Appearance
差错检测(CRC校验)
考情分析
CRC 校验是 408 数据链路层的高频考点,几乎每隔一两年就会出现,常见形式是给定数据位和生成多项式,要求手算 FCS(帧检验序列)或判断接收到的帧是否出错。模 2 除法的计算过程必须熟练掌握。
考频:★★★★
差错的来源与分类
比特在传输过程中可能发生错误,0 变成 1 或者 1 变成 0。根据错误的分布模式,分为两类:
- 位错(比特错): 某一个或几个比特发生翻转
- 单比特错:只有 1 位出错
- 多比特错:多个不相邻的位出错
- 突发错误:连续多个位出错(实际链路中最常见)
- 帧错: 帧丢失、帧重复、帧失序(这些由协议层面处理,不在差错检测的范围内)
检错 vs 纠错
| 类型 | 能力 | 代表方法 | 开销 |
|---|---|---|---|
| 检错码 | 只能检测出错误,不能定位和纠正 | CRC、奇偶校验 | 冗余位少,开销小 |
| 纠错码 | 能检测并纠正错误 | 海明码 | 冗余位多,开销大 |
数据链路层通常使用检错码 + 重传的策略(ARQ),而不是纠错码。因为有线链路的误码率很低,大部分帧是正确的,用纠错码会浪费带宽。
奇偶校验码
最简单的检错方法,在数据后面附加 1 个校验位,使整个码字中 1 的个数为奇数(奇校验)或偶数(偶校验)。
- 奇校验:包括校验位在内,1 的总数为奇数
- 偶校验:包括校验位在内,1 的总数为偶数
| 特性 | 说明 |
|---|---|
| 检错能力 | 只能检测奇数位错误,偶数位同时出错时检测不出 |
| 纠错能力 | 无法纠错,也无法定位出错位置 |
| 编码效率 | 高(只增加 1 位冗余) |
| 应用场景 | 早期通信、存储系统(如内存 ECC 的基础) |
奇偶校验的码距
CRC 循环冗余校验
基本思路
发送方和接收方事先约定一个生成多项式
生成多项式
生成多项式用二进制表示。例如:
规则:
模 2 运算
CRC 中的"除法"不是普通的算术除法,而是模 2 除法:
- 模 2 加法 = 模 2 减法 = 异或(XOR)
- 0 XOR 0 = 0, 0 XOR 1 = 1, 1 XOR 0 = 1, 1 XOR 1 = 0
- 不进位、不借位
CRC 计算步骤
设数据为
第 1 步: 在数据
第 2 步: 用
第 3 步: 余数
第 4 步: 发送的帧 = 数据
计算例题
已知: 数据
第 1 步: 数据后补 3 个 0 →
第 2 步: 模 2 除法(
101001000
⊕ 1011 (首位为1,可以除)
---------
0001 01000
↓
00101000 (去掉前导0,取够4位)
⊕ 0000 (首位为0,商0,不除)
---------
0101000
⊕ 0000 (首位为0,商0)
---------
101000
⊕ 1011 (首位为1,可以除)
---------
001100
⊕ 0000 (首位为0)
---------
01100
⊕ 0000 (首位为0)
---------
1100
⊕ 1011 (首位为1)
---------
0110
⊕ 0000
----
110 ← 余数 R = 110第 3 步: FCS =
第 4 步: 发送帧 =
接收方校验
接收方收到
交互可视化
下面的可视化工具可以动态演示 CRC 的模 2 除法计算过程,输入数据和生成多项式后逐步展示每一轮异或运算。
也可以使用计算器快速验算 CRC 结果:
CRC 的检错能力
CRC 不是万能的,它的检错能力取决于生成多项式的选择:
- 能检测出所有奇数个比特错误(前提是
含因子 ) - 能检测出所有双比特错误(前提是
的阶 突发长度) - 能检测出所有长度
的突发错误 - 长度为
的突发错误,检测不出的概率为
CRC 只能检错,不能纠错。检测到错误后,数据链路层的做法是直接丢弃该帧,由上层协议负责重传。
易错点
1. 余数位数必须等于
如果计算出的余数不足
2. 模 2 除法不是普通除法
最容易犯的错误是在做除法时借位。模 2 除法全程用异或运算,不存在借位。每一步就是简单的 XOR。
3. 生成多项式的二进制表示
4. CRC 检错 ≠ 纠错
CRC 余数不为 0 只能说明"出错了",但不知道哪一位错了。海明码才具备定位和纠正错误的能力。
高频考点清单
- 奇偶校验只能检测奇数位错误(码距
) - 给定数据和生成多项式,手算 FCS
- 模 2 除法的完整计算过程
- 接收方校验:用收到的完整帧除以
,余数为 0 则正确 - 生成多项式与二进制串的互相转换
- CRC 的检错能力范围
- FCS 位数 = 生成多项式的阶