原贴地址:https://blog.csdn.net/djl806943371/article/details/88770493
错误探查三种方式:Checksum(检验和)、Cyclic Redundancy Codes(循环冗余CRC)、Message Authentication Codes(消息身份验证MAC)
大家可以首先做下这个课程中的quiz,如果你的答案跟图中是一致的,说明可能你真的是理解了,如果有一点不一致,说明你对某种错误探查方式有盲点,那么你可以好好看一下这篇文章:
Checksum(校验和):
应用举例:
TCP、IP、UDP使用反码算法计算校验和。传输层、网络层。
IP Checksum实现方式:
首先将校验和位置零,将packet中所有的16-bits以16进制相加,每当要进位时(大于65535),则-65536+1,即进位到最后一位。所有bit加完之后将结果取反作为校验和。这意味着如果把整个包包含校验位的所有bit相加将得到0xffff。
存在一个边界情况,当不包含校验和的所有位相加为0xffff时,不进行取反,因为0代表没有校验位。
优缺点:
非常快,即使是在软件层面进行计算成本都非常低,早期都是在软件层面实现的,因此非常有帮助;
不是特别强大,能绝对保证检验出的错误是1bit发生变化。(关于这点我有以下思考:为什么只有1bit发生变化才能检测到,难道不是只要有奇数位发生变化就会检测到吗。后来我想通了,因为它是以16bit为一个单位进行累加的,而不是每一位累加,因此奇数位发生变化也有可能使校验和不变,比如前16bit:0x0000,后16bit:0x0010,出错后变为前16bit:0x0001,后16bit:0x0001,此时一共三位出错,但是校验和是不变的。因此实际能稳定检验出的错误应该是在同一个16bit中任意1-16bit出现错误都能检测到,但是一旦是跨16bit单位的将不能保证。)
Cyclic Redundancy Codes(循环冗余CRC):
应用举例:
USB、BLUETOOTH使用16bit CRC。链路层常用。
实现方式:
本部分摘自https://blog.csdn.net/snow_5288/article/details/73472398。
CRC码由两部分组成,前一部分是k+1个比特的待发送信息(固定不变),后一部分是r个比特的冗余码。
计算过程中主要用到两个多项式:f(x) 和 G(x)。 f(x) 是一个k阶多项式,其系数是待发送的k+1个比特序列; G(x) 是一个r阶的生成多项式,由发收双方预先约定。CRC校验举例 :
设实际要发送的信息序列为1010001101(10个比特,k = 9),则以它们作为f(x) 的系数,得到对应的9阶多项式为:
再假设发收双方预先预订了一个5阶(r = 5)的生成多项式:
则其系数序列为110101。
CRC码的产生方法如下:
- 生成 r 个比特的冗余码:用模2除法进行 x^r f(x) / G(X) 运算,得余数R(x) ,其系数即是冗余码。
其中的余数01110即为冗余码,对应的余式:
注意:模2除法在做减法时不借位,相当于在进行异或运算。
- 得到带CRC校验的发送序列:用模2减法进行 x^5 f(x) - R(x) 运算得到带CRC校验的发送序列,即x^5 f(x) - R(x) = 101000110101110。形式上看,就是在原信息序列后面附加上冗余码。在接收方,用同样的生成多项式G(x) 除所收到的序列。若余数为0,则表示传输无差错,否则说明传输过程出现差错。若收到的序列是101000110101110,用它除以
(即110101),因为余数为0,所以收到的序列无差错。
优缺点:
计算成本比检验和高,但是在如今是很容易实现的,在硬件上很容易实现;
c bit长的CRC,可以检测到任意奇数位错误、两位错误、长度小于等于c位的突发错,比校验和更强大。
Message Authentication Codes(消息身份验证MAC):
应用举例:
Transfer Layer Security(TLS)传输层,主要保证数据的安全。
实现方式:
利用密码学的知识,数据交换双方均持有一个事先约定好的秘密s,则MAC码计算公式:,即c由消息内容及秘密s耦合计算得出。其中秘密s是一组随机产生的bits,因此很难被破解,因此如果不是事先知道这个秘密,是很难得到一条消息的c的,并且即使知道了c,也很难制造另一条消息的c是相同的。因此如果一条来源不明的消息M+c都能通过验证,那么说明对方很大概率已经破解了这个秘密。并且,如果消息中某一位发生了变化,那么计算出来的c中每一位的变化情况是随机的,否则将很容易被破解。
优缺点:
对于检测恶意修改非常有效,但对error效果不是很好;
对于c bit长的MAC,当1bit发生反转时,它有概率MAC值不变。
总结:
看到这里再回头看看开头的quiz是否能做对了吧!其实从quiz结果可以看到,每一种侦测方式都不能保证百分百检测出某些错误,但是各种错误检测方式组合起来,除了提到的几种,应用层一般也会有自己的检测方式,总体来看一个数据包出错而不被检测出来的概率是很小的。这就足够了。