TCP滑动窗口
假设A向B发送数据,A收到了B的确认报文,报文首部的窗口值为20,确认号ack=31,这表示B已经收到了截止序列号30的所有数据,根据窗口值和确认号,A构造出自己的发送窗口,如下图所示。
A的发送窗口表示在没有收到B的确认下可以联系把窗口内的数据发送出去。对于已经发送出去的数据,在没有接到确认时,必须暂时驻留在发送窗口内以便在超时重传时使用。发送窗口后沿的后面部分是已经发送并得到确认的数据,这些数据不再保留到发送窗口内。发送窗口前沿的前面部分是不允许发送的数据,因为接受方B的接收窗口没有足够的空间保留这些数据。
由上图可知,发送窗口的位置与大小由前后沿共同决定。后沿的变化有2种可能:
(1)变大:接收到新的确认。
(2)不变:没有接收到新的确认。
后沿不可能变小,因为不能撤销已经接收到的确认。
前沿的变化有3种可能:
(1)不变:没有接收到新的确认,或者接收到新的确认但是接收方B的接收窗口变小了,正好导致前沿位置不变。
(2)变大:接收到新的确认并且B的接收窗口不变。
(3)变小:接收到新的确认并且B的接收窗口变小了,正好导致前沿位置变小。但是tcp标准强烈建议不要这样做,因为在接收到这个确认以前A已经发送了这个窗口的很多数据,现在窗口缩小并且不许发送这些数据,会产生一些错误。
假设现在A发送了序列号31~41的11个字节的数据,如下图所示,其中发送窗口内11个黑色方框表示已经发送但未收到确认的数据,由p1、p2指出,即p2-p1=已发送但尚未收到确认的字节数。窗口内其余的方框表示允许发送但未发送的数据,有p2、p3指出,即p3-p2=允许发送但未发送的字节数。发送窗口的大小为p3-p1。
由上图可知,B的接收窗口大小为20,序列号31~50表示可以接收的数据。现在B已经收到了黑色方框表示的32和33号数据,但是这些数据没有按序到达,31号数据可能滞留在网络中或者丢失了,而B只能对按序到达的数据中的最高序列号进行确认,所以B发送的确认报文的确认号仍然是31。
假设B现在收到了按序到达的31~33号数据,把这些数据交付给主机,然后B删除这些数据并把接收窗口向前移动3个序列号,窗口仍为20保持不变,如下图所示。B会发送确认给A,其中确认号为34,窗口值为20,表明B已收到序列号33为止的所有数据。从图中可以看到,B也收到了37、38和40号数据,但是不是按序到达,只能暂存在接收窗口中。A在接收到B的确认后,将发送窗口向前移动3个序列号。
假设A继续发送序列号42~53的数据后p2与p3重合,此时发送窗口内的数据全部发送完毕但还没收到确认,如下图所示。由于A的发送窗口已满,可以继续发送的数据为0,因此必须停止发送。A在经过一段时间(由超时计时器控制)后如果没有收到B的确认就会重传这些数据,并重置超时计时器,直到收到B的确认为止。如果A收到的确认号处于发送窗口之间,A就可以相应地向前移动发送窗口并继续发送数据。