以工程师John Nagle命名的Nagle算法旨在减少由TCP应用程序造成的“小包问题”引起的网络拥塞。 UNIX实现在20世纪80年代开始使用Nagle的算法,并且它仍然是当今TCP的标准功能。
Nagle算法的工作原理
Nagle的算法通过称为nagling的方法处理TCP应用程序发送端的数据。 它在发送数据之前检测小型消息并将其累积到较大的TCP数据包中,从而避免产生不必要的大量小数据包。 Nagle算法的技术规范于1984年作为RFC 896发布。 需要积累大量数据的决定以及在两次发送之间等待的时间长短对于整体性能至关重要。
Nagling能够以增加延迟( 延迟 )为代价更有效地利用网络连接的带宽 。 RFC 896中描述的一个例子说明了潜在的带宽优势以及其创建的原因:
- 拦截键盘击键并希望将每个要键入的字符传送给接收方的TCP应用程序可以生成一系列包含1 字节数据的消息。
- 在这些消息可以通过网络发送之前,每个消息必须与TCP / IP所要求的TCP 头信息一起打包。 每个标题的大小在20到60个字节之间。
- 如果没有唠叨,这个示例应用程序将生成包含95%或更多头信息(21个字节中至少20个)和来自发送者键盘的5%或更少实际数据的网络消息。 使用Nagle算法,相同的数据可以使用更少的消息来传递,而且其中95%的内容是键盘信息,从而节省了大量带宽。
应用程序通过TCP_NODELAY 套接字编程选项来控制对Nagle算法的使用。 Windows,Linux和Java系统通常默认启用Nagle,因此为这些环境编写的应用程序需要在要关闭算法时指定TCP_NODELAY。
限制
Nagle的算法仅适用于TCP。 其他协议,包括UDP不支持它。
当启用Nagle时,需要快速网络响应的TCP应用程序(如互联网电话呼叫或第一人称射击游戏)可能无法正常工作。 当算法花费额外时间将较小的数据组合在一起时所造成的延迟可能在屏幕上或数字音频流中在视觉上触发明显的滞后 。 这些应用程序通常会禁用Nagle。
这种算法最初是在计算机网络支持的带宽比现在少得多的时候开发的。 上述例子是基于约翰·纳格尔在20世纪80年代早期在福特航空航天公司的经历,在他们慢速,重负荷的长途网络上进行的折衷交易很有意义。 网络应用程序今天可以从他的算法中受益的情况越来越少。