通过TCP传输键盘输入时,每个包只携带很少的数据:一次击键变成几十字节的段,外面包裹着40字节的头部。在低速链路上,这会用几乎不携带数据的包淹没网络,这就是纳格尔所说的小包或愚蠢窗口综合征。

简单的修复方法是立即发送(浪费带宽)或者等待完整段缓冲(增加延迟)。纳格尔的规则介于两者之间:保持一个小段在传输中,其余数据在其确认之后批量发送。

这种批量传输很自然,因为TCP本来就要等待确认;该算法只是将此变为规则而非偶然,交互式应用获得低延迟,同时数据包数量大幅减少。

发送一个小包,其余数据等待ACK后批量发送

单字节数据包大部分字节浪费在头部上。

在ACK之后批量传输不会增加新的固定等待时间。

在不采用全段缓冲带来的延迟的情况下,减少了数据包数量。

要解决浪费,允许一个小的传输单元,其余数据在其确认之后批量传输,利用你已经在等待的时间来限制成本。

RFC 1122将其规定为TCP的重要要求,纳格尔算法几乎出现在所有TCP协议栈中,成为牺牲少量延迟换取显著降低负载的经典案例。

从这里,追溯依据

参考来源

  1. RFC 896: Congestion Control in IP/TCP Internetworks IETF · rfc-editor.org
  2. RFC 1122: Requirements for Internet Hosts - Communication Layers IETF · rfc-editor.org