2639 字
13 分钟
3.3差错控制

3.3 差错控制#

实际的通信链路并非理想,比特在传输过程中可能产生差错:1 可能变为 0,0 也可能变成 1,这种现象称为比特差错。比特差错是传输差错的一种,本节仅讨论此类差错。

通常采用编码技术进行差错控制,主要分为两类:检错编码和纠错编码。采用检错编码时,接收方若检测到差错,会设法通知发送方重传,直到收到正确的数据为止;采用纠错编码时,接收方不仅能发现差错,还能确定错误位置并加以纠正。在探讨具体的编码技术之前,需先引入码距(也称海明距离)的概念——它是衡量编码检错能力与纠错能力的重要参数。

码距是指两个码字在对应位上取值不同的比特数量。计算码距的一种方法是对两个位串进行异或(xor)运算,结果中1的个数即为码距。例如,0110⊕0011=0101,结果中有两个1,说明这两个码字有2位不同,因此其码距为2。在一个编码集中,任意两个有效码字之间码距的最小值称为该编码集的码距。例如,对于编码集{10011,01011,11110,00001},虽然11110与00001的码距为5,但10011与01011的码距仅为2,取各码距中的最小值,求得该编码集的码距为2。

根据差错控制理论,编码方案的检错能力和纠错能力与码距 l 的关系如下:

l=d+c+1,且 dcl=d+c+1, \text{且 } d\geqslant c

即码距 l 越大,其检错的位数 d 就越大,纠错的位数 c 也越大,且纠错能力恒不超过检错能力(能纠错必然能检错)。例如,当码距 l=3 时,该编码最多可检测 2 位错误,或纠正 1 位错误。此外,进一步考虑 c=0 或 d=c 的两种边界情况,还可得出以下两个重要结论

  1. 为检测 d 位错误,编码方案的码距至少应为 d+1d+1。任何发生 d 位错误的有效码字不可能变成另一个有效码字,以确保差错可被发现。例如,码距为 1 的编码无法检测任何错误。
  2. 为纠正c位错误,编码方案的码距至少应为 2c+12c+1。即使一个有效码字发生c位错误,其仍然离原始码字最近,接收方可据此唯一确定原始码字,实现纠错。

3.3.1 检错编码#

检错编码均采用冗余编码技术,其核心思想是:在有效数据(信息位)发送前,按照特定规则附加若干冗余位(检验位),构成一个符合预设编码规则的码字后再发送。当信息位发生变化时,冗余位也会相应调整,以确保整个码字始终满足该编码规则。接收方通过校验收到的码字是否仍符合这一规则,来判断是否发生了差错。若某些比特在传输中出错,则可能违反原有的编码规则,进而使差错被有效检测出来。常见的检错编码包括奇偶检验码循环冗余码

1. 奇偶检验码#

奇偶检验码是奇检验码偶检验码的统称,是最基本的检错码。它由 n 位数据和 l 位检验位组成,检验位的取值(0 或 1)使得整个码字中“1”的个数为奇数(奇校验)或偶数(偶校验)。

  1. 奇检验码:附加检验位后,码字中“1”的总数为奇数。
  2. 偶检验码:附加检验位后,码字中“1”的总数为偶数。

例如,7位数据1001101中有4个“1”(偶数),因此:对应的奇检验码为100110111001101\underline{1}(加1使“1”的总数为奇数),对应的偶检验码为100110101001101\underline{0}(加0使“1”的总数保持为偶数)。

奇偶检验码只能检测奇数位错误,无法发现偶数位错误,也无法定位错误位置。由于任意两个合法码字之间至少有2位不同,其码距为2。根据码距理论,此类编码最多可检测1位错误。而实际上,只要发生奇数位错误,“1”的总数奇偶性必然改变,因此能检测所有奇数位错误。

2. 循环冗余码#

循环冗余码(Cyclic Redundancy Code,CRC)是数据链路层广泛采用的一种高效检错技术,具有检错能力强、实现简单、硬件支持成熟等显著优势,其基本原理如下。

CRC 的核心思想: 将待发送的数据视为一个二进制多项式, 通过与一个预定义的生成多项式 G(x)G(x) 进行特定运算, 生成一段冗余校验信息 (称为帧检验序列, FCS), 并将其附加在原始数据之后。接收方则使用相同的 G(x)G(x) 对整个接收到的帧进行验证, 从而判断传输过程中是否出现差错。

CRC 校验过程的具体描述如下。

约定生成多项式 G(x)G(x)#

收发双方事先约定一个 r+1r+1 阶的生成多项式 G(x)G(x),其对应的二进制系数串长度为 r+1r+1 位,且最高位和最低位必须为 1。例如,位串 1101 对应多项式 x3+x2+1x^{3}+x^{2}+1,其阶数 r=3。

发送方生成FCS#

假设待发送数据为 mm 位,记作位串 MM;在 MM 后面添加 rr 个 0,得到长度为 m+rm+r 的扩展串(相当于将 MM 左移 rr 位,即乘以 2r2^r);用 G(x)G(x) 对应的位串对该扩展串进行模 2 除法(不进位的二进制除法,其减法操作由异或实现);所得余数(共 rr 位,不足时补前导 0)即为 FCS;将原扩展串末尾的 rr 个 0 替换为 FCS,形成最终发送帧(2rM+FCS2^rM + FCS),总长度为 m+rm+r 位。

接收方校验#

接收方收到整个帧(可能出错)后,用相同的 G(x)G(x) 对其进行模2除法:若余数为0,则认为传输无差错,接受该帧;若余数非0,则认为存在差错,丢弃该帧。

以数据 M=101001(m=6)生成多项式 G(x)=1101G(x)=1101(对应 r=3)为例。

CRC 校验码的计算步骤如下:

  1. 左移补零:在M后加3个0,即101001000。
  2. 模2除法:用1101去除101001000,如图3.8所示。模2除法规则:减法不借位,等价于按位异或;从最高位开始,每次对齐除数进行异或,直到处理完所有位。
  3. 取余数:最终余数为001(必须保留为3位)。
  4. 构造发送帧:将余数作为 FCS 附加到原始数据后,即 101001001(共 9 位)。

CRC 的生成与校验通常由专用硬件电路实现,速度极快,几乎不会引入额外的延迟。若传输过程中无差错,则 CRC 检验所得余数必定为 0;若出现误码,余数仍为 0 的概率极低。因此,在工程实践中通常认为 “凡是被数据链路层接受的帧,几乎可以确定在传输过程中未发生差错”。而那些被丢弃的帧,尽管物理上曾被收到,却因 CRC 校验失败而未被上层接受。

3.3.2 纠错编码#

最常见的纠错编码是海明码。其基本原理是在原始信息位中插入若干检验位,构成具有检错与纠错能力的海明码。每个检验位对应一个校验组(通常采用偶校验),用于校验海明码中的若干信息位。通过将每个信息位分配到多个检验组中,当某一位出错时,会引发其所属的多个检验组同时出现校验错误,从而不仅能检测出错误,还能确定错误位置,实现单比特纠错

下面以信息位 1010 为例,详细介绍海明码的构造与纠错过程。

(1) 确定海明码的总位数#

设信息位有 n 位,检验位有 k 位。k 个检验位可表示 2k2^{k} 种状态:信息位和检验位共有 n+kn + k 种单比特出错的位置,此外还需 1 种表示无错状态。因此,n 与 k 需满足

2kn+k+12^{k}\geq n+k+1

本例中 n=4,尝试 k=3:234+3+1k=3:2^{3} \geqslant 4+3+1 成立。故取 k=3,海明码共 n+k=7n+k=7 位。记信息位为 D4D3D2D1=1010D_{4}D_{3}D_{2}D_{1}=1010,检验位为 P3P2P1P_{3}P_{2}P_{1},海明码位号从右至左依次为 H7H6H5H4H3H2H1H_{7}H_{6}H_{5}H_{4}H_{3}H_{2}H_{1}

(2) 确定检验位的分布#

规定:检验位 PiP_i 放在海明位号为 2i12^{i-1} 的位置上,其余各位放置信息位,因此:

P1P_{1}的海明码位号为 2i1=20=12^{i-1}=2^{0}=1,即 H1H_{1}P1P_{1}

P2P_{2} 的海明码位号为 2i1=21=22^{i-1}=2^{1}=2,即 H2H_{2}P2P_{2}

P3P_{3} 的海明码位号为 2i1=22=42^{i-1}=2^{2}=4,即 H4H_{4}P3P_{3}

将信息位按原顺序放在剩余位置,得到海明码的分布如下:

H7H6H5H4H3H2H1D4D3D2P3D1P2P1\begin{array}{c c c c c c c}{H_{7}}&{H_{6}}&{H_{5}}&{H_{4}}&{H_{3}}&{H_{2}}&{H_{1}}\\ {D_{4}}&{D_{3}}&{D_{2}}&{P_{3}}&{D_{1}}&{P_{2}}&{P_{1}}\\ \end{array}
(3) 分组以形成检验关系#

每个信息位由多个检验位共同校验,需满足条件:信息位所在位号 = 其所参与的所有检验位位号之和。另外,检验位不需要再被检验。分组形成的检验关系如下。

D1 位于 H3, 由 H2H1(P2P1) 检验:因为 3(011)=D2 位于 H5, 由 H4H1(P3P1) 检验:因为 5(101)=D3 位于 H6, 由 H4H2(P3P2) 检验:因为 6(110)=D4 位于 H7, 由 H4H2H1(P3P2P1) 检验:因为 7(111)=[H4(P3)+44+4]+[H2(P2)2+2+2+]H1(P1)1+2+2+\begin{aligned}&D_{1} \text{ 位于 } H_{3}, \text{ 由 } H_{2}H_{1}(P_{2}P_{1}) \text{ 检验:}\quad& \text{因为 } 3(011)=\\&D_{2} \text{ 位于 } H_{5}, \text{ 由 } H_{4}H_{1}(P_{3}P_{1}) \text{ 检验:}\quad& \text{因为 } 5(101)=\\&D_{3} \text{ 位于 } H_{6}, \text{ 由 } H_{4}H_{2}(P_{3}P_{2}) \text{ 检验:}\quad& \text{因为 } 6(110)=\\&D_{4} \text{ 位于 } H_{7}, \text{ 由 } H_{4}H_{2}H_{1}(P_{3}P_{2}P_{1}) \text{ 检验:}\quad& \text{因为 } 7(111)=&\begin{bmatrix}H_{4}(P_{3})\\&&+\\&&\\4&&\\4&&+\\4&&\\\end{bmatrix}+\begin{bmatrix}H_{2}(P_{2})\\&2\\&&+\\&&\\2&&+\\2&&+\\\end{bmatrix}\begin{matrix}H_{1}(P_{1})\\&1\\&&+\\&&\\2&&+\\2&&+\\\end{matrix} \end{aligned}
(4) 检验位取值#

检验位 PiP_{i} 的值为其对应校验组中所有位(含信息位)求异或(偶校验结果)。

根据(3)中的分组有

P1 校验 D1,D2,D4P1=D1D2D4=011=0P_{1} \text{ 校验 } D_{1},D_{2},D_{4}\quad\rightarrow\quad P_{1}=D_{1}\oplus D_{2}\oplus D_{4}=0\oplus1\oplus1=0P2 校验 D1,D3,D4P2=D1D3D4=001=1P_{2} \text{ 校验 } D_{1},D_{3},D_{4}\quad\rightarrow\quad P_{2}=D_{1}\oplus D_{3}\oplus D_{4}=0\oplus0\oplus1=1P3 校验 D2,D3,D4P3=D2D3D4=101=0P_{3} \text{ 校验 } D_{2},D_{3},D_{4}\quad\rightarrow\quad P_{3}=D_{2}\oplus D_{3}\oplus D_{4}=1\oplus0\oplus1=0

因此,1010 对应的海明码为 1010010101\underline{0}0\underline{1}\underline{0} (下划线为检验位,其余为信息位)。

(5) 海明码的检验原理#

每个检验组分别利用检验位和参与形成该检验位的信息位进行奇偶检验检查,构成 k 个检验方程:

S1=P1D1D2D4S_{1}=P_{1}\oplus D_{1}\oplus D_{2}\oplus D_{4}S2=P2D1D3D4S_{2}=P_{2}\oplus D_{1}\oplus D_{3}\oplus D_{4}S3=P3D2D3D4S_{3}=P_{3}\oplus D_{2}\oplus D_{3}\oplus D_{4}

S3S2S1S_{3}S_{2}S_{1} 的值为“000”,表示无错误;否则表示出错,且这个数就是错误位的位号,如 S3S2S1=001S_{3}S_{2}S_{1}=001,表示第1位出错,即 H1H_{1} 出错,直接将其取反即可达到纠错的目的。

海明码的优势在于:通过少量冗余检验位,可实现单比特错误的自动定位与纠正。

3.3差错控制
https://www.atsuko.top/posts/408/computer-network/33-error-control/
作者
AC_DB
发布于
2026-06-06
许可协议
CC BY-NC-SA 4.0

评论