我目前有一个应用程序,它以很高的速率接收实时消息,而我的应用程序需要立即显示这些消息。我了解了nagles算法,并且了解到它将小消息组合成一条大消息然后进行传输(它的设计是通过将ACK延迟一小段时间来减少确认数据包的数量)。我的问题是禁用Nagles算法帮助我的应用程序 ?我收到的所有消息都将在收到后立即实时显示。对此问题的任何建议将不胜感激。
更新:
我也只能控制接收器,将禁用nagles algo。在接收方上有任何影响,还是仅在发送方上禁用后才有影响?
最佳答案
Nagle仅是发送方算法,因此,如果只能影响接收方,则不能禁用它。
即使可能影响发送者,在进行定向通信时禁用Nagle也不是很有效。在双向通信中,禁用Nagle可以提高吞吐量,因为消除延迟的好处可以累积,因为每个节点可以更快地发送其响应,从而使另一端可以更快地响应。但是,在单向情况下,禁用Nagle可以将往返延迟减少一次,但是这些好处无法累积,因为您没有延迟数据包的事实不会减慢新数据包的生成。您永远不会获得超过一次往返的成功。在互联网上,大约20-30毫秒。在局域网上,通常约为1毫秒
如果您的系统具有足够高的实时性,那么单次往返延迟就很重要,那么TCP是一个较差的协议(protocol),您应该改用UDP。 Nagle是仅TCP的算法,因此它不会影响UDP。
只是为了好玩:对我的LAN上的本地计算机执行Ping操作不到1毫秒。这意味着Nagle只能将我的消息延迟1毫秒以下。台式机计算机调度程序的量子时间可以为20-60ms [1],对于服务器来说甚至更长,因此,我希望删除nagle算法对我的LAN没有可见的影响,这与我计算机上其他线程消耗CPU的影响相形见war。
[1] http://recoverymonkey.org/2007/08/17/processor-scheduling-and-quanta-in-windows-and-a-bit-about-unixlinux/