目录

下面完整整理“差错控制”至“局域网”之前的内容,重点补全海明码的编码、定位纠错过程,以及 CRC 的模2除法、生成多项式和检错能力。全文只使用 DokuWiki 原生语法。

差错控制

一、本节概述

数据在通信信道中传输时,会受到噪声、干扰、衰减和信号失真的影响,导致接收数据与发送数据不一致。

为了将错误降低到系统允许的范围,需要使用:

Error Control(差错控制)

差错控制的基本思想是:在原始信息中增加一定数量的冗余信息,使接收方能够发现或纠正传输错误。

本节主要内容包括:

  1. 差错产生的原因;
  2. 随机错误与突发错误;
  3. 检错与纠错;
  4. 海明码;
  5. 循环冗余校验码。
差错控制
│
├─ 差错产生原因
│  ├─ 热噪声
│  ├─ 冲击噪声
│  ├─ 信号失真
│  └─ 串扰
│
├─ 差错类型
│  ├─ 随机错误
│  └─ 突发错误
│
├─ 控制策略
│  ├─ 检错后重传
│  └─ 接收端直接纠错
│
└─ 典型编码
   ├─ 海明码
   └─ CRC循环冗余校验码

二、差错产生的原因

1. 热噪声

Thermal Noise(热噪声)是由电子随机热运动产生的噪声。

主要特点:

热噪声通常引起:

Random Error(随机错误)

2. 冲击噪声

Impulse Noise(冲击噪声)是短时间出现、但瞬间幅度很大的干扰。

常见来源包括:

冲击噪声的特点:

冲击噪声通常引起:

Burst Error(突发错误)

3. 信号失真

信号幅度、传播速度与相位、频率等参数有关。信号在传输过程中可能出现:

接收端可能因此错误判断信号状态,从而产生差错。

4. 串扰

Crosstalk(串扰)是相邻线路或相邻信道之间发生信号耦合,一个信号对另一个信号产生干扰的现象。

串扰通常具有突发性,也可能导致多个数据位连续出错。

三、随机错误与突发错误

比较项目 随机错误 突发错误
英文名称 Random Error Burst Error
典型原因 热噪声 冲击噪声、串扰和瞬态干扰
错误分布 零散、随机出现 集中出现在一段数据范围内
常见影响 一个或少量数据位 多个连续范围内的数据位
常用控制方法 奇偶校验、海明码 CRC、交织和重传

1. 突发错误长度

突发错误长度是指从第一个错误位开始,到最后一个错误位结束所覆盖的总位数。

例如:

发送数据:110101101001
接收数据:110'''01011'''1001

突发错误范围内不要求每一位都发生错误。只要第一个错误位与最后一个错误位之间覆盖5位,突发错误长度就是5。

四、冗余校验原理

1. 信息位与冗余位

假设:

则:

''n=k+r''

其中:

符号 含义
k 原始信息位数
r 冗余校验位数
n 编码后的总位数

发送方按照确定的算法,根据原始信息计算冗余位,再将信息位与冗余位一起发送。

接收方对收到的数据使用同一算法:

2. 编码效率

增加冗余位会降低有效数据比例。

编码效率为:

''η=k÷(k+r)''

例如,7位信息增加1位校验位:

''η=7÷8=87.5%''

冗余位越多:

五、检错与纠错

1. 检错

Error Detection(检错)是指接收方能够判断数据发生了错误,但通常不能确定正确数据是什么。

发现错误后,接收方可以请求发送方重新传输。

这种策略称为:

ARQ(Automatic Repeat reQuest,自动重传请求)

发送数据
    ↓
接收端执行校验
    ↓
是否检测到错误?
├─ 否:接收数据
└─ 是:请求发送方重传

2. 纠错

Error Correction(纠错)是指接收方不仅知道发生了错误,还能确定错误位置并恢复正确数据。

利用冗余信息在接收端直接完成纠错的技术称为:

FEC(Forward Error Correction,前向纠错)

3. 检错与纠错比较

比较项目 检错 纠错
英文名称 Error Detection Error Correction
能否发现错误
能否确定错误位置 通常不能 在编码能力范围内可以
能否直接恢复数据 不能 可以
是否通常需要重传
冗余位数量 较少 较多
实现复杂度 较低 较高
典型机制 奇偶校验、CRC 海明码、FEC编码

六、海明码基本概念

1. 海明码的提出

1950年,理查德·海明研究了利用冗余位检测和纠正代码错误的方法。

Hamming Code(海明码)是一类通过增加多个校验位,实现错误检测和错误定位的线性分组码。

海明码的基本思想是:

2. 海明重量

一个码字中二进制1的数量称为:

Hamming Weight(海明重量)

例如:

''10110100''

其中有4个1,因此:

''海明重量=4''

3. 海明距离

两个等长码字在对应位置上不同的位数称为:

Hamming Distance(海明距离)

可通过按位异或计算:

码字A:10110110
码字B:10011100
异或值:00101010

异或结果中有3个1,因此:

''d(A,B)=3''

其中:

XOR(Exclusive OR,异或)的运算规则是:

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

4. 最小海明距离

一个编码系统中,任意两个合法码字之间海明距离的最小值称为:

Minimum Hamming Distance(最小海明距离)

通常记作:

''d_min''

最小海明距离决定了编码能够检测和纠正多少位错误。

七、海明距离与差错控制能力

1. 检错能力

如果最小海明距离为 d_min,则最多能够保证检测:

''d_min-1''

位错误。

若要保证检测 s 位错误,需要满足:

''d_min≥s+1''

例如:

最小海明距离 保证检测的错误位数
2 1位
3 2位
4 3位
5 4位

2. 纠错能力

如果要保证纠正 t 位错误,需要满足:

''d_min≥2t+1''

最大保证纠错位数为:

''t_max=⌊(d_min-1)÷2⌋''

其中 ⌊x⌋ 表示向下取整。

最小海明距离 保证纠正的错误位数
2 0位
3 1位
4 1位
5 2位
6 2位
7 3位

3. 几何意义

一个长度为 n 的二进制码字,可以看成 n 维超立方体中的一个顶点。

两个码字之间的海明距离,就是两个顶点之间需要改变的最少坐标数量。

如果两个合法码字的距离为 d

纠错的本质是将接收到的错误码字判断为距离最近的合法码字。

4. 奇偶校验的海明距离

7位ASCII数据增加1位奇偶校验后形成8位码字。

这些合法码字之间的最小海明距离为2,因此:

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)

八、海明码校验位数量

1. 基本条件

设:

对于单比特纠错,每一个有效码字需要区分:

因此,一个有效码字需要对应:

''n+1''

种可识别状态。

由于 k 位校验位可以表示 2^k 种状态,所以必须满足:

''2^k≥n+1''

代入 n=m+k

''2^k≥m+k+1''

也可以写成:

''m+k+1≤2^k''

这就是单比特纠错海明码校验位数量的基本条件。

2. 教材推导

对于 m 位数据,有:

''2^m''

个有效信息。

每个有效码字需要表示:

总共需要:

''2^m(n+1)''

个可区分码字。

长度为 n 的二进制码字共有:

''2^n''

种可能,因此:

''2^m(n+1)≤2^n''

因为:

''n=m+k''

所以:

''n+1≤2^k''

最终得到:

''m+k+1≤2^k''

3. 常见数据位与校验位对应关系

数据位m 最少校验位k 总码长n 验证
1 2 3 1+2+1=4≤2²
4 3 7 4+3+1=8≤2³
7 4 11 7+4+1=12≤2⁴
8 4 12 8+4+1=13≤2⁴
11 4 15 11+4+1=16≤2⁴
12 5 17 12+5+1=18≤2⁵
26 5 31 26+5+1=32≤2⁵

4. 快速判断方法

给定数据位 m 后,从较小的 k 开始尝试:

''2^k≥m+k+1''

取满足条件的最小 k

例如,8位数据:

尝试 k=3

''2³=8''
''8+3+1=12''
''8<12'',不满足。

尝试 k=4

''2⁴=16''
''8+4+1=13''
''16≥13'',满足。

因此,8位数据至少需要4位海明校验位。

九、海明码的位编号与校验关系

1. 校验位的位置

海明码把校验位放在序号为2的整数次幂的位置:

其余位置用于存放数据位。

以11位码字为例:

位置 1 2 3 4 5 6 7 8 9 10 11
类型 P1 P2 D1 P4 D2 D3 D4 P8 D5 D6 D7

其中:

2. 校验位分组规则

把每个位置编号写成二进制数:

十进制位置 8位 4位 2位 1位
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1

一个位置参加哪些校验,由其二进制编号中哪些位为1决定。

校验位 检查条件 检查的位置
P1 位置编号的最低位为1 1、3、5、7、9、11
P2 位置编号的2位为1 2、3、6、7、10、11
P4 位置编号的4位为1 4、5、6、7
P8 位置编号的8位为1 8、9、10、11

3. 某数据位参加哪些校验

例如,第6位:

''6=0110₂''

其2位和4位为1,因此第6位参加:

第9位:

''9=1001₂''

其1位和8位为1,因此第9位参加:

十、海明码编码示例

1. 放置原始数据

教材示例的原始数据为:

''1001011''

将7个数据位依次放入:

''3、5、6、7、9、10、11''

号位置。

位置 1 2 3 4 5 6 7 8 9 10 11
类型 P1 P2 D1 P4 D2 D3 D4 P8 D5 D6 D7
数据 1 0 0 1 0 1 1

2. 计算P1

P1检查:

''1、3、5、7、9、11''

不考虑P1本身,数据位为:

''1、0、1、0、1''

其中有3个1。

若采用偶校验,为使1的总数成为偶数:

''P1=1''

3. 计算P2

P2检查:

''2、3、6、7、10、11''

不考虑P2本身,数据位为:

''1、0、1、1、1''

其中有4个1,已经是偶数,因此:

''P2=0''

4. 计算P4

P4检查:

''4、5、6、7''

不考虑P4本身,数据位为:

''0、0、1''

其中有1个1,因此:

''P4=1''

5. 计算P8

P8检查:

''8、9、10、11''

不考虑P8本身,数据位为:

''0、1、1''

其中有2个1,因此:

''P8=0''

6. 最终码字

位置 1 2 3 4 5 6 7 8 9 10 11
编码结果 1 0 1 1 0 0 1 0 0 1 1

最终海明码为:

''10110010011''

十一、海明码纠错示例

1. 传输错误

假设码字:

''10110010011''

在传输过程中第6位由0变成1,接收结果为:

''10110110011''
位置 1 2 3 4 5 6 7 8 9 10 11
接收值 1 0 1 1 0 1 1 0 0 1 1

2. 接收端重新校验

接收端按照相同规则进行偶校验:

校验组 校验结果 含义
P1组 正确 错误位置的1位标志为0
P2组 错误 错误位置的2位标志为1
P4组 错误 错误位置的4位标志为1
P8组 正确 错误位置的8位标志为0

形成校验结果:

''P8 P4 P2 P1=0110₂''

转换为十进制:

''0110₂=6''

也可以直接将出错校验位编号相加:

''2+4=6''

因此可以确定:

''第6位发生错误''

将第6位取反:

''1→0''

即可恢复原码字。

3. 综合校验值

各校验结果组成的二进制数称为:

Syndrome(伴随式或校验综合)

十二、海明码的能力与限制

普通海明码的最小距离通常为3,因此:

增加一个全局奇偶校验位后,可构成:

SECDED(Single Error Correction, Double Error Detection,单错纠正、双错检测)

其能力为:

十三、循环码

1. 基本概念

Cyclic Code(循环码)是一类具有循环性质的线性分组码。

如果一个码字是合法码字,那么将其循环左移或循环右移任意位后,得到的码字仍然是合法码字。

例如,若:

''a_(n-1) a_(n-2) … a₁ a₀''

是合法码字,则其循环移位结果也是合法码字:

''a_(n-2) a_(n-3) … a₀ a_(n-1)''

循环码便于使用移位寄存器和异或门实现。

十四、CRC循环冗余校验

1. 基本概念

CRC(Cyclic Redundancy Check,循环冗余校验)是一种基于循环码和模2多项式除法的检错方法。

CRC的主要特点:

2. CRC基本过程

发送端:

  1. 选择生成多项式;
  2. 在原始数据后补0;
  3. 执行模2除法;
  4. 取得余数作为CRC校验码;
  5. 将原始数据与CRC余数组成发送码字。

接收端:

  1. 用相同生成多项式除接收到的完整码字;
  2. 如果余数为0,则未检测到错误;
  3. 如果余数不为0,则判定传输出现错误。
原始数据D
    ↓
末尾补r个0
    ↓
除以生成多项式G
    ↓
得到r位余数R
    ↓
原始数据+余数
    ↓
发送

十五、模2运算

CRC使用:

Modulo-2 Arithmetic(模2运算)

其特点:

1. 模2加减法

A B A+B或A-B
0 0 0
0 1 1
1 0 1
1 1 0

因此:

''1+1=0''
''1-1=0''
''0-1=1''

在CRC运算中,加法和减法均可使用XOR实现。

2. 移位与乘法

多项式乘以 x,相当于二进制码左移一位。

多项式乘以 x^r,相当于二进制码末尾补 r 个0。

十六、二进制码与多项式

一个二进制码字可以表示为一个系数属于0或1的多项式。

例如:

''00101011''

从最高非零位开始对应:

''x⁵+x³+x+1''

因为:

二进制位 对应多项式项
第5次项为1 x⁵
第4次项为0
第3次项为1
第2次项为0
第1次项为1 x
常数项为1 1

因此:

''00101011 ↔ x⁵+x³+x+1''

1. 生成多项式

CRC使用的除数称为:

Generator Polynomial(生成多项式)

通常记作:

''G(x)''

如果生成多项式最高次数为 r,则:

十七、CRC数学模型

设:

对数据多项式补 r 个0,相当于:

''x^rD(x)''

执行模2除法:

''x^rD(x)=Q(x)G(x)+R(x)''

其中:

''deg R(x)<r''

实际发送的码字为:

''F(x)=x^rD(x)+R(x)''

由于模2运算中的加法和减法相同,所以:

''F(x)''

能够被:

''G(x)''

整除。

接收端计算:

''F(x)÷G(x)''

正确情况下余数应为0。

十八、CRC计算步骤

假设:

计算步骤:

  1. 在原始数据后补 r 个0;
  2. 使用生成多项式对应的二进制数进行模2长除;
  3. 模2减法使用异或,不借位;
  4. 得到长度不超过 r 位的余数;
  5. 不足 r 位时在左侧补0;
  6. 用余数替换原来补入的 r 个0;
  7. 得到最终发送码字。

表达式为:

''发送码字=原始数据+CRC余数''

十九、CRC校验示例

教材示例使用:

''D=00101011''

对应数据多项式:

''D(x)=x⁵+x³+x+1''

生成多项式采用CRC-CCITT:

''G(x)=x¹⁶+x¹²+x⁵+1''

生成多项式二进制形式为:

''1 0001 0000 0010 0001''

十六进制形式通常简写为:

''1021H''

因为生成多项式次数为16,所以在原始数据后补16个0:

''00101011 0000000000000000''

进行模2长除后,教材得到余数:

''9509H''

因此,16位CRC校验和为:

''9509H''

其中:

最终发送的数据形式为:

''00101011 1001010100001001''

二十、CRC硬件实现

CRC可以使用以下电路实现:

使用:

LFSR(Linear Feedback Shift Register,线性反馈移位寄存器)

实现CRC时:

  1. 先将寄存器清零;
  2. 数据逐位输入移位寄存器;
  3. 移出的位通过反馈线路参与异或;
  4. 数据全部输入后,再输入与校验位数量相同个数的0;
  5. 最终寄存器内容就是CRC余数。

生成多项式中系数为1的项,决定反馈异或连接的位置。

CRC-CCITT的生成多项式为:

''G(x)=x¹⁶+x¹²+x⁵+1''

因此其硬件反馈路径与:

相对应。

二十一、CRC接收端校验

设正确发送码字为:

''F(x)''

传输过程中产生的错误多项式为:

''E(x)''

接收到的码字为:

''H(x)=F(x)+E(x)''

因为正确码字 F(x) 能被 G(x) 整除:

需要注意:

如果错误多项式 E(x) 恰好也能被 G(x) 整除,则:

''H(x)''

仍能被 G(x) 整除,此时错误无法被CRC检测。

因此,CRC不能检测所有理论上可能的错误,但合适的生成多项式可以使漏检概率非常低。

二十二、CRC的检错能力

CRC检错能力取决于生成多项式 G(x)

1. 单比特错误

如果 G(x)至少包含两个非零项,即不是单项式,则可以检测所有单比特错误。

教材表述为:

如果生成多项式的项数大于1,可以检测所有单比特错误。

2. 奇数位错误

如果 G(x)含有因子:

''x+1''

则能够检测所有奇数个位发生的错误。

3. 突发错误

如果CRC校验位长度为 r,则可以检测所有长度:

''≤r''

的突发错误。

对于长度为 r+1 的突发错误,绝大多数也能够被检测。

更长的突发错误也具有较高的检出概率。

4. CRC核心结论

错误类型 检测条件或能力
单比特错误 生成多项式至少包含两个非零项时可全部检测
奇数位错误 G(x)含有因子x+1时可全部检测
长度不超过r的突发错误 可全部检测
更长突发错误 可检测绝大多数,但不能保证全部检测

二十三、常用CRC生成多项式

1. CRC-CCITT

CRC-CCITT(Consultative Committee for International Telegraph and Telephone CRC,国际电报电话咨询委员会循环冗余校验)

''G(x)=x¹⁶+x¹²+x⁵+1''

常见十六进制表示:

''1021H''

2. CRC-16

''G(x)=x¹⁶+x¹⁵+x²+1''

3. CRC-12

''G(x)=x¹²+x¹¹+x³+x²+x+1''

4. CRC-32

''G(x)=x³²+x²⁶+x²³+x²²+x¹⁶+x¹²+x¹¹+x¹⁰+x⁸+x⁷+x⁵+x⁴+x²+x+1''

CRC-32广泛应用于局域网及其他计算机网络。

CRC类型 校验位长度 教材给出的生成多项式
CRC-12 12位 x¹²+x¹¹+x³+x²+x+1
CRC-16 16位 x¹⁶+x¹⁵+x²+1
CRC-CCITT 16位 x¹⁶+x¹²+x⁵+1
CRC-32 32位 x³²+x²⁶+x²³+x²²+x¹⁶+x¹²+x¹¹+x¹⁰+x⁸+x⁷+x⁵+x⁴+x²+x+1

二十四、海明码与CRC比较

比较项目 海明码 CRC
英文名称 Hamming Code Cyclic Redundancy Check
主要目的 检错并纠正单比特错误 检测传输错误
数学基础 海明距离与校验位分组 循环码与模2多项式除法
错误定位 可以定位能力范围内的错误 通常不能定位具体错误位
直接纠错 可以 通常不可以
突发错误检测 一般 很强
冗余位计算 2^k≥m+k+1 由生成多项式次数决定
硬件实现 校验网络 移位寄存器和异或门
典型应用 存储器纠错、数字通信 局域网、数据链路和存储系统

二十五、考试重点

必须掌握:

二十六、常见易错点

二十七、快速解题方法

1. 求海明码校验位数量

已知数据位 m

  1. k=1开始尝试;
  2. 计算 2^k
  3. 计算 m+k+1
  4. 找到第一个满足 2^k≥m+k+1k

2. 求海明码错误位置

  1. 按原校验规则重新计算各校验组;
  2. 正确记为0,错误记为1;
  3. 按照 P8、P4、P2、P1 的顺序组合;
  4. 将所得二进制数转换为十进制;
  5. 十进制数就是错误位置;
  6. 将该位置取反完成单比特纠错。

3. 求CRC校验码

  1. 确定生成多项式的最高次数 r
  2. 在数据后补 r 个0;
  3. 使用生成多项式执行模2长除;
  4. 每次减法使用异或;
  5. 得到 r 位余数;
  6. 将余数附加到原数据后形成发送码字。

4. 验证CRC码字

  1. 用相同生成多项式除完整接收码字;
  2. 余数非0:检测到错误;
  3. 余数为0:未检测到错误。

二十八、英文缩写与术语速查表

缩写或术语 英文全称 中文含义
Error Control Error Control 差错控制
Random Error Random Error 随机错误
Burst Error Burst Error 突发错误
Thermal Noise Thermal Noise 热噪声
Impulse Noise Impulse Noise 冲击噪声
Crosstalk Crosstalk 串扰
Error Detection Error Detection 检错
Error Correction Error Correction 纠错
ARQ Automatic Repeat reQuest 自动重传请求
FEC Forward Error Correction 前向纠错
Hamming Code Hamming Code 海明码
Hamming Weight Hamming Weight 海明重量
Hamming Distance Hamming Distance 海明距离
d_min Minimum Hamming Distance 最小海明距离
Syndrome Syndrome 伴随式或校验综合
SECDED Single Error Correction, Double Error Detection 单错纠正、双错检测
XOR Exclusive OR 异或
CRC Cyclic Redundancy Check 循环冗余校验
CRC-CCITT Consultative Committee for International Telegraph and Telephone CRC 国际电报电话咨询委员会CRC
LFSR Linear Feedback Shift Register 线性反馈移位寄存器
Generator Polynomial Generator Polynomial 生成多项式
Modulo-2 Arithmetic Modulo-2 Arithmetic 模2运算
ASCII American Standard Code for Information Interchange 美国信息交换标准代码
H Hexadecimal 十六进制表示标记

二十九、本节知识脉络

差错控制
│
├─ 差错原因
│  ├─ 热噪声 → 随机错误
│  ├─ 冲击噪声 → 突发错误
│  ├─ 信号失真
│  └─ 串扰
│
├─ 控制策略
│  ├─ 检错
│  │  └─ ARQ请求重传
│  └─ 纠错
│     └─ FEC直接恢复
│
├─ 海明码
│  ├─ 海明距离
│  ├─ d_min决定检错纠错能力
│  ├─ 2^k≥m+k+1
│  ├─ 校验位位于1、2、4、8
│  └─ Syndrome指出错误位置
│
└─ CRC
   ├─ 循环码
   ├─ 模2多项式除法
   ├─ 生成多项式G(x)
   ├─ 余数作为校验码
   ├─ 接收端重新计算余数
   └─ 擅长检测突发错误

三十、相关条目

软考 网络规划设计师 计算机网络 数据通信 差错控制 海明码 海明距离 CRC 循环冗余校验 模2运算 检错 纠错 ARQ FEC