1. FEC与重传机制概述

前向纠错(FEC)原理

前向纠错,简称FEC,说白了就是在发送数据时就带上冗余信息。接收端拿到这些冗余码字,就能自己把错修回来,用不着麻烦发送方再重发一次。

我最早接触FEC,是在一条卫星链路上调一个视频传输项目。当时延时特别大,重传一遍来回要半秒多,画面直接卡死。后来切了FEC,虽然带宽多了20%左右,但画面总算能看了。打那之后,我对FEC的印象就一个字——快。不管重传多好的机制,总归有来回时间,FEC不来回,一次到位。

FEC的核心思路很简单:给原始数据增加校验码。比如最经典的Reed-Solomon(RS)码,它的参数写成 RS(n, k):

  • k 是原始数据块的长度
  • n 是编码后带冗余的总长度
  • 冗余度就是 (n – k) 个符号

举个例子,你发送100字节的数据,用RS(120, 100),每100字节额外带20字节的纠错码。如果信道里丢了一些字节,接收端能用这20个冗余把它补回来。具体能纠多少错?一般可以纠正 (n – k)/2 个错误。注意是“错误”不是“丢失”,丢失的算擦除,能纠更多。这里不展开数学细节,你只要记住一句话:FEC用带宽换时间。

参数含义典型值
n编码后总符号数120
k原始符号数100
t可纠错符号数(错误)10
冗余率(n−k)/n16.7%
我的一个小习惯:选FEC强度时,先看链路误码率(BER)的分布。如果是随机零星错误,冗余少点就行;如果是突发误码(比如Wi-Fi丢包一大段),冗余得加倍。我在5G试验网里就吃过亏,按随机错误配的RS(220,200),结果突发的连续错误直接干穿纠错上限,视频全花了。

自动重传请求(ARQ)基础

ARQ就完全是另一条路——不纠错,只检错,错了就喊发射方重新发。典型的流程是:接收方收到数据包,算个CRC,如果校验通过回ACK,不通过回NAK或者什么都不回(超时重发)。

最常见的三种ARQ机制:

  1. 停等ARQ(Stop-and-Wait):发一个包,等ACK,到了再发下一个。简单,但利用率低。我当年做低速物联网模组时用过,9600波特率下一个包几十毫秒,等得起。但换成千兆以太网你试试看,效率会低到离谱。
  2. 回退N步ARQ(Go-Back-N):连续发一堆包,一旦某一个丢了或错了,发送方从那个包开始全部重传。窗口长度固定,适合信道比较稳定的场景。我记得有一回优化一个地面微波链路,用了Go-Back-N窗口32,误码率一上来就“雪崩”——一个包错,后面31个白传了。
  3. 选择性重传ARQ(Selective Repeat):只重传出错的包,其他包缓存起来乱序重组。效率最高,但实现也最复杂。我现在做的无线视频传输项目就用的Selective Repeat,接收侧要维护一个大重排缓冲区,处理乱序到达的包。

三种方式的对比我经常拿来做调试手册的入门参考:

类型重传粒度接收缓存需求效率(高误码)实现复杂度
停等ARQ单包无极低简单
回退N步整窗口无(丢弃乱序包)低中等
选择性重传单包有(重排序)高复杂
注意:ARQ有一个根本弱点——它依赖反馈信道。如果反馈信道本身丢包严重,ACK/NAK丢了,发送端会超时重传已经收到的包,造成浪费。我曾经在一条不对称链路上吃过这个亏:下行带宽够,上行只有几个kbps,NAK频繁拥塞丢失,最后接收端缓冲区被重传数据填满,全链路崩溃。后来给NAK加了序列号和前置优先级才解决。

混合自动重传请求(HARQ)简介

看到这里你可能在想:FEC快但浪费带宽,ARQ节省带宽但牺牲延时。能不能两个合起来用?当然可以。这就是HARQ。

HARQ的思路:第一次发数据包时,带上一部分FEC冗余。如果接收端解码成功,直接回ACK;如果解码失败,但不至于完全找不到北,接收端会缓存这次失败的软信息(比如LLR对数似然比),然后请求发送端重发增补冗余。发送端再发一些额外的校验比特,接收端把新老信息合并起来再尝试解码。这样大大提高了成功率。

HARQ分两种主流方案:

  • 类型I HARQ(纯重传+简单合并):每次重传都是相同的数据和冗余,接收端做分集合并(Chase Combining)。简单,但增益有限。
  • 类型II HARQ(增量冗余 HARQ / IR-HARQ):重传的不是整个包,而是新的冗余比特。每次重传都增加纠错能力。我倾向于用IR-HARQ,码率自适应,效率明显更高。

嗯,这里要注意:IR-HARQ虽然好,但要求接收端能灵活调整软缓冲区大小。我在调试4G LTE基站的HARQ流程时,曾因为软缓存区配置不匹配,导致重传合并后CRC依然失败,反复重传了4次才成功——后来重新算了最大软比特数和HARQ进程数才压下来。

下面这张图把FEC、ARQ、HARQ的关系串到一起,你看一眼就能明白它们各自的位置:

误码处理机制:FEC与重传体系 发送端 前向纠错 (FEC) RS/LDPC/卷积码 自动重传请求 (ARQ) 停等/GBN/SR 混合ARQ (HARQ) IR-HARQ / Chase 接收端 成功 → 上行ACK 失败 → 请求重传 合并解码再试 FEC一次性纠错 → 低延时;ARQ精准重传 → 省带宽;HARQ折中结合 → 鲁棒性强 实际系统中常根据信道质量动态切换使用哪一种或组合

HARQ的关键设计参数包括:

  • 最大重传次数:太多会堆积延时,太少则浪费纠错潜力。LTE里一般是4次,NR灵活到最多几十次。
  • 冗余版本(RV):增量冗余里每次重传用不同的打孔模式。我习惯搞一个RV序列表,第一版给满码率,后面逐渐降低。别忘了同步接收端的软合并状态机,否则合并全是乱序。
  • HARQ进程数:流水线里同时存在多个未完成的HARQ事务。太少导致发送端等响应而空闲,太多则占用大量内存。5G NR最多16个进程,我调试时发现10个左右就能喂饱100MHz带宽。

核心思想:三种机制不是互斥的。现代通信系统——比如4G/5G、Wi-Fi 6、卫星DVB-S2X——都把FEC作为底码,再在MAC层叠一层ARQ或HARQ。你的调试工具必须能同时观测这两层的状态:物理层的CRC错误、解码迭代次数、软比特范围;MAC层的重传计数、RTT、缓冲区水位。缺一个信息,误码定位就像瞎猫捉耗子。

写到这里我想起一个真实的案例:调试某国产卫星通信网关时,发现FEC纠错一直正常,ARQ却反复超时。一开始以为FEC部分没问题,后面一查才发现接收端会错误地把解码成功的包当成失败,导致双重重传。最后问题出在——软比特量化位数被协议栈误配成4位,SNR估计偏差超过3dB,判决定门直接崩溃。所以说,别以为FEC修好了就万事大吉:上层重传日志和底层解码统计必须联合分析。