TCP协议中的Nagle算法

Nagle算法为了避免网络中存在太多的小数据包,尽可能发送大的数据包。定义为在任意时刻,最多只有一个未被确认的小段。小段为小于MSS尺寸的数据块,未被确认是指数据发出去后未收到对端的ack。

Nagle算法是在网速较慢的时代的产物,目前的网络环境已经不太需要该机制,该算法在linux系统中默认关闭。

延时ACK机制: 在接收到对端的报文后,并不会立即发送ack,而是等待一段时间发送ack,以便将ack和要发送的数据一块发送。当然ack不能无限延长,否则对端会认为包超时而造成报文重传。linux采用动态调节算法来确定延时的时间。

可以举例来描述一下,client连续向server端发送两个小于MSS的数据包。client发送第一个数据包,根据Nagle算法,此时没有未确认的数据段,该数据包可以直接发送。server端接收到数据包后,由于延时ACK机制,并不会立即发送ack,而是需要等到延时ack机制超时后再发送第二个数据包。此时client端由于Nagle算法, 存在一个未被确认的数据包,不能向server端发送第二个数据包。

在延时要求尽量小的情况下,并不适合用Nagle算法,比如SSH会话。可以通过设置TCP_NODELAY来完成。