深入理解CRC校验背后的原理

首先声明本文的大部分内容,图片来源于Ben Eater的how do CRCs work?,如有条件建议直接观看原视频。https://www.youtube.com/watch?v=izG7qT0EpBwhttps://www.youtube.com/watch?v=izG7qT0EpBw        本文为那些了解过CRC校验,甚至已经编程实现过,但是不知背后数学原理准备的。但是我还是会从最基础的讲起,逐步深入,当然原创很少,相当于做了个翻译和总结。

        如下图,当传输的二进制信号发送翻转时,其值就会发生变化,接收的信息也会改变,用一值去除它,也会有不同的结果,或许有人问,你除它干神马,直接比较不就行了,但是你想,如果要比较,那不是至少要两段一样的信息,而且你怎么保证两个都不发生错误,那就的同时发三段相同的数据流,然后来比较。你看这不是超级浪费嘛,一旦发的数据比较多那不就延迟超大,卡到爆。所以,人们就想出了checksum(也就是校验码),用一个数去除原数据得到的余数来得到一段较少的校验数据,加在原数据后面,这就大大提高传输效率了,具体原理待会儿道来。

      前面讲到校验码,直接是加(用补可能更贴切吧)在原数据后面的,一般和除数的位数一样,因为你的余数不得在0到除数之间嘛,而校验码就是余数·,这里给的校验位是16位。当接收者收到原来的数据和校验码后,进行相关的运算,如下图所示,当接收者把数据处理之后除以除数如果结果为零就通过校验,不为零就无法通过校验。

      刚才所言的运算,加法,减法,或是除法,都是正常的四则运算,也就是有进位有借位。我们对于错误信息的定义是在原来的数值上增加或是减少了一个数,那我们最后可以通过余数来判断是否发生了改变。但是,对于二进制编码的数据,通常是某一位或是某几位数据发生翻转,通过加减来表达错误数据对原数据的影响必然会导致进位或是借位,使得整体的数据发生天差地别的变化。如下图所示。

    其实这也是一种数学技巧吧,出现了一种新的四则运算,被称之为为有限域运算,没有借位和进位。但是这里面的除法也能化简信息,也满足交换律,结合律,分配律等基本定律。在其他一些介绍CRC的文章里也有出现那就是mod 2运算,如下图。

      由上图可知,通过这种运算就可以将发生错误翻转的原数据表示为原始数据和错误数据的和。当然,mod 2 运算就是异或运算,这就在硬件上非常方便处理而不需要专用的除法器,极大地加快了信号传输的速度,这在信息传输领域应用的十分广泛。

     但是对于CRC校验总会提到的多项式表达式是最让人迷惑的,除数1000 1000 0001 0001 表示为G(X)=X^16 + X^12+X^5 + 1,有许多人下意识的就认为X的值是2,因为这不就是二进制数转化为十进制的表达式嘛,这可是先入为主了,在这里X不代表任何数,就是一个未知量,为后面的长除法有个数学符号表示,被除数,余数都是这样的X的多项式表示。纯粹是个数学表示技巧罢了。下图就是有限域运算下的除法。

   至于为什么选择特定的除数,下图是我的理解,但是有点模糊,其实我也不大理解,想要再深入了解的建议去看computer network 这本书,在第三章后面一点吧,哈哈。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值