关于计算机网络Hamming Code海明校验码, CRC及奇偶码校验
Abstract
在数字化通信系统里面,数据的传输应该保持无错误及高精准度,由于数据错误经常导致丢失一些重要的安全数据,因此为了更好地克服这个问题,我们该如何进行报文传送的过程中进行错误检测和纠错,同时我们如何对传输的信息进行有效加密,比如电子签名,值得我们思考。笔者通过这篇文章主要阐明海明Hamming Code校验码, CRC及奇偶码带来哪些好处及之间的区别及让我们进一步思考为什么海明码添加奇偶校验码能成为一种较理想的校验码。
奇偶校验码 parity check code
什么是奇偶校验?
奇偶校验是确保两个端点之间通信时数据准确传输,是通过拼接一个位到原始数据创造一个奇偶位数字,这些数据通过链路传输,并且在目的端进行位检测和验证,如果奇偶位是匹配的说明数据是准确的。例如,如果原始数据是1010001,这里有三个 1s,当使用偶校验时,一位奇偶位添加到数据的最左边使 1s数量变成偶数,此时传输数据变成了11010001。然而,如果使用奇数时,奇偶位变成了 0,即 01010001。如果原始数据包含的 1s数量是偶数,则添加一位 1 奇偶位到最左边使得1s数量变成奇数,如果使用的是奇数奇偶检测,则传输的数据变成了 11101001。接受端与发送端达成一致协议使用一样的奇偶位检测方法,即要么是奇数或偶数。如果这个协议没有配置成功,则无法进行数据通信。一旦数据传送到了接收端,如果此时数据是不正确的,则奇偶值也就变成了错误的,因此表明数据传输的过程中出现了错误。
奇偶检测应用在数据通信,比如作为使用为内存存储设备测试,当数据被读取时进行内存检测。它是一种能检测单个错误的基本方法,但是无法检测,比如由电子噪声干扰而造成的位改变数量,事实上,如果噪声干扰后接收端和发送端将都是错误的,两者都得到了补偿。尽管这些发生的机会是很遥远的,但在一个大型的计算机系统,确保数据的完整性是基本需要,因此一个第三方位可以分配为奇偶检测。
独立磁盘的随机阵列Redundant array of independent disks (RAID) 也使用了一个基于奇偶的保护加强形式,检查横行和纵向奇偶性。为了避免发生错误时数据丢失,所有的驱动将写入了第二组奇偶校验数据。当 RAID 驱动奇偶检测失败了,数据将使用奇偶信息耦合其他磁盘数据进行重建。其余驱动上的位将会累加,当增加到一个奇数数字时,此时失败驱动上的纠错信息将变成了偶数,反之亦然。 如下是两种形式奇偶位:
-
偶校验位
如果一个给定的二进制数据上的 1s 数量加起来是奇数时,则奇偶位的值设置为 1,使最终总共出现的 1s 数量加起来时一个偶数。如果在一个给定的二进制数据上 1s 数量加起来是偶数时,则奇偶位的值设置为 0。 -
奇校验位
如果一个给定的二进制数据上的 1s 数量加起来是偶数时,则奇偶位的值设置为 1,使最终总共出现的 1s 数量加起来时一个奇数。如果在一个给定的二进制数据上 1s 数量加起来是奇数时,则奇偶位的值设置为 0。
什么是2D矩阵奇偶校验?
假设一个单一的位错误出现在原始数据 d 位上,利用二维奇偶校验方案,出现错误的位将呈现在纵向和横向交叉位置上,因此接受端不仅仅检测到原始数据出现了1 位错误,而且能依据二维矩阵准确定位到出现错误的位置,如下图位错误值位 0 出现在(1,1)位置。
接收端能同时检测和纠错叫做forward error correction (FEC)正向纠错,这个技术通常使用在音频存储和播放设备比如音频CD,FEC正向纠错可以有效减少重传数据。同时,最重要的是FEC能满足接收端即时纠错,能有效避免等待传播时延。