1.TCP的零窗口
上一文中,我们介绍了TCP滑动窗口,通过滑动窗口实现了一次性传输多个包和流量控制。
上一文的示例中,接收端接收到消息后,并不处理,所以会一直占用接收端的接收窗口,一直到最后,完全占用了接收窗口。
示例完全同TCP滑动窗口模拟实战,这里笔者不再赘述。
1.1 零窗口当接收端的接收窗口被完全占用后,此时再来新的数据包就无处安放了,同时接收方回复给发送方的ACK中,Win也已经归零。
如下所示:
可以从第二条接收方回复的ACK中看到,Win=0
1.2 接收方零窗口后的窗口更新接收方零窗口后,可以阻止发送方再发送数据包。
当接收方重新获取可用空间时,会给发送端传输一个窗口更新,发送端接收到该数据包之后,继续发送数据
1.3 发送端的窗口探测假设一种情况,接收方发送窗口更新包丢失了,那么发送端就一直无法得到窗口更新的消息,一直在等待。
为了避免这种互相等待的死锁情况,发送端会采用一个持续计时器,间歇性的查询接收端的窗口信息。
我们来看下示例:
可以看到,发送端在间歇性的发送一个1字节大小数据包到接收端,询问是否有窗口更新
由于我们接收端一直没有释放数据,所以窗口一直是ZeroWindow
而且,这种间歇性的查询方式与TCP超时重传很像,都是指数级避退的方式来发送询问包。