浅谈CRC效验

浅谈CRC效验

在网络的信息的传输中,现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能变为0,而0也可能变为1.这就是比特差错。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC的检错技术。

CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

如何效验:

在接收端吧接收到的数据以帧为单位进行CRC检验:把收到的每一个帧都除以同样的除数P(模2运算),然后检查得到的余数R。如果在传输过程中无差错,那么经过CRC检验得出的余数R肯定是0。但如果出现误码,那么余数R仍等于0的概率是非常非常小的。需要强调的是,在数据链路层若仅仅使用循环冗余检验CRC差错检测技术,则只能做到对帧的无差错接收,即“凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错”。接收端丢弃的真虽然曾收到了,但最终还认为因为有差错被丢弃,即没有接受。以上所述的可以近似的表述为:凡是接收端数据链路层接受的帧均无差错

CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。接收端根据同样的规则校验,以确定传送中是否出错。

接收端有两种处理方式:

1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。2、计算整个k+r位的CRC码,若为0,则接收正确。CRC码有多种检验位数,8位、16位、32位等,原理相同。16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(即乘以2的16次方后),除以一个多项式,最后所得到的余数就是CRC码。求CRC码所采用的是模2运算法则,即多项式除法中采用不带借位的减法运算,运算等同于异或运算。

生成crc校验码:

例如:我们要生成序列1101011011的crc效验码:

要传输的数据为:1101011011

除数设为:10011

在计算前先将原始数据后面填上4个0:11010110110000

浅谈CRC效验_第1张图片

由此我们知道生成crc校验码最关键的就是除数的选取;

生成多项式的选取是个很有难度的问题,如果选的不好,那么检出错误的概率就会低很多。好在这个问题已经被专家们研究了很长一段时间了,对于我们这些使用者来说,只要把现成的成果拿来用就行了。

最常用的几种生成多项式如下:

CRC8=X8+X5+X4+X0

CRC-CCITT=X16+X12+X5+X0

CRC16=X16+X15+X2+X0

CRC12=X12+X11+X3+X2+X0

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0

因此,如果我们要求所发数据的crc校验码,使用上面多项式即可。。。。

你可能感兴趣的:(linux)