【问题标题】:Bad latency on windows compared to mac using TCP in java与在 java 中使用 TCP 的 mac 相比,Windows 上的延迟较差
【发布时间】:2016-11-12 00:49:48
【问题描述】:

我正在尝试制作具有多人游戏方面的游戏,但在我深入研究之前,我一直在尝试让一个简单的类似 ping 的应用程序工作。出于某种原因,我在 Windows 上的 ping 时间非常糟糕(400 毫秒左右),而如果我在 Mac 上尝试,它会好很多(8 毫秒左右)。

我有我的服务器和我的客户端。服务器使用serverSock.accept() 创建一个Socket clientSock,其中serverSock 是另一个Socket 在端口12234。客户端使用另一个Socket 在单独的应用程序中连接到我的外部IP 端口12234。

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

Java 在我试用过的所有计算机上都是最新的(3 台 Windows 计算机、2 台 Mac 和一个 Windows 虚拟机)。

奇怪的是,Windows VM 得到了与 mac 相同的 8 或 9 毫秒 ping,而独立的 Windows 机器在 400 毫秒范围内。

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

此外,当我在命令行/终端上 ping 我的外部地址时,windows 和 mac 大约需要 1 毫秒。

任何建议或想法将不胜感激!

提前致谢!

【问题讨论】:

  • Windows 和 OSX 机器是否在同一个网络上? Windows 系统是否运行某种防火墙?与网络相关的系统之间还有什么不同的地方吗?此外,您在 Windows 和 OSX 上计算延迟的方式是否相同?
  • 所有机器都在同一个网络上。我相当肯定 Windows 机器有防火墙,只是因为它们默认有防火墙,对吗?我不确定它从 windows 到 mac 有何不同。你能想到任何其他诊断工具来测试类似的东西吗?
  • 延迟以同样的方式计算,假设java时钟在两个系统上都工作。
  • @JoachimPileborg 感谢您的帮助。我现在想通了。

标签: java sockets network-programming latency


【解决方案1】:

问题已经解决了。

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

Windows 上 ping 时间缓慢的原因是此。大约 400 毫秒的时间是 200 毫秒从客户端发出,然后 200 毫秒从服务器返回到客户端。

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

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

【讨论】:

  • 对于高吞吐量和低延迟的游戏,几乎一致地使用 UDP 进行与游戏相关的通信。 TCP 适用于聊天等非关键事物,或用于必须交付但没有延迟限制的事物。
猜你喜欢
  • 2011-05-28
  • 2012-04-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多