我目前有一个应用程序以非常高的速率接收实时消息,我的应用程序需要立即显示这些消息。我阅读了有关 nagles 算法的信息,我了解它将小消息组合成一个大消息然后传输它(它旨在通过在短时间内延迟 ACK 来减少确认数据包的数量)。我的问题是禁用 Nagles 算法帮助我的应用程序 ?我的所有消息将在收到后立即实时显示。对此问题的任何建议将不胜感激。
更新: 我也只能控制接收器,将禁用 nagles 算法。对接收方有任何影响,还是仅在对发送方禁用时才有影响?
我目前有一个应用程序以非常高的速率接收实时消息,我的应用程序需要立即显示这些消息。我阅读了有关 nagles 算法的信息,我了解它将小消息组合成一个大消息然后传输它(它旨在通过在短时间内延迟 ACK 来减少确认数据包的数量)。我的问题是禁用 Nagles 算法帮助我的应用程序 ?我的所有消息将在收到后立即实时显示。对此问题的任何建议将不胜感激。
更新: 我也只能控制接收器,将禁用 nagles 算法。对接收方有任何影响,还是仅在对发送方禁用时才有影响?
Nagle 只是一个发送方算法,所以如果你只能影响接收方,你不能禁用它。
即使您可以影响发件人,在进行单向通信时禁用 Nagle 也不是很有效。在双向通信中,禁用 Nagle 可以提高吞吐量,因为消除延迟的好处可以累积,因为每个节点可以稍微更快地发送其响应,让对方响应得更快。但是,在单向情况下,禁用 Nagle 可以将延迟减少一趟,但这些好处无法累积,因为您没有延迟数据包这一事实不会减慢新数据包的生成速度。你永远不会超过一次往返。在互联网上,大约是 20-30 毫秒。在 LAN 上,这通常是 ~1ms
如果您的系统足够硬实时以至于单个往返延迟很重要,那么 TCP 是一个糟糕的协议,您应该改用 UDP。Nagle 是一个仅 TCP 的算法,所以它不会影响 UDP。
只是为了好玩:在我的 LAN 上 ping 一台本地计算机的时间小于 1 毫秒。这意味着 Nagle 只能将我的消息延迟 1 毫秒以下。台式计算机调度程序的量子可以 20-60 毫秒 [1],服务器甚至更长,所以我希望删除 nagle 算法对我的 LAN 没有明显影响,与我计算机上其他线程消耗 CPU 的影响相形见绌