- 专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航
文章目录
- 一:检错编码
- (1)奇偶校验码
- (2)循环冗余检验码(CRC)
- 二:纠错编码(海明校验码)
- (1)码字和码距
- (2)海明校验码
- A:纠错理论
- B:求解海明码
- C:补充-全校验位
- 三:注意
本节对应视频如下
【计算机网络微课堂(有字幕无背景音乐版)】:3.3:差错检测
差错检测:数据在传输过程中可能会因为各种因素而出现差错,主要有以下两种类型的错误
- 位错(本节研究内容):比特位出现错误
- 帧错:几个比特出现错误;包括帧丢失、帧重复、帧失序;对于帧错误可以通过编号、确认重传解决
其中关于位错,可由差错检测码解决,差错检测码主要包括检错编码和纠错编码
- 检错编码:奇偶校验码、循环冗余校验码CRC
- 纠错编码:海明码
一:检错编码
- 注意此部分内容在《计算机组成原理》校验码部分已有介绍:【专栏必读】王道考研408计算机组成原理万字笔记和题目题型总结(从学生角度辅助大家理解):各章节导航及思维导图
(1)奇偶校验码
奇偶校验码:在原编码的基础上增加一个校验码,可以检测出一位错误(或奇数位错误),但不能确定出错位置,也不能检测出偶数位出错,增加的冗余位称为奇偶校验位;校验位只取0或1,它的加入使整个校验码中“1”的个数要么是奇数要么是偶数,所以就有两种可选的校验规律
- 奇校验码:整个检验码中“1”的个数为奇数
- 偶校验码:整个校验码中“1”的个数为偶数
例如:1001101的奇校验码和偶校验码设置如下
奇偶校验具有很大的局限性,只能发现数据代码中的奇数位出错的情况
校验过程:
- 传输前,发送端和接收端会协议确定彼此之间采用奇校验还是偶校验
- 以偶校验为例:首先会将二进制所有位进行异或运算,所得结果就是偶校验位,例如上面信息“1001101”,进行异或运算“1⊕0⊕0⊕1⊕1⊕0⊕1=0”,这表明“1”的个数为偶数个,故偶校验位为0
- 接收端在接受信息后会进行异或运算,一旦结果为“1”表明错误;例如上图中第一个例子,在接受到之后进行异或运算“0⊕1⊕0⊕1⊕1⊕1⊕0⊕1=1”,所以结果错误
(2)循环冗余检验码(CRC)
- 举个例子,A要向B传送数据
882
,为了校验数据是否准确,A和B约定了一个除数7
,882
除以7
是可以除尽的;B在接收到数据之后同样也使882除以7,如果没有余数,数据可能正确,但如果有余数那么一定出现了错误
循环冗余校验码:CRC的原理和上面除法的例子基本一致。发送方和接收方提前约定好一个数,作为除数(这里的数自然指的是二进制序列),然后在 K K K个信息位后拼接 R R R个校验位作为被除数(添加的校验位需要保证被除数除以除数余数为0),接受方在接收到数据之后进行除法运算,检查余数是否为0
双方会通过生成多项式 G ( x ) G(x) G(x)来确定除数
- 例如多项式 G ( x ) = x 3 + x 2 + 1 G(x)=x^{3}+x^{2}+1 G(x)=x3+x2+1,其完整形式为 G ( x ) = 1 × x 3 + 1 × x 2 + 0 × x 1 + 1 × x 0 G(x)=1\times x^{3}+1\times x^{2}+0\times x^{1}+1\times x^{0} G(x)=1×x3+1×x2+0×x1+1×x0,取其系数,则除数为 1101 1101 1101
这里以传送信息101001,生成表达式为 G ( x ) = x 3 + x 2 + 1 G(x)=x^{3}+x^{2}+1 G(x)=x3+x2+1为例,演示CRC码的求解过程
①:确定 K K K、 R R R以及生成多项式对应的二进制码
首先
- 校验位 R = R= R=生成多项式最高幂次 = 3 =3 =3
- K = K= K=信息码长度的 = 6 =6 =6
- 整个编码位数 N = K + R = 9 N=K+R=9 N=K+R=9
- 多项式 G ( x ) G(x) G(x)对应二进制码(即除数)为 1101 1101 1101
②:移位
现在我们要确保添加的 3 3 3位校验位形成的被除数可以整除除数,因此将信息码 101001 101001 101001左移R位,低位补0,也即 101001000 101001000 101001000,称其为新信息码
③:相除
对于新信息码,用生成多项式进行模2除法,产生余数。
-
举个例子,用1001000作为被除数,1011作为除数,模2除法为的是求余数,不关心商。
首先商为1,得出结果
此时不应该做减法,而应该做对应为的异或运算
接着如果高位为0,就抹去一位,同时后面用被除数的补齐一位
这里经过异或运算,然后抹位补位得到的结果(比如上图0100)中,如果首位为0就商0,首位为1就商1
继续异或,然后抹位,补位后
继续
运算到这里,其实可以进行快捷操作。异或后前面有多少0都全部扔掉,再从被除数哪里补齐相应位即可。但是这里很明显只能取一个,于是就得到下面的结果,此时也是最终结果,因为余数位数小于除数
好的,回到正题。此时运算出的余数为001,作为校验位。于是整个CRC码即为信息码+校验码= 101001001 101001001 101001001
④:检验纠错
接收方接受到数据后,会使用约定的除数进行模2除运算,如果余数为000,表示结果可能正确;如果接收方数据为 101001011 101001011 101001011(导数第二位出现错误),计算结果为010,对应是十进制数为2,表示第二位出现错误,但是特别注意这只是巧合,出错位置与计算结果没有必然联系
我们把每一个位置出错的情况统计如下,大家可以发现,余数为3位最多映射8种情况,因此第1-7位是属于一个周期,但是从第8位又开始了一个新的周期,因此010有可能对应第2位出错,也有可能是第9位
难道说CRC码不能确定出错位置吗?其实也不是的,出现这种情况的原因主要在于信息位过长,无法一一映射。所以要想确定纠错位置就要选择合适的多项式(纠错1位),需要满足以下不等式
2 R ≥ K + R + 1 2^{R}\geq K+R+1 2R≥K+R+1
二:纠错编码(海明校验码)
(1)码字和码距
网络传输内容实则是二进制序列,每种编码都对应特定的信息,如下
- 码字:由若干位代码组成的一个字称为码字,比如上面的“00”,“01”
- 码距:将两个码字逐位比较,具有不同的位的个数称为两个码字的距离,比如“00”和“10”距离就是1;一种编码方法可能有若干合法码字,各合法码字之间的最小距离称为“码距”,上面这种编码方案码距为1。
码距为1无检错能力;对于码距大于等于2的校验码,具有检错能力,且码距越大,检错、纠错能力就越强,而且检错能力总大于等于纠错能力
(2)海明校验码
海明校验码:海明码是一种广泛采用的有效的校验码,本质是一种多重奇偶校验码。其实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到奇偶校验组中。当某一位出现错误后,就会引起有关的几个校验位的值发生变化。它不但可以发现错误位置,还可以为自动纠错提供依据
A:纠错理论
假设信息位为 n n n,校验位为 k k k,因此 k k k个比特位一共可以映射 2 k 2^{k} 2k种状态;海明码由信息位和校验位组成,因此共有 n + k n+k n+k位, n + k n+k n+k位每一个位置都有可能出现错误,因此这 2 k 2^{k} 2k种状态要把这 n + k n+k n+k种全部映射到,但是要注意其中还要包含一种全部正确的情况。
综上所述,得出下面的重要不等式
2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2k⩾n+k+1
B:求解海明码
范例:求1010的海明码,具体流程如下
1:确定海明码位数
此二进制序列信息位 n = 4 n=4 n=4,根据前述不等式 : 2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2k⩾n+k+1,可知 k k k为3时不等式方可成立。
- 除了实际计算,也可以熟悉下面这张表,从而快速写出
为了区分信息位和校验位,我们用 D 4 D 3 D 2 D 1 D_{4}D_{3}D_{2}D_{1} D4D3D2D1表示信息位(对应 1010 1010 1010);用 P 3 P 2 P 1 P_{3}P_{2}P_{1} P3P2P1表示校验位;整个海明码序列可以表示为 H 7 H 6 H 5 H 4 H 3 H 2 H 1 H_{7}H_{6}H_{5}H_{4}H_{3}H_{2}H_{1} H7H6H5H4H3H2H1
2:确定校验位分布
海明码中校验位不能直接放在信息位的头部和尾部。
规定:校验位
p
i
p_{i}
pi应该放在海明码
H
2
i
−
1
H_{2^{i-1}}
H2i−1的位置,因此
P
1
P
2
P
3
P_{1}P_{2}P_{3}
P1P2P3分别对应
H
1
H
2
H
4
H_{1}H_{2}H_{4}
H1H2H4,其实也就是2进制的权值
校验位分布如下,首先放入校验位,信息位从低到高依次补全空位
海明码位置 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|
分布情况 | D 4 D_{4} D4 | D 3 D_{3} D3 | D 2 D_{2} D2 | P 3 P_{3} P3 | D 1 D_{1} D1 | P 2 P_{2} P2 | P 1 P_{1} P1 |
海明码 | 1 | 0 | 1 | 0 |
接下来,由于校验位为3位,因此信息位需要根据校验位分为3组,每个分组分别进行偶校验
3:求校验位的值
首先,我们需要海明码中对应位置为信息位的下标(也就是所处位置)转为二进制序列,比如上面表格中, H 7 H_{7} H7对应位置为信息,其下标为 7 7 7,对应二进制序列为111
海明码位置 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|
二进制 | 111 | 110 | 101 | 011 | |||
分布情况 | D 4 D_{4} D4 | D 3 D_{3} D3 | D 2 D_{2} D2 | P 3 P_{3} P3 | D 1 D_{1} D1 | P 2 P_{2} P2 | P 1 P_{1} P1 |
信息位值 | 1 | 0 | 1 | 0 |
然后我们需要根据二进制序列确定每个校验位所在组包括哪些信息位。
前面我们说过,
P
3
P
2
P
1
P_{3}P_{2}P_{1}
P3P2P1实则对应的是二进制的权值
421
421
421,而分组依据就是根据这个权值,比如
P
1
P_{1}
P1表示所有二进制序列第0位为1的分到该组,
所以
H
3
H
5
H
7
H_{3}H_{5}H_{7}
H3H5H7就分到了这一组
分为三个组后,我们就要对每一组进行偶校验。上面内容提到,偶校验码计算实则通过异或运算完成,因此对每组进行异或运算,确定
P
P
P的取值
填充表格如下
海明码位置 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|
二进制 | 111 | 110 | 101 | 011 | |||
分布情况 | D 4 D_{4} D4 | D 3 D_{3} D3 | D 2 D_{2} D2 | P 3 P_{3} P3 | D 1 D_{1} D1 | P 2 P_{2} P2 | P 1 P_{1} P1 |
海明码 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
4:校验纠错
每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查。这里是偶校验,如果 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1为“000”,表明无错误
如果
S
3
S
2
S
1
S_{3}S_{2}S_{1}
S3S2S1为“010”,表明第2位出现错误
其原理可以用下面的这张图解释。
- 比如 D 3 D_{3} D3信息位发生变化,由于 D 3 D_{3} D3包含于 P 2 和 P 3 P_{2}和P_{3} P2和P3,同时 P 2 和 P 3 P_{2}和P_{3} P2和P3又在 S 2 S 3 S_{2}S_{3} S2S3的校验方程中,导致 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1为 110 110 110, 也就是 H 6 H_{6} H6发生改变
- 再比如校验位 P 2 P_{2} P2发生改变时,其只存在于 S 2 S_{2} S2的校验方程中,所以 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1为 010 010 010,也就是 H 2 H_{2} H2发生改变
C:补充-全校验位
海明码具有1位的纠错能力和2位的检错能力
刚才设计的海明码,在使用时还是有一定问题的,比如发送刚数据为
海明码位置 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|
二进制 | 111 | 110 | 101 | 011 | |||
分布情况 | D 4 D_{4} D4 | D 3 D_{3} D3 | D 2 D_{2} D2 | P 3 P_{3} P3 | D 1 D_{1} D1 | P 2 P_{2} P2 | P 1 P_{1} P1 |
海明码 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
发送中, P 2 P 1 P_{2}P_{1} P2P1这两个校验位发生改变
海明码位置 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|
二进制 | 111 | 110 | 101 | 011 | |||
分布情况 | D 4 D_{4} D4 | D 3 D_{3} D3 | D 2 D_{2} D2 | P 3 P_{3} P3 | D 1 D_{1} D1 | P 2 P_{2} P2 | P 1 P_{1} P1 |
海明码 | 1 | 0 | 1 | 0 | 0 | 0 | 1 |
那么按照之前的校验规则, S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值为“110”,表明 H 3 H_{3} H3位置发生错误。很明显发现,判断错误,此时发生的是两个比特位的改变。所以之前的方案是没有办法区分1位错误,还是2位错误的
为此,在使用时我们在海明码首部加入“全校验位”,对整体统一进行一次偶校验。
发送方数据
海明码位置 | H 8 H_{8} H8 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|---|
二进制 | 111 | 110 | 101 | 011 | ||||
分布情况 | P 全 P_{全} P全 | D 4 D_{4} D4 | D 3 D_{3} D3 | D 2 D_{2} D2 | P 3 P_{3} P3 | D 1 D_{1} D1 | P 2 P_{2} P2 | P 1 P_{1} P1 |
海明码 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
- 如果此时接收方校验后 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值为“000”,并且全体偶校验成功,表明没有错误;
- 如果 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值不为“000”,并且全体偶校验失败,表明有1位错误,纠正即可;
- 如果 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值不为“000”,并且全体偶校验成功,很明显产生了两位错误,此时无法纠正,需要重传
三:注意
- 检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误
- 要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用
- 循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层
- 在计算机网络中通常采用我们后续课程中将要讨论的检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务