CRC校验

来源:互联网 发布:java volatile变量 编辑:程序博客网 时间:2024/06/08 07:20
  1. CRC校验是什么?
  2. 如何进行校验?
  3. 具体的例子?

CRC校验

为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)。

CRC校验原理:

先在要发送的帧后面附加一个数(这个数就是用来校验的校验码FCS,这个校验码是二进制序列的),生成一个新帧发送给接收端。

关于这个校验码,不是随机选择的,它要使得生成的新帧能与发送端和接收端共同选定的某个特定数整除(采用一种“模2除法”),通俗点讲,获取该校验码的方法也就是用生成的新帧除以选定的特定的除数得到的余数,该余数就是这个校验码。
到达接收端后,再把接收到的新帧除以(“模2除法”)上面那个选定的除数。

因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(可以整除了),所以结果应该没有余数,如果有余数,则说明该帧在传输过程中出现了差错。

在发送的数据后面增加n位的冗余码,虽然增大了数据传输的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价往往是很值得的。

模2除法的特点:

1.不比较除数和被除数的相同位数值的大小,只要以相同位数相除即可。
2.在模2加法运算和模2减法运算中,既不向上借位,也不向上进位。

模2除法和模2乘法的图示:

这里写图片描述

这里写图片描述


CRC校验原理的步骤:

1.先选择一个可以用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。

2.看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。
但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。

3、 再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端;
最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。


CRC校验码的计算示例:

除数是随机或者按照标准选定的,所以CRC校验的关键是如何求出余数,也就是校验码(CRC校验码)。

下面是具体的计算过程:
(1)首先把生成的多项式转换成二进制数。
由G(X) = X4 (x的4次方)+ X3 (x的3次方)+ 1可以知道(除数一共有5位(总位数等于最高位的幂次加1,即4+1=5),很快就可得到它的二进制比特串为11001。

(2)因为生成多项式的位数为5,根据前面的介绍,得知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以除数,得到的余数(即CRC码)为0100。

这里写图片描述

(3)把上步得到的CRC校验码0100替换原始帧101100110000后面的四个“0”,得到新帧101100110100。再把这个新帧发送到接收端。

(4))当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。

计算示例:

例:M=101001,P=1101,n=3。

在发送端:
1、M=(2^n*M);
则:M=101001000
2、用M除以P

这里写图片描述

3、得到余数R也就是FCS,将FCS加到M上,就得到了要发送的帧。
M=101001000+FCS=101001001

在接收端:
接收到的每一帧都要进行差错检验,假设收到101001001,P=1101。

这里写图片描述

原创粉丝点击