什么是 CRC

它是一种差错检验技术,数据帧的接收方用一个二进制素因子(生成多项式)除以数据帧的内容计算出余数,并将所计算出的余数与发送方存储在数据帧中的检验码进行比较。

CRC方法用在被称为“帧”的数据块上。基本上,发送者给每一帧附加一个被称为“FCS(帧检查序列)”的位序列。结果帧正好除以预设的数字。接收计算机用预设的数字去除该帧。如果剩有余数,就认为帧遭到损坏并要求重发。在许多形式的通信中通常都用这种方法。它具有差错检测级别高和快速及使用便捷的特点。

CRC(Cyclical Redundancy Check),就是在每个数据块(称之为帧)中加入一个FCS(Frame Check Sequence,帧检查序列)。FCS包含了帧的详细信息,专门用于发送/接收装置比较帧的正确与否。如果数据有误,则再次发送。

数据通信和磁盘记录等操作时使用的错误检测机制,特点是可以利用简单的硬件实现。 CRC 虽然能够检测出错误发生但不能修正错误。在以太网中使用此方法.

1.CRC循环冗余校验的基本原理
发送器和接收器约定选择同一个由n+1个位组成的二进制位列P作为校验列,发送器在数据祯的K个位信号后添加n个位(n < K)组成的FCS祯检验列(Frame Check Sequence),以保证新组成的全部信号列值可以被预定的校验二进制位列P的值对二取模整除;接收器检验所接收到数据信号列值(含有数据信号祯和FCS祯检验列)是否能被校验列P对二取模整除,如果不能,则存在传输错误位。P被称为CRC循环冗余校验列,正确选择P可以提高CRC冗余校验的能力。(注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行XOR异或运算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1)。可以证明,只要数据祯信号列M和校验列P是确定的,则可以唯一确定FCS祯检验列(也称为CRC冗余检验值)的各个位。

FCS帧检验列可由下列方法求得:在M后添加n个零后对二取模整除以P所得的余数。

例如:如要传输的M=7位列为1011101,选定的P校验二进制位列为10101(共有n+1=5位),对应的FCS帧校验列即为用1011101 0000(共有M+n=7+4=11位)对二取模整除以10101后的余数0111(共有n=4位)。因此,发送方应发送的全部数据列为10111010111。接收方将收到的11位数据对二取模整除以P校验二进制位列10101,如余数非0,则认为有传输错误位。

2.CRC循环冗余校验标准多项式P(X)
为了表示方便,实用时发送器和接收器共同约定选择的校验二进制位列P常被表示为具有二进制系数(1或0)的CRC标准校验多项式P(X)。

(1)CRC循环冗余校验常用的标准多项式P(X)
 常用的CRC循环冗余校验标准多项式如下:
  CRC(16位) = X^16+X^15+X^2+1
  CRC(CCITT) = X^16+X^12+X^5+1
  CRC(32位) =X^32+X^26+X^23+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X+1
  以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。

注意:这儿列出的标准校验多项式P(X)都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。

循环冗余校验标准多项式P(X)的检错能力

(2)CRC循环冗余校验标准多项式P(X)的检错能力
CRC循环冗余校验具有比奇偶校验强得多的检错能力。可以证明:它可以检测出所有的单个位错、几乎所有的双个位错、低于P(X)对应二进制校验列位数的所有连续位错、大于或等于P(X)对应二进制校验列位数的绝大多数连续位错。
但是,当传输中发生的错误多项式E(X)能被校验多项式P(X)对二取模整除时,它就不可能被P(X)探测出来,例如当E(X)=P(X)时。  

用循环块码的并发错误检测。[4]

这是一种错误检查技术,接受方计算桢内容与一个二进制质数相除得到的余数,并将结果同发送方存储在桢中的值进行比较。