CRC循环冗余检验算法

来源:互联网 发布:怎么看卖家淘宝网址 编辑:程序博客网 时间:2024/05/21 06:57

1.为什么要有CRC循环冗余检验算法
数据在网络的传输过程中,都是以二进制数据传输,即不是0,就是1;数据传输过程中,因为各种可能的原因导致数据0变为1,1变为0。为了保证传输数据的可靠性,在计算机网络传输时,必须采用各种差错检测措施;
CRC是我们运用在数据链路层的差错检验算法;

2.CRC循环冗余检验算法的原理

举例说明如何得到帧检验序列FCS

  • 假设待传输的数据M=101001(k=6),CRC算法就是在数据M后添加供差错检测的n位冗余码,构成大小为(k+n)比特的数据帧发送出去;
  • 利用模2运算(加法时不进位,减法时不借位,即1+1 = 0,0-1 = 1),2^n乘M,相当于二进制数M左移n位,后面n位补0,得到(k+n)位数除以事先双方约定好的(n+1)位的除数P,得到的商Q和余数R(n位),我们将余数作为帧检验序列FCS;
  • 例如我们事先约定好P = 1101,则n = 3;则(6+3位)被除数为101001 000,除数p(6位)为1101,利用模2除法,可以得到商Q = 110101,余数(3位)R = 001,那么001即为M = 101001的帧检验序列FCS,即发送的数据为101001001

当我们收到一个数据帧时,如何利用CRC算法判断该数据有无传输差错?

将接收到的数据与实现约定好的除数P相除,得到的余数R

  • 若余数R = 0;则表明该帧没有传输错误;
  • 若余数R!=0;则表明该帧有差错,直接丢弃

3.CRC循环冗余检验算法解决了数据链路层上实现数据比特差错的控制,单着还不是真正的可靠传输,因为数据除比特差错外,还可能有帧丢失、帧重复或帧失序等问题

4.举例说明FCS计算过程

【例】假设使用的生成多项式是G(x)=x3+x+1。4位的原始报文为1010,求编码后的报文。
  解:

  • 将生成多项式G(x)=x3+x+1转换成对应的二进制除数1011;
  • 此题生成多项式有4位(n+1),要把原始报文C(x)左移3(n)位变成1010000 ;
  • 用生成多项式对应的二进制数对左移3位后的原始报文进行除:
      这里的除法有两种方法
      一种是把原二进制转化为10进制,然后进行除法运算得到余数。将这个余数再转化为二进制,就是要填在后面的二进制数了(这个可能有误……)
      如此例
      1010000(原始报文移位后)转换为十进制为80
      1011(生成多项式)转换为十进制为11
      11除80,余数为3
      转化为二进制位011
      这个011就是要在后三位的校验码
      编码后的报文(CRC码):
      1010000
      + 011
      ——————
      1010011
      
    第二种方法是模二除法
    这里写图片描述