3.1.3 差错控制(比特错,检错编码,纠错编码)
1.差错从何而来?
概括来说,传输中的差错都是由于噪声引起的。
1.全局性:由于线路本身电气特性所产生的的随机噪声(热噪声),是信道固有的,随机存在的
解决办法:提高信噪比来减少或避免干扰。(对传感器下手)
2.局部性:外界特定的短暂原因所造成的冲击噪声,产生差错的主要原因。
解决办法:通常利用编码技术来解决。
2.差错的分类
1.位错:比特位出错,1变成0,0变成1
2.帧错:分为三种:丢失,重复,失序
例如:要传输三个帧[#1]-[#2]-[#3]
则 帧丢失:[#1]-[#3]
帧重复:[#1]-[#2]-[#2]-[#3]
帧失序:[#3]-[#2]-[#1]
针对这些帧错误,会采用帧编号、确认重传机制等来进行帧的差错控制
这是过去OSI模型的观点,现在通信链路的质量大大提高,因为通信链路质量不好引起的差错概率越来越小
现在的因特网会采用较为灵活的方法,针对不同的网络,我们会选择是否采用确认重传机制。
3.链路层为网络层提供的服务:
1.无确认无连接服务
2.有确认无连接服务
3.有确认面向连接服务
若通信质量好,比如有线传输链路,链路层协议就不会采用确认和重传机制,
而且也不要求链路层向网络层提供有效可靠传输的服务(即只有无确认无连接服务),如果发生差错,改错任务会交给上层协议
若通信质量差,比如无线传输链路,链路层协议就会采用确认和重传机制
数据链路层就需要向上提供可靠传输的服务(即需要提供有确认无连接服务和有确认面向连接服务)
4.数据链路层的差错控制(比特错,帧错会在后面讲解)
差错控制:
1.检错编码
1.奇偶校验码
2.循环冗余码CRC
2.纠错编码
海明码
3.数据链路层编码和物理层编码的区别
数据链路层编码和物理层的数据编码与调制不同。
物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,如曼彻斯特编码。
而数据链路层的编码针对的是一组比特,它通过冗余码的技术实现一组二进制比特串在传输过程中是否出现了差错。
5.奇偶校验码
n-1位信息元,1位校验元
1.奇校验码
信息元和校验元中,“1”的个数为奇数
2.偶校验码
信息元和校验元中,“1”的个数为偶数
3.奇偶校验码特点:只能检查出奇数个比特错误,检错能力为50%
6.CRC循环冗余码
1.发送端最终发送的数据:要发送的数据+帧检验序列FCS
计算冗余码(FCS帧检验序列)
第1步:加0 假设生成多项式G(x)的阶为r,则加r个0(多项式是n位,则阶是n-1位)
加0是为了不改变原发送数据,FSC帧检验直接跟在原发送数据的后面即可
第2步:模2除法。数据加0后除以多项式,余数就是冗余码FCS。
在除法过程中应该做减法的步骤,在模2除法中替换为异或
2.接收端检错过程
把接收的每一帧都除以相同的除数(发送端的生成多项式),然后检查得到的除数R
若R==0,判定这个帧没有差错,接受
若R!=0,判断这个帧有差错(无法确认到位),丢弃
3.FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,因此不会延误数据的传输。
4.在数据链路层仅仅使用循环冗余检验CRC差错检测技术,只能做到对帧的无比特差错接收,
即“凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错”。
可以认为:”凡是接收端数据链路层接收的帧均无差错“
接收端丢弃的帧虽然曾收到了,但是最终还是因为有差错被丢弃。
5.但是帧的无差错接受不是可靠传输,CRC循环冗余码只能检验出帧有错误并丢弃,但是不能对错误的帧进行校正
可靠传输是指:数据链路层发送端发送什么,接收端就收到什么。
7.海明码
1.发现双比特错,纠正单比特错
2.工作原理:牵一发而动全身
3.工作流程
1.确定校验码位数r
海明不等式:2^r >= k+r+1 (r是冗余信息位,k为信息位)
2.确认校验码和数据的位置
校验码只能填在2的n次方的位置(包括第一个位置)
原码按顺序插入
3.求出校验码的值
首先将数据位从低位到高位按1,2,3...进行编号,然后将编号用二进制表示,
记录二进制表示中的第n位为1的数据位,令这些数据位上的上的数据异或=0,则Pn即为所求
这些数据位上包括Pn,则公式可以改进为:Pn=这些数据位除了Pn之外异或(原理:相同异或为零)
**补充:异或的性质
1.任意二进制数与0异或之后是本身
2.任意二进制数与1异或之后是取反
3.偶数个1异或是0(2*k个1,即在1的基础上进行2*k-1次取反操作),
奇数个1异或是1(2*k+1个1,即在1的基础上进行2*k次取反操作),
无论0有多少个
4.检错并纠错
记录二进制表示中的第n位为1的数据位,求这些数据位上的上的数据异或,则Jn即为所求
J=JN...J1J2
将J转换为十进制JT,即第JT位发生错误
4.比如:D=101101
第1步:先求出校验码的位数:2^4=16>=4+6+1,所以校验码为4位
第2步:按位数分别给校验码、原码编号,原码一共有6位,即编号为:D6 D5 D4 D3 D2 D1
校验码一共有4位,即编号为P4 P3 P2 P1
校验码和原码的位置分配:D6 D5 P4 D4 D3 D2 P3 D1 P2 P1
位置编号 10 9 8 7 6 5 4 3 2 1
位置二进制编码 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001
第3步:求P1,D5 D4 D2 D1 P1的位置编码的第一位是1,所以令D5 D4 D2 D1 P1的异或=0,求出P1
Pn的求法同理,先把能求的求出来,最后把之前不能求的再求出来
求得:P1=P2=P3=0,P4=1
第4步:求得海明码1011100100
8.本节总结