《网络工程师真题详解》中讲到:和停止等待相比,出现差错的可能性由ACK损坏变成分别的RR损坏和RE损坏。当接收方检测到一个帧有错误,则放弃该数据帧,并不采取其他行为,如果此时发送方继续发送数据帧,那么接收方就检测到数据帧的帧号次序有错误,发送REJ帧。发送方收到REJ后必须从REJ所指示的帧号后发送所有的数据帧。如果此时发送方没有再继续发送数据。接收方不返回RR,也不返回REJ。当发送超时后会发送RR帧,这个RR帧 中某位被置1,提示接收方必须响应一个RR帧,接收方则发送一个RR帧,其中包括接收方希望收到的下一个数据的帧编号,接收方会把错误的帧号回入REJ。

       其中 RR、REJ到底是什么?他们又扮演什么角色呢?回退N帧ARQ到底什么时候回用到它们呢?我翻阅多种教材,谢希仁老师的《计算机网络》、潘爱民老师的《计算机网络》、王达老师的《网络工程师必读》等书,从而得到一些有用的结果。

       追溯起源,就不得不从HDLC帧结构说起。HDLC的帧可以分为信息帧、监督帧、无编号帧。

        HDLC的控制字段有8位。如果第1位为“0”时,表示该帧为信息帧;第1、2位为“10”时,表示该帧为监控帧;第1、2位为“11”时,表示该帧为无编号帧。如图1所示。

 

图1 HDLC帧结构及其控制字段格式


       1)信息帧(Information Frame)用于传送有效信息或数据,通常简称为I帧。
       2)监控帧(Supervisor Frame)用于差错控制和流量控制,通常称为S帧。监控帧以控制字段第0、1位为“10”来标志。
       3)无编号帧U(Unnumbered Frame)用控制字段第1、2位为“11”来标识。
       本文涉及的RR、REJ就是监控帧的四种编码中的两种。监控帧控制字段的第3、4位为监控帧类型编码,共有4种不同的编码,如表1所示。


  表1  监控帧的功能及N(R)字段含义

帧类型

Type字段

功能描述

N(R)字段的含义

RR

00

接收就绪,请求发送下一帧

期望接收的下一个I帧的序号

REJ

01

请求重新发送序号为N(R)的所有帧

重发帧的开始序号

RNR

10

请求暂停发送数据帧

N(R)之前各帧已正确接收

SREJ

11

请求重发指定帧

重发帧的顺序号

       回退N帧ARQ出现有损帧的情况下,就会使用这个两个帧。具体情况如下:
       (1)接收方检测到第i帧出错
       这属于帧损坏。该情况下,接收方发送 REJ(i),当发送方接受到该REJ时,发送方重传第i帧以及第i帧后续的所有帧。
       (2)第i帧丢失
       这属于帧丢失。当出现第i帧丢失的情况,并且发送方发送第 i+1帧之后,当接收方收到第 i+1帧之后,就出现了失序的情况。这个时候,接收方发送 REJ(i),发送方回退到第 i 帧并重传。
       (3)第 i 帧丢失,并在此之后无后续帧
       这属于帧丢失。接收方没有收到第i帧,并且由于没有后续帧,因此既不回送RR也不回送REJ。
       当发送方一直没有收到回应而超时的时候,发送方发送P比特置1的RR帧。这类RR帧就是要求接收方发送含有其期望第 i 帧的RR,即RR(i)。
发送方收到该RR(i)后,然后重传第 i 帧
       (4)接收方收到第 i 帧并发送RR (i+1) ,但该RR丢失
       这属于RR帧丢失的情况。由于确认是累积的, 发送方在第 i 帧确认超时之前可能收到下一个确认RR (i+n)。这类情况属于正常的接收。
如果没有累积确认,而发送方又超时,则发送P比特置1的RR帧。
       (5)REJ丢失
       由于REJ帧和RR帧的相似,则该情况的处理方式与(3)相同。