循环冗余校验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+1ATM头部
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+1ATM AAL
CRC-16 x 16 x^{16} x16+ x 12 x^{12} x12+ x 5 x^{5} x5+1HDLC
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+1LANs

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

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,这一位会被省略掉。

所以,如果被除数用于计算的4位最左边第一位为1,就用除数1101去异或;如果落下的4位最左边第一位为0,就用0000去异或。这样才可以保证得到的异或结果最左边第一位一定为0。

第一次异或被除数落下4位1011,第一位是1,所以用除数1101去异或:1011 ⊕ 1101 = 0110 。省略最左边的0为110,被除数再落下一位,为1100。

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

这其实是进行了简化运算,异或后的结果,第1位一定是0,如果左边还有0,此时应该用0000去异或。

看第二次异或:1100 ⊕ 1101 = 0001。如果和之前一样,只省略结果0001第一位的0,那再让被除数从右边落下一位,应该是0011。
这样结果最左边第一位为0,应该用0000去异或:0011 ⊕ 0000 = 0011,结果根本不会变。省略掉最左边一位0,结果又落下一位,结果则是0110。可以看到,和0000异或的结果根本不用计算,就相当于把前面的0都去掉,后面直接落下对应的位数即可。

所以实际计算会省略和0000异或的部分(我画的图里把两次和0000的异或省略为了一次,方便读者理解),直接去掉左边多余的零,右边落下对应的位数即可。

所以,按照规则2可以简化计算。第二次异或是:1100 ⊕ 1101 = 0001。去掉前面3个0,被除数再落下三位,为1100。

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

简化计算后的第三次异或:1100 ⊕ 1101 = 0001。去掉前面三个0,发现被除数只能落下一个0,结果变为10。不足一个0凑齐三位。

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

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

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

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

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



CRC未检测到错误的概率

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

  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值