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码的生成多项式。
计算公式如下:
若设码字长度为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码字。发送方通过指定的g(x)产生CRC码字,接收方则通过该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除检测和确定错误位置。
应满足以下条件:
(1)生成多项式的最高位和最低位必须为1。(2)当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。(3)不同位发生错误时,应该使余数不同。(4)对余数继续做除,应使余数循环。
CRC生成步骤:
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除(高位对齐),模2除(按位除)模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位。所以实际上就是异或。然后再移位移位做下一位的模2减。步骤如下:a、用除数对被除数最高几位做模2减,没有借位。b、除数右移一位,若余数最高位为1,商为1,并对余数做模2减。若余数最高位为0,商为0,除数继续右移一位。c、一直做到余数的位数小于除数时,该余数就是最终余数。
1010000
1011
------------------
0001000
0001011
------------------
0000011
得到的余位011,所以最终编码为:1010 011
常见的CRC版本:
名称
多项式
表示法
应用举例
CRC-8
X8+X2+X+1
0X07
 
CRC-12
X12+X11+X3+X2+X+1
0X80F
telecom systems
CRC-16
X16+X15+X2+1
0X8005
Bisync, Modbus, USB, ANSI X3.28, SIA DC-07, many others; also known as CRC-16 and CRC-16-ANSI
CRC-CCITT
X16+X12+X5+1
0X1021
ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
CRC-32
X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1
0x04C11DB7
ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
CRC-32C
X32+X28+X27+X26+X25+X23+X22+X20+X19+X18+X14+X13+X11+X10+X9+X8+X6+1
0x1EDC6F41
iSCSI, SCTP, G.hn payload, SSE4.2, Btrfs, ext4, Ceph
实际通信中发送数据是多字节,比如发送地址、控制、信息、校验。所以必须按多字节去计算CRC码。
B(X)=Bn(X)*2^8n+Bn-1(X)*2^8(n-1)+....+B1(X)*2^8+B0(X)
 在实际应用中,我们不能花时间去一一计算编码,尤其是CRC16时,单片机是承受不了的,而且占据大量任务,给实时通信打折扣。所以一般我们会把8位二进制序列数从0~255的CRC全部计算出来,放在表里,扔到EEPROM或者FLASH中固存。
接收端收到数据后对收到的每一帧进行 CRC检验:
若得出的余数 R = 0,则判定这个帧没有差错,就接受。
若余数 R != 0,则判定这个帧有差错,就丢弃。
特点:
但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。
只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。


仅用循环冗余检验CRC 差错检测技术只能做到无差错接受(accept)。

“无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。

要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认重传机制。

考虑:帧重复、帧丢失、帧乱序的情况

从上面的分析我们看到,国际上提供的标准也并不是在任何情况下都能提供很好的差错检测性能,因此,针对不同的情况来选择适当的CRC生成多项式是有必要的,根据以上,我们提供下面的CRC国际标准选择方案:
1. 当数据帧长度在8bits-128bits范围内时,推荐CRC-8(CRC-8能够减少额外比特的开销,且有更好的性能表现);
2. 当数据帧长度在128bits-2048bits范围内时,推荐CRC-12,CRC-16,CRC-CCITT(CRC-12额外比特的开销更小,且用于6bit字符流的传输;对于16bits的标准,更推荐美国标准CRC-16,性能略优于CRC-CCITT);
3. 当因数据帧长度更长、信道不稳定等情况而需要更高的性能时,CRC-32、CRC-32C(Castagnoli等人于1993年左右提出的具有更好性能的CRC标准,并被iSCSI、SCTP使用)将是更好的选择;
4. 选择其他更多国际标准。




















  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值