数据链路层是网络工程师考试中考点最密集的层次之一,而差错控制又是数据链路层中最具区分度的命题方向。不少考生对"停等协议""回退N帧""选择重传"三个名词背得滚瓜烂熟,一遇到"发送窗口大小为三十二至少需要几位序号"这类计算题却仍然丢分。究其原因,是没有把确认机制、超时重传和滑动窗口三者串成一条完整的逻辑链。本文以自动重传请求协议为主线,从概念定义讲到原理机制,再从三种实现的对比讲到命题人的挖坑套路,最后结合2024年下半年与2021年上半年真题逐题拆解,帮助读者彻底拿下这一高频考点。
自动重传请求的英文全称是Automatic Repeat reQuest,缩写ARQ,属于数据链路层差错控制机制的一种,教材中亦常称为"检错重发"或"反馈重传"。其标准定义可以表述为:发送方为每个数据帧附加序号和检错码后发送,接收方对收到的帧进行差错检测,若发现帧损坏或帧丢失,则通过反馈信道向发送方发送否认应答,或者以不予应答的方式触发发送方的超时重传,发送方据此自动重发出错或丢失的帧,直至该帧被正确接收并得到确认。与"前向纠错"相对,ARQ的本质是"先检错、后重发",纠错动作由发送方完成,而不是由接收方自行修复数据。
理解这一定义需要抓住三个关键词。第一是"自动",整个重传过程由协议机制驱动,不依赖人工干预,发送方依据反馈信号与定时器自主决策。第二是"请求",重传的触发源于接收方的显式或隐式请求——显式请求是发送否认帧,隐式请求则是超时未收到确认帧。第三是"重传",发送方必须缓存尚未确认的帧副本,否则一旦需要重发就无帧可发,这决定了ARQ实现必然伴随发送缓冲区管理。
差错控制的完整技术路线有两条。一条是前向纠错(Forward Error Correction,FEC),接收方利用发送方附加的冗余纠错码自行纠正传输错误,海明码是其中最典型的代表。FEC的优点是不需要反向信道、时延低,代价是冗余度高、编码复杂。另一条就是ARQ,接收方只检错不纠错,发现错误就要求重传。ARQ的优点是检错码冗余小、实现简单、在信道质量尚可时效率高,代价是依赖反向反馈信道,且重传会引入额外时延。软考命题经常把两者放在一起考查适用场景:实时性要求极高且无法等待重传的场景宜选FEC,对可靠性要求高且可以容忍一定时延的数据传输场景宜选ARQ。需要特别注意,混合自动重传请求(HARQ)是两者结合的产物,将纠错码与重传机制叠加使用,在移动通信系统中应用广泛,但在软考考纲范围内仅作了解即可,考查重点仍是纯ARQ。
数据链路层有三大基础功能:封装成帧、透明传输、差错检测。差错检测借助帧尾的FCS字段(通常由CRC循环冗余校验生成)完成,但检测出错误之后怎么办,CRC本身并不回答,这正是ARQ的位置——它是差错检测功能的后续动作。与此同时,ARQ与流量控制天然耦合:滑动窗口既限制发送速率又管理重传,因此考试中ARQ几乎总是与窗口机制一起出现。最后要明确ARQ成立的三个前提条件:其一,通信双方之间必须存在反向信道用于回传确认或否认帧;其二,发送方必须为每个已发送但未确认的帧保留副本;其三,收发双方必须约定一致的帧序号规则,否则无法区分新帧与重传帧。
ARQ的运转机制可以抽象为一个由四个部件构成的闭环:序号、确认帧、重传定时器与发送缓存。发送方从发送缓存中取出帧、标注序号后发出,同时启动重传定时器;接收方对收到的帧做检错,正确则回送确认帧,出错则回送否认帧或直接丢弃;发送方收到确认后释放缓存中的副本并滑动窗口,收到否认或定时器超时则重传。整个闭环中任何一个部件的细节理解不到位,都会在计算题或辨析题中暴露出来。
确认帧的语义是ARQ机制中最容易误解的部分。ARQ体系使用累积确认,即编号为n的确认帧表示"n号帧及其之前的所有帧均已正确接收",而不是仅仅确认n号帧本身。累积确认的价值在于容错:即便某个确认帧在反向信道中丢失,只要后续序号更大的确认帧到达发送方,前面帧的交付状态依然可以得到确认。与累积确认配套的优化手段是捎带确认,全双工链路上双方互有数据要发时,把确认信息附加在反向数据帧的头部一并传输,从而节省独立的确认帧开销。理解了累积确认,就能解释为什么回退N帧协议接收方只需维护一个期望序号变量。
超时重传是ARQ的兜底机制,处理的是帧丢失、确认帧丢失这类"没有任何反馈到达"的场景。发送方每发出一个帧(或一批帧)就启动重传定时器,若在超时周期内未收到相应确认,则认定该帧已丢失并重传。定时器时长必须大于一个往返周期,即数据帧发送时延加上确认帧返回时延的总和,否则会因过早超时把尚未到达的确认误判为丢失,造成不必要的重传甚至协议失序。定时器的管理方式因协议而异:停止等待协议只有一个定时器,跟随当前帧走;回退N帧协议维护一个定时器,始终对应最早发送且尚未确认的帧;选择重传协议则为每个未确认帧单独维护定时器,这也是它实现复杂度最高的原因之一。
滑动窗口是理解ARQ三类实现的钥匙。停止等待协议可以视为收发窗口都为一的特例,发送一帧后必须等待确认才能发送下一帧,信道在等待确认期间完全空闲。流水线化的核心思想是把窗口放大,允许连续发送多个帧而不必逐帧等待,从而把信道的空闲时间利用起来。窗口放大之后,帧必须携带序号以便接收方区分,序号字段位数n决定了可用序号空间为二的n次方个。这里产生两条关键数学约束:回退N帧协议要求发送窗口不超过二的n次方减一,原因在于若窗口等于二的n次方,接收方将无法区分新到达的帧与因重传而复用旧序号的帧;选择重传协议要求收发窗口之和不大于二的n次方,通常双方各取二的n减一次方。这两条约束正是软考计算题的核心命题点,后文真题部分将做展开。
基于上述机制,可以建立ARQ的信道利用率模型。设数据帧发送时延为Td、单程传播时延为Tp,停止等待协议的利用率近似为Td除以Td与二倍Tp之和。当传播时延远大于发送时延时,分母远大于分子,利用率急剧下降,这正是停止等待协议在卫星链路等长时延环境中被淘汰的原因。流水线协议在理想无差错条件下,若窗口足够大、足以覆盖整个往返周期,信道可以近乎连续地传输数据;若窗口受序号空间限制无法覆盖往返周期,则利用率近似为窗口大小乘以Td再除以Td与二倍Tp之和。这一模型是把抽象机制转化为定量计算的桥梁。
需要补充的是,帧丢失与帧损坏在接收端表现为两种不同的情形,但ARQ对它们的处理殊途同归。帧损坏可以由FCS校验直接判定,接收方据此发送否认帧;帧丢失则表现为期望的帧迟迟不到,接收方虽无从直接感知,发送方的超时定时器会触发重传。换言之,确认与超时两种机制合起来覆盖了"可感知的错误"与"不可感知的丢失"两类故障,这正是ARQ闭环设计的完备性所在。此外,当信道误码率较高时,ARQ的重传次数上升、有效吞吐量下降,此时引入前向纠错码、让纠错与重传分担差错处理压力的思路便自然浮现,这也为理解混合自动重传请求的设计动机提供了注脚。
按照发送窗口与接收窗口的大小组合以及重传策略的差异,ARQ分为停止等待协议、回退N帧协议与选择重传协议三种经典实现。三种协议共享同一套确认与超时框架,区别集中在窗口约束、重传范围与缓冲区开销上。
停止等待协议的发送窗口与接收窗口均为一,发送方每发送一帧就停下来等待该帧的确认,收到确认后窗口滑动一格,再发送下一帧。协议用一位序号即可区分相邻两帧,序号在零与一之间交替。它需要处理两类典型异常:一类是数据帧丢失或损坏,接收方不回确认,发送方超时后重传;另一类是确认帧丢失,发送方超时重传同一帧,接收方依靠一位序号识别出这是重复帧,将其丢弃但必须再次回送确认,否则发送方将陷入无限重传。停止等待协议的优点是实现极其简单、缓冲区只需容纳一个帧,缺点是信道利用率低,只适用于单向低速链路、短帧传输或对实现成本敏感的简单通信场景。
回退N帧协议的发送窗口大于一、接收窗口恒为一,允许发送方连续发送多个帧而不必等待确认。接收方只接受按序到达的帧,一旦发现某个帧出错或丢失,就丢弃该帧及其后所有乱序到达的帧,并发送否认帧或保持沉默;发送方超时或收到否认后,从出错帧开始把窗口内的后续帧全部重传一遍,这也是"回退N帧"名称的由来。由于采用累积确认,接收方只需维护一个期望序号变量,实现简单,但批量重传会浪费带宽,尤其当窗口较大而出错只涉及个别帧时,大量正确接收的帧被无辜重传。协议约束发送窗口不
本篇完!