首页 › deep-tech › 图解HARQ软合并翻盘原理

图解HARQ:一次没听清,再听一遍

想象你在听一场信号断断续续的电话会议。对方说了一句话,你漏听了几个关键词,这时你有两种补救办法:要么请对方原封不动再说一遍,你把两次听到的在脑子里互相印证,把缺的词拼出来;要么对方第一次就讲得很细,第二次只补充关键细节,你把两次的细节拼成完整的一句话。

无线通信里的HARQ(Hybrid Automatic Repeat reQuest,混合自动重传请求),干的就是这件事——而且是把这两种办法同时用到了极致。

先划清边界:数据出发之前如何加冗余抗噪(LDPC、Polar码的编码原理),是编码器的功劳,相关原理此前已有专门篇幅。HARQ站在编码器的下游:编码已经尽力了,如果信道实在太恶劣、译码还是失败了,HARQ负责第二落点——把失败的业务救回来。理解了这层分工,本文的所有设计细节就都有了落脚点。

一、为什么单靠纠错码不够

无线信道和有线信道最大的区别是时变:同一个用户站在原地不动,信号质量也会因为多径衰落、邻区干扰、_body阻挡_而起伏,误码率在几毫秒内波动几个数量级是常态。这给系统设计者出了一个两难题:

于是出现了第一次分工:链路自适应(AMC)根据终端上报的信道质量指示(CQI)动态选择调制编码方案(MCS),“看天穿衣”。但CQI的测量、上报、调度生效存在时延,信道可能在这几百微秒里“变脸”——AMC是提前预判,预判总会出错。

HARQ存在的全部意义,就是给预判错误兜底。 整个无线链路因此形成一套层层设防的体系:AMC负责毫秒级的快速“猜测”,HARQ负责毫秒级的快速补救,RLC重传负责几十毫秒级的残余错误清理,TCP则更慢但更彻底。每往上一层,速度慢一个数量级,可靠性高一个台阶。

这里有一个非常反直觉的设计目标:初始传输的目标误块率(BLER)不是0,而是约10%。也就是说,系统故意允许十分之一的数据块第一次传输失败,然后用一次廉价的重传救回来,而不是把码率压得极低去追求首发全胜。为什么这样做更划算?第三节算账。

二、第一个设计难题:等待反馈太浪费

最朴素的自动重传请求(ARQ)采用“停等协议”:发送一块数据 → 停下来等对方说“收到” → 再发下一块。问题显而易见——等待的时间里,信道完全闲置。停等协议的信道利用率:

$$\eta = \frac{T_{data}}{T_{data} + T_{wait}}$$

对讲机通话结尾喊一声"over"就是典型的停等。假设发送占1毫秒,而“对方处理+反馈传回+发送端决策”合计要7毫秒,利用率就只有 $\eta = 1/8 = 12.5\%$,八成以上的时间在干等,这对寸时寸金的无线信道不可接受。

设计者没有发明新数学,用的是工厂流水线的老办法:多开几条并行产线。让多个HARQ进程轮转工作——进程0发完数据进入等待状态时,进程1立刻发下一块,以此类推;等进程0的反馈转回来时,恰好轮到它再次上场。发送端不停,信道不闲。

sequenceDiagram
    participant G as gNB
    participant U as UE
    Note over G: 单进程停等 等待期信道闲置
    G->>U: 进程0 发送数据块A
    U-->>G: NACK
    G->>U: 进程0 重传A
    U-->>G: ACK
    Note over G: 多进程并行后 发送不再中断
    G->>U: 进程0 发送数据块A
    G->>U: 进程1 发送数据块B
    G->>U: 进程2 发送数据块C
    U-->>G: 进程0 反馈NACK
    G->>U: 进程1 发送数据块D
    G->>U: 进程0 重传A 与旧软比特合并
    U-->>G: 进程0 反馈ACK

一个HARQ进程从发出数据到可以再次被使用的总时间称为HARQ往返时延(RTT),它等于“传输时间 + 接收处理 + 反馈传输 + 调度决策”。进程数必须 ≥ RTT内的传输次数,流水线才不会断流。这就是进程数与时延绑定关系的由来——LTE的帧结构下RTT恰好对应8个进程;到了5G NR,时隙长度和时序全部可配,进程数也随之变成可配置参数(详见第六节对比)。

那为什么不干脆用滑动窗口协议?因为HARQ必须为每一个数据块单独保留接收缓存和软比特状态,停等结构让每个数据块的生命周期清晰独立,失败时的影响粒度最小;多进程并行实际上把滑动窗口的流水线效果找了回来,却保留了逐块确认的简单性。这是“简单机制 + 并行复制”优于“复杂单机制”的又一个范例。

三、第二个设计难题:失败之后,别扔

传统ARQ最大的浪费在接收端:第一次译码失败时,接收机其实已经完整地“看到”了承载信息的电磁波形,只是把握不够大。把这些原始观测直接扔掉、只保留一个“失败”的结论,等于把拼了一半的拼图倒进垃圾桶,再从零开始拼第二遍。

现代接收机因此不做“非黑即白”的硬判决,而是为每个比特输出一个软信息——对数似然比(LLR):

$$L(b) = \ln\frac{P(b=0 \mid y)}{P(b=1 \mid y)}$$

读法很简单:符号代表判决方向(正数更像0,负数更像1),幅度代表自信程度。+0.1的意思是“可能是0,但我没什么把握”;−8的意思是“几乎铁定是1”。

软合并的魔法在于:对同一个比特的两次独立观测,LLR可以直接相加:

$$L_{comb} = L_1 + L_2$$

两种情形都成立——如果两次都模糊地觉得“像0"(各+2),合并后+4,自信翻倍;如果第一次说"+2"、第二次说"−3",合并后“−1",说明第一次很可能看走眼了,第二次把它纠正了过来。重传的本质不是重发数据,而是叠加置信度。

最直接的用法叫Chase Combining(CC,追 words 合并):重传与首次完全相同的比特,接收端LLR逐位相加。其效果等效于提升信噪比,m次合并后的理论增益:

$$G = 10\lg m \ \text{dB}$$

两次合并约3 dB——相当于发射功率翻倍的效果,却不用多花一分钱电费,代价仅仅是UE多存一份软比特。对1985年D. Chase提出这个思路的背景(深空通信、功率极度昂贵)来说,这是一笔极划算的买卖。

四、比复读更聪明:增量冗余

CC的每一次重传都是原样复读。但回想一下信道编码那篇的内容:编码器当初生成的校验比特,远比实际发送的多——多余的部分在速率匹配时被打孔(puncturing)丢掉了。这些没上过“车”的校验比特,是现成的新证据。

增量冗余(Incremental Redundancy,IR)的思路是:第一次传输以系统比特(原始信息比特)为主,保证可独立译码;一旦失败,重传不再复读旧证据,而是发送此前被打了孔的校验比特。接收端把新旧比特拼回一个更长、码率更低的完整码字,等效码率随重传次数下降:

$$R_{eff} \approx \frac{R_0}{m}$$

首传码率1/2,重传一次后有效码率降到约1/4——纠错能力不是线性而是台阶式增强。对比CC每次只有3 dB的线性叠加,IR在深衰落场景的翻盘概率明显更高。这就是第三节那个问题的答案:允许10%的初始失败 + IR式重传兜底,比全程保守编码的系统吞吐更高——因为绝大多数传输一次成功,失败的少数用低成本救回,而保守编码是让全部传输长期为最差情况买单。

工程上,IR用循环缓冲器 + 冗余版本(RV)实现:编码器输出的比特流(系统比特 + 两路独立校验比特)顺序写入一个环形缓冲区;每次发送时,按RV版本指定的起点“开窗读出”一段。四个RV版本对应四个不同起点,典型重传顺序是0 → 2 → 3 → 1。

flowchart TB
    subgraph ENC[编码器输出比特流]
        S[系统比特]
        P1[第一路校验比特]
        P2[第二路校验比特]
    end
    subgraph BUF[循环缓冲器]
        W[按RV版本指定起点开窗读出]
    end
    S --> W
    P1 --> W
    P2 --> W
    W -->|RV0 从系统比特起读| T0[首次传输 可独立译码]
    W -->|RV2| T1[第一次重传 补充校验]
    W -->|RV3| T2[第二次重传 补充校验]
    W -->|RV1| T3[第三次重传]

两个设计细节值得咀嚼:

CC与IR的全面对比:

维度 Chase Combining(原样复读) Incremental Redundancy(增量冗余)
重传内容 与首传完全相同的比特 首传未发过的校验比特为主
合并方式 LLR逐位相加 拼接成更长码字后再译码
等效效果 等效SNR提升,约 $10\lg m$ dB 等效码率降低,约 $R_0/m$
单次重传增益 线性、平缓 低码率区间增益陡峭
接收缓存需求 较小(只需存首传软比特) 较大(需存多次重传的软比特)
单独能否译码 可以(每次都一样) 不一定(重传包可能不含系统比特)
一句话类比 “原话再说一遍” “换种讲法补细节”

那么现网到底用哪个?答案是“IR为主、CC为退化形态”。主流系统的重传都基于IR式循环缓冲器;当终端缓存受限、或调度器让RV重复出现时,重传比特与首传大量重叠,IR的行为就自动趋近CC。标准还规定了不同终端等级的最小缓存能力——这正是同一小区里,旗舰机与入门机在弱信号下翻盘能力不同的底层原因之一。

五、一个HARQ进程的一生

把视角收窄到单个HARQ进程,它的状态迁移如下:

stateDiagram-v2
    [*] --> 空闲
    空闲 --> 等待反馈: 收到调度 NDI翻转 存入新软比特
    等待反馈 --> 空闲: 收到ACK 清空缓存
    等待反馈 --> 缓存保持: 收到NACK
    缓存保持 --> 等待反馈: 收到重传 NDI不变 合并译码

这里藏着整个机制能运转的前提性设计:新数据指示符(NDI)。它在下行控制信息(DCI)中只占1个比特,规则极简:每调度一个新数据块就翻转一次;调度重传时保持不变。终端看到NDI翻转 → 该进程缓存作废,按新数据接收;NDI没翻 → 这是重传,把缓存里的旧软比特搬出来合并。

没有这1个比特,终端将无法区分“这是一块新数据”和“这是旧数据的重传”——清错缓存,软合并就全部作废;不清缓存,新数据会跟旧数据错误叠加。整个软合并大厦,建立在1个比特的诚实之上。这也是调试时的经典检查点:如果日志里重传始终不成功且RV在0附近打转,优先核对NDI行为是否异常。

六、LTE与NR的HARQ参数对照

维度 LTE 5G NR
HARQ进程数 FDD固定8个,TDD随上下行配比变化 可配置(典型下行最多16个)
反馈时序 固定(下行第n个子帧的数据在第n+4个子帧反馈) 动态(DCI中的K1指示反馈时隙)
上行授权时序 固定 动态(K2指示)
调度方式 下行异步自适应,上行同步为主 上下行均可异步自适应
重传粒度 传输块(TB) TB,大块场景支持码块组(CBG)
反馈内容 每TB一比特ACK/NACK 每TB或每CBG一比特,支持更灵活的码本

两个关键演进展开说:

第一,时序从“写死”到“可配”。 LTE把反馈间隔固定为4个子帧,简单、可预期,UE和基站各自按公式倒推即可;代价是僵化——帧结构、处理能力变化时没有回旋余地。NR改用K1动态指示“这个PDSCH的ACK应该在哪个时隙发”,配合K2(上行授权到实际发送的间隔),调度器获得了按帧结构、终端处理能力灵活安排时序的自由。天下没有免费的午餐:自由换来的信令开销和配置复杂度,是NR调度器复杂度的重要来源。

第二,重传粒度从TB细化到CBG。 一个大传输块会被切成若干码块,每个码块带独立校验——译码失败往往只是个别码块损坏,其余都是好的。LTE的重传必须整块重来;NR引入码块组(CBG)重传,只重传损坏的那几个组。对大带宽、高MCS的大数据块场景,节省的重传资源相当可观。这是“把确认粒度对齐到真实出错粒度”思想的体现——反馈越精细,重传浪费越少,但反馈开销也越大,标准在两者间做了折中。

再把整个网络的分层重传体系摆在一起看,就能理解HARQ的生态位:

机制 所在层 重传依据 时延量级 特点
HARQ 物理层/MAC 单比特ACK/NACK 毫秒级 软合并,快速廉价
RLC AM重传 层二 状态报告 几十毫秒级 接HARQ的漏
PDCP/上层机制 层二以上 — 更高 失序处理、加密计数相关
TCP重传 传输层 累计确认 数百毫秒以上 最慢但最终兜底

越靠近信道,重传越便宜、越快;越往上层,重传越贵、越慢,但覆盖面越广。HARQ的任务就是用最低的成本消化掉绝大部分错误,让上层重传几乎不被触发——TCP如果频繁重传,说明无线侧的分层防线已经失守。

七、现网实战与调试陷阱

这套原理在工程师的日常里长这样:

日志与统计里看什么。 通用抓包工具的PDSCH/PUSCH记录里,每个调度事件都带着四元组:HARQ进程号、RV版本、NDI、反馈结果(ACK/NACK/DTX三态)。小区级统计里最值钱的是初始BLER(IBLER):健康小区的下行IBLER应该在10%上下浮动。看到“大量HARQ重传”先别急着告警——那是设计内行为;持续显著高于10%才指向真问题(弱覆盖、强干扰、MCS配置过高)。

DTX与NACK必须区分。 UE如果连DCI都没检测到,它不会发出任何反馈,基站等超时后按失败处理并自适应重传。NACK多,说明PDCCH是好的、数据信道差——查覆盖和干扰;DTX多,说明问题出在控制信道——查PDCCH聚合度、功率配置和上行反馈信道。这一步分诊,是指向根因的第一条岔路口。

K1配置类故障。 K1指示的反馈时隙如果与终端能力或TDD帧结构冲突,ACK会被发在错误的时隙上,基站收不到反馈 → 触发无谓重传 → 吞吐骤降,而BLER统计看起来“完全正常”。这类问题在TDD复杂帧结构下尤其隐蔽,属于“统计指标正常但用户体感极差”的典型。

重传耗尽之后。 同一个数据块反复失败直到进程重传上限,事件会向RLC层上报;RLC确认模式仍救不回,最终走向无线链路失败。排查“掉话”时,从RLF倒推HARQ层的历史NACK序列,是还原事发过程的重要证据链。

与DRX的联动。 连接态DRX专门为HARQ设置了RTT定时器与重传定时器——正因为每个进程的反馈到达时刻是可预期的,终端才敢在等待反馈的间隙关掉接收机小睡片刻,醒来再收重传(DRX机制的完整原理此前已有专文,此处不展开)。软合并缓存的“可暂存性”,让省电和低时延重传得以共存。

四个常见调试陷阱:

  1. 把10%初始BLER当故障——那是性能最优点附近的设计目标,不是异常;
  2. 混淆HARQ重传与RLC重传的统计口径——两者次数、时延、含义完全不同,归因错误会让优化方向南辕北辙;
  3. 忽略终端缓存能力差异——同样的调度行为,缓存小的终端在深度IR上会退化,弱信号对比测试要控制终端型号变量;
  4. 在TDD网络照搬FDD的8进程直觉——进程数、反馈时序与帧结构强耦合,参数经验不可跨双工方式直接移植。

常见问题

Q: HARQ重传和TCP重传有什么区别? A: 三层区别——所在层(物理层 vs 传输层)、时延(毫秒级 vs 数百毫秒级)、反馈依据(逐数据块单比特确认 vs 逐字节累计确认)。最本质的不同是HARQ重传带软合并:重传与旧观测叠加增益,而TCP重传的旧包对新包毫无帮助。这就是为什么无线系统把重传尽量压在最底层做。

Q: CC和IR现网到底用哪个? A: 主流系统的重传都基于IR式循环缓冲器实现;当重传读出的比特与首传大量重叠(RV重复或缓存受限)时,行为自动退化为近似CC。可以记成:IR是常态,CC是它的兜底形态。

Q: 为什么初始BLER目标是10%而不是0%? A: 算账即可:追求0%首发失败意味着MCS必须按最差信道保守配置,全体用户的频谱效率长期受损;允许10%失败并用软合并重传兜底,绝大多数传输一次成功,少数失败的以极低成本救回。重传的边际成本,远低于全程保守编码的机会成本。

Q: 终端怎么知道收到的是新数据还是重传? A: 靠DCI里的1比特NDI:新数据翻转、重传保持。翻转即清空该进程缓存。这是软合并机制成立的前提,也是排查“重传永远不成功”时的第一个检查点。

Q: NR的进程数为什么能做到16个,LTE只有8个? A: 进程数的本质是“并行流水线条数”,必须与单进程占用周期(RTT)匹配。NR的时隙长度可短至零点几毫秒、时序全部可配,单进程占用周期不再固定,因此进程数改为可配置(最多16个),给调度器留出支持大载波和低时延业务的余量。不是越多越好——每个进程都要在终端侧占用软缓存。

参考来源

  1. 樊昌信、曹丽娜《通信原理》(第7版),高等教育出版社 — 差错控制编码与ARQ体系的经典教材论述
  2. Dahlman, Parkvall, Sköld, 5G NR: The Next Generation Wireless Access Technology, Academic Press — NR的HARQ时序、进程设计与CBG机制的系统性章节
  3. ShareTechnote 技术手册 — HARQ时序与日志分析相关的工程实践索引

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。