前向纠错方式 (Forward Error Correction, FEC)

发出去的数据,就指望你收到能够自己解决问题

  • 消息 m: 这是我们想要发送的原始数据。
  • 纠错编码: 在发送端,我们不是直接发送原始数据 m,而是对它进行“纠错编码”。这个编码过程会加入冗余信息(多余但有用的信息)。比如,你可以想象成给一句话里多加一些重复的字,即使中间掉了几个字,也能根据剩下的猜出原意。编码后的数据我们称之为码字 c
  • 信道: 码字 c 沿着信道(比如无线电波、光纤、网线等)进行传输。在传输过程中,由于噪声、干扰等原因,数据可能会出错,比如 0 变成了 1,或者 1 变成了 0。
  • 接收向量 r: 接收端收到的就是带有潜在错误的码字,我们称之为接收向量 r。
  • 纠错译码: 接收端根据接收到的 r 以及编码时加入的冗余信息,尝试检测并纠正传输过程中产生的错误。如果错误在可纠正的范围内,它就能成功恢复出原始消息 m 的近似值,我们称之为消息

FEC 的实现依赖于各种纠错码,例如汉明码、循环冗余校验码 (CRC) (虽然 CRC 主要是检错,但一些高级 CRC 也可以用于纠错)、卷积码、Turbo 码、LDPC 码等。这些编码在数学上设计得非常巧妙,能够让少数比特错误不影响整体数据的恢复。它们通过在原始数据中增加校验位(parity bits),使得接收端可以通过这些校验位来定位并翻转错误的比特。

反馈重传方式 (Automatic Repeat reQuest, ARQ)

我给你发数据,你收到之后告诉我收的怎么样,如果收的不好,我再重发一遍

  1. 消息 m: 原始消息。
  2. 纠错编码: 与 FEC 类似,也会进行编码,但这里的编码主要是为了检错(Error Detection),而不是直接纠错。通常会加入 CRC 校验码等。编码后的数据是码字 c。
  3. 信道: 码字 c 传输。
  4. 接收向量 r: 接收端收到 r。
  5. 纠错译码: 接收端对 r 进行译码,检查数据是否出错。
    • 如果数据正确: 接收端会发送一个确认(ACK) 信号给发送端。
    • 如果数据出错: 接收端会发送一个否定确认(NACK) 信号(或超时不发送 ACK)给发送端,请求重传。
  6. 反馈链路: 接收端通过反馈链路将 ACK/NACK 信号传回发送端。
  7. 发送端:
    • 收到 ACK,发送下一段数据。
    • 收到 NACK,或者在规定时间内没有收到任何回复,发送端会重传之前的数据段。

底层原理: ARQ 的核心在于“检错”和“反馈”。检错通常通过 CRC 校验码等完成,这些码能够以极高的概率检测出传输中的错误。反馈机制则确保了发送方能够知道接收方的数据接收情况,从而决定是否重传。常见的 ARQ 协议包括停等 ARQ、回退 N 步 ARQ 和选择重传 ARQ。

混合纠错方式 (Hybrid Error Control, HEC)

结合了 FEC 和 ARQ 的优点,先尝试自己纠错,纠不了再请求重传。

  • 消息 m: 原始消息。
  • 纠错编码: 发送端对 m 进行编码,这种编码既包含纠错码(像 FEC 那样),也包含检错码(像 ARQ 那样)。生成码字 c。
  • 信道: 码字 c 传输。
  • 接收向量 r: 接收端收到 r。
  • 可纠错?(决策点): 接收端首先使用 FEC 的纠错能力来尝试纠正错误。
    • 是(可纠错): 如果接收到的错误在自身的纠错能力范围内,就直接纠正,恢复出消息 (或者码字 c^)。无需通知发送端。
    • 否(不可纠错): 如果错误超出了其纠错能力(或检测到错误但无法纠正),则说明单靠 FEC 解决不了,此时会切换到 ARQ 模式,发送NACK信号(或超时)请求发送端重传
  • 反馈链路(虚线): 当需要重传时,通过反馈链路通知发送端。

HEC 通常会先采用 FEC 的纠错码进行“初步处理”,处理掉大部分的轻微错误。对于那些 FEC 无法纠正的严重错误,则利用 ARQ 的检错和重传机制来保证最终的可靠性。这是一种“双保险”的策略。