循环冗余校验CRC



CRC的简介

循环冗余校验(cyclic redundancy check, CRC):CRC是数据通信领域最常用的一种差错检验码。它只能检错,不能纠错。要纠错就需要更多的冗余位得到对应的纠错码。

在发送端会对数据字段(实际是在数据字段末尾加足够的0)进行模2除法运算,用生成多项式(一种用来生成差错检测码的工具)作为除数,将得到的余数作为冗余码加到数据字段尾部,数据字段+冗余码合起来称为码字。码字会被发送端传送到接收端,接收端会对码字做同样的模2除法运算,得到的结果称为校正子,如果校正子全为0,则认为数据没有出错。否则认为数据出错。

具体逻辑如下图所示:
在这里插入图片描述



CRC在数据链路层的应用

比如PPP协议以太网协议都使用CRC。



CRC的计算

和所有差错检测一样,CRC检错也是靠冗余位实现的。CRC的冗余位叫做帧检验序列FCS(Frame Check Sequence)。计算出的FCS会作为冗余位加到数据字段的尾部。
计算CRC的方法是利用模2除法运算,除数是通过已知的生成多项式求得。

常见生成多项式

生成多项式的获取需要抽象代数的专业知识,不过常用的生成多项式已经被专家研究出了,如下表所示:

名称 多项式 应用
CRC-8 x 8 x^{8} x8+ x 2 x^{2} x2+ x 1 x^{1} x1+1 ATM头部
CRC-10 x 10 x^{10} x10+ x 9 x^{9} x9+ x 5 x^{5} x5+ x 4 x^{4} x4+ x 2 x^{2} x2+1 ATM AAL
CRC-16 x 16 x^{16} x16+ x 12 x^{12} x12+ x 5 x^{5} x5+1 HDLC
CRC-32 x 32 x^{32} x32+ x 26 x^{26} x26+ x 23 x^{23} x23+ x 22 x^{22} x22+ x 16 x^{16} x16+ x 12 x^{12} x12+ x 11 x^{11} x11+ x 10 x^{10} x10+ x 8 x^{8} x8+ x 7 x^{7} x7+ x 5 x^{5} x5+ x 4 x^{4} x4+ x 2 x^{2} x2+1 LANs

每个包含差错控制的协议的生成多项式都是已知的,这些生成多项式成功检测出差错的概率非常高。
发送方和接收方一开始都有统一的生成多项式

CRC计算的步骤

下面是CRC计算的完整步骤:

发送端:

1.构造除数
发送方首先要
将已知的生成多项式转换为除数**。

方法很简单,将多项式进行完整的展开,多项式的系数组合就是除数的值。
举例:
x 3 x^{3} x3 + x + 1 = 1✖ x 3 x^{3} x3 + 0✖ x 2 x^{2} x2 + 1✖x + 1✖ x 0 x^{0} x0
除数为对应系数组合:1011

2.构造被除数
被除数是将数据字段的末尾填充足够位数的0得到的0的个数为生成多项式的最高项次数
比如生成多项式为: x 3 x^{3} x3+x+1,最高项次数为3,所以添加3个0。

3.求得模2除法的余数
用被除数和除数进行模2除法,将得到的商省略,得到的余数留下来。余数的值就是CRC冗余码的值,也就是帧检验序列FCS的值。

4.传输码字
在数据字段末尾加上帧检测序列FCS,组合成最终的码字。将整个码字传输到不可靠的链路中,接收端最终会收到可能改变(大几率不会出错)的码字。

接收端:

1.计算校正子
接收端会和发送端做类似的处理,和发送端的唯一区别是:它是直接用接收到的码字做被除数
还是用生成多项式得到的值做除数,用模2除法计算余数。余数就是最终的校正子

2.逻辑决策
如果校正子为全0,则认为收到的数据没有差错。
反之,如果校正子不是全0,则认为数据出错。接收端有可能丢弃数据,或者要求发送端做数据的重传。是直接丢弃还是要求重传由具体的协议决定。

CRC计算举例

如何根据生成多项式生成除数,如何填充数据字段得到被除数,以及如何通过模2运算得到余数作为冗余位。
只需要跟着计算一个例子即可完全掌握。

下面的例子的数据字段为:101101001,生成多项式为: x 3 x^{3} x3+ x 2 x^{2} x2+1

展开多项式得到除数为:1101

多项式最高项次数为3,所以数据字段末尾需要加3个0。
所以被除数为:101101001000

模2除法的规则很简单,如下图所示:
在这里插入图片描述
其实和一般的除法差不多,不过每次做的是异或运算。

规则1:每次异或的最左边第一位一定为0。

第一次异或:1011 ⊕ 1101 = 0111 省略最左边的0为111,被除数再落下一位,为1110

规则2:异或的结果最左边有几个零,就省略几个0,同时被除数需要落下对应的数字补齐。

第二次异或:1110 ⊕ 1101 = 0011 省略最左边的2个0为11,被除数再落下两位,为1110

第三次异或:1110 ⊕ 1101 = 0011,省略最左边的2个0为11,被除数再落下两位,为1100

规则3:余数的位数比除数少1位,如果余数位数不够就在前面补0。

第四次异或:1100 ⊕ 1101 = 0001,得到最终的余数位1。由于除数为4位,所以余数少1位应为3位,所以补齐2个0,余数最终为001。

所以,余数001就是CRC的冗余码,也就是帧检验序列FCS

商的规则其实很简单,如果得到的结果最左边只有第一位为0,商的对应那位就是1,如果得到的结果最左边有n个0(n大于1),则商对应需要加上n-1个0。比如得到的结果是0011,有2个0,则商应该加1个0上去(不过商的值没用,所以也不用在乎它的计算)。

接受端和发送端都做同样的模2除法,只不过接收端的被除数是接受到的码字

比如发送端的被除数是101101001000(101101001补足3个0),FCS的值为001,那么如果传输没出错,接收端的码字应该为101101001001,这个码字会被接收端用来当作被除数。

具体的计算方法都是模2除法,由于码字没错,所以得到的余数应该为000。具体计算读者可以自行尝试。



CRC未检测到错误的概率

CRC并不是百分百检错成功。当码字出错,但接收端计算得到的校正子还为全0时,CRC就出错了。错误的数据字段也会被接收端上层协议接收。但是只要选择合适的生成多项式,CRC未检测到错误的概率是非常低的。
CRC在检测单个差错,双差错,奇数个差错和突发性差错的性能都是非常令人满意的,而且它的硬件实现也很简单。所以,很多网络协议都会选择CRC进行差错检测。

猜你喜欢

转载自blog.csdn.net/qq_983030560/article/details/128494066