gpt4 book ai didi

java - SSL Socket OutputStream Write Slow only on Windows

转载 作者:可可西里 更新时间:2023-11-01 10:37:44 24 4
gpt4 key购买 nike

服务器:Linux

测试客户端:OS X、CentOS、Windows

服务器/客户端编程语言:Java

Server-side

SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();

InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

String string = null;
while ((string = bufferedreader.readLine()) != null) {
System.out.println(string);
System.out.flush();
}

使用此选项执行的服务器程序

-Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456

证书:在 Linux 上使用 keytool 创建

keytool -genkey -keystore mySrvKeystore -keyalg RSA

客户端

....
SocketAddress sa = new InetSocketAddress(ip, port);
....
SSLContext sslContext = SSLContext.getInstance("SSL");
....
sslContext.init(.........., new SecureRandom());

SSLSocketFactory socketFactory = sslContext.getSocketFactory();
this.clientSock = socketFactory.createSocket();
this.clientSock.connect(sa, this.ConnectTimeout);
this.clientSock.setSoTimeout(this.RecvTimeout);
this.clientSock.setReuseAddress(true);
....

public boolean writeTo(String procname, BufferedOutputStream out, byte[] data)
{....
out.write(data, 0, data.length);
out.flush();
....}

结果:一切正常,但只有来自 Windows 的客户端程序,写入输出流时会延迟。

  1. 建立 SSL 套接字连接
  2. 设置输出/输入流
  3. 将数据写入输出流
  4. 冲洗

... 4-5秒,此时无缘无故卡在这里...

  1. 关闭

延迟发生在从 Windows 7、Windows XP 执行的同一 java 客户端简单程序上。从 3 台不同的 Windows 机器上测试。其他地方都很好。

所以我尝试使用 C 和 PHP 构建 SSL 简单客户端,在 Windows 上运行良好。这意味着只有 Java 客户端方法不起作用。

有没有人有任何想法或类似的经验?我看过一些怀疑 WINS/DNS 的帖子,但这里似乎并非如此。同样有趣的是,每台 Windows 机器总是有大约 4-5 秒的延迟。

非常感谢您的提前评论。

最佳答案

我遇到过类似的问题。使用 tcpdump,我发现从客户端到服务器的 TCP 连接(SYN、SYN-ACK、ACK)几乎是瞬间发生的,然后是一个神秘的暂停,然后客户端才真正发送数据。

tcpdump 输出表明,在连接之后,客户端(在 Windows 上运行)立即发送一个 NetBIOS 名称请求(大概是为了找出服务器的名称,也许这样它可以选择一个合适的证书或其他东西)和服务器立即用 ICMP 响应回复说 NetBIOS UDP (137) 端口无法访问。看起来 Windows 客户端忽略了该响应。 1.5 秒后,Windows 客户端发送另一个 NetBIOS 名称请求,服务器发送相同的 ICMP 响应。再过 1.5 秒后,Windows 客户端发送第三个也是最后一个 NetBIOS 名称请求,服务器发回相同的 ICMP 响应。 1.5秒后,socket数据终于传输完毕。

所以看起来 Windows 尝试了 3 次以确定服务器的 NetBIOS 名称,并且每次等待 1.5 秒。最终(4.5 秒后)它放弃并发送数据。我认为这可以解释您报告的 4-5 秒暂停。

消除暂停的一种解决方法是为服务器添加“主机”文件条目。 (在该文件中使用什么主机名并不重要。仅仅存在一个 IP 地址就避免了对 NetBIOS 名称解析的需要。)可能还有其他选择(例如,将服务器名称添加到 WINS 或 DNS 或其他东西,具体取决于您的 Windows 机器使用什么进行名称解析)。

关于java - SSL Socket OutputStream Write Slow only on Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com