protocol

CRC 循环冗余校验原理

·4 分钟阅读·1216 字
📋 目录

CRC 循环冗余校验原理

CRC(Cyclic Redundancy Check,循环冗余校验)是一种通过对输入数据进行多项式模 2 运算,生成固定长度校验值的算法,用于验证数据完整性。

核心原理(4 步)

1. 定义核心参数

计算前需确定两个关键参数(不同 CRC 标准参数不同,如常见的 CRC-16/CCITT):

  • 生成多项式(Generator Polynomial):16 位的二进制数(通常用十六进制表示),如 0x1021(二进制 1000000100001),是 CRC 运算的”计算规则”
  • 初始值(Initial Value):计算开始前,先给一个 16 位的寄存器赋值(如 CRC-16/CCITT 初始值为 0xFFFF),作为运算起点

2. 数据预处理(补位)

将输入的二进制数据末尾补 16 个 0,目的是让最终运算结果能覆盖数据的所有位。

3. 模 2 除法运算(核心步骤)

用补位后的数据与生成多项式进行模 2 除法(仅涉及”异或”和”移位”,无减法):

  • 规则:1 XOR 1 = 01 XOR 0 = 10 XOR 0 = 0
  • 从数据的最高位开始,取前 16 位与生成多项式进行”异或”,得到新的 16 位结果
  • 将结果左移 1 位,再补入数据的下一位,形成新的 16 位数据,再次与生成多项式”异或”
  • 重复上述步骤,直到处理完所有位,最终得到一个 16 位的余数

4. 结果处理(可选)

部分 CRC 标准会对最终的 16 位余数进行”异或后处理”(如与 0xFFFF 异或),处理后的结果即为最终 CRC 校验值。

简单类比

可将 CRC 比作**“数据称重”**:

  • 生成多项式 = 称重的”标准砝码”(固定规则)
  • 输入数据 = 待称重的”物品”
  • CRC 校验值 = 物品的”重量”(固定长度,是物品的唯一”短标识”)

接收方只需重新”称重”(计算 CRC),若两次”重量”一致,说明数据未损坏。

关键特点

  • 仅校验,不加密:原理是”数据映射”,无法反向推导原始数据,不能用于安全加密
  • 高效快速:仅涉及异或和移位(简单位运算),对硬件/软件资源占用低
  • 适合场景:嵌入式、通信等对性能敏感的场景
  • 抗碰撞弱:不同数据可能生成相同校验值

常见 CRC 标准

标准多项式初始值应用场景
CRC-16/CCITT0x10210xFFFF通信协议
CRC-16/IBM0x80050x0000USB 协议
CRC-320x04C11DB70xFFFFFFFFEthernet、ZIP、PNG

关联文档 -../网络 — 网络基础主页

  • ../../storage/Ceph 分布式存储 — CRC 用于数据完整性校验
  • ../../linux/system/Linux — 系统级数据校验