TCP滑动窗口
what:
滑动窗口:是传输层为了进行流量控制而采取的一种措施。由接受方来告诉发送方自己窗口的大小,从而来控制发送方的速率。
滑动窗口分为:发送窗口和接受窗口。
滑动:发送方根据接受窗口来决定自己的发生窗口。发送窗口的位置会随着接受确认报文,而不断向后滑动;并且发生窗口的大小,也会随着接受窗口的大小而不断变化。
接受窗口:由接收方来填,该值是接收方自己接受缓存还能容纳数据的大小。决定了发送方的发送窗口大小。
具体见下图:
当收到36的ack,并且发出46~51后的滑动窗口情况:
案例:
滑动死锁及解决方案:
现象:接收方现在接收窗口是0,发送了0窗口的报文。是后面接收窗口有不是0了,于是发了size=10的报文。但是size=10的报文丢了,就会出现发送端一直等接收端的非0窗口通知,而接收端一直等数据的到来。
方案:TCP为每对连接建一个持续计时器。只要TCP一方收到0窗口的通知,就启动持续计时器。若持续计时器设置的时间到了,就发送一个探测报文(仅携带1字节的数据),接收方收到探测报文后,在确认该报文时,将自己的窗口值发回去。
糊涂窗口症:
现象:接收的缓存慢以后,接受进程1次只读1个数据。然后向发送方发送1个窗口的确认报文,后面发送方再发送1个数据。这样继续,每次都只发送1个数据效率会非常差。
方案:延迟ACK或者数据发送。对接收方,延迟ACK的发送,在这段时间内接收窗口可能放大。对发送方,可以不理会小窗口通知(不马上发小包,延迟一会),从而小包可能变大。