一、差错产生的原因

在原始的物理传输线路上传输数据信号是有差错的,存在一定的误码率,数据链路层存在的目的就是给原始二进制位流增加一些控制信息 ,实现如何在有差错的线路上进行无差错传输

信道的电气特性引起信号幅度,频率,相位的畸变,信号反射,串扰,闪电,大功率电机的启停等

计算机网络中出现的差错是连续的还是离散的差错?→ 是连续的突发性的差错
比如传了一个这样的位串0001101001,连续的差错:比如一共出错了3位,连续的出错在一起。离散的差错:一共出错了3位,不是连续出的,是分散出的

差错控制的目的:

保证帧正确,按序送交上层(顺序要对,不能重复也不能跳帧)。在接收方能够判断接收的数据是否正确,若错误还可能要恢复错误

二、差错控制的方法

检错码:

数据和冗余位.png

数据设定为M位,冗余位设定为R位,如果位数满足即认为不出错,如果位数不满足即肯定出错

自动纠错机制:

纠错控制主要由接收方做,能检查出错并定位到是哪儿出错了

检错反馈重发机制:

接收方通过反馈机制告诉发送方出错,发送方通过重发的方式恢复差错

☆自动纠错比检错反馈重发机制代价大,在发生数据丢失的情况下,只是自动纠错机制无法进行差错恢复,还是需要检错反馈重发机制

码字(codeword)

一个帧包括m个数据位,r个校验位(是冗余位,和m位的有效数据是无关的),称为n位码字(n=m+r),我们希望r尽量短,并且尽量有一个固定长度

检错码(error-detecting code)

加入了冗余位,使接收方知道有差错发生,但不知道什么差错,然后请求重发

纠错码(error-correcting code)

加入了足够多的冗余位,使接收方不仅知道有差错发生,并知道哪些位发生差错

海明定理

海明距离

两个编码的海明距离:两个编码不相同位的个数
例:0000000000与0000011111的海明距离是5
编码方案的海明距离:编码方案中任两个编码海明距离的最小值
ASCII这样的连续编码的海明距离都是1

海明定理

为检测d位错,编码方案的海明距离应至少为d+1
当发生d位错时,不会由一种合法编码变为另一种合法编码,也就是想要由一种合法编码变为另一种合法编码,需要d+1以上出错

对接收方来讲,它判定一个编码是否出错的唯一依据是这个编码是否是一个合法的编码。即使接收方收到了一个合法的编码,它也无法判断是否是一个合法编码,因为它不知道这个合法编码原本就是合法的,还是出错以后也依然是一个合法编码。因此需要海明距离应至少为d+1

三、奇偶校验码

在数据链路层一般是不用这种检错方法的,因为检错率太低

奇偶校验码.png

若接收方收到的字节奇偶结果不正确,就可以知道传输中发生了错误
增加奇偶校验位后海明距离由1变为2,因此根据“为检测d位错,编码方案的海明距离应至少为d+1”,可以检查出一位二进制位的差错
用这种方法,有一位出错时,就会由合法编码(奇校验时1的个数为奇数,偶校验时1的个数为偶数)变成一种非合法编码(奇数校验时1的个数为偶数,偶校验时1的个数为奇数)

为纠正d位错,编码方案的海明距离应至少为2d+1
当发生d位错时,出错编码仍然最接近于原始的正确编码

例:现在有一个编码方案,这个编码方案之中只有4种合法编码↓
0000000000
0000011111
1111100000
1111111111
它们之间的海明距离为5,按照定理,能够纠正2位错
假设接收方收到了这样的编码:0001100000,很明显这是个非法编码,怎么样纠正
呢?我们知道出错的位数是≤ 2位的,它和第一种的海明距离为2,和第二种为7,和
第三种为3,和第四种为8,离它最近的是第一种编码。它采用这种就近恢复的原则将
出错的编码恢复到原始编码

四、循环冗余校验法CRC

数据链路层用的最多的一种检错方法
但是高层(网络层,传输层)是不用这种检错方法的,而用检验和的方法

循环冗余码.png

生成多项式G(x)
发方,收方事前约定。这里的约定是数据链路层的协议已经定义该协议使用什么生成多项式
生成多项式的高位和低位必须为1
生成多项式必须比传输信息对应的多项式短
(现在最多用的是CRC-32,生成多项式是32位,能否保证生成多项式比传输的对应的多项式短呢?从原始数据来讲保证不了,但是到数据链路层时加了传输层的头,网络层的头之后肯定能保证大于32位。比如现在的Internet网络,例如在传输层使用TCP加20个字节,在网络层IP又加了20个字节,已经超过32位了,所以肯定能保证)
理论上来讲生成多项式的阶越高,检错率越高
硬件实现CRC校验

四个多项式已经成为国际标准

四个多项式.png

CRC校验基本思想

CRC码(增加的r位冗余位检错码,即校验和)加在帧尾(效率比较高),使带CRC码的帧的多项式能被G(x)除尽:接收方接收时,用G(x)去除它,若有余数,则传输出错

※CRC码计算还有一个好处:
我们希望不管m是多少位的,但是冗余位r是越短越好,而且最好位数是固定的。用这CRC码的好处就是生成多项式是多少阶的,那么最后的余数(冗余位)的位数就是多少位。如果是n阶的,那么最后就是4位

循环冗余校验法检验不出来的错的情况:收到的位串虽然是错误的,但是恰巧能被生成多项式整除,这个时候检测不出来

五、检验和

适用于高层协议,如IP,TCP,UDP等
校验码放在前面或后面影响都不大,所以绝大多数是放在前面的
检错率低于循环冗余校验法
在↓例子中,如果第1位和第9位同时出错,或者第2位和第10位同时出错···出错,那么它们取反相加的数是不变的,这个时候是检查不出错的。但是网络当中连续突发的错占绝大部分,这种跳跃性的出错概率很小,所以检验和的检错率还是比较高的
高层不用冗余校验法的原因是,冗余校验法主要采用除的计算方式,比累加的(校验和)计算方式效率要低,而数据链路层用这种方法可以用硬件实现,但是网络层和传输层一般只能通过软件实现,那么效率就降低了。而且数据链路层已经提供了比较可靠的支持,所以高层就可以用这种检错率相对低一点的检错法

参考:https://www.jianshu.com/p/99b2713d5f05

常用校验方式以及优缺点(奇偶校验,CRC校验,校验和)相关推荐

  1. 常用的数据校验方式(奇偶,CRC,异或校验, LRC校验,累加和,MD5等校验)概念及源码

    数据校验概念 数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错.为了能够控制传输过程的差错,通信系统必须采用有效的检错方案.因此产生了数据校验. 数据 ...

  2. crc校验算法程序c语言实现,CRC校验的快速算法的C语言实现

    CRC校验的快速算法的C语言实现 CC R校验的快速算法的C语言实现 颜国谷 (中原油田信息中心 4 70 ) 5 0 1 摘要:c c R循环冗余校验算法,是一种在数据存储和数据通讯领域中使用十分广 ...

  3. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

    Modbus通信协议中CRC校验的快速C语言算法 2004年第11期 福 建 电 脑 63 Modbus通信协议中CRC校验的快速C语言算法 孟开元 (西安石油大学计算机学院陕西西安710065) [ ...

  4. 16位CRC校验算法,16进制crc校验

    在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1. 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2. 把第 ...

  5. 串口通信校验方式:奇偶校验、累加和校验

    转载自:https://zhuanlan.zhihu.com/p/29693940 串口通信校验方式:奇偶校验.累加和校验 许佳伟 利用串口传输数据时,近距离传输还好,远距离传输由于线路长度影响,可能 ...

  6. CRC校验原理和推导过程及Verilog实现(一文讲透)

    目录 一.CRC简介 1.1 CRC可检测的错误 1.2 CRC需要知道的基本名称 1.2.1 多项式公式 1.2.2 多项式简记式 1.2.3 数据宽度 1.2.4 初始值与结果异或值 1.2.5 ...

  7. CRC校验的原理及实现方法

    一.CRC校验介绍 循环冗余校验码(CRC),是一种常用的.具有检错.纠错能力的校验码,在早期的通信中运用广泛.循环冗余校验码常用于外存储器和计算机同步通信的数据校验.循环冗余校验是通过某种数学运算来 ...

  8. CRC校验原理及STM32 IAP在线升级程序

    CRC校验原理: 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据 ...

  9. CRC校验码学习笔记

    一.CRC校验的作用 CRC:循环冗余校验码,是数据通信领域中最常用的一种查错校验码,它的优点是信息字段和校验字段的长度可以任意选定.使用CRC的方法是,在数据传输前计算信息字段的CRC,将其作为校验 ...

最新文章

  1. 怎么让div显示一行,其余的隐藏。
  2. slf4j 如何返回堆栈_重学JS系列 - JS 调用堆栈
  3. Hbuilder----安装less插件(详细)
  4. Android开发中Edittext设置密码显示隐藏的多种方法
  5. 多个小int的乘法小心溢出哦(记洛谷P1615题WA的经历,Java语言描述)
  6. 获得三位数的百位,十位和个位
  7. 计算机基础与应用32页,《计算机基础与应用》2次作业及答案
  8. 祖冲之算法c语言实现,3GPP机密性和完整性算法规范128-EEA3和128-EIA3(二)----祖冲之算法的C语言实现...
  9. Rust : RwLock读写锁
  10. 单片机c语言控制直流电机转速,一个用单片机控制直流电机的PWM调速程序
  11. 如何将 EDI系统作为服务器开机自启动?
  12. 赛道和资本的玩儿法已经过气,SaaS公司活下去还能靠什么?
  13. C++ 赛码打字编程题
  14. 关于阿里飞天系统中分布式系统底层各服务的介绍
  15. 历代iphone详细对比
  16. 如果可以随意 Emoji 组合,你能让两个表情包碰撞出什么花样?
  17. 整理了300个市面上最不常见的springboot计算机毕业设计选题。满满的干货
  18. 【python牛客刷题】——深度学习第一弹
  19. 两平面平行但不重合的条件是_____黑龙江省大庆外国语学校高中数学_第二章《2.2_直线、平面平行的判定及其性质》单元测试5_新人教A版必修3...
  20. CodeSys轴控指令使用方法

热门文章

  1. ⊱静心抄经,是对抗这个浮躁社会的最好武器
  2. Word2010 下划线字体距离的调整方法
  3. 如何使用sci-hub批量下载论文
  4. 会议室可以使用全彩LED显示屏吗?
  5. nprogress 插件 网页顶部加载进度条
  6. html绝对定位重叠,怎么消除css中的绝对定位重叠问题
  7. 全光谱护眼灯哪个牌子好?2022最新全光谱灯与led灯区别
  8. C语言练习:输出最长的名字
  9. unreal-教程-第十章:蒙太奇实现拔剑动作
  10. 从wolai转移到Notion