TCP首部中有一个窗口字段,接受方和发送方通过这个字段,告诉对方还能够发送多少数据。在TCP连接建立的时候,接收方和发送方首先建立窗口大小初始值。在传输过程中,如果一方发送的数据过多,以至于另一方无法及时处理;这时,另一方就会通过收缩接收窗口字段来提醒发送方减少数据量。极端情况下,发送窗口的大小会降低到0,这个时候,发送方将彻底无法发送数据,而是会定时发送探寻数据,查看对方是否能够接收数据。
下面,我们以一个案例来分析接收窗口的在TCP传输中的作用。在这个案例中,发送的双方对应的分别是客户机以及服务器,他们之间通过TCP进行通信:客户机会发送get请求服务器端的数据,而服务器端在接收到请求之后,会返回对应的数据。
在这个过程中,get请求的大小往往少于服务器返回数据的大小,换句话说,在这个请求过程中,客户机应该接受更多的数据,其接收窗口的大小应该也更大。反应在图中也可以看出来,客户机的wind字段大小为65535,远远大于服务器端的win字段(5840),这个能够辅助我们理解接收窗口的作用。
我们仔细观察传输过程,前三次是我们非常熟悉的TCP三次握手,在这个过程中,双方交换自己的交换窗口,告诉对方自己能够接收的最大数据。
接下来,客户机向服务器发送了get请求;服务器回复了200状态码以及数据;之后,客户端发送ACK表明成功接收,注意:这个时候的Win字段仍然是65535,和之前一样,也就是说,到目前为止,尽管服务器给客户机发送了数据,客户机仍然能够顺利处理这些信息,窗口没有缩小。
我们接着看双方的通信,客户机再次发送了GET请求,这次服务器返回了两个1460bytes的数据,这时,客户发送的ACK报文中,win字段变成了62615,这已经相对于上次减少2920,这说明了上次的数据,客户端并没有“消化”,因此win字段已经减少来提示发送方。
但是,服务器端并不会因为win字段缩小而减少发送的数据,win字段表明仍有相当大的空间接收数据。因此,服务器端会继续发送数据,直到win字段彻底变成0。当接收方的win字段彻底变成0之后,说明他的tcp缓存已经占满了,这时候的发送方就不会再发送数据,而是会发送探寻报文,如果接收方已经恢复,这个时候就会返回一个win窗口不为0的报文,发送方于是可以继续发送数据。
相关文章: