Go-Back-N协议和Selective-Repeat协议是计算机网络在传输层和链路层用于实现可靠数据传输的两个重要协议。Internet的TCP协议在设计时借鉴了上述两个协议的基本思想。
回退N步(GBN)协议也称为==滑动窗口协议==,通过控制窗口的大小来控制发送方发送的速率,并且在滑动窗口这个机制的前提下,能够为数据的可靠传输做出保证
协议的名字”回退N步“来源于出现丢失和时延过长分组时发送方的行为。对于这些情况,发送方可能会重新发送对应的分组
我们知道,为了区分不同的分组,我们为这些数据分组都进行编号。
在GBN协议中,根据当前发送方传输的情况对一些特别位置进行特殊的命名:
基序号(base):定义最早未确认分组的序号
下一个序号(nextseqnum):定义最小的未使用序号
下图是GBN中发送方看到的序号:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aLFHGj48-1660904058540)(D:\note\笔记仓库\图片\20200220164803465.png)]](https://1000bd.com/contentImg/2024/03/29/3c5dc4130a97ae77.png)
如上图所示,将序号范围分成了四段:
上述那些已被发送但未被确认的分组以及即将发送的分组的==许可范围==就可以被看成是一个序号范围内长度为N的窗口。即为我们常说的滑动窗口,这个窗口会随着协议的运行,会在序号空间内不断的向前滑动
窗口长度可根据接收方接收和缓存报文的能力、网络中的拥塞程度或两者情况来进行设置
有利于理解的知识点:在实践中,分组的序号是承载在分组首部的一个固定长度的字段中。所以序号的大小是有限制的,如果字段长度为k,那么序号的范围就是【0,2k - 1】。所以,对于一些过长的序号就必须进行模2k 运算
下面是GBN协议中发送方和接收方的流程:
GBN发送方必须响应的三种类型的事件
GBN接收方响应型的事件
如果一个序号为n的分组被正确接收到,并且按序(即上次交付给上层的数据的序号为n - 1),则接收方为分组n发送一个ACK,并将数据部分交付给上层。其它情况所有情况(例如序号没有按序)都会丢失该分组(这是和SR协议不同的地方)
思考,只要收到的分组不是按序的就会丢失效率会不会太低?
假如现在发送了分组序号为1……n、n+1的分组,假如n+1的分组先于n的分组收到,那么根据前面所说会就会丢弃序号为n + 1的分组,这样就效率太低了✖
对此,GBN协议的处理方式接收方可能会缓存分组n + 1,等到分组n收到并交付后,再将该分组交付到上层。然而,如果序号为n的分组丢失,那么它们就只能根据GBN的重传规则进行重传了。。
GBN协议中,发送方需要维护窗口的上下边界以及nextsequnum再该窗口的位置。
而接收方需要维护的唯一信息就是下一个按序接收的分组的序号,保存在expectedseqnum变量中
下面这张图给出了窗口长度为4个分组的GBN协议的运行情况(网上找的图):

可以发现:2号分组在发送的过程丢失了,在后面发送分组4和分组5的时候,接收方发现了序号没有按序,所有就丢掉了接收的报文。直到发送方重传2号分组后,才正常的接收了后面的分组。
对于GBN协议,虽然它解决了停等协议的信道利用率过低的问题,但是它还是存在一定的性能问题的。例如如下场景:
当窗口长度和带宽时延积都很大时,或者流水线中有很多分组时。单个分组的差错就可能会引起大量的GBN重传。
为了解决GBN协议中出些单个分组的差错时就可能会引起大量的重传的情况。SR协议只会重传那些发送方认为在接收方出现差错的分组,避免了不必要的重传,极大的提升了效率。
除了上述的不同外,SR协议在收到失序分组时也于GBN不同:
下面这张图显示了SR的操作:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xp9J5wPv-1660904058542)(D:\note\笔记仓库\图片\image-20220819170344465.png)]](https://1000bd.com/contentImg/2024/03/29/aaeb58d07e230005.png)
由上图所示:分组2第一次发送时丢失,但是接受方接受了分组3、4、5,但是注意到此时接受方并没有交付数据给上层,直到发送方超时重传分组2后,接收方成功收到,才叫全部分组交付给上层。
了解完大致流程后,下面我们再来详细说说SR接受方和发送方的事件与动作:
SR发送方的事件与动作:
SR接收方的事件与动作:
下面分别是GBN和SR协议丢失分组的情况的动图
主要观察以下两方面的区别:接收方接收到失序分组后如何处理的区别、发送方超时重传的区别
回退N步

选择重传

GBN协议使用累积确认,其中发送方有缓冲区而接收方没有;发送方同时对封装的包进行计时。
SR协议的接收方对每个包都发送一个单独的ACK,发送方和接收方都有一个缓冲区,发送方为每个未封装的包维护一个计时器。
SR协议比GBN协议更有效。GBN协议,当窗口大小和带宽的乘积延迟很大,一个数据包在错误可能导致GBN重新发送大量的数据包,而在SR协议,许多正确的数据包的顺序在这个过程中不需要重传。
| 协议 | sender buffer | 接受端buffer | 数据分组计时 | 是否接收正确的乱序package | 采用累积确认 |
|---|---|---|---|---|---|
| GBN | 是 | 否 | 同步计时 | 否 | 是 |
| SR | 是 | 是 | 独立计时 | 是 | 否 |
本文参考:《计算机网络 自顶向下方法》
GBR回退N步演示网站
SR选择重传演示网站
Go-back-N(GBN)协议&选择性重复(SR)协议的区别