TCP滑动窗口

来源:互联网 发布:内窥镜软件an97apk 编辑:程序博客网 时间:2024/05/16 05:27

      TCP的首部中有一个很重要的字段就是16位长的窗口大小,它出现在每一个TCP数据报中,配合32位的确认序号,用于向对方通告本地socket的接收窗口大小。也就是说,如果本地socket发送一个TCP数据报,其32位确认序号是5,窗口大小是5840,则用于告诉对方:你方发出的4个字节的数据已经收到并确认,我方socket将接收从第5个字节开始的长度为5840个字节数据。这是由接收方进行的一种流量控制,接收方通过告诉发送方自己所能够接收数据的大小,达到控制发送方发送速度的目的。

 

 

    TCP窗口是TCP确认/重传机制的一部分。
        TCP窗口分接收窗口和发送窗口。
一、接收窗口
        接受窗口是将要接受数据的序列号,它的最左边是下一个将要接受数据的序列号,它的最右边是需要接受数据的序列号的最大值。通过接受窗口即可以预测下一个接受数据的序列号,同时还可以控制数据流量,当网络上传来的数据的序列号大于接受窗口右边的序列号值,则这些数据将被直接丢弃,这样就可以控制接受的数据不会超过接受方缓冲区空间大小。如果一个TCP段到达时,如果其所带序列号不在接受窗口内,则此TCP段将被丢弃。如果一个TCP段到达后,其序列号不是接受窗口最左边的下一个序列号,但其小于接受窗口最右边的序列号,则证明此TCP段是非按顺序到达的,通常将其放入队列中等待之前的TCP段到来。如下图演示了一个例子:

 

 

        在图中展示了一个接受窗口(虚线框部分),在开始时其已经接受了1、2、3,下一个是准备接受4,而且希望接受的数据为9个段(如图A所示),当4、5、6、7到达后,下一个接受序列号就为8了(如图B所示)。
二、发生窗口
        和接收窗口一样,发送方也维持一个发送窗口,发送窗口分为两个部分,一部分是已经发送但没有被确认的段(在发送窗口最左边),另一个部分是可以发送但没有发送的段。如下图所示,当发送4、5、6、7段后,在没有获得接收方确认前,发送方可以继续发送8、9、10、11、12段。在发送4、5、6、7段后,TCP将启动重传超时(RTO),如果在RTO超时之前没有得到接收方对4、5、6、7段的确认,则TCP将启动重传机制,将4、5、6、7段进行重传。


        这里需要特别注意,重传的段可能会比原来传输的段更多,例如8、9段在RTO超时之前发送,则重传时将重传4、5、6、7、8、9段。
        这里还应该注意,RTO超时并不意味着开始发出的4、5、6、7段没有到达目的地,这里面包括的原因有很多,如可能是接收方回馈的ACK响应丢失,很可能是网络延迟造成ACK响应到达在RTO超时之后。
        当4、5、6、7段被确认后,发送窗口向右滑动(如上图C所示)