Skip to content

CRC循环冗余校验

CRC(Cyclic Redundancy Check)是数据链路层最重要的差错检测机制,几乎所有帧(以太网、PPP、802.11)都用CRC作为帧校验序列(FCS)。

工作原理

发送端(生成FCS)

  1. 在数据 \(M\) 末尾附加 \(r\) 个零(\(r\) = 生成多项式次数)
  2. 对扩展后的数据 \(M \cdot 2^r\) 做模2除法(即异或除法),除以生成多项式 \(P(x)\)
  3. 余数(\(r\) 位)即为 FCS
  4. 发送 \(T = M \cdot 2^r + FCS\)(此时 \(T\) 能被 \(P\) 整除)

接收端(验证)

  1. 对收到的帧 \(T'\) 做模2除法,除以相同的 \(P(x)\)
  2. 若余数为零 → 帧正确,接收
  3. 若余数非零 → 帧有错,丢弃

常用生成多项式

标准 多项式 应用
CRC-8 \(x^8+x^2+x+1\) ATM首部
CRC-16 \(x^{16}+x^{15}+x^2+1\) USB, BISYNC
CRC-32 \(x^{32}+x^{26}+x^{23}+...+1\) 以太网, 802.11, PPP

以太网使用 CRC-32,FCS字段为4字节。

模2运算规则

模2加法(即异或):

1 + 1 = 0  (不进位)
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0

模2除法(商的每一位由异或决定,不借位)。

CRC的能力

CRC-32 能检测: - 所有1位错、2位错 - 所有奇数位错 - 所有突发长度 ≤ 32 位的突发错 - 大多数更长的突发错(漏检率约 \(2^{-32}\))

重要限制

CRC 只能检测错误,不能纠正错误。

检测到错误的帧直接丢弃,依靠上层(TCP)的重传机制处理。

参见

  • [[03-数据链路层]] — 数据链路层三个基本问题
  • [[03-数据链路层|PPP]] — 使用CRC-16/32的广域网协议
  • [[以太网与MAC地址|MAC帧格式]] — CRC-32的具体应用