网络原理考点之差错编码

如题2019年4月

又如2019年10月

其实这些考点都是很有用的,代表了网络的思想。 

还是那句话,这些词看着挺熟悉,但具体什么意思,还真一时想不起来……。

检错重发:典型差错控制方式,发送端对发送数据进行差错编码,传输后,接收端利用差错编码检错,对于出错的数据,要求发送端重发。单片机项目中用的CRC、校验和等都是这种方式。对应的网络停等、滑动窗口协议都是这种方式。

检错丢弃:出错后,直接丢弃。适用于容许一定比例差错存在,只适用于实时性要求较高的系统。

反馈校验:接收端将收到数据原封不对返回,很简单的检错方法,传输效率低、实时性差。

前向纠错:差错纠正,接收方利用纠错码进行纠错。前向:指对接收的数据向前检查哪一个出错,并纠正。

所谓差错控制都是指  检错后的处理方式。如何检错没说。上面两题答案不说了,自己看!

如何检错?其实就是CRC、奇偶校验、汉明码这些,详见2019-9-20《软考考点笔记之校验码》

软考这篇笔记,没有记录汉明码,因为之前作为新奇的东西,记在了本子上面,现在越来越觉得,本子查看不是很方便!以个网上例子再总结一下。记不住也没什么,再看一遍就是了,但总要有个印象吧,以后再遇到同样的问题时能知道个方向,这就是夯实基础的意义,也是自考专业另一层意义,再说应用其实是小菜了。

海明码:

下面本例以1010110为例进行海明码编码。

第一步先确定需要多少位校验码;

设数据有n位,校验码有x位。则校验码一共有2^x种取值方式。其中需要一种取值方式表示数据正确,剩下(2^x)−1种取值方式表示有一位数据出错。因为编码后的二进制串有n+x位,都可能出错,因此x应该满足:(2^x)−1≥n+x;软考其实就是考这个公式。
使不等式成立的x的最小值就是校验码的位数。在本例中,n=7,解得x=4。


第二步,确定校验码的位置

校验码在二进制串中的位置为2的整数幂,即1、2、4、8、16……..剩下的位置是信息码,绿色为校验位:

这里写图片描述

本例的校验码位置如下图:要具体分析是大端还是小端,这个表是小端,所以只是借鉴思路,没有问题。

这里写图片描述

 

第三步,计算校验位的值

由于奇偶校验原理一样,偶校验的计算更为简单,实际中多用偶校验,本例中也以偶校验进行计算。

这里写图片描述

如图中:
第一行中每个X跳过1位;第一行所有的X值进行异或是0;第一行的X对应的数据位位置转化为二进制最后一位都是1,即是xxx1这种形式;
第二行中每2个X跳过2位;第二行所有的X值进行异或是0;第二行的X对应的数据位位置转化为二进制倒数第二位一位都是,即是xx1x这种形式;
第三行中每4个X跳过4位;第三行所有的X值进行异或是0;第三行的X对应的数据位位置转化为二进制倒数第三位一位都是1,即是x1xx这种形式;
第四行中每8个X跳过8位;第四行所有的X值进行异或是0;第四行的X对应的数据位位置转化为二进制倒数第四位一位都是1,即是1xxx这种形式;
……..
每一行都是从对应的校验位开始校验,即从第(2^n)/2位开始校验,校验(2^n)/2个,然后跳过(2^n)/2个
下面计算本例子,将表格中的位置用二进制表示:

这里写图片描述

x1的计算:
x1是第一个校验码,位置对应栏所有最后一位为1(xxx1格式)的相异或为0,即

这里写图片描述

x1⊕1⊕0⊕0⊕1⊕0=0;则x1=0;

x2计算:
x2是第二个校验码,位置对应栏所有倒数第二位为1(xx1x格式)的相异或为0,即

这里写图片描述

 

x2⊕1⊕1⊕0⊕1⊕0=0;则x2=1;

x3计算:
x3是第三个校验码,位置对应栏所有倒数第三位为1(x1xx格式)的相异或为0,即

这里写图片描述

 x3⊕0⊕1⊕0=0;则x3=1;

x4计算:
x4是第四个校验码,位置对应栏所有倒数第四位为1(1xxx格式)的相异或为0,即

这里写图片描述

x4⊕1⊕1⊕0=0;则x4=0;

所以最终的海明码是01110100110。

这里写图片描述

如何校验:??

接收到数据后

分别计算校验码所校验的位置的模二加法。

G1=X1 ⊕ D1 ⊕.. ⊕ D7

G2=X2  ⊕ D1  ⊕... ⊕ D7

...几个校验位列几个。

按十六进制G4G3G2G1=0101H,就代表出错的位置。

 

补充CRC循环冗余校验的原理:

假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m(m代表h(x)的最高阶数值),既将g后加m个0(完成以上被除数的处理),然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

其中,h(x)就代表多项式,除数,注意:所选生成多项式最高阶与最低阶对应的系数必须为1。

 

            g(x) 代表要发送信息。

 

举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。 

      

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

如CRC16的

计算法一般都是:

(1)预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
(2)把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器相异或,把结果放于CRC寄存器;CRC高8位异或0相当于没变,低8位相当于除FF(模二除法)为什么呢?

按照常规的思想CRC初始化为0,然后第一个字节先进CRC高位,判断将要左移一们是否为1,若为1则将左移,并且将CRC寄存器高8个字节(其实存的是数据)与多项式(从第二位起)异或(相当于执行了除法),不为1,则光左移?

这时脑子里一定要脑补出这样的图来

这里由于CRC初始化为FFFF,并且往右移,正好反过来了,那么数据肯定也要“反过来”;这样才能保持数据不变。如何反?就是拿数据跟当前CRC里面的数据值异或。
(3)把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4)如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多项式(例如:1010 0000 0000 0001)进行异或;
(5)重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6)重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7)将该通讯信息帧所有字节按上述步骤计算完成后(全部的数据按字节都要过一遍CRC校验,这样才叫校验),得到的16位CRC寄存器的高、低字节进行交换;(脑补出的图,往左移的话,就不用交换了)
(8)最后得到的CRC寄存器内容即为:CRC码。发送时,将数据后+CRC码一块发送出去。

对于接收端的处理:

把CRC+数据,理解成二进制数就好了,其实就是已经能整除了,这样发送端再除以之前选定的CRC16多项式,就可以得到零,不是零的话,就说明出错了。

以上计算步骤中的多项式A001(1010 0000 0000 0001)是8005按位颠倒后的结果。

参考https://blog.csdn.net/qq_27312943/article/details/52723965

查表法:

将移位异或的计算结果做成了一个表,就是将0~256放入一个长度为16位的寄存器中的低八位,高八位填充0,然后将该寄存器与多项式例如:1010 0000 0000 0001)按照上述3、4步骤,直到八位全部移出,最后寄存器中的值就是表格中的数据,高八位、低八位分别单独一个表。

项目会用到的CRC:

标准CRC多项式如下表:

注:简记式是把 生成多项式的最高幂次项系数是固定的1,将最高的1统一去掉了。如CRC16  多项式系数为11000000000000101,将最高位去掉1000000000000101,十六进制形式为8005

 CRC校验码使用:

在线CRC计算:https://www.lammertbies.nl/comm/info/crc-calculation.html

刚开始时,可以参照这个验证下算法对不对。这样可以提高信心。

CRC算法参数模型解释:

NAME:参数模型名称。

WIDTH:宽度,即CRC比特数。

POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。

INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。

REFIN:待测数据的每个字节是否按位反转,True或False。

REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。

XOROUT:计算结果与此参数异或后得到最终的CRC值。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章