循环冗余校验基本算法

版权声明:本文为博主原创文章,转载请注明原文链接 https://blog.csdn.net/sailist/article/details/83588406

也称为多项式编码,是链路层广泛使用的更具纠错能力的方法

基本思想: 将位串看成是系数为 0 或 1 的多项式。一个 k 位帧看作是一个 k-1 次多项式的系数列表,该多项式共有 k 项,从 xk-1 到 XO。这样的多项式认为是 k-1 阶多项式。高次(最左边〉位是 xk-1 项的系数,接下来的位是 xk-2 项的系数,依此类推。

如, 110001 有 6 位,因此代表了一个有 6 项的多项式,其系数分别为 1 、 1 、 0、 0、 0 和 1 :即 1x5+ 1x4+0x3+0x2+0x1+1x0

多项式的算术运算遵守代数域理论规则,以 2 为模来完成。加法没有进位,减法没有借位。加法和减法都等同于异或。例如:

在这里插入图片描述

注意: 使用多项式编码时,发送方和接收方必须预先商定一个生成多项式 G(X),生成多项式的最高位和最低位系数必须是 1 。

计算 CRC 的算法如下:

  1. 假设 G(x)的阶为 r。在帧的低位端加上 r 个 0 位 , 使得该帧现在包含 m+r 位,对应多项式为 x’M(X)
  2. 利用模 2 除法,用对应于 G(x)的位串去除对应于 x、1(x)的位串。
  3. 利用模 2 减法,从对应于 x’M(x)的位串中减去余数(总是小于等于 r 位)。结果就是将被传输的带校验和的帧。它的多项式不妨设为 T(X)

下图展示了采用生成多项式为 G(x)=x4+x+1 计算帧 1101011111 校验和的情形。
在这里插入图片描述

显然, T(x)可以被 G(x)除尽(模 2)。在任何一种除法中,如果将被除数减掉余数,则剩下的差值一定可以被除数除尽。例如,在十进制中,如果 210 278 被 10 941 除,则余数为 2399。从 210 278 中减去 .2399,得到 207 879,它可以被 10 941 除尽。

问题: 商数的每一位是怎么来的?
解答: 看每一次除的第一位是0还是1

另外一个例子,对于101110101,采用110101作为生成多项式,余数为00011
在这里插入图片描述

要注意的是,CRC循环冗余校验是硬件完成的,对于上层软件或用户来说是感觉不到的。因此,发送端对出错的数据帧进行重传是自动进行的,这种差错控制体质常简称为ARQ(自动重传请求/自动请求重传)

猜你喜欢

转载自blog.csdn.net/sailist/article/details/83588406