后退N帧协议的接收窗口为1,可以保证按序接收数据帧。
若采用n比特对帧编号,则其发送窗口的尺寸WT应满足1 ≤ WT ≤ 2n-1。
若发送窗口的尺寸大于2n-1,则会造成接收方无法分辨新帧和旧帧。
请说明:用 n 比特进行编号时,若接收窗口的大小为1,则只有在发送窗口的大小 WT ≤ 2n-1时,连续ARQ协议才能正确运行。
举一个具体的例子说明:
例如用3比特可编出8个不同的序号,因而发送窗口的最大值似乎应为8个,但实际上,设置发送窗口为8个,将使协议在某些情况下无法工作。
设发送窗口 WT = 8 个,发送端发送完0~7号 共8个数据帧,因发送窗口已满,发送暂停。假定这8个数据帧均已正确到达接收端,并且对每个数据帧,接收端都发送出确认帧。
下面考虑两种不同的情况:
-
第一种情况是:所有确认帧都正确到达了发送端,因而发送端接着又发送8个新的数据帧,其编号应该是 0~7 。注意序号是循环使用的。因此,序号虽然相同,但8个帧都是新的帧。
-
第二种情况是:所有确认帧都丢失了。经过一段由超时计时器控制的时间后,发送端重传这8个旧的数据帧,其编号仍然是 0~7。于是当接收端第二次收到编号为 0 ~ 7的 8 个数据帧时,就无法判定这是8个新的数据帧还是8个旧的重传的数据帧。
因此,将发送窗口设置为8显然是不行的。
讲到这里,可能有人对第二种“所有确认帧都丢失了”的情况仍然很疑惑,
即,为什么接收端无法判断出来重传的这8个数据帧是旧数据帧呢?
大家看了下面的图示就懂了。
-
继续沿用上述例子中的条件,用3比特即可编出8个不同的序号,我们可以看到上图中发送端的帧编号是 0~7 ,因为序号是循环使用的,因此,发送端前8位和紧接着的后8位,序号虽然相同,但后8个帧都是新的帧。
-
发送窗口个数是蓝色框选中的序号为0-5的6个帧,发送端可以同时发送多个数据帧,直到收到来自接收端的ACK确认帧,发送窗口才往前移动。
-
此时发送窗口序号为 0~5的6个帧,依次发向接收窗口,并保留对应序号帧的副本,发送窗口各帧成功收到来自接收窗口的ACK确认后,再将副本丢弃。
-
接收窗口大小为1,所以接收窗口只能一个一个的按序接收来自发送窗口的数据帧,成功接收后,便向发送窗口返回一个ACK确认帧。比如接收窗口成功的按序接收到了来自发送端的0、1、2、3、4、5号帧后,便依次向发送端发送ACK0、ACK1、ACK2、ACK3、ACK4、ACK5,或者直接发送一个ACK5确认帧(代表序号为5的帧及之前的帧都已收到)。
-
如上图此刻,接收窗口向前移动了6个帧,移动到了接收端序号为6的帧处。然而,序号 0~5的ACK确认帧在数据链路上出错,发送窗口苦苦等待ACK确认帧,等不到就无法向前移动。
-
经过一段由超时计时器控制的时间后,发送端重传这6个旧的数据帧,其编号仍然是 0~5。因为发送端帧的序号范围是0至7,即重发序号为0至5的帧会被接收窗口认为是旧帧,因为接收窗口还没接收到过6号、7号帧。
重点来了!!!!!
若上述情况的发送窗口个数6(序号为0-5号帧)改为2n也就是23=8个(序号为0-7号帧),错误情况仍然是ACK确认帧丢失。 -
那么,设置发送窗口为8个,此时发送端需要重发的就是0-7号帧,而序号范围正好也是0-7,接收端将无法区分这0-7号帧是新帧还是旧帧,因为接收端之前已经成功接收了0-7号帧,只是不知道ACK出错了,若发送窗口个数与序号个数相同,将使协议在某些情况下无法工作。
总结,发送窗口W T的个数必须为 1 ≤ W T ≤ 2n-1。