流量控制
# 流量控制
让发送方根据接收方的实际接受能力控制发送的数据量;
# 窗口关闭死锁
窗口关闭的死锁现象:当接收方来不及处理,滑动窗口大小设置为0,等到接收方数据处理完之后,发送一个窗口非0的ack报文,如果该报文丢失,陷入死锁状态;
解决方法:
tcp收到零窗口通知的那一方会启动计时器,超时后,发送窗口探测报文;
# 糊涂窗口综合征
背景:TCP+IP头部有40个字节,如果只传输几个字节,开销太过于浪费;
如果接收方来不及处理数据,发送方窗口越来越小,如果窗口只剩几个字节,发送方也会选择发送;
解决方法:
接收方不通知小窗口
当窗口大小<MSS/2,向发送方通知窗口为0;
发送方避免发送小数据
Nagle算法,囤积数据;
if 有数据要发送 { if 可用窗口大小 >= MSS and 可发送的数据 >= MSS { 立刻发送MSS大小的数据 } else { if 有未确认的数据 { 将数据放入缓存等待接收ACK } else { 立刻发送数据 } } }
1
2
3
4
5
6
7
8
9
10
11