

接下来看第二个基于滑动窗口机制的协议叫做后退N帧协议,英文缩写叫GBN。GBN分别取了Go-Back-N的首字母。相比于停止等待协议,后退N帧协议有这样的一些不同。首先,在滑动窗口方面,后退N帧协议的发送窗口啊大小是大于一的,接收窗口的大小和停止等待协议一样,都是等于一。另外还有一个比较特殊的规则,就是关于确认帧,在停止等待协议当中,每一个数据帧都需要一次确认。但是在后退N帧协议当中,接收方可以累积确认,也就是连续收到多个数据帧的时候只返回最后一个帧的ACK。一会儿我们会用一个例子带大家感受这个特点。另一方面,关于超时重传的规则,也有一些不一样,如果说发送方超时没有收到i号帧的ACK。那么在后退N帧协议当中,会
要求重新传输i号帧以及i号帧之后的所有帧。同样的一会儿会用例子带大家感受,我们现在先建立起一个框架。
接下来我们先探讨滑动窗口和帧编号这两个问题,后退N帧协议规定发送窗口的大小要大于1。比如说我们可以取发送窗口的大小等于三,而接收窗口的大小等于1。如果我们要用n个比特给各个帧进行编号的话,我们必须满足发送窗口+接收窗口的大小小于等于二的n次方这个条件。对于这个例子来说,就是3+1要小于等于二的n次方,所以可以推出n要大于等于二,也就是说我们至少要用两个比特给帧编号。两个比特可以表示的编号就是0、1、2、3这几个数,我们会用这样的方式给各个帧进行编号。第一个帧是0号帧,接下来1、2、3,再往后一个帧又回到0号,1、2、3,接下来又回到0号,0、1、2、3。对于接收方来说,它的这些帧序号也是同样的规则。

接下来基于这样的条件,我们来看后退N帧协议是如何工作的?现在发送窗口框住了0、1、2这几个帧,所以发送方可以在信道上连续的传输这样的三个帧,接收方首先会收到0号帧,如果按照停止等待协议的规则,每当收到一个帧,接收方就需要返回这个帧的ACK,但是对于后退N帧协议来说,我们不需要给每一个帧都返回一个ACK。

接下来可以这么做,收到0号帧之后,接收方的滑动窗口向右滑动,并且准备好接收1号帧。现在1号帧也已经正确的接收,滑动窗口继续往右移动,现在收到了2号帧,那么在二号帧之后,信道上已经没有连续传输的数据了,此时接收方可以给发送方返回最后收到的这个帧所对应的确认帧,也就是ACK2,这就是所谓的累计确认机制。当接收方给发送方返回ACK_i的时候,表示他已经正确的接收到i号帧,以及他之前的所有其他帧了。对于刚才这个例子来说,返回ACK2意味着他已经收到2号帧以及二号帧之前的所有帧了,发送方收到这个确认帧之后就可以确认0号,1号,2号已被正确的接收。接下来发送窗口就可以向后移动。刚才我们举的这个例子是一种没有发生异常的情
况,发送方连续发送了三个帧,并且三个帧都被顺利的接收。




接下来我们看一种异常的情况,假设其中某一个数据帧丢失,我们应该如何处理?现在发送方的窗口框住了3、0、1这几个帧,首先发送3号帧,紧接着0号,最后是一号。这些帧的数据依次被发到信道上。那么第一个到达的帧肯定是3号帧,我们假设三号帧顺利到达,并且数据没有错误,可以被正确的接收,此时接收方的滑动窗口会向右移动,假设信道发生了一些故障,导致0号帧在中途丢失,或者我们也可以假设可以顺利的收到0号帧,但是在0号帧当中检测出差错,因此零号帧被接收方主动丢弃。反正不管是因为线路的原因,导致这个帧丢失,还是说接收方主动的丢弃了这个帧,接下来的处理都是类似的。后面的故事是这样的:零号帧丢失之后,一号帧还可以顺利的传到接收方这边,但是接收方检查这个帧的序号并没有落在接收窗口之内,我现在期待接收到的是零号帧,但现在我收到的是一号帧,这种情况下,我们肯定得拒绝接收1号帧,直接把它丢弃,与此同时接收方会给发送方返回最后收到的这个正确帧的ACK。目前收到的最后一个正确帧是3号帧,所以应该给发送方返回ACK3,让发送方知道这个三号帧之前的所有帧我都已经顺利的接受了。现在发送方收到ACK3 之后,它就可以让发送窗口往右移动一格。与此同时,由于迟迟没有收到0号帧、1号帧的确认信息,所以0号帧的计时器会超时,0号帧超时之后,发送方会把0号帧及其后面的所有帧都重新传一遍,虽然1号帧此时暂时还没有超时。但是既然接收方没有返回ACK0,就意味着0号帧有可能没有被正确的接收,在后退N帧协议当中。接收方只能顺序的接收各个帧,所以对于发送方而言,如果说0号帧超时了,就需要把0号帧及其后面的所有帧都统一的做重传的处理,0号帧和1号帧需要重传,而二号帧是第一次进行传输。讲到这儿我们就能理解为什么后退N帧协议要叫后退N帧了,之前发送方的这个发送窗口框住的是3、0、1这几个帧,3、0、1这几个帧原本都已经发给接收方了,但是现在由于0号帧超时,所以发送方不得不退回到0号帧,从零号帧再重新进行发送。由于需要退回到某一个帧重新进行发送,因此这个协议的名字叫做后退N帧协议。注意这个后退并不是指滑动窗口往后退,而是原本已经发送出去的这些帧需要退回来重新发一次,这样的特性也实现了流量控制。我们可以想象一下,如果发送方给接收方发送帧的数据太快而导致接收方来不及接收所有的帧已经发出,但是来不及接收的那些帧肯定迟早会超时。超时之后发送方又会把超时的帧以及后面的所有帧再重新发一遍。也就是说发送方给接收方发送数据的速率是被接收方所控制的。这就是后退N帧协议实现流量控制的原理。


接下来我们让故事继续,发送方重传了0号帧和1号帧,被重传的这些帧需要重置计时器。同时,新发送的2号帧也需要给它设置一个计时器,首先到达的是0号数据帧,收到这个帧之后,接收窗口可以向右滑动,与此同时1号帧、2号帧也顺利的到达并且顺利的被接收,接收窗口就可以到达3这个位置。在连续收到几个帧之后,接收方会把最后帧的ACK返回给发送方。最后帧的帧号是2,所以返回的就是ACK2,对于发送方而言,收到ACK2就知道2号帧以及前面的所有帧都已经被顺利的接收。因此发送方的窗口也可以继续往右滑动。



刚才这个例子当中,我们看到了在GBN协议当中,如果数据帧丢失,发送方和接收方会如何处理。接下来,我们看另一种异常的情况,我们看确认帧丢失的情况,我们把传输的过程退回到上图这一步。假设现在发送方已经给接收方发了两个数据帧,并且这两个帧已经被顺利的接收。紧接着发送方又发送了2号数据帧,同时这个帧也被顺利的接收。连续收到三个帧之后,接收方的窗口会向右滑动,与此同时会给发送方返回最后收到的正确帧,它的确认信息也就是ACK2。接下来出现了一点状况。假设确认帧在传输的过程中丢失了,这样的话,发送方就一直收不到ACK2,不
过好在发送方在每一个帧被发出的时候都会设置计时器。0号帧是最先被发出的,所以它的计时器会第一个超时,0号帧超时之后,0号帧及其之后的所有帧都需要重新发送。


所以接下来发送方会把0号帧,1号帧,2号帧全部进行重传。现在问题来到了接收方这边,接下来他会陆续的收到0号,1号,2号这几个帧。但是这几个帧落在了接收窗口之外,当接收方收到这种非法的帧的时候,会给发送方返回目前已经收到的最后一个正确帧的ACK。现在已经收到的最后一个正确帧,应该是2号帧,所以接收方会给发送方返回ACK2。接收方会把这些重复收到的帧直接丢弃,之前已经收到过了不用重新再接收。这一次返回的确认帧ACK2中途没有丢失,被发送方顺利的收到,发送方就可以知道在2号帧及其之前的所有帧已经被正确的接收。因此,它可以把滑
动窗口滑到3开始的位置。刚才的例子中,我们探讨了确认帧丢失的时候,发送方和接收方会怎么处理。

接下来我们探讨下一个关键的问题,无论是停止等待协议还是后退N帧协议,还是之后将要学习的选择重传协议,这三种协议都必须满足发送窗口加接收窗口小于等于2n这个条件,其中n指的是给帧进行编号的比特数。现在我们探讨一下后退N帧协议,如果不满足这个条件会有什么问题。我们假设使用两个比特给这些帧进行编号,发送窗口的大小我们调到4。发送窗口加接收窗口的大小已经大于二的n次方了,也就是不满足这个条件。在这种情况下,我们看会有什么问题。


现在假设发送方给接收方连续发送了0号、1号、2号、3号帧,因为这几个帧都落在了发送窗口之内,按照滑动窗口机制的规则,这几个帧都是可以发给接收方的。假设接收方这边也没有出现任何的问题,顺利的接收了0、1、2、3这几个帧。同时,接收方的接收窗口也滑动到了后一个帧,也就是0号这个位置。接下来问题发生了,接收方最后接收到的帧是3号,因此按照后退N帧协议的规则,接收方会给发送方返回最后帧的ACK,但是ACK3在传输的过程当中丢失了,对于发送方而言,永远收不到ACK3。发送方给每个帧都设置了计时器,由于0号帧是最先被发出的,所以0号帧的计时器会首先超时,0号帧超时之后发送方会把0、1、2、3这些帧全部再重新传输给接收方。

首先进行重传的是0号帧,现在问题发生了,接收方的接收窗口,它落在了0号这个位置。与此同时发送方给过来的帧,它的编号也等于0,刚好可以落在接收窗口之内,所以接收方会把这个帧的数据完整的接收下来,但是通过上帝视角,我们可以看到,发送方这次传过来的0号帧并不是他真正想接收的0号帧,而是对前面0号帧的重传。所以如果发送窗口加接收窗口的大小小于等于2n这个条件不满足的话,在传输的过程中,帧序号可能会错乱,导致发送方、接收方无法判别每一个帧序号真正对应的到底是哪一个帧。所以必须满足这样的条件,这个条件也十分重要,在历年真题当中,很多题目就是以这个条件作为解题的切入点。

这个小节当中,我们探讨了后退N帧协议,英文缩写叫GBN,后退N帧协议的发送窗口大于1,接收窗口等于1。发送窗口和接收窗口的大小相加要小于等于2n,这里的n指的是给帧进行编号的比特数。在后退N帧协议当中,确认机制有一些特殊的地方。我们不需要给每个帧都返回一个ACK,
我们可以采用累计确认的方式,当接收方收到连续的多个帧的时候,可以只返回最后一个帧的 ACK。所以对于发送方而言,当他收到ACK_i的时候,表示i号帧和i号之前的所有帧都已经被顺利的接收。除了确认机制之外,重传机制,后退N帧协议也会有一些特殊的地方。如果i号帧超
时,发送方除了重传i号帧之外,还需要重传i号帧之后的所有帧。这是后退N帧协议比较特别的两个地方。最后我们再总结一些后退N帧协议的要点。首先当接收方收到一个非法帧的时候,接收方会把这个帧给丢弃,非法帧是我的说法,官方并没有这样的术语。所谓的非法帧,指的就是落在了接收窗口之外的帧,或者落在窗口之内,但是被检测出差错的帧,反正就是有问题的帧,我们把它称为非法帧,接收方会丢弃这种非法帧,并且给发送方返回目前已经接收的最后一个正确帧的 ACK。对于发送方而言,收到ACK_i之后,就意味着i号帧,以及i号之前的所有帧已经被正确的接收。如果i号帧的后一个帧出现超时的情况,数据的发送方就需要后退回i+1号帧,这个帧以及后面的所有帧都重新发送,严格来说,我们不应该把它称为i+1 号帧,更准确的说法应该是i+1再对2的 n次方取余。我们知道用n比特给帧编号,那么帧的编号就会呈现出0、1、2、3,一直到2的n次方减1,然后再回到0、1、2、3,这是帧编号的一个规律,所以i号帧的后面一个帧,它的编号应该是 i+1,然后对二的n次方取余。这个地方大家能够理解i加一号帧指的就是i号帧,后面一个帧就可以了。这样的特性也使得后退N帧协议有一个明显的缺点。如果接收方接收帧的速度很慢,也就是说发送方连续发送了多个帧,但是接收方可能只来得及接收第一个帧,后面帧都来不及接收,对于发送方而言,后面这些帧迟早会超时,只要其中一个帧超时,发送方就需要把这个帧及其后面的所有帧都重新发一遍。当接收方收帧的速度很慢的时候,发送方的这个发送进度是不是就很有可能需要频繁的往后退,需要重复的传送很多帧,这样就会导致传输效率低下。另一方面,如果说信道的误码率很高的话,也会导致传输效率低下。同样的道理,发送方可以给接收方连续的发送多个帧,但是由于信道误码率很高,所以接收方收到的第一个帧,很有可能就会有差错,只要第一个帧有差错,后面帧都不可能被顺利的接收,因此发送方又需要退回到第一个帧,逐一的再重新发一遍。所以在信道误码率很高的情况下,也会导致后退N帧协议的传输效率非常低。这是后退N帧协议明显的一个缺点。在之后我们还会学习选择重传协议,在选择重传协议中,我们会尝试着,解决这种需要频繁后退的问题。
好的,大家可以再结合这一页的总结,再回顾一下后退N帧协议,以上就是这节视频的全部内容。
3239

被折叠的 条评论
为什么被折叠?



