CRC校验

来源:互联网 发布:路小雨知乎 编辑:程序博客网 时间:2024/05/29 03:48

CRC的概念:现今的计算机网络中广泛应用的差错冗余检测编码。CRC编码也叫多项式编码,因为该编码能够将要发送的比特串看作为系数是0和1多项式,对比特串的操作被解释为多项式算式。

CRC的编码操作如下:考虑d比特的数据D,发送节点要将它发送给接收节点。发送方和接收方首先必须协商一个r+1比特模式,称为生成多项式,我们将其表示成G,G的最高有效位的比特(最左边)是1。CRC编码的思想如图所示:


对于一个给定的数据段D,发送方要选择r个附加比特位R,并将它们附加到D上,使得得到的d+r比特模式(被解释为一个二进制)用模2算法恰好能被G整除。

用CRC进行差错检测的过程为:接收方用G除以接收到的d+r比特。如果余数为0,接收方知道了差错,否则认为数据正确而被接受

所有的CRC计算采用模2算法来做,在加法中不进位,在减法中不错位。这意味着加法和减法是相同的,而且这两种操作等价于操作数的按位异或(XOR)。举例来说:

1011 XOR 0101=1110

1001 XOR 1101=0100

类似的我们还有:

1011-0101=1110

1001-1101=0100

除了加法和减法操作没有进位或错位以外,乘法和除法与在二进制算法中是相同的。如在通常的二进制算法中那样,乘以2^k,就是以一种比特模式左移k个位置。例如,我们给定D和R,D*2^rXOR R产生如上图所示的d+r比特模式,下面我们将利用上图的d+r比特模式的代数特性。

现在我们回到发送方怎样计算R这个关键问题来,我们要求出R使得对n有:D*2^r XOR R=nG,也就是说,我们要选择R使得G能够除以D*2^r XOR R而没有余数。如果我们对上述等式的两边都用R异或(即用模2加,而没有进位),我们得到:D*2^r=nG XOR R这个等式告诉我们,如果我们用G除以D*2^r,余数则刚好是R,即R=remainder(D*2^r)/G。我们举一个例子:


上例中,D=101110,d=6,G=1001和r=3的情况下的计算过程,这种情况下传输的9个比特是101110011