数据链路层-第二三节:封装成帧和差错控制
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据链路层-第二三节:封装成帧和差错控制相关的知识,希望对你有一定的参考价值。
文章目录
一:封装成帧
数据链路层把比特组合成帧,然后以帧为单位进行传输,这样才传输时,一旦出现了错误(例如跳变,乱序)就不用重发全部数据了。因此 封装成帧 就是在一段数据的前后部分添加首部和尾部构成一个帧。接收端在收到物理层上交的比特流后,可以根据首部和尾部的标记,继而从收到的比特流中识别帧的开始和结束。这里添加的首部和尾部就是为了实现帧定界、帧同步和透明传输
- 帧定界:用于标识帧的开始与结束,目的是为了实现帧同步
- 帧同步:让接收方能从接收到的二进制比特流中区分出帧的起始与终止
- 透明传输:不管所要传输的数据是什么样的组合,都应当可以在链路上传送;这是因为如果在数据中恰好出现与帧定界符相同的比特组合,就会误认为“传输结束"而丢弃后面的数据
数据链路层通常会采用4种方法进行组帧
- 字符计数法
- 字符填充法
- 零比特填充法
- 违规编码法
(1)字符计数法
字符计数法:在帧的首部使用一个计数字段(第一个字节、八位)来标明帧内字符数。目的结点的数据链路层收到字节计数值时,就可以知道后面跟随的字节数,从而可以确定帧结束的位置
- 缺点:如果计数字段出错,即失去了帧边界划分的依据,那么接收方就无法判断所传输帧的结束位和下一帧的开始位,收发双方将失去同步,从而造成灾难性后果
(2)字符填充法
字符填充法:使用一些特定字符来定界一帧的开始(DEL STX
)与结束(DLE ETX
)。但这存在着一个弊端,就是传送的数据中可能会碰巧出现定界符,因此为了避免这种情况,可以在这样的字符前再填充一个转义字符DLE
进行区分。接收方在接受到转义字符后,就会知道其后紧跟的是数据而不是控制信息
具体过程
(3)零比特填充法(常用)
零比特填充法:允许数据帧包含任意个数的比特,也允许每个字符的编码包含任意个数的比特。使用01111110来标志一帧的开始和结束。同时,为了防止信息中出现的01111110造成干扰,做如下规定
- 发送方:数据链路层在信息位中遇到5个连续的1时,将自动在其后面插入一个0
- 接收方:数据链路层在信息位中每收到5个连续的1时,自动删除后面紧跟的0
零比特法可以保证透明传输,且在传送的比特流中可以传送任意比特组合,而不会引起对帧边界的判断错误
(4)违规编码法(常用)
违规编码:在曼彻斯特编码中是不会出现“高-高”电平对和“低-低”电平对的,因此可以采用他们来定界帧的开始与终止
二:差错控制
差错来源:比特在传输时错误是无法避免的,一般而言,传输中的差错都是由于噪声引起的,包括两种
- 全局性噪声:由于线路本身电气特性所产生的随机噪声,是信道固有、随机存在的;因此可以通过提高信噪比来减少或避免干扰
- 局部性噪声(产生差错的主要原因):外界特定的短暂原因所造成的冲击噪声;因此可以通过编码技术来解决
差错类型:
- 位错(本节研究内容):比特位出现错误
- 帧错:几个比特出现错误;包括帧丢失、帧重复、帧失序;对于帧错误可以通过编号、确认重传解决
位错差错控制:其差错控制主要包括检错编码和纠错编码
- 检错编码:奇偶校验码、循环冗余校验码CRC
- 纠错编码:海明码
(1)检错编码
- 注意此部分内容在《计算机组成原理》校验码部分已有介绍:【专栏必读】王道考研408计算机组成原理万字笔记和题目题型总结(从学生角度辅助大家理解):各章节导航及思维导图
A:奇偶校验码
奇偶校验码:在原编码的基础上增加一个校验码,可以检测出一位错误(或奇数位错误),但不能确定出错位置,也不能检测出偶数位出错,增加的冗余位称为奇偶校验位;校验位只取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”,所以结果错误
B:循环冗余检验码(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
(2)纠错编码-海明校验码
A:码字和码距
网络传输内容实则是二进制序列,每种编码都对应特定的信息,如下
- 码字:由若干位代码组成的一个字称为码字,比如上面的“00”,“01”
- 码距:将两个码字逐位比较,具有不同的位的个数称为两个码字的距离,比如“00”和“10”距离就是1;一种编码方法可能有若干合法码字,各合法码字之间的最小距离称为“码距”,上面这种编码方案码距为1。
码距为1无检错能力;对于码距大于等于2的校验码,具有检错能力,且码距越大,检错、纠错能力就越强,而且检错能力总大于等于纠错能力
B:海明校验码
海明校验码:海明码是一种广泛采用的有效的校验码,本质是一种多重奇偶校验码。其实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到奇偶校验组中。当某一位出现错误后,就会引起有关的几个校验位的值发生变化。它不但可以发现错误位置,还可以为自动纠错提供依据
①:纠错理论
假设信息位为 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
②:求解海明码
范例:求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
计算机网络--数据链路层(全)
计算机网络学习笔记——数据链路层功能和服务帧定位差错海明距离检错码和纠错码