Go-Back-N协议和Selective-Repeat协议是计算机网络在传输层和链路层用于实现可靠数据传输的两个重要协议。Internet的TCP协议在设计时借鉴了上述两个协议的基本思想。
回退N步(GBN)
回退N步(GBN)协议也称为==滑动窗口协议==,通过控制窗口的大小来控制发送方发送的速率,并且在滑动窗口这个机制的前提下,能够为数据的可靠传输做出保证
为什么要叫“回退N步”协议?
协议的名字”回退N步“来源于出现丢失和时延过长分组时发送方的行为。对于这些情况,发送方可能会重新发送对应的分组
我们知道,为了区分不同的分组,我们为这些数据分组都进行编号。
在GBN协议中,根据当前发送方传输的情况对一些特别位置进行特殊的命名:
-
基序号(base):定义最早未确认分组的序号
-
下一个序号(nextseqnum):定义最小的未使用序号
下图是GBN中发送方看到的序号:
如上图所示,将序号范围分成了四段:
- 【0,base - 1】:已经发送并且被确认的分组
- 【base,nextseqnum - 1】:已发送但未被确认的分组
- 【nextseqnum,base + N - 1】:即将被发送的分组
- 【base + N,---------】:现在还不能够使用的分组
上述那些已被发送但未被确认的分组以及即将发送的分组的==许可范围==就可以被看成是一个序号范围内长度为N的窗口。即为我们常说的滑动窗口,这个窗口会随着协议的运行,会在序号空间内不断的向前滑动
窗口长度可根据接收方接收和缓存报文的能力、网络中的拥塞程度或两者情况来进行设置
有利于理解的知识点:在实践中,分组的序号是承载在分组首部的一个固定长度的字段中。所以序号的大小是有限制的,如果字段长度为k,那么序号的范围就是【0,2k - 1】。所以,对于一些过长的序号就必须进行模2k 运算
下面是GBN协议中发送方和接收方的流程:
GBN发送方必须响应的三种类型的事件
- 上层的调用:当上传调用发送数据的事件时,首先会检查发送窗口是否已满:
- 窗口未满:产生一个分组并将其发送,并更新变量nextseqnum
- 窗口已满:发送发只需要将数据返回给上层,隐式的指示上层该窗口已满,然后上层可能过一会再试。在实际实现中,发送方更可能会缓存这些数据,并在之后尝试发送。或者就直接使用同步机制仅当窗口不满时,上层才能够调用发送事件。
- 收到一个ACK:在GBN协议(与SR协议不同)中,对序号为n的分组的确认采用==累积确认==的方式,这表明接收方在接收到序号为n的分组确认后,表示在序号为n以前包括n的所有分组已经正常发送到接收方
- 超时事件:如果出现超时,发送方会重传所有已发送但未被确认的分组。(这里注意只有一个对应的超时重传计时器)
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重传。
选择重传(SR)
为了解决GBN协议中出些单个分组的差错时就可能会引起大量的重传的情况。SR协议只会重传那些发送方认为在接收方出现差错的分组,避免了不必要的重传,极大的提升了效率。
除了上述的不同外,SR协议在收到失序分组时也于GBN不同:
- SR接收方将确认一个正确接收的分组而不管其是否有序(GBN必须得有序),失序的分组将被缓存直到所有的丢失分组(即序号更小的分组)皆被收到为止,才可以将这一批分组按序交付给上层。
下面这张图显示了SR的操作:
由上图所示:分组2第一次发送时丢失,但是接受方接受了分组3、4、5,但是注意到此时接受方并没有交付数据给上层,直到发送方超时重传分组2后,接收方成功收到,才叫全部分组交付给上层。
了解完大致流程后,下面我们再来详细说说SR接受方和发送方的事件与动作:
SR发送方的事件与动作:
- 从上层收到数据:与GBN相似,SR发送方首先会检查下一个用于该组的序号是否在滑动窗口内,如果在,直接打包。如果不在,要么缓存要么将数据返回给上层,过一段时间后再传输
- 超时:超时就会重传对于的分组。(这里主要因为是要单独传送分组,所以每个分组都拥有一个自己的逻辑定时器)
-
收到ACK:收到的ACK可能的位置有以下两种情况:
- 分组序号在窗口内,SR发送方将被确认的分组标记为已接收
- 分组序号等于send_base,则窗口基序号移动到最小序号的未确认分组处。如果移动过程中有序号落在了窗口内的未发送分组,则发送这些分组
SR接收方的事件与动作:
- 序号在【rcv_base ,rcv_base + N - 1】内的分组被正确接收。说明落在接收窗口内,将会返回ACK,如果分组以前没有收到过,缓存该分组。如果序号等于接收窗口的基序号,那么会向上交付当前缓存的分组序号,然后接收窗口向前滑动。例如上图接收到分组2后,向上交付之前在缓存中的分组3、4、5
- 序号在【rcv_base - N,rcv_base - 1】内的分组被收到(表面这个分组已经被接收过了),那么会产生一个ACK返回。(具体原因是接收方和发送方的窗口并不总是一致的,如果不发送ACK给接收方,那么发送方的窗口可能会无法向前移动,这里很好理解我就步详细说明了)
- 其它情况,忽略分组
下面分别是GBN和SR协议丢失分组的情况的动图
主要观察以下两方面的区别:接收方接收到失序分组后如何处理的区别、发送方超时重传的区别
-
回退N步
-
选择重传
主要区别
-
GBN协议使用累积确认,其中发送方有缓冲区而接收方没有;发送方同时对封装的包进行计时。
-
SR协议的接收方对每个包都发送一个单独的ACK,发送方和接收方都有一个缓冲区,发送方为每个未封装的包维护一个计时器。
1 接收缓冲区
- 对于GBN协议,由于它丢弃了接收端窗口内所有无序的数据包,所以不需要有一个缓冲区来存储接收端窗口内的无序数据包。接收端窗口大小为1。
- 对于SR协议,由于避免了重传许多不必要的数据包,所以接收端需要对无序的数据包进行缓冲,其中窗口大小为N。
2 实现的复杂性
- GBN协议采用累积确认的方法。因为接收方是按顺序接收数据包的,所以任何错误到达的数据包都将被接收方丢弃。
- SR协议避免了GBN协议以同时设置发送方窗口和接收方窗口大小相同为代价,重传到达接收方的正确数据包。所以基本上,SR协议比GBN更复杂,因为SR协议的接收者需要一个缓冲区来确认是否正确地接收了包,不管它是否有序。
3 网络效率
SR协议比GBN协议更有效。GBN协议,当窗口大小和带宽的乘积延迟很大,一个数据包在错误可能导致GBN重新发送大量的数据包,而在SR协议,许多正确的数据包的顺序在这个过程中不需要重传。文章来源:https://www.toymoban.com/news/detail-442943.html
- 用表格的形式来列举两种协议的区别:
协议 | sender buffer | 接受端buffer | 数据分组计时 | 是否接收正确的乱序package | 采用累积确认 |
---|---|---|---|---|---|
GBN | 是 | 否 | 同步计时 | 否 | 是 |
SR | 是 | 是 | 独立计时 | 是 | 否 |
本文参考:《计算机网络 自顶向下方法》
GBR回退N步演示网站
SR选择重传演示网站
Go-back-N(GBN)协议&选择性重复(SR)协议的区别文章来源地址https://www.toymoban.com/news/detail-442943.html
到了这里,关于SR和GBN的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!