在介绍滑动窗口之前先来简单介绍一下TCP可靠传输原理中的停止等待协议,该协议就是发送方每发送一个报文段后就停止发送,一直等收到接收方的确认后再发送下一个报文段。
TCP通信是全双工的,这里为了方便理解,就以一个方向为例,假设A为发送方,B为接收方。A会有一个发送窗口,B有一个接收窗口。
发送窗口表示在没有收到B确认的情况下,A也可以连续把发送窗口的数据发送出去。但是已经发送过的数据在未收到确认之前,它还需要暂时保留,以便于超时重传时使用。发送窗口越大,它就可以在收到对方确认之前发送更多的数据,因而获得更高的传输效率。(但是A的发送窗口的值不能超过B的接收窗口的大小,还会受到网络拥塞程度的影响)。
发送窗口的位置由窗口前沿和后沿的位置共同确定。
它后沿变化有两种,(1)不动(没有收到新的确定)(2)前移(收到新的确认);
前沿是不断向前移动的,但也可能不动(1)没有收到新确认,对方窗口也不变,(2)收到新的确认,对方的接收窗口缩小了,使前沿正好不变)
P3-P1:A的发送窗口
P2-P1:已发送但是没有收到确定
P3-P2:允许发送但是未发送(可用窗口)
接收方B只对按序到达的数据中最高序号给出确认。
此外发送方和接收方都有自己的缓冲区
发送缓冲区存放:
1、发送发TCP准备发送的数据
2、TCP已发送但尚未收到确认的数据(为超时重传准备)
接收缓冲区存放:
1、按序到达但未被应用程序读取的数据
2、未按序到达的数据
滑动窗口的3种协议
1、1比特滑动窗口协议(发送窗口=1,接收窗口=1)
当发送窗口和接收窗口大小都为1时,滑动窗口协议退化成停止等待协议,因为发送方需要判断每个发送的帧是新发送的帧还是超时重传的帧,故给每个帧前都加一个序号,由于停止等待协议中只有当一个帧发送确认后才能发送下一个,所以用1个比特来编号即可。
2、后退n协议(发送窗口>1,接收窗口>1)
由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n协议。后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。缺点也很明显,就是重发出错的帧和之后的即使没出错的帧。
3、选择重传协议(发送窗口>1,接收窗口>1)
当接收方发现某个帧出错后(可能未按序到达),它将后面到达的正确的帧放入接收缓冲区中,同时要求发送方重传出错的帧(对按序到达的最大序号进行确认,当发送方收到重复确认了就知道出错了),当重传的帧到达后,将缓冲区中按序一并发送给高层