初识循环冗余校验码:
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检验措施,目前广泛使用的是循环冗余(CRC)检验的检错技术。
CRC检验原理:
在发送端,先把数据划分为组,假定每个组k个比特。现假定待传送的数据M=101001(k=6)。CRC运算就是在数据M后面添加供差错检验用的n位冗余码,然后构成一个帧发送出去,一共发送(k+n)位。在要发送的数据后面加n位的冗余码,虽然增加了数据传送的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价是很值得的。
这n位冗余码可以通过下面的方法得出。用二进制的模2运算进行2^n乘M的运算,这相当于在M后面添加n个0。得到k+n位的数除以收发双方事先商定的长度为(n+1)位的除数p(实际上是除数和被除数做异或运算),得出商是Q余数是R(n位,比p少一位)。
在上图所示例子中,M=101001(k=6),假定除数p=1101(n=3,n比除数p少一位,即n为3位).经模2除法运算后的结果是:商Q=110101(这个商并没有什么用),而余数R=001,这个余数R就作为冗余码拼接在M之后发送出去,这种为了进行检错而添加的冗余码常称为帧检验序列FCS,因此加上FCS后发送的帧是101001001(一共K+n位)。
在接收端把接收到的数据以帧为单位进行CRC检验:把收到的每一帧都除以同样的除数P(模2运算),然后检查得到的余数R。
如果在传输过程中无差错,那么经过CRC检验后得出的余数R肯定是0。
但如果出现误码,那么余数R仍等于0的概率是非常小的。
总结:
(1)若得出的余数R=0,则判定这个帧没错,就接受。
(2)若余数R!=0;则判定这个帧有差错(但无法确定是哪一位或者或者哪几位出现了差错),就丢弃。
注意:
还有一种较方便的方法是用多项式g(x)来表示循环冗余检验过程。具体算法下面例题详细介绍。但在实际应用中,g(x)的取值是有限制的,它受限于以下国际标准:
CRC-CCITT=x^16+x^12+x^5+1
CRC-16=x^16+x^15+x^2+1
CRC-12=x^12+x^11+x^3+x^2+x+1
关于g(x)的国际标准还有一些,这里不一一介绍。
例题1:
采用CRC进行差错检验,生成多项式为G(X)=X4+X+1,信息码字为10110,则计算出的CRC校验码是:
A. 0000 B. 0100 C. 0010 D.1111
【分析】
符号表示假定:多项式和多项式的系数排列均用相同的符号表示,如
G(X)= X4+X+1
G(X)=10011
(1)已知条件如下:
原码字记做M(X),即:M(X) = 10110
生成多项式记做G(X),即:G(X) = 10011
G(X)的最高阶数记做r,此处r = 4
(2)计算步骤
a、计算XrM(X)
也就是把M(X)的尾部添加r个0
XrM(X) = 10110 0000
b、计算XrM(X)长除G(X),余数记做Y(X)
这里的“长除”计算方法如下:
XrM(X) 10110 0000
– G(X) 10011 (注意位对应方式,对应位进行异或运算即可)
00101 0000
– G(X) 100 11 (计算方法同上)
001 1100
– G(X) 100 11
01111 (此数已经小于G(X),计算到此为止,即Y(X))
注意Y(X)的位数为r(此处为4),所以Y(X) = 1111
Y(X)即是CRC校验码。
c、计算传输码字T(X) = XrM(X)-Y(X)
计算方法:在M(X)末尾连接上Y(X)即可
即:T(X) = 10110 1111
【答案】
此题只要计算出校验码Y(X)即可。正确答案为:D
例题2:
对于生成多项式g(x)=x^4+x^3+x^2+1,报文110产生的CRC的过程如下:
(1)对于g(x)=x^4+x^3+x^2+1的解释:(都是从右往左数)x4就是第五位是1,因为没有x1所以第2位就是0。
将生成多项式g(x)=x^4+x^3+x^2+1转换成对应的二进制除数11101。
(2)此生成多项式有5位(R+1)(注意:5位的生成多项式计算所得的校验码为4位,R为校验码位数),要把原始报文左移 4(R)位变成110 0000
(3)用110 0000与11101进行模2除,相当于按位异或:
11101 | 110,0000
得到余数:1001
所以CRC码是1001,传输码为:110,1001