差错控制
差错产生的原因
概况来说,传输中的差错都是由于噪声引起的
- 全局性:由于线路本身电气特性所产生的
随机噪声(热噪声)
,是信道固有的,随机存在的;解决办法:提高信噪比来减少或避免干扰。(对传感器下手) - 局部性:外界特定的短暂原因所造成的
冲击噪声
,是产生差错的主要原因;解决办法:通常利用编码技术来解决
差错
位错
- 比特位出错,1变0,0变1
帧错
- 丢失:收到[#1] - [#3]
- 重复:收到[#1] - [#2] - [#2] - [#3]
- 失序:收到[#1] - [#3] - [#2]
链路层为网络层提供服务:无确认无连接(通信质量好,有限传输链路)、有确认无连接服务、有确认面向连接服务(通信质量差的无线传输链路)
数据链路层的差错控制
编码VS编码
数据链路层编码和物理层编码的数据编码与调制不同。物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,如曼彻斯特编码。而数据链路层的编码针对的是一组比特,通过冗余码的技术实现一组二进制比特串在传输过程中是否出现了差错
冗余编码
在数据发送之前,先按某种关系附加上一定的冗余位,构成一个符合某一规则的码字后再发送。当要发送的有效数据变化时,相应的冗余位也随之变化,使码字遵从不变的规则。接收端根据收到码字是否仍符合原规则,从而判断是否出错
检错编码
奇偶校验码
- n-1位信息元 + 1位校验元
- 只能检查出奇数个比特的错误,检错能力为50%
循环冗余码CRC
-
详细步骤图解
https://blog.csdn.net/weixin_45422231/article/details/129278687?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129278687%22%2C%22source%22%3A%22unlogin%22%7D&fromshare=blogdetail
发送端 5(要传的数据) / 2(双方商定的除数/生成多项式) = 2 ...... 1(FCS帧校验序列/冗余码) 最终发送的数据:5 + 1 = 6 接收端 6(接收到的数据) / 2(双方商定的除数/生成多项式) = 3 ...... 0 余数为0,判定无错,接收;否则丢弃
-
例:要发送的数据是1101 0110 11,采用CRC校验,生成多项式是10011,最终发送的数据应该是?
1、加0,假设生成多项式G(x)的阶为r,则加r个0 2、模二除法 10011生成多项式 x^4 + x^1 + x^0 = x^4 + x^1 + 0 阶为4 模二除法/异或,同0异1 1101 0110 11 模二除 10011 = 1110(余数FCS) 最终发送的数据 1101 0110 11 + 1110 = 1101 0110 11 1110 接收端 接收的数据 模二除 10011 = 1101 0110 11 1110 模二除 10011 = 0 余数为0,判定无错,接收 余数不为0,判定这个帧有差错(无法确定到位),丢弃
-
FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,因此不会延误数据的传输
-
在数据链路层仅仅使用循环冗余校验码CRC差错检测技术,只能做到对帧的无差错接收,即
凡是接收端数据链路层接收的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错
。接收端丢弃的帧虽然收到了,但是最终还是因为有差错被丢弃。凡是接收端数据链路层接收的帧均无差错
。 -
可靠传输
:数据链路层发送端发送什么,接收端就接收什么 -
链路层使用CRC检验,能够实现无比特差错的传输,但这还不算可靠传输
纠错编码
海明码
-
详细步骤图解
https://blog.csdn.net/weixin_45422231/article/details/129179896?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129179896%22%2C%22source%22%3A%22weixin_45422231%22%7D&fromshare=blogdetail
-
发现错误、找到位置、纠正错误
-
流程
- 确定校验码r
- 确定校验码和数据位置
- 求出校验码的值
- 检错并纠错
海明距离
两个合法编码(码字)的对应比特取值不同的比特数称为这两个码字的海明距离(码距)
,一个有效编码集中,任意两个合法编码(码字)的海明距离的最小值称为该编码集的海明距离(码距)
000 001 010 011 100 101 110 111 该编码系统中的码距为1
0000 1001 1010 0011 1100 0101 0110 1111 该编码系统中码距为2
如果需要d位检错能力,需要的码距为d+1;如果需要d位纠错能力,需要的码距为2d+1
确定校验码位数
-
数据/信息有m位,冗余码/校验码有r位;校验码一共有2^r种取值
-
海明不等式:2^r >= m + r + 1
-
例:要发送的数据:D=1100
2^r >= m + r + 1 数据的位数:m = 4 满足不等式的最小值:r = 3 海明码位数:4 + 3 = 7 其中原数据4位,校验码3位
确定校验码和数据的位置
校验码放在序号为2^n的位置
x1(1)、x2(2)、x4(4)
数据从后往前放在剩余位置
1(7)、1(6)、0(5)、0(3)
海明校验码位置
x1 x2 0 x4 0 1 1
求出校验码的二进制值
二进制值
x1(h1, 001, **1) x2(h2, 010, *1*) 0(h3, 011) x4(h4, 100, 1**) 0(h5, 101) 1(h6, 110) 1(h7, 111)
根据通配符*格式确定校验码负责校验的信息位
x4(1**)负责:x4(h4, 100, 1**)、0(h5, 101)、1(h6, 110)、1(h7, 111)的校验
x2(*1*)负责:x2(h2, 010, *1*)、0(h3, 011)、1(h6, 110) 1(h7, 111)的校验
x1(**1)负责:x1(h1, 001, **1)、0(h3, 011)、0(h5, 101)、1(h7, 111)的校验
采用偶校验
x4 0 1 1 => x4 = 0
x2 0 1 1 => x2 = 0
x1 0 0 1 => x1 = 1
完整海明码
1 1 0 0 0 0 1
检错和纠错
-
检错类似奇偶校验
-
例:若接收方收到的数据为111(跳变)0001
x4负责4、5、6、7 => 0 1(跳变) 1 1(不符合偶校验) x2负责2、3、6、7 => 0 0 1 1(符合偶校验) x1负责1、3、5、7 => 1 0 1(跳变) 1(不符合偶校验)
-
纠错方法一:找到不满足奇偶校验的分组取交集,并与符合校验的分组取差集
-
纠错方法二:
x4 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 1 => x4 = 1 x2 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 1 => x2 = 0 x1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 1 => x1 = 1 错误位置为101 => 5
海明码能发现双比特错,纠正单比特错