循环冗余检验CRC的小细节

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误,它是利用除法及余数的原理来作错误侦测的。发送方计算机使用某公式计算出被传送数据所含信息的一个值,并将此值附在被传送数据后,接收方计算机则对同一数据进行相同的计算,应该得到相同的结果。如果这两个 CRC结果不一致,则说明发送中出现了差错,接收方计算机可要求发送方计算机重新发送该数据

1.模二运算

模2运算是一种二进制算法,不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。
(1)模二加法
两个序列模二相加,即两个序列中对应位相加,不进位,相同为0,不同为1,即1+1=0 0+0=0 1+0=1 0+1=1

例如
  1101
+1001
————
  0100

(2)模二减法
模2减法是一种不考虑借位的减法,和加法规则类似,即0-0=0 1-1=0 0-1=1 1-0=1(相同即为0,否则为1)

例如
  1001
+1011
————
  0010

(3)模二乘法
多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果(或称部分积)时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法,即0×0=0    0×1=0    1×0=0    1×1=1

例如:
  1001
x    11
————
 1001
1001
————
00100

(3)模二除法
模2除法与算术除法类似,但是在如何确定商的问题上两者采用不同的规则。算数除法按带借位的二进制除法,根据余数减除数是否够减确定商1还是商0,若够减则商1,否则商0,多位模2除法既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。同为0,异为1

例如:
11010110110000÷10011
在这里插入图片描述
也就是说11010110110000÷10011商为10011余数是1110

2.生成多项式
生成多项式,可以随机选择,也可以使用国际标准。
在这里插入图片描述
自己选择的生成多项式需要保证(这个自己也没搞明白怎么选)
1、生成多项式的最高位和最低位必须为1。
2、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
3、不同位发生错误时,应该使余数不同。
4、对余数继续做除,应使余数循环。

3.循环冗余检验原理
要传的数据÷生成多项式=商…余数(冗余码)
接受的数据÷生成多项式=商…余数

在发送的数据后面加上冗余码后(二进制)发送出去,接收端接收到后进行crc检验,若余数=0则判断没有差错接受,若余数≠0则判断有错,丢弃。
4.冗余码计算
(1)加0
假设要传输的原数据是1101011011,生成多项式是x4+x+1,转换为二进制就是10011(x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0)。将要传送的数据左移四位(也就是后面加四个0,也就是生成多项式最高幂是几原数据后面就加几个0),则原数据变为11010110110000。
(2)模二除法
加0后除以多项式,余数冗余码/FCS帧检验序列

图示
在这里插入图片描述
将模二除法后的道德余数替换掉原数据上加的0,则发送的数据为11010110111110

注意:
CRC差错检验技术能够实现无差错接受,并不是无差错传输,所以不是可靠传输。
CRC是一种常用的检错方法,而FCS是添加在数据后面的冗余码
FCS可以通过CRC得到,但是这并不是唯一的方法

猜你喜欢

转载自blog.csdn.net/aaahuahua/article/details/107752328
今日推荐