问题引入:
如何避免发送方发送小数据呢?
发送方的策略:
使⽤ Nagle 算法,该算法的思路是延时处理,只有满⾜下⾯两个条件中的任意⼀个条件,才可以发送数据:
条件⼀:要等到窗⼝⼤⼩ >= MSS 并且 数据⼤⼩ >= MSS ;
条件⼆:收到之前发送数据的 ack 回包;
只要上⾯两个条件都不满⾜,发送⽅⼀直在囤积数据,直到满⾜上⾯的发送条件。
Nagle伪代码:
if 有数据要发送 {
if 可⽤窗⼝⼤⼩ >= MSS and 可发送的数据 >= MSS {
⽴刻发送MSS⼤⼩的数据
}
else {
if 有未确认的数据 {
将数据放⼊缓存等待接收ACK
}
else {
⽴刻发送数据
}
}
}
注意,如果接收⽅不能满⾜「不通告⼩窗⼝给发送⽅」,那么即使开了 Nagle 算法,也⽆法避免糊涂窗⼝综合症,因为如果对端 ACK 回复很快的话(达到 Nagle 算法的条件⼆),Nagle 算法就不会拼接太多的数据包,这种情况下依然会有⼩数据包的传输,⽹络总体的利⽤率依然很低。
所以,接收⽅得满⾜「不通告⼩窗⼝给发送⽅」+ 发送⽅开启 Nagle 算法,才能避免糊涂窗⼝综合症。