分享

以太网的数据帧的末尾CRC校验算法

 charlie_linux 2020-01-13

一、什么是CRC校验算法 

最近在学网络时在以太网的数据帧的末尾有一个叫CRC校验码的东西,遂不解。于是便一起学习一下,什么是CRC校验码。 

CRC就是循环冗余校验码(Cyclic Redundancy Check),是数据通信领域常见的差错校验码,特征是信息字段和校验字段的长度可以任意的选定。 

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接受设备也执行类似的算法来保证数据传输的正确性和完整性。 

二、CRC校验算法的算法的原理 

CRC校验算法的原理就是:原始帧数据发送之前,在n个bit位的原始数据后面加上通过特定运算得到的K位校验序列,组成新的帧来发送给接收端。接收端会根据原始数据后的校验序列再次进行特定的运算,若正确则接受,若结果错误则丢弃。 


把上面的K位校验码序列就称为:FCS 

CRC校验算法原理的示图如下: 


我们把特定的运算就称为异或运算。 

这样看来CRC校验算法也就是把原始数据通过异或运算得到FCS,接收端根据原始数据再次运算如果相等那么就接收。那么CRC算法的核心就是如何得到FCS。 

假设要发送的数据是M,M里面有K个数据,现在要计算冗余码。冗余码的计算方法如下: 

1、用二进制模2运算来进行2^n*M也就是M左移了n位,也即是在M的后面加上了n个0,现在M的长度就是K+n 

2、用M去除收发双方事先商定的长度为n+1的除数p,得到余数是R 

3、这个R就是FCS(帧检验序列),将这个FCS序列加到M后面发出去就行了。 

最后接收端对数据进行CRC校验,若余数为R就表示这个帧没有错,就接受。若R不为0表示这个帧出错就丢弃。 

一般在数据传输之前,发送端与接收端会相互约定好一个除数(也是一个二进制序列,用来进行模2算法)。这个除数就是生成多项式。这个多项式的最高位和最低位必须为1。 

常见的生成多项式为: 

CRC8=X8+X5+X4+1(100110001) 

CRC-CCITT=X16+X12+X5+1(1001000000100001) 

CRC16=X16+X15+X5+1(11000000000100001) 

CRC12=X12+X11+X3+X2+1(1100000001101) 

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1 

(100000100110000010001110110011111) 

给个栗子吧: 

M= 101001,p = 1101,n = 3 

M是要发送的数据,p是除数,n是在M后面差错检测的n位冗余码 

发送端: 

M=(2^n*M),所以M=101001000 

用M除以p: 


得到的余数是FCS,将其加到M的后面就是要发送的帧 

M = 101001000 + FCS = 101001001 

接收端: 

接收到的每一帧都要进行差错检验,假设收到的101001001,p=1101,具体如下: 


我们可以看到最后的余数R=0,没有出错,所以信息是被接收的。 

三、CRC算法的编程实现 

下面我们通过一个栗子来说明是如何实现CRC校验的,生成多项式为:100110001(简记0x31),也就是CRC-8 

计算步骤如下: 

(1) 将CRC寄存器(8-bits,比生成多项式少1bit)赋初值0 

(2) 在待传输信息流后面加入8个0 

(3) While (数据未处理完) 

(4) Begin 

(5) If (CRC寄存器首位是1) 

(6) reg = reg XOR 0x31 

(7) CRC寄存器左移一位,读入一个新的数据于CRC寄存器的0 bit的位置。 

(8) End 

(9) CRC寄存器就是我们所要求的余数。 

程序实现的示图: 


————————————————

版权声明:本文为CSDN博主「Payshent」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Payshent/article/details/73466179

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多