首页 › deep-tech › 别扔草稿:HARQ软合并原理

别扔草稿:HARQ软合并原理

一、从听写课说起:解错了,然后呢?

先讲一个每个人都经历过的场景。小学听写课,老师念一个长句子,你只听清了七成,剩下的靠猜。这时候你有两种选择:要么硬着头皮把猜的写上去,错了就错了;要么把没听清的位置做个记号,等老师念第二遍时,重点对齐记号处,把两遍听到的内容拼起来——第二遍念的如果是完整重复,你把两遍重叠的部分互相印证;如果第二遍干脆念的是“答案的另一半”,那拼起来就是完整的答案。

无线接收机每天都在做这道听写题。空气里的信号被噪声、衰落、干扰反复揉搓,解码器拿到的是一份伤痕累累的数据。第一次解码失败了,这份伤痕累累的数据该怎么办?

绝大多数协议(包括我们熟悉的TCP)的答案是:扔掉,让对方重发一份,重新再来。这个思路在有线世界完全合理——光纤里的误码率低到可以忽略,重发一次的代价就是时间。但无线世界不一样:空口每个比特都来之不易,是能量、频谱、调度机会堆出来的,扔掉等于把已经付出的射频能量直接倒进垃圾桶。

于是无线系统做了一个很“抠门”的设计:解码失败的数据不扔,留着,跟重传的那一份合并起来一起解。这套机制叫混合自动重传请求(HARQ,Hybrid ARQ)。"Hybrid"这个词指的就是它混合了两种东西:前向纠错(FEC,编码抗错)和重传(ARQ,错了再来)。而它的灵魂,全在接收机那个“不扔”的动作上。

本文要回答三个问题:为什么留着旧数据有用(软合并的数学直觉)、重传时发什么(增量冗余与冗余版本)、以及为什么网络能一边等确认一边不停工(多进程流水线)。

二、为什么不扔:硬判决扔掉了最值钱的东西

要理解软合并,得先看清“扔掉”这个动作到底扔掉了什么。

接收机收到一个调制符号,比如一个16QAM星座点,落在星座图上某个位置。这个位置和标准点之间有个偏移——偏移是噪声造成的。接下来接收机要判断:这个符号代表哪几个比特?

硬判决的做法是“就近拍板”:看它离哪个标准点最近,直接判定为那个点,输出0和1。判断完,原始的位置信息就地销毁。

问题来了。假设某个比特被硬判成了0,但它的信号点其实落在0和1两个标准点的正中间——这不是一个“0”,这是一个“吵架中”的0。硬判决把这份犹豫全部抹掉,只留下一个斩钉截铁的0。如果重传的数据再来一遍,还是这个位置还是这个纠结,硬判决还是输出同一个0——两份信息叠加,你得到的还是同一个错误,没有任何新东西。

软判决的做法完全不同:不急着拍板,先把每个比特的“证据强度”记下来。这个证据强度有个标准记法,叫对数似然比(LLR):

$$\mathrm{LLR} = \ln\frac{P(x=0 \mid y)}{P(x=1 \mid y)}$$

其中 $y$ 是收到的信号,$x$ 是发送的比特。这个式子说白了就是回答一个问题:“就现在收到的这个信号而言,发0的可能性是发1的多少倍?” 取对数是为了好算——正数表示偏向0,负数表示偏向1,绝对值越大表示越笃定。LLR = +8 是“铁定是0”,LLR = -0.1 是“五五开,稍微偏1”,LLR = -6 是“八成是1”。

flowchart TD
    subgraph HD["硬判决"]
    A1["收到信号点"] --> B1["就近拍板"]
    B1 --> C1["只留0或1<br/>犹豫丢弃"]
    end
    subgraph SD["软判决"]
    A2["收到信号点"] --> B2["记录置信度LLR"]
    B2 --> C2["不急着定案"]
    C2 --> D2["留给合并与译码"]
    end

软判决保留的这份“犹豫”,正是重传合并的原材料。而且它带来一个额外红利:现代信道译码器(LDPC、Polar、卷积码的维特比译码)本来就吃软信息——给它们喂LLR而不是硬邦邦的0/1,仅此一项就能带来约2dB的编码增益。这就是为什么教科书里把“软判决译码”当作现代数字通信的标配。

三、软合并:独立证词可以累加

现在回到听写课的比喻。老师念第二遍了,你怎么把两遍“拼”起来?

数学给出一个出奇简单的答案。假设第一遍和第二遍的噪声是相互独立的(这在无线系统里基本成立,因为两次传输发生在不同的时频资源上,经历不同的衰落和干扰),那么两份观测提供的证据可以直接相加:

$$\mathrm{LLR}_{合} = \mathrm{LLR}_1 + \mathrm{LLR}_2 + \cdots + \mathrm{LLR}_n$$

直觉上这非常好懂,像一个陪审团:每个独立证人的证词是带方向的权重,倾向0的往正方向推,倾向1的往负方向推,互相抵消的是噪声的随机摇摆,共同指向的是真实的比特值。 一个证人拿不准的事,三个独立证人方向一致,置信度就不是三倍而是指数级增长。

用信噪比的语言描述更直观:两份相互独立的同样信号叠在一起,信号功率翻倍、噪声因为不相关只按功率平均,合并后的等效信噪比:

$$\mathrm{SNR}_{合} = \mathrm{SNR}_1 + \mathrm{SNR}_2 \approx 2\,\mathrm{SNR}_1$$

两次传输合成一次,等效信噪比翻倍,也就是白赚3dB。在链路预算里,3dB意味着覆盖半径明显外扩,或者等效于发射功率翻倍——而这里一分钱射频功率都没多花,只是接收机多记了一遍账。

这种“每次重传内容完全一样、接收端逐比特累加LLR”的方式,以上世纪八十年代提出它的工程师Chase命名,今天口语里常叫Chase合并。它简单、可靠、对缓存要求低,是软合并最朴素的形态。

四、从“再念一遍”到“念另一半”:增量冗余

Chase合并赚的是信噪比,但它有个天花板:第二遍和第一遍内容一样,没有提供任何新的编码信息,增益上限就是功率叠加那几dB。

上世纪八十年代末,Hagenauer提出了一类“速率兼容打孔卷积码”,打开了另一扇门:编码器其实是一个“内容远超所需”的母本工厂——同样的信息比特,它可以产出包含大量校验位的完整编码,也可以按需打孔(扔掉一部分校验位)来适配信道。平时只发打孔后的“精简版”;一旦失败,重传时发送母本里上次没发出去的那些校验比特。接收端把新旧拼在一起,等效码率逐次降低、纠错能力逐次增强。

这就是增量冗余(IR,Incremental Redundancy)。回到听写课:Chase合并是“老师把原句再念一遍”,IR是“老师第一次念句子,第二次直接把关键词抄给你”。后者每一次重传都在实质性地增加纠错能力,而不只是提高音量。

三种重传思路放在一起看:

维度 传统ARQ Chase合并 增量冗余
失败后接收端动作 整包丢弃 保留软信息,等重复 保留软信息,等新校验位
重传内容 原包重发 与初传完全相同 母本中未发过的校验比特
增益来源 无,纯重试 功率叠加(两次约+3dB) 功率叠加 + 等效码率下降
软缓存开销 无 小(存一份LLR) 大(要存整个母本对应的LLR)
实现复杂度 最低 低 高(依赖速率匹配设计)
典型场景 有线/早期系统 低成本终端、简单信道 现代宽带系统主力

增量冗余能落地,靠的是一个精巧的“仓库”设计:编码母本和实际发送的内容被解耦了。

五、母本、循环缓冲与RV:增量冗余的仓库管理

把增量冗余想象成一个电影发行的故事。编码器产出的是母带——信息比特加上LDPC编码产生的大量校验比特,全长远超一次播放所需。发行方不会一次放完,而是每次从母带上剪一个窗口发出去:

冗余版本(RV)就是“窗口从哪开始剪”的指针编号。 母带存在一个首尾相接的循环缓冲区里,窗口从缓冲区的不同位置切入,就得到不同的RV。

flowchart TD
    A["信息比特加CRC"] --> B["LDPC编码<br/>产出母本比特流"]
    B --> C["写入循环缓冲区"]
    C --> D["RV0窗口<br/>系统位为主"]
    C --> E["RV2窗口<br/>校验位中段"]
    C --> F["RV3窗口<br/>校验位后段"]
    D --> G["初传"]
    E --> H["第一次重传"]
    F --> I["第二次重传"]
    G --> J["接收端LLR累加合并"]
    H --> J
    I --> J

工程上有两个细节值得知道,它们直接影响你调试时看到的现象:

第一,重传的RV不是随便跳的。 常见的顺序是0、2、3、1这样的固定序列——先发信息位密集的版本打底,后续重传优先补上“性价比最高”的校验段落。你在空口信令里看到一串重传的RV值跳变,背后就是这个逻辑,而不是随机数。

第二,软合并要求“比特级对齐”。 接收端做LLR累加时,必须知道新来的每一个比特对应母本的哪个位置——所以重传时编码母本不能换,速率匹配的行为必须完全一致,只有窗口位置(RV)可以变。这就解释了一个常见的调试困惑:HARQ重传可以换调制方式、换RV,但不能“换个编码重新编一遍”,否则接收端缓存的旧LLR全部作废,增量冗余直接退化成Chase合并甚至纯重传。

也正因为IR要为整个母本预留软缓存,它对终端的存储能力是个考验。成本敏感的物联网终端可能选择更省缓存的策略;宽带手机则把大软缓存当作标配,因为IR带来的吞吐增益实打实地值这个钱。

六、流水线:为什么需要十几个HARQ进程

还有最后一个问题:确认和重传都要时间,这段时间信道在干嘛?

最朴素的协议叫停等式:发一包,停下来等对端回ACK,收到了才发下一包。对讲机通话就是这样——“完毕,请回话”,对方不吭声你就干等。问题是一来一回的时间里信道完全空转。空口的往返时延是毫秒级,宽带系统每毫秒要吞吐的数据是几十上百兆比特,停等式等一个来回,容量直接腰斩再腰斩。

解法和所有流水线问题一样:别等,并行发货,用编号区分。 发送方同时维持多个独立的HARQ进程,每个进程管一包数据的“发送—等待—重传”生命周期。进程0发出去进等待状态时,进程1、进程2照常发送,信道一刻不停。收到NACK时,只需对指定进程号的包发起重传。

sequenceDiagram
    participant gNB
    participant UE
    Note over gNB,UE: 多进程并行,等待期不空转
    gNB->>UE: 进程0 初传
    gNB->>UE: 进程1 初传
    UE-->>gNB: 进程0 NACK
    gNB->>UE: 进程2 初传
    UE-->>gNB: 进程1 ACK
    gNB->>UE: 进程0 重传 RV2
    UE-->>gNB: 进程0 ACK

配套的还有一个小而关键的字段——新数据指示(NDI)。它只回答一个问题:这个进程号上装的是新数据,还是上次那包的重传?想象仓库管理员收到“3号货架补货”的指令,他得知道是3号货架上那箱坏货换新的,还是3号货架本来就该发新货——搞反了,接收端要么把重传当新数据(缓存里多出一份不配对的LLR),要么把新数据当重传(和八竿子打不着的旧缓存合并,全盘解错)。NDI每翻转一次,接收端就把对应进程的软缓存清空,从头开始。

一整套机制配合下来,就形成了空口数据面的心跳:初传、反馈、重传在多个进程上循环往复,链路看起来始终满负荷,而每一个包在后台都走完了自己的“发送—确认—必要时合并重传”旅程。

七、现网落地:这套原理在你手上的KPI里

理解了原理,再看现网数据,很多“反直觉”的现象会突然讲得通。

第一,初传误块率10%左右不是故障,是设计工作点。 链路自适应把初传BLER目标定在一成附近,就是有意让HARQ有事干:MCS调得激进一点,初传偶尔失败,靠一次合并重传兜底,总吞吐反而比“保守MCS保初传”更高。所以看到小区下行的HARQ重传率在个位数到一成之间波动,先别当故障处理;真正要警惕的是合并之后仍然失败的残留错误——那才意味着链路质量真的恶化到自适应都追不上了。

第二,DTX和NACK是两回事。 理想流程里UE解不出就回NACK,但还有一种更糟的情况:UE连调度指令本身都没收到(漏检),什么都不回。发送方等不到ACK,只能按失败处理、安排重传。统计的时候如果把DTX混进NACK,你会把“下行覆盖有问题(UE听不见调度)”误诊成“合并后仍解错”,两者的优化方向完全不同。做信令分析时把ACK、NACK、DTX分开计数,是排障的基本功。

第三,语音业务也在用HARQ,这和“实时业务不重传”不矛盾。 说实时业务不重传,指的是RLC层为语音配置了不重传的模式——因为百毫秒级的RLC重传对语音来说太迟了,迟到的正确不如准时的错误。而物理层HARQ的重传发生在几毫秒内,远在语音的时延预算之内,所以每一帧语音照常走“初传—合并—重传”的流程,只是预算里通常只允许重传一次左右。这就是为什么语音的质量保障是“HARQ兜底+RLC放行”,而不是层层重传。

第四,上行链路同样是这套机制,但形态不同。 下行的反馈走上行控制信道;上行数据失败时,重传的许可通常夹在下一次的调度指令里捎带下来,而不是走一条专用的确认信道——这是两代移动宽带之间一个广为人知的设计变化,目的是让控制开销随调度灵活伸缩。另外提一句:标准允许多种实现与配置选择,具体参数行为以各厂家官方文档为准。

顺手整理一份速查表,把本文出现的机制对应到你日常看到的字段:

参数/字段 它在说什么 排障时的看点
HARQ进程号 这包数据属于流水线的哪个工位 进程号异常跳变可能意味着失步
NDI 新包还是旧包重传 NDI不翻转却无重传→缓存对不上
RV 循环缓冲的窗口位置 重传RV应按序列推进,长期停在0有问题
HARQ-ACK 接收端裁决结果 区分ACK/NACK/DTX三态
软缓存 UE能存多少待合并LLR 终端能力项,影响IR能否全量发挥
初传BLER 链路自适应的工作点 个位数到10%正常,残留错误才报警

八、三个常见误解

误解一:“重传多说明网络差。” 恰恰相反,适度的重传是系统在激进配置下的正常呼吸。判断网络健康度的正确姿势是看“合并后仍失败的占比”和重传率的突变趋势,而不是重传的绝对量。

误解二:“HARQ就是一种重传协议。” 它的精髓在接收端而不在重传动作本身——没有软信息缓存和LLR合并的ARQ,就算重传一百次,每次也是从零开始。同样的重传次数,软合并的成败概率天差地别。

误解三:“重传就是把原包再发一遍。” 在增量冗余成为主力的今天,重传发的大概率是初传没发过的校验比特。如果你在分析重传性能时按“完整重复”建模,估出来的增益会系统性偏低。

常见问题

Q: HARQ重传和RLC层重传有什么区别?已经有两道保险,为什么都要? A: 三点不同:层级上,HARQ在物理层与MAC层交界,RLC在它之上;粒度上,HARQ按编码比特块重传并做软合并,RLC按协议包整体重传、丢掉旧的重新收;时延上,HARQ重传在毫秒级,RLC重传要慢一个量级。分工是:HARQ用软合并吃掉绝大多数零星误码,RLC只兜HARQ都救不回来的极端情况(比如重传次数耗尽)。两道保险成本不同、速度不同,谁也不替代谁。

Q: 初传BLER为什么定在10%而不是越低越好? A: 把初传BLER从10%压到1%,要求更高的信噪比,意味着要么加大功率、要么调低MCS——两者都损失吞吐或覆盖。而10%的初传失败由毫秒级软合并几乎全部兜住,对上层表现为接近无损。也就是说,10%是“传输成功”这个概念被HARQ重新定义之后的最优点:链路自适应负责让初传“十拿九稳”,HARQ负责剩下的“一失”。

Q: 重传时为什么要换RV?一直用RV0把同一段重发不行吗? A: 一直用RV0就退化成了Chase合并——只赚功率叠加的几dB,不增加新的编码信息。换RV的目的是把母本里还没发过的校验比特补进来,让等效码率随重传次数下降。至于常见序列里跳过某些编号,是因为不同窗口里信息位与校验位的配比不同,跳到的那些位置对合并贡献小,约定俗成走性价比最高的路径。

Q: 软合并要求两次传输噪声独立,什么情况下会被破坏? A: 如果两次重传落在高度相关的信道状态上(比如终端静止、强反射径稳定,两次经历几乎相同的深衰落),噪声和衰落不再独立,合并增益会明显缩水。好在系统调度天然避开了这一点:重传发生在不同的时频资源上,配合跳频等机制,两次传输的信道经历通常差异足够大。

Q: 为什么 sometimes 连续多次重传还是解不出来,系统怎么办? A: 每个HARQ进程有最大重传次数限制。耗尽之后,这包数据在物理层宣告死亡,交由上层处理——数据业务由RLC确认模式接管重传,最终还有TCP端到端兜底;语音这类UM业务则直接丢包,靠码度和人耳的容错扛过去。所以排障时如果看到“HARQ重传次数耗尽”类事件增多,说明链路已经差到软合并都救不动,要优先查覆盖和干扰。

参考来源

  1. Hybrid automatic repeat request - Wikipedia — HARQ的总体概念、Chase合并与增量冗余两条技术路线的词条级概述
  2. Incremental redundancy - Wikipedia — 增量冗余与速率兼容打孔编码的原理条目
  3. Forward error correction - Wikipedia — 前向纠错、软判决译码的背景知识
  4. Likelihood function - Wikipedia — 似然函数与对数似然比的数学定义出处
  5. 樊昌信、曹丽娜《通信原理》差错控制编码章节 — 软判决译码、ARQ与HARQ对比的经典教材表述

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

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入