与 mac 在 java 中使用 TCP 相比,windows 上的延迟较差

Bad latency on windows compared to mac using TCP in java

我正在尝试制作一款多人游戏,但在我开始之前,我一直在尝试让一个简单的类似 ping 的应用程序运行。出于某种原因,我在 Windows 上的 ping 时间非常糟糕(400 毫秒左右),而如果我在 Mac 上尝试它,它会好得多(8 毫秒左右)。

我有我的服务器和我的客户端。服务器使用 serverSock.accept() 创建一个 Socket clientSockserverSock 在端口 12234 是另一个 Socket。客户端使用另一个 [=16= 在我的外部 ip 端口 12234 连接到它] 在单独的应用程序中。

我的 ping 基本上只是将我客户端上的当前系统时间的消息发送到服务器,服务器立即将其发回,客户端从收到的时间中减去新的当前时间并将其打印出来.

Java 在我试过的所有计算机上都是最新的(3 windows 计算机、2 mac 和一个 windows 虚拟 mac海因).

奇怪的是,Windows VM 获得了与 macs 相同的 8 或 9 ms ping,而独立的 Windows machines 在400 毫秒范围。

另一个奇怪的怪癖是,如果我 ping 速度更快,Windows 上的 ping 时间会减少到 200 毫秒左右。

此外,当我在命令 line/terminal 上 ping 我的外部地址时,windows 和 mac 都在 1 毫秒左右。

如有任何建议或想法,我们将不胜感激!

提前致谢!

问题已解决

事实证明,Windows 使用 Nagle 算法来节省带宽。然而,该算法在实际发送数据包之前建立了 200ms 缓冲时间。

Windows 上的 ping 时间慢的原因就是这个。 ~400ms 时间是 200ms 从客户端发出,然后 200ms 从服务器返回到客户端。

这一切都可以通过在两端的套接字上调用 setTcpNoDelay()来解决

http://www.rgagnon.com/javadetails/java-0294.html https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setTcpNoDelay(boolean)