谈CRC循环冗余校验的之前,先把二进制除法说一下,先回忆一下十进制之间的除法是如何运算的,
这个式子在做除法的时候满足了这几个条件:
- 从被除数的最左边开始向右做除法
- 被除数运算的两位永远比除数大
- 如果相减的时候需要向前一位借1,则前一位要减1
知道两个概念
模2和
两个二进制位相加不进位,即 0+0=0,0+1=1,1+0=1,1+1=0(此时不进位)
模2减
两个二进制位相减不借位,即0-0=0,0-1=1(此时不进位),1-0=1,1-1=0
两种不同的二进制除法
除法
这个方法和正常的十进制除法没什么区别,就和刚开始回顾的二进制除法运算方法一样,在下面的例子中,被除数前四位1010除以111要考虑向前一位借1,其实把这些二进制转换成十进制的除法就是83/7=11…6,而这个二进制的运算结果完全吻合。
模2除法
模2除法就要用到之前说的两个概念之中的1个,就是模2减,除数和被除数相减的时候不考虑进位(可以看作做异或运算),这就引出了CRC(Cyclic Redundancy Check)循环冗余校验,用来检测或校验数据传输或者保存后可能出现的错误,本次主要讲解在计算机网络信息传输中的校验,计算机组成原理的信息保存校验原理和网络信息校验一样,不做深入讲解。在相减的时候每一次都是3位之间相减。你可能会问,为什么有时结果是1,有时结果是0呢,主要是被除数百位和除数百位相减可以抵消,不然相减结果还是3位就没有意义了。
CRC 循环冗余校验
编码过程
计算机传输数据的时候要最底层是物理层,向上有数据链路,网络层等等。当然数据要从计算机输出,是自上向下传输,比如从网络层得到一个IP数据报,封装成数据帧。在发送端把数据划分成组,假设每一组k位,数据M=101001,那么k=6,在M后面添加n位的二进制数值(冗余码)用来差错检验。添加冗余码的时候被除数和除数之间进行的是模2除法。
接下来确定除数,除数采用二进制系数多项式,如下表
名称 | 多项式 | 对应除数 |
---|---|---|
CRC-8 | x8+x2+x+1 | 1000 0011 1 |
CRC-16 | x12+x11+x3+x2+x+1 | 1100 0000 01111 |
… | … | … |
x8+x2+x+1表示二进制第8,2,1,0位为1,黄色的就是0位,其它多项式同理
接下来继续M数据的处理,设除数P=1101,则n=3,为什么冗余码的长度是3呢?
因为余数比除数少1,余数是被用来做校验用的。被除数是2nM=101001000。
为什么后面多出来n个0呢?这和后面的检验有关由于拿到的是(k+n)的数据要对数据做模2运算最后判断余数,只有被除数处于(除数+除数的余数)才会等于0,所以0的个数和余数的个数一样。
根据上面模2除法运算结果是商为110100,余数为001,把101010改为101001001,这就是一个完整的可校验数据。
下表是本题的各个数据的含义
符号 | 含义 | 值 |
---|---|---|
M | 一组数据 | 101001 |
n | 冗余码的位数 | 3 |
k | 每组数据的位数 | 6 |
P | 除数 | 1101 |
2nM | 被除数 | 101001000 |
Q | 商 | 110101 |
R | (余数)冗余码 | 001 |
2nM+R | 发送的数据 | 101001001 |
差错检测能力
利用多项式,我们定义误码多项式E(X)是接收到的消息码字与正确码字的异或。即
E(X) = Trecv(X) XOR Tcorrect(X) …… (14)
当E(X)能够被CRC多项式P(X)整除的时候(即R=0)CRC算法无法检查到错误。当我们选择一个适当的P(X)时,E(X)都不能被P(X)整除,因此可以检测出的出错情况有:
- 单比特差错,只要P(X)含有一个以上的非零项。
- 双比特差错,只要P(X)满足上述两种形式((12)(13)式)。
- 任意奇数个比特差错,只要P(X)含有因式(X - 1)。
- 任意突发差错,当突发差错长度小于或等于帧检验序列(F(X))的长度(n - k)。
- 长度为(n - k + 1)的突发差错片段,这个片段等于(1-2-(n-k-1))。
- 长度大于(n - k + 1)的突发差错片段,这个片段等于(1 - 2-(n-k))。