1. 后退 N 帧协议 (GBN) 的发送窗口

这个文章的最后说明了后退 N 帧协议 (GBN) 的发送窗口为什么 ≤ 2^n-1
https://blog.csdn.net/OOFFrankDura/article/details/79858712

他明确了 ACKn 的意义是:已经收到了序号为 n 的帧,请求发送序号为 n+1 的帧
(与 TCP 中不同)
并且指出最坏的情况是:发送窗口发送了窗口内所有的帧,接收端收到了发送端发送的所有的帧,但接收端发送的 ACKn 全部丢失,发送端从窗口第一个帧超时重传

对于窗口长度为 2^n-1 时,最坏情况的正确的描述为

由于超时,发送方会不断重传,但a0-a6和接收方所需要的a7始终无法匹配,接收方会不断重复返回ack要求发送a7,直到发送方正确收到此ack,能够确认a0-a6已经成功发送,移动窗口,并发送a7为止。

单单这么说虽然好,但是有一个对比的描述会更好

首先,序号为 n 位时,待发送的所有帧的编号为 0 1 2 .... 2^n-1 0 1 2 ...

① 发送窗口长度为 2^n

初始时,
发送窗口为 | 0 1 2 .... 2^n-1 | 0 1 2 ...
根据最坏情况的定义
最后一个可能丢失的确认帧为 ACK2^n-1,即接收端接下来要接受序号为 0 的帧,置于第二组
由于没接收到确认帧,发送端将会重发 0 1 2 .... 2^n-1,它们都属于第一组
接收端能够接收到第一组序号为 0 的帧,就把这个第一组的帧置于了第二组,出错

② 发送窗口长度为 2^n-1

初始时,
发送窗口为 | 0 1 2 .... 2^n-2 | 2^n-1 0 1 2 ...
根据最坏情况的定义
最后一个可能丢失的确认帧为 ACK2^n-2,即接收端接下来要接受序号为 2^n-1 的帧,置于第一组
由于没接收到确认帧,发送端将会重发 0 1 2 .... 2^n-2,它们都属于第一组
接收端接收到重发的序号为 0 1 2 .... 2^n-2 的帧时,认为这些帧的序号错误,因此接收端会重发 ACK2^n-2,直到发送端收到 ACK2^n-2,发送序号为 2^n-1 的帧让接收端收到,正确

以此类推,发送窗口长度为 2^n-1 时,发送窗口也可以为 0 | 1 2 .... 2^n-1 2^n | 0 1 2 ...,此时接收端需要序号 0,但是发送端一直重发 1 2 .... 2^n-1 2^n ,同理可得发送窗口长度为 2^n-1 时协议正常

但是同时这个文章没有说明为什么选择重传协议 (SR) 的滑动窗口大小为 2^(n-1)

2. 选择重传协议 (SR) 的发送窗口

已经知道了后退 N 帧协议的分析思路,那么可以先使用滑动窗口大小为 2^(n-1) 来测试选择重传协议 (SR)

① 发送窗口长度为 2^n-1 时

初始时,
发送窗口为 | 0 1 2 .... 2^n-2 | 2^n-1 0 1 2 ...
接收窗口为 | 0 1 2 .... 2^n-2 | 2^n-1 0 1 2 ...
根据最坏情况的定义
发送窗口为 | 0 1 2 .... 2^n-2 | 2^n-1 0 1 2 ...
接收窗口为 0 1 2 .... 2^n-2 | 2^n-1 0 1 2 ... 2^n-3 | 2^n-2 2^n-1 0 1 2 ...
最后一个可能丢失的确认帧为 ACK2^n-2,即接收端接下来要接受序号为 2^n-1 0 1 2 ... 2^n-3 的帧,2^n-1 的部分置于第一组,0 1 2 ... 2^n-3 置于第二组
由于没接收到确认帧,发送端将会重发 0 1 2 .... 2^n-2,它们都属于第一组
接收端接收到重传的序号为 0 1 2 .... 2^n-3 的属于第一组的帧,会将它们置于第二组,错误

可见,问题出现在发送窗口和接收窗口的重复
最坏情况下,尚未滑动的发送窗口,和滑动了一个窗口长度的接收窗口,总共是两个窗口的长度和
要是想要让发送窗口和接收窗口不重复,就要让这两个窗口的长度和不超过一个序号组的长度,也就是 2L≤2^n,得 L≤2^(n-1)

在这里插入图片描述

画图比较直观,但是严谨一点还是写一下

② 发送窗口长度为 2^(n-1) 时

初始时,
发送窗口为 | 0 1 2 .... 2^(n-1)-1 | 2^(n-1) 2^(n-1)+1 ... 2^n-2 2^n-1 0 1 2 ...
接收窗口为 | 0 1 2 .... 2^(n-1)-1 | 2^(n-1) 2^(n-1)+1 ... 2^n-2 2^n-1 0 1 2 ...
根据最坏情况的定义
发送窗口为 | 0 1 2 .... 2^(n-1)-1 | 2^(n-1) 2^(n-1)+1 ... 2^n-2 2^n-1 0 1 2 ...
接收窗口为 0 1 2 .... 2^(n-1)-1 | 2^(n-1) 2^(n-1)+1 ... 2^n-2 2^n-1 | 0 1 2 ...
最后一个可能丢失的确认帧为 ACK2^(n-1)-1,即接收端接下来要接受序号为 2^(n-1) 2^(n-1)+1 ... 2^n-2 2^n-1 的帧,置于第一组
由于没接收到确认帧,发送端将会重发 0 1 2 .... 2^(n-1)-1,它们都属于第一组
0 1 2 .... 2^(n-1)-12^(n-1) 2^(n-1)+1 ... 2^n-2 2^n-1 不重复,接收端接收到重发的序号为 0 1 2 .... 2^(n-1)-1 的帧时,认为这些帧的序号错误,因此接收端会重发 ACK2^(n-1)-1,直到发送端收到 ACK2^(n-1)-1,发送序号为 2^(n-1) 的帧让接收端收到,正确

2.1 例题

对于第 8 题,极端发送窗口最大尺寸就是使用后退 N 帧协议的时候,易得答案

在这里插入图片描述

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐