差错控制
差错控制是数据通信中保障传输可靠性的核心技术,通过检错编码 与纠错编码两类手段,发现并处理传输过程中产生的比特错误。
检错编码(如奇偶校验、CRC)仅识别错误,不定位错误位置,发现后直接丢弃数据帧并请求发送方重传,实现简单、开销小,适合对实时性要求不高的场景。
纠错编码(如海明码)通过插入冗余校验位,不仅能检测错误,还能精准定位并自动纠正 1 位错误,无需重传,适合重传代价高的场景;扩展后可检测 2 位错误,但 2 位错仍需重传。
整体目标是在有限冗余开销下,最大化数据传输的准确性与效率。所谓差错控制的核心目标就是发现并解决一个帧内部的比特错误,保障数据传输的可靠性。
| 类型 | 核心功能 | 典型实现 |
|---|---|---|
| 检错编码 | 发现比特错误 → 丢弃帧并要求发送方重传 | 奇偶校验、CRC 循环冗余校验 |
| 纠错编码 | 发现并纠正比特错误,无需重传 | 海明码(汉明码) |
一、检错编码
1. 奇偶校验码
基本原理
在信息位后添加 1 位校验位,使整个校验码(信息位 + 校验位)中 "1" 的个数满足:
- 奇校验码:"1" 的个数为奇数
- 偶校验码:"1" 的个数为偶数(更常用,可通过异或运算实现)
结构示意

**示例:**采用偶校验码进行差错控制,假设有效信息数据是: 10110001
那么信息为中共有偶数个1.因此校验位为0,校验码为:0 10110001
接收方收到数据后,对校验码进行校验,如果发现整个校验码中有偶数个1,则认为没有差错,否则认为数据出错
校验能力
- 只能检测奇数位错误,无法检测偶数位错误
- 无法定位错误位置,不具备纠错能力
2. CRC 循环冗余校验码(工程常用)
核心原理
发送方与接收方约定一个生成多项式 G(x),将信息位与校验位组合后,保证能被 G(x) 对应的二进制码模 2 除尽(余数为 0)。
关键参数
- k:信息位位数
- r:生成多项式的最高次幂(即校验位位数)
- 总码长:N=k+r
结构示意

示例 :双方约定生成多项式为G(x)=x3+x2+1G(x)=x^3+x^2+1G(x)=x3+x2+1,信息码为101001,求CRC码
-
确定生成多项式二进制码:
G(x)=1⋅x3+1⋅x2+0⋅x1+1⋅x0G(x)=1⋅x^3+1⋅x^2+0⋅x^1+1⋅x^0G(x)=1⋅x3+1⋅x2+0⋅x1+1⋅x0⟹1101
r=3,k=信息码长度=6,总码长 N=6+3=9
-
信息位左移补 0:
在信息位后补 r 个 0 →
101001000 -
模 2 除法求余数:
用补 0 后的信息码除以生成多项式
1101,得到 r 位余数(即校验位)(具体运算过程在下方) -
拼接 CRC 码:
CRC 码 = 原信息码 + 余数 →
101001001
模 2 运算规则
- 模 2 减法 = 异或运算(无借位):1−1=0,1−0=1,0−1=1,0−0=0
- 模 2 除法:只看被除数最高位,为 1 则商 1 并做模 2 减,为 0 则商 0 并补 0

检错能力
- 可检测所有奇数位错误
- 可检测所有长度 ≤r 的突发错误
- 无法纠错,仅用于检错重传
二、纠错编码:海明码(汉明码)
核心思想
将信息位分组进行偶校验,生成多个校验位,通过多组校验结果定位并纠正 1 位错误。
校验位数量计算(海明不等式)
设信息位为 n 位,校验位为 k 位,总码长 n+k 位,需满足:
2k≥n+k+1 2k≥n+k+1 2k≥n+k+1
- 含义:k 个校验位可表示 2k 种状态,其中 1 种表示 "无错误",剩余 2k−1 种需覆盖 n+k 位中任意 1 位出错的情况。
示例计算
设信息位=1010(四位,n=4),求海明码:
1.确定海明码的位数
- 试算 k=3:23=82^3=823=8,4+3+1=8,满足不等式 → 需 3 个校验位 P1 P2 P3
- 信息位n=4,记为D4 D3 D2 D1
- 总码长:4+3=7 位,记为 H7 H6 H5 H4 H3 H2 H1
2.确定校验位的分布
三个校验位并不是在开头或者结尾,而是每一个都有自己定位置
校验位Pi要放在海明码位号为2(i−1)2^(i-1)2(i−1)的位置上,信息位则按顺序放到空位:
- P1→20=1→H1P1 → 2^0=1 → H1P1→20=1→H1
- P2→21=2→H2P2 → 2^1=2 → H2P2→21=2→H2
- P3→22=4→H4P3 → 2^2=4 → H4P3→22=4→H4
| 海明码位 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|---|
| 对应位 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
| 示例值 | 1 | 0 | 1 | 0 |
3.确定分组
有三个校验位,则需要把信息位分成三个组,分别做偶校验得到三个校验码
分组方式:将每个信息位的位置编号转为二进制,二进制中某一位为 1,则该信息位属于对应校验位的分组:
- D1(H3 → 3 →
011)→ 属于 P1,P2 组 - D2(H5 → 5 →
101)→ 属于 P1,P3 组 - D3(H6 → 6 →
110)→ 属于 P2,P3 组 - D4(H7 → 7 →
111)→ 属于 P1,P2,P3 组
直观的理解:

分组结果:
- P1 组:D1,D2,D4
- P2 组:D1,D3,D4
- P3 组:D2,D3,D4
4.计算校验位取值(偶校验)
- P1=D1⊕D2⊕D4=0⊕1⊕1=0
- P2=D1⊕D3⊕D4=0⊕0⊕1=1
- P3=D2⊕D3⊕D4=1⊕0⊕1=0
生成最终海明码:
| 海明码位 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|---|
| 对应位 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
| 示例值 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
填入校验位后得到:1010010
海明码纠错流程
接收端重新计算各组校验结果,得到校正子 S3 S2 S1:
- 若 S3 S2 S1 = 000 → 无错误
- 若 S3 S2 S1 != 000 → 该二进制数即为出错位的位置编号 ,即第
S3 S2 S1位出错了将该位取反即可纠正
标准海明码仅具备纠 1 错能力,无法区分 "1 位错" 和 "2 位错"(例如 P1 与 P2 同时跳变)。
扩展方案:增加全校验位
在海明码后新增 1 位校验位,对整个海明码做偶校验:
| 扩展后海明码 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|---|---|
| 对应位 | 全 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
| 示例值 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
纠错 / 检错判断规则
- S3 S2 S1 = 000、且全校验通过 → 无错误
- S3 S2 S1 != 000、且全校验失败 → 1 位错,可纠正
- S3 S2 S1 != 000、且全校验通过 → 2 位错,需重传
三、三种编码对比总结
| 特性 | 奇偶校验 | 海明码 | CRC 循环冗余校验 |
|---|---|---|---|
| 核心功能 | 检错(奇数位) | 纠 1 错 / 检 2 错 | 检错(强能力) |
| 冗余位 | 1 位 | k 位(满足 2k≥n+k+1) | r 位(生成多项式最高次幂) |
| 运算方式 | 统计 1 的个数 / 异或 | 多组偶校验 | 模 2 除法 |
| 纠错能力 | ❌ 无 | ✅ 可纠 1 位错 | ❌ 无 |
| 典型应用 | 内存简易校验 | ECC 内存、低延迟通信 | 网络帧、磁盘存储、USB 传输 |