TCP糊涂窗口综合症
TCP通过滑动窗口来完成流量控制,当接收方发现自己跟不上发送的速度,就缩小接收窗口大小,抑制发送方的发送速度,防止发送的过快
出现问题:接收方的接受能力越来越差怎么办?
简单来说,就是接收方接受能力变差,窗口变小,导致发送方犯傻,其发送的数据只有一个大大的头部,真正携带的数据很少
接收方和发送方都有问题:
- 接收方:通告了发送方窗口缩小
- 发送方:即使窗口很小也还是发送数据
一、接收方的策略
防止发送方发送小数据
1⃣️方案一
- 只要窗口大小 < 某个值(内核缓冲区大小的一半)的时候,就直接讲窗口大小置为0,防止发送小数据
- 等到窗口大小 >= 某个值的时候,才打开窗口,通告发送方,告知其可以发送数据了
2⃣️方案二:延迟确认应答
- 如果接收到数据立刻发送ACK确认报文的话,接收方的窗口可能比较小,发送方发的数据也比较少
- 如果能延迟一些确认的话,能够从缓冲区中清理的数据就变多了,窗口就变大了,发送方就能够发送的数据就更多了
二、发送方的策略
不要犯傻去发送小报文
算法:Nagle,即若发送方还有数据待发送,但数据比较小,就可以进行延迟发送
具体来说,仅在下列任意一种条件下才能发送数据:
- 已经发送的数据都已经收到确认应答
- 可以发送的数据 >= 某个值(内核缓冲区大小的一半)
若两个都不满足,则等待一段时间在进行数据发送
【参考】这个网站很容易懂哦
https://cswiki.top/