(十六)数据链路层——差错控制

前言

这一节的内容,和上两节的内容是联系在一起的。通过差错检测,检测出的错误,需要配合流量控制的方法,进行差错的处理。

对于数据帧产生的错误,不论是帧丢失,还是帧损坏,通常不会自己纠错,而都会采用自动重传的机制进行差错控制,这个过程叫做自动重传请求(ARQ)

那么,在接收方如果出现了帧丢失的话,接收方怎么才能让发送方知道发生了丢失,请求发送方重传数据帧呢?

其实,发送方在发送出去一帧以后,就会启动一个重传定时器如果在定时器时间到之前,收到了来自接收方的确认帧,那么发送方就会发送下一帧,定时器重新开始计时。如果在定时器时间到之前,没有收到来自接收方的确认帧(可能是数据帧在传输过程中丢失了,接收方根本就没收到这个帧;也有可能是数据帧正确到达了接收方,但是接收方返回的确认帧在传输过程中丢失了),这两种请况都会使发送方的定时器到期之前,收不到对方的确认。这时,发送方就会因为定时器超时而重传数据

只不过,如果是数据帧正确到达了接收方,但是接收方返回的确认帧中途丢失了的话,发送方定时器超时重传,那么接收方不就会收到两个一模一样的重复帧了吗。这时候,只要接收方判断出来帧重复以后,就会明白,这是它返回给发送方的确认帧丢失了。然后接收方就会把重复帧丢弃掉,再次给发送方返回确认帧。

如果接收方这里出现了帧损坏的话,接收方会有两种处理方法,一是直接给发送方发送否认帧,发送方看到否认帧之后,就会立即重传一遍这个帧;二是接收方直接把坏帧丢弃,别的什么也不做,等着发送方的定时器超时,发送方就会自动再重传一份过来。

一般情况下,差错控制和流量控制是结合在一起的。我们知道,流量控制的两种方法:停止等待、滑动窗口。

ARQ和停止等待相结合使用,叫做停等ARQ。ARQ和滑动窗口相结合使用,叫做连续ARQ。

 

停等ARQ

在停等ARQ方式中,由于是使用了停止等待的原理,发送出去一帧以后,要等待接收方的确认,才能继续发送下一帧。因此,接收方正确收到了数据帧后,要返回一个确认帧。但是,需要注意的是,这个确认帧表达的意思是一个期望,也就是说期望收到下一帧

举个例子说明一下:发送方发出0号帧,接收方正确接收之后,要向发送方返回ACK1,ACK就代表确认,而数字1代表着0号帧已经正确接收了,期望收到1号帧。发送方看到ACK1之后,就明白了,接收方想要得到1号帧,那么就把1号帧发送过去,如果接收方正确接收了1号帧,就返回一个ACK0,期望收到下一个0号帧……

如果接收方收到1号帧后,通过差错检测,检测出这个帧在传输过程中出错了,那么,这时候它就仍然返回ACK1,要求发送方重传1号帧。

下面我们来看四个图,分别代表着四种在停等ARQ中可能发生的情况:

(十六)数据链路层——差错控制(十六)数据链路层——差错控制

(十六)数据链路层——差错控制(十六)数据链路层——差错控制

 

连续ARQ

连续ARQ方式是ARQ和滑动窗口技术结合起来的方式。我们已经了解了滑动窗口的概念,所以在这种方式下,发送完一帧后,不是停下来等待确认帧的到来,而是可以连续的发送若干个帧

在连续ARQ方式中,可以有两种方式,一个是选择重传ARQ,一个是回退N帧ARQ。

选择重传ARQ原理简单,但是实现起来比较复杂。这种方式的基本思想是:接收方接收到的错误帧,或者丢失的帧是哪些帧,就直接告诉发送方,发送方就重传哪些帧

那么,为什么说,选择重传ARQ实现起来复杂呢?来看一种情况,接收方正确接收了0,1,2,4,6号帧,3号和5号出错了,那么接收方要求发送方重传3号和5号帧。发送方知道情况以后,重传了3号和5号帧,这时候就要求接收方必须要有给所有帧排序的功能,把帧按照顺序排好之后,再交给上层处理

另一种方式,回退N帧的意思是,从出错处开始,重发已经发出去的N个帧。举个例子:

(十六)数据链路层——差错控制

上图的意思是,接收方正确接收了0号和1号帧以后,对发送方返回ACK2,说明0号和1号已经正确接收了,现在期望收到2号帧。但是,当2号帧传过来以后,出错了,这时候接收端把2号帧丢弃掉,仍然返回ACK2,继续期望着2号帧。

与此同时,发送方已经把3号和4号传过来了,并且也没有出错。但是接收方还是不能接收,因为接收方在等待着2号帧,2号帧不到就没办法继续往下接收,所以3号和4号帧只能丢弃。

只有当发送方接收了ACK2,并重传了2号帧,接收方正确接收了2号帧后,再继续返回ACK3,发送方重传3号帧,接收方接收以后返回ACK4,发送方重传4号帧,接收方返回ACK5…………这样才能继续下去。

可以发现,回退N帧的ARQ方式,实现起来就简单了,它不需要接收方具有排序的功能,因为所有帧最终肯定都是按序到达的。