数据链路层-第三节:差错控制
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据链路层-第三节:差错控制相关的知识,希望对你有一定的参考价值。
文章目录
本节对应视频如下
差错检测:数据在传输过程中可能会因为各种因素而出现差错,主要有以下两种类型的错误
- 位错(本节研究内容):比特位出现错误
- 帧错:几个比特出现错误;包括帧丢失、帧重复、帧失序;对于帧错误可以通过编号、确认重传解决
其中关于位错,可由差错检测码解决,差错检测码主要包括检错编码和纠错编码
- 检错编码:奇偶校验码、循环冗余校验码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_4D_3D_2D_1 D4D3D2D1表示信息位(对应 1010 1010 1010);用 P 3 P 2 P 1 P_3P_2P_1 P3P2P1表示校验位;整个海明码序列可以表示为 H 7 H 6 H 5 H 4 H 3 H 2 H 1 H_7H_6H_5H_4H_3H_2H_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_1P_2P_3
P1P2P3分别对应
H
1
H
2
H
4
H_1H_2H_4
H1H2H4,其实也就是2进制的权值
校验位分布如下,首先放入校验位,信息位从低到高依次补全空位
海明码位置 | H 7 H_7 H7 |
H
6
H_6
以上是关于数据链路层-第三节:差错控制的主要内容,如果未能解决你的问题,请参考以下文章 计算机网络 王道考研2021 第三章:数据链路层 -- 数据链路层功能概述封装成帧和透明传输差错控制(检错编码/纠错编码) |
---|