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