错误检测 CRC

Posted eret9616

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误检测 CRC相关的知识,希望对你有一定的参考价值。

预备知识:多项式除法

 

上一节我们讲了checksum

技术图片

 

 

 

这一节我们来讲CRC

 

 

How do CRCs work

 

 

 

 

CRC: the cyclic redundancy check

技术图片

 

 

 

从下面几个章节来讲,

首先是讲一下如何通过 模除运算 来检测错误,为了给你后面学习CRC提供一些sense

 

 

技术图片

 

 

现在有hello world, o变成了n , r变成了s

 

checksum是不能检测出错误的,

 

技术图片

 

 

两个 big long binary string 的等价十进制数字

 

我们用着两个数字除以 251

技术图片

 

 

余是50和52, 通过求余运算,我们就能检测错误。。

 

下面再给出个例子,

技术图片

 

 

 

hi! 是上面那一行,

我们想为这一行增加一些extra byte,

fill these extra bytes in here with our check sequence

 

首先我们先加0, 最后16位都是0,生成了一个十进制的数字

 

技术图片

 

 

 

我们先用这个数字模 65521 得到 26769

 

然后用65521 – 26769 = 38752

 

然后用这坨数字加上38752

 

这样得到的数,就能被65521整除

 

例如,

5%3 = 2

3-2=1

5+1=6

 

技术图片

 

 

然后我们可以把 38752 加到最后两个字节上

 

技术图片

 

 

 

这个东西模65521的值就是0

 

如果我们得到的message 模 65521的值不是0,我们就知道了,一定是传输中出现错误了

 

 

技术图片

 

 

 

(将hi! 改成ho!)

 

 

 

 

 

 

===============================================

 

 

 

 

技术图片

 

 

 

receive的message = trans的message + error message

 

t可以被65521整除

r不可以被 65521整除,是因为e不可以被65521整除,

 

我们为什么选了65521这个数字,,,为什么没选256呢,

e其实是可以被256整除的,因为anything where the last 8 bits are zeros is a multiple of 256

 

技术图片

 

 

 

在这两个例子中, receiver都是改变了两位, 但是error却可能实际改变很多位,这是因为有进位的问题干扰

 

 

技术图片

 

 

 

 

技术图片

 

 

在这个例子中虽然只有两个位变了,但是受进位的影响,错误error中有那么多位都不一样。

 

技术图片

 

 

在CRC中,没有用2,而是用x(因为用2的话相当于是十进制)

 

 

技术图片

 

 

 

这只是表示这段二进制string的另一种方式

 

(another expression represents the same string)

 

技术图片

 

 

 

 

然后我们用 下面这个多项式来除

技术图片

 

 

 

技术图片

 

 

 

和我们在文章一开始做的一样, 先把二进制转换为一种表达式,然后找到了一个数..就去相除

 

技术图片

 

 

得到的这个结果怎么转换为二进制呢, 比如说 6x^15,我们不能在一行二进制的第16位写6。。。因为二进制里没有6, 下面介绍一个数学工具

 

 

finite fields 有限域

技术图片

 

 

 

 

技术图片

 

 

在algebra(代数)中, 有各种各样的rules, 上图中对x的一个计算,应用了

additive property of equality

multiplicative property of equality

 

 

 

Finite Fields

 

a finite filed uses a finite number of numbers, but still all the rules of algebra work just the same.

 

 

a filed is basically just a set of numbers  and then definition of how you add those numbers together and how you multiply those numbers

 

 

Field axioms 域公理

技术图片

 

 

 

技术图片

 

 

 

定义有限域F=[0,1],满足Field axioms

 

虽然上面有些东西看上去不符合直觉,

 

比如在field axioms中 additive inverse : a+(-a) = 0

 

在我们的F中,只是inverse是这个数本身,所以这一条也是满足的

 

 

回到刚才的算式中:

技术图片

 

 

 

如果我们用有限域F,就不会出现二进制之外的数字了

 

技术图片

 

 

 

技术图片

 

 

 

在这个表达式中,我们留了16位来fill我们的CRC,

 

我们的除数被称作 generator polynomial

 技术图片

 

 

 

进行除法,

在处理到x^22的时候, 0 – x^22 ,并不是 -x^22

因为我们在使用我们的有限域进行运算

 

在F中,0-1的值是1,所以0-x^22 结果是 x^22

技术图片

 

 

 

在计算中,

技术图片

 

 

我们也应该注意到这很像xor门,因为上下都有的时候会变成0,有一个的时候会保留,

 

技术图片

 

 

 

 

一直到最后算出 remainder

 

 

 

 

 

 

because we use the finite field when we did this whole division process what you’ll see is that all of our coefficients(系数) are either 0 or 1, right?

 

 

so we could actually convert this remainder now to a binary number

 

 

the finite field even though it’s kind of weird and we had to redefine some of the addition and multiplication, A little bit algebra still works and that’s the whole that’s the whole reason to use it

 

技术图片

 

 

 

技术图片

 

 

 

技术图片

 

 

 

x^13 + x^12 + … … 从这一位开始是运算的结果——m(x) mod g(x) 的余数,

 

t(x) = m(x) – (m(x) mod g(x)).  中间计算使用的是F(0,1)有限域的二进制计算

 

(

5%3 =2

5-2=3

3%3=0

)

 

(

7%3=1

7-1=6

6%3=0

)

 

技术图片

 

 

 

当receiver拿到t(x)后,用t(x) mod g(x) 得到的值是 0

 

 

技术图片

 

 

 

如果求得余数不是0,那么说明是有错误的。

 

 

技术图片

 

 

 

如果求得的余数不是0,那么说明是有错误的。

 

 

技术图片

 

 

 

generator polynomial是怎么来的

 

 

技术图片

 

 

 

最后接收方要收到的是t(x) ,要求是t(x) mod g(x) = 0,

所以我们期望的是((tx) + e(x)) mod g(x) !=0

 

所以我们只要选取出e(x) mod g(x) 不为0的,就是合适的g(x)

 

 

Detecting single-bit errors:

技术图片

 

 

 

例如:

 

in order to detect this we need to come up with a polynomial that is not a multiple of X to the I (x^i),

为了检测出单比特错误,我们要找的g(x) 要求不是 x^i 的倍数

 

g(x):

with at least 2 terms (e.g. x+1)

 

 

技术图片

 

 

 

 

Detecting two-bit errors:

技术图片

 

the goal is come up with a generator polynomial that is not a multiple of this expression

 

上式也可以写成

技术图片

 

 

写成

技术图片

(k is the distance between two errors)

 

 

我们直接给出一个g(x):

技术图片

 

 

 

对应这个g(x), if your message less than 32k,then this particular polynomial will be able to detect any two-bit errors within that message, 这个可以在数学上严格证明

 

技术图片

 

 

通过WIKI我们可以看到,我们给出的这个叫做CRC-16-CCITT (Bluetooth就用的这个..)

 

还有CRC32.。

技术图片

 

 

802-3(Ethernet)   ---->   wifi 就用的这个

PNG什么的

 

 

 

还有一些更好的CRC变种

技术图片

 

 

看一下                       

Koopman(CRC-32K)教授的CRC

http://users.ece.cmu.edu/~koopman/crc/

 

 

 

 

看一下这张表中,对应HD=4折一行的16折一列对应的表格值的意思

技术图片

 

 

Max length of Hamming distance is the minimum number of bits that you’d have to change between two messages in order to not detect an error.

 

HD=4的意思是

in this case a Hamming distance of four

means that you can change any three bits in the message and guaranteed to detect it

 

这一行这一列对应的意思是:

this particular 16 bit CRC will give you that and it’ll give you that for messages up to 32K long

 

技术图片

 

 

you can get higher hamming distances, but you see the message size gets smaller

 

 

 

Detecting  burst errors:

技术图片

 

 

k is the length of burst

 

 

 

x^i 是最右边的错误位,k是burst error的长度 ,所以x^i(x^k-1 + … + 1)

 

技术图片

 

 

因为结果[t(x)] % g(x) = 0

 

 

所以我们期望((tx) + e(x)) mod g(x) !=0

我们要求ex除以gx 使余数不为0

 

假设g(x)最高项位数是16

e(x)的项数只要少于16,就不可能被整除..

 

所以

any 16-bit crc is always going to protect against at least 16-bit burst errors

a 32-bit crc is always going to protect against at least 32-bit burst errors and so forth

 

 

以上是关于错误检测 CRC的主要内容,如果未能解决你的问题,请参考以下文章

错误检测 CRC

是否可以使用 CRC 进行基本的纠错?

什么是CRC? CRC检测又有什么意思?

软件安全之CRC检测

如何接收错误的以太网帧并禁用 CRC/FCS 计算?

算法CRC 循环冗余校验