CRC校验是什么? 如何进行校验? 具体的例子? CRC校验
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。 目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)。
CRC校验原理:
先在要发送的帧后面附加一个数(这个数就是用来校验的校验码FCS,这个校验码是二进制序列的),生成一个新帧发送给接收端。
关于这个校验码,不是随机选择的,它要使得生成的新帧能与发送端和接收端共同选定的某个特定数整除(采用一种“模2除法”),通俗点讲,获取该校验码的方法也就是用生成的新帧除以选定的特定的除数得到的余数,该余数就是这个校验码。 到达接收端后,再把接收到的新帧除以(“模2除法”)上面那个选定的除数。
因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(可以整除了),所以结果应该没有余数,如果有余数,则说明该帧在传输过程中出现了差错。
在发送的数据后面增加n位的冗余码,虽然增大了数据传输的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价往往是很值得的。
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校验方法
♪发送端 ◆在发送端先将数据分组,每组k个数据。假定要传送的数据是M。 ◆在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。 虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值得的。 ◆冗余码可以用下面的方法得出: ★用二进制模2运算进行2^n*M(相当于M左移n位)的运算。意思就是在M后面补n个0。现在M就变成了k+n位。 ★用M除以收发双方事先商定的长度为n+1的除数P。 ★得到的余数R,这个R就是FCS(帧检验序列)。将这个FCS序列加到M上然后发出去。 ♪接受端 ◆在接受端把接受到的数据以帧为单位进行CRC校验 ◆把收到的每一个帧都除以同样的除数P,然后检查余数R。 ◆如果余数R为0,如果在传输过程中没有差错。 ◆如果出现误码,那么余数R为零的概率是非常小的。 ▒冗余码生成步骤 1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。 2、将信息码左移R位,相当于对应的信息多项式C(X)*2R。 3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。 4、将余数拼到信息码左移后空出的位置,得到完整的CRC码