在网络传输中,有时候会遇到这样一种场景:网络中传输了大量的小数据块,浪费资源。有时候传输数据本身的大小比头部还小,一个常见的情况是发送端的"糊涂窗口综合症(Silly Window Syndrome)"。
而Nagle的出现就是为了解决这样的问题的。
Nagle规定任何时候网络中只能存在一个未被确认(未发ACK)的小段(小于MSS)。
Nagle算法的规则
Nagle算法的改进在于:如果发送端欲多次发送包含少量字符的数据包(一般情况下,后面统一称长度小于MSS的数据包为小包,与此相对,称长度等于MSS的数据包为大包,为了某些对比说明,还有中包,即长度比小包长,但又不足一个MSS的包),则发送端会先将第一个小包发送出去,而将后面到达的少量字符数据都缓存起来而不立即发送,直到收到接收端对前一个数据包报文段的ACK确认、或当前字符属于紧急数据,或者积攒到了一定数量的数据(比如缓存的字符数据已经达到数据包报文段的最大长度)等多种情况才将其组成一个较大的数据包发送出去。具体情况如下:
/* Return false, if packet can be sent now without violation Nagle's rules:
* 1. It is full sized. (provided by caller in %partial bool)
* 2. Or it contains FIN. (already checked by caller)
* 3. Or TCP_CORK is not set, and TCP_NODELAY is