数据链路层的差错控制ARQ

        本文重点介绍了差错控制以及自动重发检错ARQ。

        差错控制时链路层一个非常重要的功能,链路层需要在不太可靠的物理层来尽量实现可靠的链路层传输,靠的就是差错控制。所谓差错控制,就是对传输的数据信息进行错误检测,并加以恰当的处理。这其中就包含了多个方面,比如说正确接收数据,检错能力和纠错能力等等。检错能力是指接收方通过各种方法能发现数据中的错误并且通知发送方进行重传该信息,纠错是指当发现错误地时候直接能够改正,而不是通过反馈给发送方进行重发。

        传输出错分下面几种情况:数据丢失,数据出错,以及确认的丢失和损坏等等,如下图所示:



        那么和上面错误对应的就是差错控制的功能:1.肯定确认,这个是最基本的情况,只要接收端认为自己收到数据是对的,就发送一个ACK告知发送方。2.超时重发 这个对应的是发送数据和确认丢失的情况。3.否定确认 这个用于数据错误之后的重发   通过以上情况考虑,设计出来的协议就是差错控制的基本方法,也就是大名鼎鼎的ARQ(自动重发检测)。

        那么ARQ的原理是:发送方根据被传送的数据信息,按一定规律加入一些校验码位,使数据信息和校验码有某种相关性,然后一起发送到接收方。接收方根据数据信息与校验码之间的相关规律进行检验,从而确定接收的信息是否出错,并通过反馈信息把检测结果反馈给发送方。接收方正是通过加入的校验码来发现是不是有错误,从而具备检错能力。

        校验码有很多种,比如说汉明校验码,以及CRC循环校验码,网上这类的资料很多,所以在这里就不再赘述了。校验码是检测出帧有没有错误,而整个ARQ不仅包含了检错,还有错误处理等一些列过程,这个不能混淆了。

        ARQ一共分成三种,停等式ARQ,回退n-ARQ以及选择重传ARQ。

        1.停等式ARQ:发送方仅仅收到当前帧的肯定确认之后才能发送下一帧。在正常情况下,停等式ARQ只需要给帧编号为0和1即可,接收方接收到F0之后,如果无误则发送ACK 1表示准备好接收F1了,如果接收到F1且校验无误则发送ACK0表示准备好接收F0了。这是无错的情况,有错误地情况如下:

        ①数据帧丢失:数据帧丢失,那么发送方发送之后接受方收不到数据,自然也不会有回应。发送方发送之后就启动计时器,当计时器超时,那么它就要重发。所以对于停等式协议,他一定要有缓存区存放自己发送的消息。

        ②数据帧错误:假设F0错了,那么接受方通过CRC校验发现数据帧有误,那么就丢弃该帧。发送方超时之后,就重新发送这一帧。


        ③确认帧丢失/损坏:发送方如果没有收到确认帧,超时之后同样再次发送刚才发送的帧,因为他会认为自己的帧丢失了。损坏的处理方式相同,因为发送方不知道接收方是不是正确接收了,所以仍然重发。如下图:


        停等式ARQ,就像我之前文章分析的停等式流量控制,优点是操作简单,但是存在的问题是效率低。因为任何时候都只能有一个帧再信道发送,所以信道存在大量空闲,在当前网络情况下,效率那么低下是不可以忍受的,所以同样也借用了滑动窗,也就是回退nARQ和选择重传ARQ。

        既然一次只发送一个,那么不用序号行不行?答案是不行。我们可以考虑这样一种情况,0帧成功发送,成功接收,发送方发送了ACK1.但是这个肯定确认ACK1却丢失了,发送方超时再次发送了0帧,但是接收方因为没有序号,只能认为这个是下一个帧,即帧1,因为他不知道自己确认帧丢了导致发送方重发,所以就造成错误了。

        2.回退nARQ

        发送方连续发出N个帧,接收方以流水线方式按照序号顺序接收各个帧,并进行差错检测。一旦某个帧有错,则丢弃该帧和它之后所收到的所有帧。这里要注意的是,接收方只能按照序号顺序接收帧,这与之后的选择重传ARQ不太一样,选择重传ARQ的性质就决定了自己一定有能力接收乱序的帧,这个一会再说。回退nARQ的原理图如下所示:


        他对于不同情况的处理如下:

        ①对于正确的数据帧,假设前i-1帧都对了,接收方发送RRi表示前i-1帧都对了,准备接收第i帧和之后的帧。

        ②数据帧损坏:接收方发回REJi,表示第i帧损坏,要求重传i帧以及之后的帧。发送方收到REJi,回退到第i帧,重新发送这一帧和之后的帧。

        ③数据帧丢失:(1)只有i帧丢失,i+1之后都没丢:那么接受方发现顺序错误了(回退nARQ只能按顺序接收),那么返回REJi,要求重传第i帧。

                                  (2)i帧是最后的帧:那么接受方首先超时,发回一个RR帧,要求重发第i帧。

        ④肯定确认帧丢失/损坏:假设i-1帧收到之后,收方发送RRi要求发第i帧,结果这个RRi丢失或者损坏了,那么发方会超时,发方会向收方发送一个RR表示询问,确认是不是已经收到了。如果接收方接到RR那么就会重发RRi。但是如果发方的RR也丢失了或者损坏,收方收不到,那么发方超时,发送方再次发送RR,循环到一定次数,就重启整个发送过程。

        ⑤REJ否定确认损坏:和④相同,把RRi换成REJI就可以了。

        回退n协议特点是:接收方只存放一帧大小的缓冲区(可以理解为接收窗的窗口大小为1;并且发送方必须有能存放着n个帧大小的缓存,以便重发。它的优点是消除了停等协议ARQ的等待应答时间,效率变高。但是它的缺点非常明显:即使只有某一帧出错,但是这一帧和之后的帧全都需要重发,尤其是假设第一帧出错了,后面n-1帧全部“连坐”。这也会造成低效率与信道浪费,所以解决办法就是选择重传ARQ.

        3. 选择重传ARQ:一次连续发送N个帧,当接收方发现其中有错帧时就给发送方反馈要求重发帧的序号,其余(N-1)个正确帧被接收方存储起来。它要求接收方必须有能力缓存n个帧,并且它可以接收乱序的帧。它的优点就是不需要重传其他的帧,信道利用率高,但是缺点就是实现复杂,要求接收方有足够的空间。我们看这张图:



        发送方按照顺序发送帧序列,对于没有错的帧,接收端反馈ACKi。那么对于有错误的帧,假设第j帧出错,那么收端反馈NAKj表示第j帧出错,那么发端就只是重发第j帧。收方于是也照常接收其他帧,当收到其他帧之后可能又收到第j帧,这时他意识到这时重传的,所以他就接收了这个帧,并且按照正确的顺序排好了。

        从上面三种ARQ的原理可以知道,越精确,越复杂。想设计出一个协议,需要全方面考虑到各种可能出现的情况,确保万无一失才行啊。

        至于怎么看出来一个帧有没有错,目前最常见的方法是CRC循环校验码,这部分就不说了,网上资料很多。但是我觉得我这篇文章可以和我的上一篇文章一起来看,方便理解,就是《数据链路层的流量控制》那一篇,因为两者是相通的,都涉及到停等,滑动窗等思想。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值