Nagle算法
1、为什么要引入Nagle算法
Nagle算法主要是为了防止网络连接中充斥着<MSS的分组。小的分组一方面会造成网络拥塞,另外一方面由于网络传输过程中,用户程序需要传递的内容需要附上TCP头和IP头封装成为TCP包/IP包,会造成资源浪费。为了解决这个问题,Nagle就提出一种算法(Nagle算法)。
2、Nagle算法的原理
该算法要求在TCP连接中,如果还有未被确认的分组,在收到ACK确认包之前禁止发送其他小的分组。
该算法的伪码如下:
if there is new data to send
if the window size >= MSS and available data is >= MSS
send complete MSS segment now
else
if there is unconfirmed data still in the pipe
enqueue data in the buffer until an acknowledge is received
else
send data immediately
end if
end if
end if
由以上可以看出,Nagle算法适用于:发送发存在许多小的分组需要发送,接收方又能够及时发送ACK的场景。默认的TCP连接中,Nagle算法是打开的,为了能够禁止使用Nagle算法,你可以设置socket为TCP_NODELAY,从而能够保证,发送方的包及时地发送给接收方。
3、Nagle算法的利弊分析
利:很明显,可以减少网络中的小分组,保持较高的网络资源利用率。
弊:由于发送方会控制小的分组,并期望合并成为较大的分组一起发送给接收方,因此实时的单向的发送数据并及时获取响应的场景需要谨慎。另外,如果接收方设置了DELAY ACK,情况可能会比较糟糕:因为如果接收方设置了DELAY ACK,接收方接收到发送方发过来的小分组后,并不及时发送ACK,只有等到Delay ACK的Timer到期后,才会给发送方回ACK。