网络数据传输的三种校验方法

2023-05-16

一、奇偶校验

根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。 
校验方法 
奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数 
1000110(0)你必须添0这样原来有3个1已经是奇数了所以你添上0之后1的个数还是奇数个。 
偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数 
1000110(1)你就必须加1了这样原来有3个1要想1的个数为偶数就只能添1了 
范例 
串行数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符‘E’,其各位为: 
0100,0101=45H 
D7 D0 
由于干扰,可能使位变为1,(为什么不变0?)这种情况,我们称为出现了“误码”。我们把如何发现传输中的错误,叫“检错”。发现错误后,如何消除错误,叫“纠错”。最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇/偶校验位。可采用奇校验或偶校验。 
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如: 
1 0110,0101 
0 0110,0101 
偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如: 
1 0100,0101 
0 0100,0101 
奇偶校验能够检测出信息传输过程中的部分误码(奇数位误码能检出,偶数位误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简单,仍得到了广泛使用。有些检错方法,具有自动纠错能力。如循环冗余码(CRC)检错等

二、CRC校验

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 
工作原理 
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。 
对应关系 
多项式和二进制数有直接对应关系:X的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:X的最高幂次为R,转换成对应的二进制数有R+1位。 
多项式包括生成多项式G(X)和信息多项式C(X)。 
如生成多项式为G(X)=X4+X3+X+1, 可转换为二进制数码11011。 
而发送信息位 101111,可转换为数据多项式为C(X)=X5+X3+X2+X+1。 
生成多项式 
是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。 
在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接收方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。 
应满足以下条件: 
A、生成多项式的最高位和最低位必须为1。 
B、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。 
C、不同位发生错误时,应该使余数不同。 
D、对余数继续做除,应使余数循环。 
校验码位数 
CRC校验码位数 = 生成多项式位数 - 1。注意有些生成多项式的简记式中将生成多项式的最高位1省略了。 
生成步骤 
1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。 
2、将信息码左移R位,相当于对应的信息多项式C(X)*2R。 
3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。 
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。 
【例】假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。 
解: 
1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。 
2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010 000 
3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或: 
1010000 
1011 
———–】 
0001000 
0001011 
———-】 
0000011 
得到的余位011,所以最终编码为:1010 011 
原则 
若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得 
V(x)=A(x)g(x)=xRm(x)+r(x); 
其中: m(x)为K次原始的信息多项式, r(x)为R-1次校验多项式(即CRC校验和), 
g(x)称为生成多项式: 
g(x)=g0+g1x1+ g2x2+…+g(R-1)x(R-1)+gRxR 
发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。 
生成方法 
借助于模2除法则,其余数为校验字段。 
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1 
假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001 
x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000; 
采用模2除法则: 得余数为: 1010(即校验字段为:1010) 
发送方:发出的传输字段为: 1 0 1 1 0 0 1 1010 
信息字段 校验字段 
接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法) 
如果能够除尽,则正确, 
给出余数(1010)的计算步骤: 
除法没有数学上的含义,而是采用计算机的模二除法,即除数和被除数做异或运算。进行异或运算时除数和被除数最高位对齐,按位异或。 
10110010000 
^11001 
————————–】 
01111010000 
1111010000 
^11001 
————————-】 
0011110000 
11110000 
^11001 
————————–】 
00111000 
111000 
^11001 
——————-】 
001010 
则四位CRC校验码就为:1010。 
利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。

三、海明码校验

将有效信息按某种规律分成若干组,每组安排一个校验位,做奇偶测试,就能提供多位检错信息,以指出最大可能是哪位出错,从而将其纠正。实质上,海明校验是一种多重校验。

假设为k个数据位设置r个校验位,则校验位能表示2^r个状态,可用其中的一个状态指出 “没有发生错误”,用其余的2 ^r -1个状态指出有错误发生在某一位,包括k个数据位和r个校验位,因此校验位的位数应满足如下关系: 
2^r ≥ k + r + 1 (2.7) 
如要能检出与自动校正一位错,并能同时发现哪位错,此时校验位的位数r和数据位的位数k应满足下述关系: 
2^r-1 ≥ k + r (2.8) 
按上述不等式,可计算出数据位k与校验位r的对应关系,如表2.2所示。

表2.2 
k值 最小r值 
2~4 3 
5~11 4 
12~26 5 
27~57 6 
58~120 7 
分组原则 
编辑 
在海明码中, 位号数(1、2、3、……、n)为2的权值的那些位,即: 
1(2^0)、2(2^1)、4(2^2)、8(2^3)、…2^(r-1)位,作为奇偶校验位,并记作: P1、P2、P3 、P4、…Pr,余下各位则为有效信息位。例如: N=11(海明码位数)K=7(数据位数)r=4(校验位) ,相应海明码可表示位号为: 1, 2, 3, 4 ,5 ,6, 7, 8, 9 ,10 ,11,校验位P占第1,2,4,8位,其他位为有效信息位,海明码中的校验位分别标示为P1,P2,P3,P4… Pr ,并被信息位中的一至若干位所校验,其规律是:第i位,由校验位位号之和等于i的那些校验位所校验,如:海明码的位号为3,它被P1P2(位号分别为1,2)所校验,海明码的位号为5,它被P1P3(位号分别为1,4)所校验。归并起来: 形成了4个小组,每个小组一个校验位,校验位的取值,仍采用奇偶校验方式确定。 
设计海明码编码的关键技术,是合理地把每个数据位分配到r个校验组中,以确保能发现码字中任何一位出错;若要实现纠错,还要求能指出是哪一位出错,对出错位求反则得到该位的正确值。例如,当数据位为3位(用D3 D2 D1表示)时,检验位应为4位(用P4 P3 P2 P1表示)。可通过表2.3表示的关系,完成把每个数据位划分在形成不同校验位的偶校验值的逻辑表达式中。 
表2.3 校验位与数据位的对应关系 
在P1、P2、P3、P4竖列相应行分别填1, 
在该4列的低3横行其它位置分别填0, 
在最顶横行的每个尚空位置都分别填1。 
若只看低3横行,右4竖列的3个bit的组合值分别为十进制的1、2、4、0,则分配 D1 D2 D3列的组合值为3 5 6,保证低3横行各竖列的编码值各不相同。 
表中D3 D2 D1为三位数据位,P4 P3 P2 P1为四位校验位。其中低三位中的每一个校验位P3 P2 P1的值,都是用三个数据位中不同的几位通过偶校验运算规则计算出来的。其对应关系是:对Pi(i的取值为1~3),总是用处在Pi取值为1的行中的、用1标记出来的数据位计算该Pi的值。最高一个校验位P4,被称为总校验位,它的值,是通过对全部三个数据位和其它全部校验位(不含P4本身)执行偶校验计算求得的。 
形成各校验位的值的过程叫做编码,按刚说明的规则,4个校验位所用的编码方程为: 
P4 = D3 D2 D1 P3 P2 P1 
P3 = D3 D2 
P2 = D3 D1 
P1 = D2 D1 
由多个数据位和多个校验位组成的一个码字,将作为一个数据单位处理,例如被写入内存或被传送走。之后,在执行内存读操作或在数据接收端,则可以对得到的码字,通过偶校验来检查其合法性,通常称该操作过程为译码,所用的译码方程为: 
S4 = P4 D3 D2 D1 P3 P2 P1 
S3 = P3 D3 D2 
S2 = P2 D3 D1 
S1 = P1 D2 D1 
对应关系 
编辑 
译码方程和编码方程的对应关系很简单。译码方程,是用一个校验码和形成这个校验码的编码方程执行异或,实际上是又一次执行偶校验运算。通过检查四个S的结果,可以实现检错纠错的的目的。实际情况是,当译码求出来的S4、S3、S2、S1的得值与表2.3中的那一列的值相同,就说明是哪一位出错;故人们又称表2.3为出错模式表。若出错的是数据位,对其求反则实现纠错;若出错的是校验位则不必理睬。举例如下: 
任何一位(含数据位、校验位)均不错,则四个S都应为0值; 
任何单独一位数据位出错,四个S中会有三个为1;如D3错,则S4 S3 S2 S1为1110。 
若单独一位校验位出错,四个S中会有一个或两个为1;如P1错,S4 S3 S2 S1为1001,如P4错,S4 S3 S2 S1为1000。 
任何两位(含数据位、校验位)同时出错,S4一定为0,而另外三个S位一定不全为0,此时只知道是两位同时出错,但不能确定是哪两位出错,故已无法纠错。如D1、 P2出错,会使S4 S3 S2 S1为0001。请注意,S4的作用在于区分是奇数位出错还是偶数位出错,S4为1是奇数位错,为0是无错或偶数位错。这不仅为发现两位错所必需,也是为确保能发现并改正一位错所必需的。若不设置S4,某种两位出错对几个S的影响与单独另一位出错可能是一样的(不必花费精力推敲),此时若不加以区分,简单地按一位出错自动完成纠错处理反而会帮倒忙。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络数据传输的三种校验方法 的相关文章

  • 私有云上创建与配置虚拟机

    目录 一 登录私有云 二 创建网络 新建路由等 xff08 一 xff09 创建网络 hy 二 新建路由 xff08 三 xff09 添加接口 xff08 四 xff09 查看网络拓扑 xff08 五 xff09 添加端口 三 创建实例 x
  • 远程桌面打开mayavi,基于VirtualGL + Turbovnc

    实现内容 xff1a 远程桌面打开mayavi xff0c 基于VirtualGL 43 Turbovnc 参考链接 xff1a 链接1 下面是复制过来的内容 xff0c 附加上我的注释 xff1a Setup VirtualGL and
  • twisted笔记三:當Deferred遇上Thread(转载)

    Deferred不會自動實現將阻塞過程轉為非阻塞過程 xff0c 雖然它已經有那樣的機制但還是要你去多走一步 要將阻塞過程轉為真正的非阻塞過程 xff0c 那麼只有借用線程 但至於線程調用你不用太擔心 xff0c twisted已為你準備好
  • pyspider安装与初次使用的那些坑

    pyspider是一个python的爬虫框架 xff0c 安装过程遇到不少坑 xff0c 在这里总结一下 安装 安装只需要简单用pip安装就可以了 pip install pyspider 测试 使用 pyspider 或 pyspider
  • FreeRTOS学习笔记(二)——内核机制

    文章目录 0x01 临界段Cortex M内核快速关中断指令关中断开中断进入和退出临界段的宏进入临界段退出临界段临界段代码应用 0x02 空闲任务与阻塞延时的实现空闲任务的创建实现阻塞延时阻塞等待总结 0x03 多优先级通用方法 xff1a
  • scrapy并发爬虫

    通过CrawlerProcess import scrapy from scrapy crawler import CrawlerProcess class MySpider1 scrapy Spider Your first spider
  • pyqt5使用pyinstaller打包项目为exe

    一 打包 1 生成index spec pyinstaller F w i logo ico index py 不显示cmd pyinstaller F c i logo ico index py 建议先用 c xff0c 这样如果打包不成
  • freshclam更新clamav病毒库失败(connection failed)

    有大佬能帮帮我吗 xff1f
  • 查杀linux服务器木马,定时查杀病毒并隔离

    接收到了阿里云服务器的安全告警 xff0c 主要文件是 usr bin sshd root aa xff0c 使用以下三种方法解决 一 使用clamav 一 xff09 下载 下载方式 xff1a xff08 1 xff09 下载压缩文件
  • 外部传参的3种方式

    运行jar包时 xff0c 希望通过外部传参并获取 xff0c 框架为spring boot xff0c 有3种方式解决 前两种需要设置环境变量 spring boot 的 64 Value 64 Component public clas
  • 批量替换文件名为指定日期并删除.svn文件

    bin bash cur date 61 34 96 date 43 Y m d 96 34 cur date 61 2 批量替换该文件夹下的所有文件日期为指定日期 function replace name for file in 96
  • log4j2内置变量

    问题概述 xff1a 在log4j2 xml中中想通过 变量名 直接获取变量 xff0c 但是直接输出了 符 xff0c 并没有获取到项目中的变量 目录 一 log4j2官方配置 二 常见变量 1 bundle配置文件 2 sys系统变量
  • 构建Docker容器集群(九)

    Docker容器集群构建 使用自定义网桥连接跨主机容器 Docker默认的网桥是docker0 它只会在本机连接所有的容器 举例来说容器的虚拟网卡在主机上看一般叫做veth 而docker0网桥把所有这些网卡桥接在一起 xff0c 如下所示
  • ubuntu虚拟桌面

    用户可以自定义启动号码如 xff1a vncserver 2 注意 2前面一定要有空格 杀死vncserver进程 vncserver kill 1 这里你启动vncserver时是什么端口号要对应上 1 第一种方法 xff1a 使用geo
  • markdown编辑希腊字母

    字母名称大写markdown原文小写markdown原文alphaAA alphabetaBB betagamma Gamma gammadelta Delta deltaepsilonEE epsilon varepsilonzetaZZ
  • Linux下WRF Domain Wizard使用教程(PART2: 使用教程及 遇到的种种BUG)

    当用命令run DomainWizard打开WRFDW后 如图所示 第一步 第一栏是你的虚拟机的名称 第二栏是WPS所在的目录 第三行是WPS所需要的静态地理数据的位置 第四栏是你WRFDW项目存放的位置 这里我新创建了个domain 点击
  • Keras学习之tensor张量

    本文参考Keras中文官方网站 xff1a http keras cn readthedocs io en latest other regularizers tensor 张量 指的是指广泛的数据类型 xff0c 它是 n n 维的 n
  • 栈和排序

    题目描述 给你一个1 gt n的排列和一个栈 xff0c 入栈顺序给定 你要在不打乱入栈顺序的情况下 xff0c 对数组进行从大到小排序 当无法完全排序时 xff0c 请输出字典序最大的出栈序列 输入描述 第一行一个数n 第二行n个数 xf
  • ubuntu系统samba共享权限设置,一清二楚

    samba共享设置 在root权限下 xff0c 进入root权限的方法 su或者 sudo su root 创建系统用户 useradd m user 设置用户密码 passwd user 创建smb密码 smbpasswd a user
  • curl安装

    一 xff1a windows下安装curl 1 下载windows版本curl安装包 根据你电脑的系统选择32位或64位 因为我的电脑是64位的 所以我选择64位的安装包 curl下载地址 xff1a https curl haxx se

随机推荐

  • OAuth 2.0 概念及授权流程梳理

    本文可以转载 xff0c 但请注明出处https www cnblogs com hellxz p oauth2 process html OAuth2 的概念 OAuth是一个关于授权的开放网络标准 xff0c OAuth2是其2 0版本
  • 基于51单片机的12864液晶时钟C语言程序

    自己写的12864液晶时钟程序 xff0c 经过验证可以使用 xff0c 希望可以为初学者作为参考 include lt reg52 h gt include lt math h gt define uint unsigned int de
  • 耗时两个月开发的弯管机三维模型自动转档软件

    一 系统简介 SmartPipe软件根据用户提供的三维实体管子数据 xff08 stp iges brep文件 xff09 xff0c 通过全自动方式 xff0c 提取管子的轴线数据及几何特征信息 xff0c 生成弯管编程所需的xyz数据以
  • 软件评测-软件测试与软件质量

    软件测试与软件质量 软件测试 xff1a 经典的定义是在规定条件下对程序进行操作 xff0c 以发现错误 xff0c 对软件质量进行评估 因为软件是由文档 数据 及程序组成 xff0c 所以软件测试应该是对软件形成过程的文档 数据以及程序进
  • sobol敏感性分析 matlab代码

    sobol 参数敏感性分析 参考 xff1a csdn https blog csdn net xiaosebi1111 article details 46517409 wiki xff1a https en wikipedia org
  • 软件质量的8个特性

    功能性 功能完备性 功能正确性 功能适用性 性能效率 时间特性 资源利用率 容量 兼容性 共存性 互操作性 易用性 可辨识性 易学性 易操作性 用户差错 防止性 用户界面 舒适性 易访问性 可靠性 成熟性 可用性 容错性 可恢复性 信息安全
  • Bad configuration option: \302\240

    ssh 配置文件时奇奇怪怪的错 xff0c 我碰到的是 xff1a Bad configuration option 302 240 一直不清楚后面这个 302 240 是啥意思 xff0c 后来参考这个回答 xff1a https sta
  • CentsOS系统卡值mysql查询慢

    第一步查看系统是什么占资源 htop F1 h 查看htop使用说明 xff0c F2 s 设置选项 F3 搜索进程 F4 过滤器 xff0c 输入关键字搜索 F5 t 显示属性结构 F6 lt gt 选择排序方式 F7 减少进程的优先级
  • 精美多功能翻页时钟源码 灵感来源于fliqlo

    介绍 xff1a 一个翻页时钟的网页 xff0c 灵感来源于fliqlo 外表相似 xff0c 功能不同 功能 xff1a 看时间看秒表倒计时 说明 xff1a F11 全屏 ctrl 43 43 或 调整设置框大小 单击 或 空格 可以暂
  • vscode 报错ERROR: Unable to start debugging. Unexpected GDB output from command “-exec-run“

    1 报错信息 Unable to start debugging xff0c 如下截图所示 网上找了很多资料 xff0c 发现大部分解释都说是 xff0c 库的问题 xff0c 拷贝libstdc 43 43 6 dll 文件后 xff0c
  • 关于Ip首部最大长度(60)和最小长度(20)的计算

    第一次写博客 xff0c 可能语言组织的不是特别好 xff0c 因为是个人理解 xff0c 有不正确的地方清指出 关于ip首部长度最大值5字节和60字节的计算 首先声明几个单位 ip数据报中的单位是 位 xff08 代表 32bit xff
  • Dev-C++ 5.11 调试程序 查找程序错误

    相信大家看到我这篇博客的时候还不怎么会用dev c 43 43 调试程序吧 xff0c 那么我就给大家详解一下 xff08 切记 xff1a 要调试的程序一定要能够通过编译 xff0c 一定要通过 xff0c 一定要通过 xff0c 一定要
  • NVM安装与使用

    NVM安装与使用 介绍 nvm是nodejs的版本管理工具 xff0c 可以安装和切换不同的版本nodejs npm是依赖包的管理工具 1 下载NVM GITHUB https github com coreybutler nvm wind
  • maven

    http mvnrepository com 打开网面 xff0c 搜索要查询的jar包名 xff0c 直接复制配制文件到你自己的pom xml中即可 xff0c 如 xff1a lt dependency gt lt groupId gt
  • 密集脚集成块的手工焊接方法

    电子爱好者在进行电子设计制作时 xff0c 最头痛的是焊接密集脚贴片集成块 如 VS1003的焊接 xff0c 往往感到无从下手 下面根据我设计制作时的经验 xff0c 将具体的手工操作方法介绍给大家 xff0c 希望能助你一臂之力 所需辅
  • python批量新建文件、批量保存图片、批量创建文件夹

    python批量新建文件 批量保存图片 批量创建文件夹 新建文件 xff1a 假设我要新建10个txt文件 for i in range 10 这里的 指代的是当前文件夹 i表示文件的名称 f 61 open 39 s 39 i 43 39
  • 操作系统——实验一.进程管理

    include 34 conio h 34 include 34 stdio h 34 include 34 stdlib h 34 struct jincheng type int pid int youxian int daxiao i
  • 计算机中堆栈的概念

    这两天学习win32的API xff0c 了解到了计算机中堆栈的概念 xff0c 相信很多程序员有时候也弄不明白计算机中的堆栈的数据结构 再次为堆栈做一下详细解析 在英文中 xff0c 我们管栈称为stack xff0c 管堆称为heap
  • 使用sqlite3_exec回掉函数输出查询内容

    include lt stdlib h gt include lt stdio h gt include lt sqlite3 h gt int my callback void param int f num char f value c
  • 网络数据传输的三种校验方法

    一 奇偶校验 根据被传输的一组二进制代码的数位中 1 的个数是奇数或偶数来进行校验 采用奇数的称为奇校验 xff0c 反之 xff0c 称为偶校验 采用何种校验是事先规定好的 通常专门设置一个奇偶校验位 xff0c 用它使这组代码中 1 的