什么是CRC校验

基本概念

我们知道,数据在传输过程中可能会因为传输介质故障或外界的干扰而产生比特差错(使原来的0变为1,原来的1变为0),从而导致接收方接收到错误的数据。为尽量提高接收方收到数据的正确率,在接收数据之前需要对数据进行差错检测,仅当检测的结果为正确时才接收数据。

差错检测的方式有多种,常见的有奇偶校验、求和校验、CRC校验等。他们的工作原理都是发送端对数据按照某种算法计算出来校验码,将校验码和数据一起发送到接收端,然后接收端进行检验确定数据是否发生变化。

CRC是由W. Wesley Peterson在1961年发表的论文中提出,由于CRC校验在速度、成本、正确率等方面比其他校验方式更具有优势,因此,CRC成为计算机信息、通信领域最为普遍的校验方式。例如在标准的以太帧格式中,最后有4个字节长度的冗余位,用于存储CRC校验的值,这个冗余位又常称为帧检验序列FCS(Frame Check Sequence)。

帧尾增加4Bytes CRC码

核心原理

CRC的思想就是先在要发送的K比特长度的数据后面附加一个R比特长度的校验码,然后生成一个新帧发送给接收端。接收端接收到新帧后,根据收到的数据和校验码来验证接收到的数据是否正确。

多项式除法:

要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(“模2除法”)。接收端把接收到的新帧除以这个选定的除数。
因为在发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。
如果有余数,则表明该帧在传输过程中出现了差错。

将待传输的原始数据视为一个二进制数(例如 101001)。
选择一个预定义的生成多项式(如 x³ + x + 1,对应二进制 1011)。
通过多项式除法,计算原始数据与生成多项式的余数,该余数即为CRC校验码。

附加校验码:

将计算出的CRC校验码附加到原始数据末尾,形成完整的传输数据。

接收端验证:

接收方用相同的生成多项式对接收到的数据(含CRC码)再次计算余数。
若余数为零,则数据正确;否则判定为传输错误。
常见CRC生成多项式

示例

CRC-4-ITU(生成多项式 x⁴ + x + 1

  1. 原始数据1101 0110
  2. 生成多项式10011(对应 x⁴ + x + 1
  3. 计算步骤
    • 在原始数据后补4个零(生成多项式最高次为4):1101 0110 0000
    • 用生成多项式进行模2除法,得到余数 1110
  4. 最终传输数据1101 0110 1110
    可检测所有单比特错误、双比特错误、奇数个错误,及大多数突发错误(取决于生成多项式)。

总结

CRC校验通过多项式除法生成冗余校验码,以极低的计算成本实现高可靠性的错误检测,是数字系统中保障数据完整性的基础技术。
其性能取决于生成多项式的选择(如CRC-8、CRC-16、CRC-32等不同标准)。

参考文献


什么是CRC校验
https://rongyel.github.io/posts/ffadf7ba.html
作者
Rong晔
发布于
2025年3月3日
许可协议