3.4_4 选择重传协议(SR)

在这个视频中,我们探讨选择重传协议,选择重传协议和停止等待协议以及后退N帧协议有很多相似的方面。选择重传协议的英文缩写叫SR(Selective Repeat),它的滑动窗口大小有这样的特点,首先发送窗口和接收窗口都要大于一。其次,它在滑动窗口上有一个特殊的要求,就是接收窗口不能比发送窗口大,一会儿我们再解释为什么要这么规定。另一方面和停止等待协议、后退N帧协议类似,如果我们用n个比特给帧进行编号,必须满足wt+wr小于等于2的N次方这样的条件。另外在确认机制方面,首先由于选择重传协议的发送窗口的大小是大于一的,所以发送方可以连续的给接收方发送多个帧。在后退N帧协议当中,接收方如果连续接收到多个正确帧,可以采用累计确认的这种方式,也就是只返回最大的正确帧的帧号就可以。对于选择重传协议来说,它并不支持累计确认的方式,必须每收到一个正确帧,就返回一个ACK,这一点是选择重传协议和后退N帧协议不同的地方。另一方面,在选择重传协议当中,如果数据的接收方收到的帧检测出差错,接收方会丢弃这个帧,并且给发送方返回否认帧,用否认帧NAK主动的去请求发送方重新发送i号帧。这一点也是选择重传协议和之前的两个协议不同的地方。之前学习的两个协议在重传机制方面只有超时重传这种规则,也就是发送方超时没有收到ACK_i的时候,再重传i号帧,而选择重传协议当中,这个重传机制除了支持超时重传这种规则之外,还支持请求重传,就是会由数据的接收方主动的用 NAK这种否认帧请求发送方去重传i号帧。这样的话,发送方就不用等到超时再进行重传,可以让重传的效率啊,进一步的得到提升,这是选择重传协议的一些要点。接下来,我们会结合一些例子,带大家感受这些要点。

首先,我们来探讨选择重传协议的窗口大小的限制条件。假设我们用三个比特给这些帧进行编号,这些帧的编号就是先从0到7,然后再回到0,在选择重传协议当中,窗口大小的限制有这样的两个条件必须满足。首先第一个条件,如果用n个比特给帧编号,发送窗口和接收窗口的这个总大小
要小于等于2的n次方,第二条件,接收窗口的大小要小于等于发送窗口的大小。对于刚才给的例子,如果我们用三个比特给帧编号的话,我们可以取发送窗口大小等于4,接收窗口的大小等于3,二的三次方等于八,满足第一个条件,发送窗口和接收窗口的大小之和小于等于八。同时也满足第二个条件,接收窗口要小于发送窗口,如果这么设计,就符合选择重传协议的窗口大小的两个限制条件。接下来假设把接收窗口的大小改为4,此时同样满足条件一和条件二,这种设计也是合理的。再接下来,如果我们把发送窗口的大小改为三,此时不满足条件二,接收窗口必须小于或者等于发送窗口的大小。由于不满足第二个条件,所以这样的设计是不被允许的。

为什么要规定接收窗口一定要小于或等于发送窗口?回到上图这个例子,接收窗口等于三发送窗口等于四,在这种情况下,发送方显然可以连续的发送四个帧,接收方在接收到第一个帧的时候,它的接收窗口就可以往右滑动了,只要往右滑动一格,接下来后面的这三个帧陆续到达,也可以被顺利的接收,这是接收窗口小于发送窗口的情况,我们可以充分的利用发送窗口和接收窗口的容量。

再回到上图这个例子,在这个例子当中,接收窗口要比发送窗口更大,在这种情况下发送方最多只能给它先发三个帧,接收方连续接收到这三个帧之后,他又会给发送方依次返回这三个帧的ACK,确认的信息,只有发送方接收到这些确认信息之后,发送方的窗口才可以向右滑动,只有窗口向右滑动,它才可以继续发送后一个,也就是三号帧,所以在刚才这个例子中,我们可以感受到,如果接收方的窗口大于发送方的窗口,那么接收方更大的这些格子,它就会长期保持为空,利用率不高。所以如果接收窗口大于发送窗口的话,这两个窗口的性能就没办法得到完全的发挥。所以在选择重创协议当中,我们必须满足第一个条件和第二个条件。

在实际应用当中,选择重传协议的发送窗口和接收窗口通常会取相等的这种情况。比如说用三比特给帧编号,我们可以取发送窗口和接收窗口的大小都等于四,在这种情况下,两个窗口相互配合效率会更高。

接下来我们用几个事例来感受选择重传协议的工作过程。发送窗口和接收窗口的大小都等于四,此时发送方可以给接收方连续的发送0号,1号,2号和3号这几个帧,接收方会陆续的收到这几个
帧,并且要给发送方返回这几个帧的ACK,同时接收窗口可以向右滑动。接收方每收到一个正确帧,都要给发送方返回这个正确帧所对应的ACK,相比之下,在后退N帧协议当中,接收方可以累积确认,如果是后退N帧协议,像刚才这种情况,连续收到0、1、2、3这几个帧的话,后退N帧协议只返回ACK3,两种协议的确认机制是有一些区别的。

让故事继续,发送方接下来会陆续的收到ACK0、1、2、3,确认了这几个帧都已经被正确的接收之后,发送方的发送窗口就可以向右滑动。接下来发送方就可以发4、5、6、7这几个帧。

下面我们看一种异常情况的处理,假设在接下来发送过程当中产生了数据帧的丢失,假设接下来发送了4、5、6、7这几个帧,每发送一个帧会给这个帧设置计时器,假设其中的5号帧因为通信线路的故障而丢失了,这样的话,接收方就只能接收到4、6、7这几个帧,收到这几个帧之后,接收方的接收窗口可以向右滑动一格,与此同时把4、6、7这几个帧的ACK返回给发送方,发送方接下来会收到4、6、7的ACK,在这种情况下,发送窗口只能往右滑动一格,因为5号帧此时还没有被正确的接收。

此时由于0号帧已经在发送窗口之内,所以可以发送0号帧,并且设置0号帧的计时器,随着时间的推移,5号帧迟迟没有收到ACK,所以五号帧的计时器会超时,在这种情况下,发送方会重传5号帧,并且重置5号帧的计时器,接下来接收方就可以收到0号帧和5号帧,并且顺利的把这两个帧接收,现在接收窗口可以向右滑动,与此同时接收方给发送方返回ACK0和ACK5,这一次ACK0和 ACK5 都可以在超时之前被发送方收到。确认这两个帧被接收之后,发送窗口就可以继续向右滑动。刚才这个例子当中展示了数据帧丢失的时候选择重传协议会如何处理,主要就是依靠超时重传机制,每个帧被发出的时候都会设置一个计时器,如果计时器超时还没有收到对应的ACK,就重传这个帧,这是数据帧丢失的处理。

接下来看另一种情况,我们退回到前面这一步,接下来我们假设接收方可以收到数据帧,但是由于检测出数据帧的错误,而把数据帧主动的丢弃,在这种异常情况下,选择重传协议又是如何处理的呢?在这个图示当中,现在发送方可以连续的传输4、5、6、7这几个帧,并且每个帧被发出的时候都会设置一个计时器,现在假设所有的帧都可以被接收方收到,但是5号帧因为检测出差错而被接收方丢弃,此时接收窗口只可以往右移动一格,与此同时,接收方会给发送方返回4号、6号、7号帧的ACK,以及五号帧的NAK,NAK指的是否认帧,就是告诉发送方说5号帧出问题了,重新传一个,就是这样的作用。NAK是Negative,Acknowledge是确认的意思,Negative是否定、负面的意思,英文缩写取了NAK这几个字母。

接下来发送方会陆续的收到4号帧的确认、5号帧的否认和6号、7号帧的确认,当收到4号帧的确认之后,发送窗口就可以向右滑动一格,与此同时,由于收到5号帧的否认,所以发送方会在这个计时器超时之前,主动的把5号帧重传一遍,重传5号帧的同时也会重置五号帧的计时器,与此同时,由于发送窗口刚才已经向右滑动了一格,所以0号帧此时也落入了这个发送窗口之内,因此0号帧也可以紧接着被发出,发出号0帧的同时,也要设置0号帧的计时器。

接下来接收方可以顺利的收到5号帧和0号帧,这一次重新收到5号帧之后,我们假设并没有检测出差错,5号帧就可以被正确的接收。在这种情况下,接收窗口就可以向右滑动四格,由于是先收到五号帧,所以会先返回五号帧的ACK,紧接着收到0号帧,再返回0号帧的ACK,发送方收到ACK5 之后,滑动窗口可以向右移动,在收到ACK0之后,滑动窗口可以继续往后移动。刚才这个例子当中,我们展示了,如果数据帧因为出现差错而被主动丢弃的时候会进行的处理。

 

在选择重传协议当中,除了超时重传机制之外,还引入了请求重传机制。如果接收方发现一个有差错的帧,除了丢弃这个帧之外,还会主动的给发送方返回这个帧的NAK,主动的去请求发送方重传这个i号帧,这样的话,发送方就不必等到计时器超时再重传,而是收到否认帧就立即重传,这样的话就可以提升选择重传协议的效率。

接下来我们再看第三种异常的情况如何处理。我们假设在接下来的例子当中确认帧有可能会丢失。

回到最初的起点,现在发送方可以连续发送0号、1号、2号、3号帧,接收方也可以顺利的陆续收到这几个帧,根据收到这些帧的顺序,接收方会给发送方陆续的返回ACK0、ACK1、ACK2和ACK 3,现在情况发生了,假设ACK1和ACK3因为通信故障而半路丢失了,发送方就只能收到ACK0和 ACK2,在这种情况下,发送方的发送窗口只能往右滑动一格,往右滑动之后,现在四号帧又落入了发送窗口之内,所以可以发送四号帧,与此同时,如果1号帧和3号帧的这个计时器超时了,发送方就会重传1号帧和3号帧,重传的同时也会重置这两个计时器,回到接收方这边,首先接收方收到了4号帧,4号帧刚好也落在接收窗口之内,所以4号帧可以被正确的接收,并且会给发送方返回 ACK4,与此同时,接收窗口可以再向右滑动一格,紧接着接收方还会收到1号和3号数据帧,由于这两个数据帧落在了接收窗口之外,所以接收方会认为这两个数据帧肯定是重复的,收到这种重复帧的时候,接收方会给发送方返回这两个重复帧的ACK。这一次确认帧并没有在中途丢失,所以发送方可以顺利的收到ACK4、ACK1和ACK3。此时发送窗口就可以往右滑动,刚才我们探讨了确认帧丢失的时候选择重传协议是如何处理的。首先,确认帧丢失会引起发送方超时重传,超时重传之后,又会导致接收方收到重复帧,接收方判别重复帧的这个方法就是看这个帧是否落在了接收窗口之外,如果在接收窗口之外,就说明它肯定是一个重复帧,每收到一个重复帧,接收方就会给发送方再一次返回这个重复帧的ACK,用这样的方式就可以解决确认帧丢失的问题。

接下来探讨窗口的大小如果不满足条件会有什么问题。假设帧序号是三个比特,我们让发送窗口等于5,接收窗口等于4,二者之和大于8,也就是不满足条件,在这种情况下,我们看会发生什么。

首先,发送方可以给接收方发送0、1、2、3、4这几个帧,接收方首先会收到0号帧,只要0号帧被正确的接收,接收窗口就可以向右滑动一格,与此同时,给发送方返回ACK0,接下来1、2、3、4这几个帧也会陆续的到达,接收方也会陆续的接收到这几个帧,与此同时,接收窗口向右滑动,滑到5这个位置。

接下来意外发生了,假设因为通信故障ACK0到4全部都丢失了,发送方这边0、1、2、3、4这几个帧的计时器会陆续的超时,超时之后,它又会重传0号,1号,2号,3号,4号帧,此时0号帧的重传就出现了问题,按照刚才这个例子,我们接收窗口往右滑动之后,0号是在接收窗口之内的,所以当接收方收到0号帧的时候,会认为这个0号帧是合法的,并不是重复帧,此时接收方就会错误的接收0号帧,对于1、2、3、4这几个帧,是落在了这个接收窗口之外,所以接收方会认为这几个帧是重复帧。回到刚才这个问题,如果不满足这个条件,就会导致发送方和接收方无法正确的判别哪些是重复帧,这就是必须要满足这些条件的原因。

在这个小节中介绍了选择重传协议,和停止等待协议、后退N帧协议有很多相似的地方,比较特别的点,用红色的这种框给它框起来了。选择重传协议的确认机制比较特别,当接收方收到正确帧的时候会返回这个帧的ACK,而当接收方收到一个错误的、有差错的帧的时候,会返回NAK否认帧,用NAK否认帧来主动的请求发送方重传对应的i号帧。另外在选择重传协议当中,要注意接收窗口不能大于发送窗口的大小,选择重传协议最需要注意的要点就是刚才说的NAK否认帧,用NAK来主动的请求重传。另外选择重传协议,不支持累计确认,必须一帧一确认,这点是和后退N帧协议不一样的,这就是选择重传协议。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋悠然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值