终于弄懂 CRC 循环冗余校验 辽

概述


  • CRC 即 Cyclic Redundancy Check 的缩写
  • CRC 循环冗余校验属于检错码,只能检测出现了错误,但无法纠正错误。
  • 与CRC循环冗余校验类似的,还有奇/偶校验,但是 CRC 漏检率更低,因此在实际应用中更为重要

使用 CRC 校验数据流程

  • 首先需要发送方在原始数据的基础上,加上CRC校验码,组成新的发送数据
  • 然后接收方对收到的原始数据 + 校验码进行校验,判断数据在传输过程中是否出现错误

发送方对原始数据追加校验码

  • 假设原始数据是:101001
  • 生成待追加的校验码,需要使用一个生成多项式,G(x)(收发双方事先约定),例如 G(x) = x3 + x2 + 1
  • 构造被除数:原始数据 + 生成多项式最高次项个0,即:101001000
  • 除数:除数实际上就是生成多项式的系数,G(x) 展开得到: G(x) = 1 * x3 + 1 * x2 + 0 * x1 + 1 * x0,即 1101
  • 两数相除得余数,并进行补位(补到与生成多项式最高次项一致),即得到校验码。但是,这里的除法跟常规除法并不相同
  • 常规除法在上下两行数进行运算时,使用的是减法运算,而这里使用的是异或
    终于弄懂 CRC 循环冗余校验 辽
  • 通过上述运算,得到校验码 001,添加到原始数据之后,得到的最终发送数据为 101001001

接收方对收到的数据进行校验

  • 继续接前文,假设收到的数据为 101001001
  • 接收方对该数据做除法,除数仍然是之前使用的多项式的系数 1101
  • 过程如下
    终于弄懂 CRC 循环冗余校验 辽
  • 若余数为0,则表示未出错
  • 假设,接收方收到的数据出现了错误: 101101001,校验过程如下:
    终于弄懂 CRC 循环冗余校验 辽
  • 余数不为0,则表示传输过程中出现了错误

结语


  • 计算CRC校验码时,用到的除法运算,内部使用的是异或运算而非减法运算

  • 计算出余数后,还要对其进行补位,才能得到最终使用的校验码

  • 在计算机网络中,数据链路层将数据封装成帧时,会在帧尾添加校验码,从而判断数据在传输过程中是否发生错误

  • 在实际使用CRC时,采用的生成多项式更为复杂,从而确保较低的漏检率
    终于弄懂 CRC 循环冗余校验 辽

  • 另外,生成多项式的常数项必须是1

上一篇:电力-MODBUS_RTU通讯规约一


下一篇:CRC总结-2