Nagle TCP网络通信算法

以工程师John Nagle命名的Nagle算法旨在减少由TCP应用程序造成的“小包问题”引起的网络拥塞。 UNIX实现在20世纪80年代开始使用Nagle的算法,并且它仍然是当今TCP的标准功能。

Nagle算法的工作原理

Nagle的算法通过称为nagling的方法处理TCP应用程序发送端的数据。 它在发送数据之前检测小型消息并将其累积到较大的TCP数据包中,从而避免产生不必要的大量小数据包。 Nagle算法的技术规范于1984年作为RFC 896发布。 需要积累大量数据的决定以及在两次发送之间等待的时间长短对于整体性能至关重要。

Nagling能够以增加延迟( 延迟 )为代价更有效地利用网络连接的带宽 。 RFC 896中描述的一个例子说明了潜在的带宽优势以及其创建的原因:

应用程序通过TCP_NODELAY 套接字编程选项来控制对Nagle算法的使用。 Windows,Linux和Java系统通常默认启用Nagle,因此为这些环境编写的应用程序需要在要关闭算法时指定TCP_NODELAY。

限制

Nagle的算法仅适用于TCP。 其他协议,包括UDP不支持它。

当启用Nagle时,需要快速网络响应的TCP应用程序(如互联网电话呼叫或第一人称射击游戏)可能无法正常工作。 当算法花费额外时间将较小的数据组合在一起时所造成的延迟可能在屏幕上或数字音频流中在视觉上触发明显的滞后 。 这些应用程序通常会禁用Nagle。

这种算法最初是在计算机网络支持的带宽比现在少得多的时候开发的。 上述例子是基于约翰·纳格尔在20世纪80年代早期在福特航空航天公司的经历,在他们慢速,重负荷的长途网络上进行的折衷交易很有意义。 网络应用程序今天可以从他的算法中受益的情况越来越少。