计算机网络下循环冗余检测(CRC)

来源:互联网 发布:韩顺平php视频教程 编辑:程序博客网 时间:2024/06/06 03:56

1 概念
  CRC即循环冗余校验码(Cyclic Redundancy Check[1]):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。概念来自百度百科CRC校验
2 CRC校验的原理
  在数据链路层传送的帧中,广泛使用了CRC检错技术。在面用实例进行原理的解释。
  1) 设传送数据为M = 1010001101(共K位),在M后添加用于检错的n位冗余码。冗余码会增加传送开销,却可以进行差错检测。
  2) 求n位的冗余码。用模2运算(加法运算不进位,减法运算不借位)进行2的n次方的运算,相当于在M后面添加n个0。然后用得到的(k+n)bit的数除以事先选定好的长度为(n+1)bit的数P,得到商为Q余数为R。
  3) P的选择。一般用多项式表示CRC的过程,即用多项式的系数表示0或1,例如P(x) = X^5 + X^4 + X^2 + 1表示110101。于是接收端进行运算为:

( X^n M(X) + R(X) ) / P(X)

  P一般选为:
  CRC-16 = X^16 + X^15 + X^2 + 1
  CRC-CCITT = X^16 + X^12 + X^5 + 1
  CRC-32 = X^32 + X^26 + X^22 + X^16 + X^12 + X^11 + X^10 + X^8 + X^7 + X^5 + X^4 + X^2 + X + 1
  4) 示例运算。
这里写图片描述

3) 检测结果
  经过接受端的运算后,只要得到余数R不为0,就检测到了差错,然后丢弃这个出现错误的帧。在使用CRC检测时只能做到无差错接受(凡是接受的帧(不包括丢弃的),我们都能以非常接近1的概率认为传输过程中没有差错)。要做到可靠传输,需加上确认和重传机制。