前两年在线上教网络基础课,我最喜欢在开篇问学员一个问题:如果一份数据跨过几百公里送到对端,中途出了差错,你是打算让发送方重传一次,还是在数据里预先塞进足够的“备份信息”,让接收方自己把错误修回来?这其实就是在问,ARQ 和 FEC 你选哪个。搞懂这个问题,才算真正理解“可靠传输”这四个字。
这篇文章我不会只给你堆一堆协议名词,而是把这两项技术的底层逻辑、量化计算方法、常见的工程误解,以及我在实际项目里踩过的坑,一次性讲清楚。文章既适合刚接触网络协议栈的初学者,也适合做无线、音视频、底层链路开发的工程师参考。
1. 同一场“丢包事故”,两种不同的修复哲学
先说一个我常用来给新人打比方的场景:你从 A 城往 B 城寄一箱零件,运输途中颠簸了几公里,开箱一看,有 5 个零件碎了。这时候你有两种处理思路。
第一种是打电话告诉收货方:“把那 5 个碎掉的零件型号报给我,我马上补寄一份过去。”这就是 ARQ(Automatic Repeat reQuest,自动重传请求)。它依赖一条“反馈通道”,让接收方告诉发送方哪些数据丢了、错了,然后发送方针对性地重传。TCP 里的超时重传、快速重传,数据链路层的帧重传机制,本质都是这个思路。
第二种是出发之前,你就往箱子里多塞了一套备用的零件。收货方打开箱子,发现几个零件碎了,直接拿备用件替换,连电话都不用打。这就是 FEC(Forward Error Correction,前向纠错)。它的特点是“闭环不需要回来”,发送方通过冗余数据和纠错算法,让接收方在无反馈的前提下自己修复错误。DVD 光盘上的划痕能正常读出来,二维码撕了一角还能扫出来,靠的就是 FEC 在背后干活。
两种哲学的分界线很明显:
| 维度 | ARQ | FEC |
|---|---|---|
| 反馈通道 | 必须要有 | 完全不需要 |
| 冗余开销 | 出错时才重传,平时几乎零额外开销 | 不管有没有错,都要带冗余,固定开销 |
| 实时性 | 依赖 RTT,一传一收,延迟高 | 无等待期,适合实时流 |
| 纠错能力 | 只要反馈通道在,理论上可无限次重传 | 纠错能力固定,超出冗余范围就无能为力 |
| 复杂度 | 收发双方实现重传状态机 | 编解码算法复杂度高,硬件/CPU 开销大 |
正因为两者各有死穴,所以真实工程里很少只用一家。TCP 不会把 FEC 作为标准能力,无线基站则把两者焊死在一起用。理解各自边界之前,得先搞清楚它们对抗的“敌人”到底长什么样。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先认清信道脾气:随机比特错、突发错与丢包不是一回事
很多人一上来就谈 ARQ 和 FEC,结果连“差错”本身的分类都没摸清。我见过不少现场排查的人,看到 ping 丢包就喊链路质量差,结果一查,根本不是“包丢了”,而是帧里的比特翻了个位,被校验层当成垃圾丢掉了。两者在应用层看都是“丢”,但在协议栈上完全是两码事。
2.1 随机比特错:噪声导致的“单点翻车”
随机比特错,指的是数据流里孤立的某一位从 0 变成 1。理想情况下,信道里的热噪声、白噪声会让信号幅度发生微小波动,当噪声幅度恰好跨过判决门限,接收端就把一个符号判错了。比如光模块的 OSNR 劣化、无线信道深衰落边缘附近,最容易出现这种错误。
随机错的特点是分散、孤立的,前后比特大概率是好的。对付它,单比特纠错码就够用,比如汉明码。这也是为什么很多系统的 FEC 设计首选汉明距离合适的码字。
2.2 突发错:多个比特连着坏
相比之下,突发错更棘手。脉冲干扰、电源浪涌、无线信道快衰落、光盘上的物理划痕、Wi-Fi 在某段时间里被微波炉干扰,这些场景都会导致连续多个比特一起出错。一张光盘有一道刮痕,可能连续几百个字节都读不出来;一条网线在强电磁环境下,数据帧尾部可能连着 CRC 校验全算不过。
突发错对纠错码是个大考验。如果 FEC 的码字长度就那么几十比特,一道突发错误进来,整个码字可能直接被击穿。工程上通行的手段是“交织”,把连续比特分散到不同的码字里,让一批相邻错误变成每个码字里的一
