这个CRC在大一的时候就已经学习了,当时看的还很懂的样子,但是现在又什么都忘记了。于是找来《计算机网络》重新温习一下,同时也做一个笔记,方便以后查阅。
CRC编码也称为多项式编码。在网络传输过程中,在帧的结构中,有一个CRC校验。
CRC编码操作如下:
假如我们有一个长度为d比特的数据D,发送节点要发送到接收节点。发送方和接收方必须事先商量一个r+1比特的模式,称为生成多项式,我们将其表示为G(G的最高有效位必须为1)。然后根据D与G的运算得到一个r比特的R,然后D+R一起发送到接收节点,接收节点根据接收到的数据D+R和事先商量好的G进行除运算,如果相除于是为0就没错,非零就是传输过程出错。
主要是这个发送端和接收端如何运算的问题了。
所有CRC计算采用模2运算。
CRC加法运算规则:0+0=0 0+1=1 1+0=1 1+1=0 (注意:没有进位) CRC减法运算规则: 0-0=0 0-1=1 1-0=1 1-1=0 CRC乘法运算规则: 0*0=0 0*1=0 1*0=0 1*1=1除法比较麻烦。其实跟以前的还是一样,理解了就好。具体还是用一个例子来说明吧。比如101110000 除以1001.
1 0 1 0 1 1
1001 1 0 1 1 1 0 0 0 0
1 0 0 1 (首先商1,然后后面的根据除法这样一样进行运算,只是加减不一样而已)
------------------------------------
1 0 1 0
1 0 0 1
---------------------------------
1 1 0 0
1 0 0 1
----------------------------------
1 0 1 0
1 0 0 1
--------------------------------------------
0 1 1
我们其实是不关心商,我们关心的是余数。因为余数就是我们的CRC。
现在来谈谈我们之前说的运算。
前面说了,如何得到r比特的R呢?其实上面的除法运算已经给出了一个提示。在除法运算中,被除数是D*2^r,余数就是R。
为什么呢?
对于发送接收双方,必须事先商量一个G,要求满足这样的运算。
D*2^r XOR R = nG
也就是说,我们选择R使得G能够除尽D*2^r XOR R 而没有余数。对上面等式两边都用R异或,得到
D*2^r = nG XOR R
R = D*2^r / G 的余数
于是,一切都明朗起来了。
就说说上面那个例子:
D = 101110,假设我们商量好的G=1001,那么r = 3(G的长度减一)。
D*2^3 = 101110000 (左移3位)
然后相除,余数就是011(必须满3位)
于是,我们传送的数据就是101110011.
这个例子在《计算机网络》这本书上详细解释的还是比较清楚的。可以多看看这本书。
CRC 校验,以此记录。