在数字化通信系统里面,数据的传输应该保持无错误及高精准度,由于数据错误经常导致丢失一些重要的安全数据,因此为了更好地克服这个问题,我们该如何进行报文传送的过程中进行错误检测和纠错,同时我们如何对传输的信息进行有效加密,比如电子签名,值得我们思考。笔者通过这篇文章主要阐明海明Hamming Code校验码, CRC及奇偶码带来哪些好处及之间的区别及让我们进一步思考为什么海明码添加奇偶校验码能成为一种较理想的校验码。
什么是奇偶校验?
奇偶校验是确保两个端点之间通信时数据准确传输,是通过拼接一个位到原始数据创造一个奇偶位数字,这些数据通过链路传输,并且在目的端进行位检测和验证,如果奇偶位是匹配的说明数据是准确的。例如,如果原始数据是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能满足接收端即时纠错,能有效避免等待传播时延。
CRC 冗余校验码是一种基本的数据校验方法,用于检验磁盘数据的准确性,CRC 能检测原数据偶尔发生改变。CRC错误出现主要是由于硬盘毁坏,文件错误配置,磁盘凌乱,程序安装不成功,或在出现媒介斑点时。CRC错误也可能会导致系统错误或数据丢失,因此必须得到解决。
CRC 实际上是在数据信息后面添加几位冗余码构成k+n 数据帧发送出去,接受端接受到数据后重新计算CRC,并且比较计算的结果,如果两者之间的值不相同,则说明出现错误。CRC计算首先给一个16位的寄存器全部预加载数字1,然后进程开始加载报文的后面8位到寄存器的当前内容,仅仅每一个字符串里的8位用于产生CRC,首尾及奇偶位不参与到CRC运算。
例如:
G(x) = 10011 = x ^ 5 + x ^ 1 + 1
D(x) = 10 1010 1010 = x ^ 10 + x ^ 8 + x ^ 6 + x ^ 4 + x ^ 2
R(x) = 0100 (remainder)
常用的三种多项式如下:
CRC-16 = x16 + x15 + x2+ 1 (used in High-level Data Link Control Protocol - HDLC)
CRC-CCITT = x16 + x12 + x5 + 1
CRC-32 = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 (used in Ethernet)
如图:一个解码器的具体实现,在传输数据帧的第1位之前需要初始化解码器,并且在发送完最后一位数据后需要冲刷解码器。具体实现工作原理如下图,首先通过设置开关到B位置进行全部赋0初始化,然后开关移动到A位置并且每一个时钟周期进入一个数据位,在最后一位发送完成后,开关再返回到B位置,并且解码器的内容随之从output 发送出去。这个具体实现叫做冲刷解码器并且需要位移寄存器每一个时钟周期携带1位数据。另外在接受端,这个实现过程正好相反,如果CRC包含了0(初始化赋予为0),说明CRC是有效的,如果不是则说明检测到了一个错误。同时CRC-16能检测到所有的单个错误和二重错误及所有的奇数错误和所有长度小于16位的突发错误。
CRC是特别设计用于保护通信信道可能出现的一些常见错误,可以用于快速及合理保证传递到的数据完整性,但是无法用于保护恶意更改的数据。
在计算机科学和通信学里,海明码Hamming code 是线性纠错码的成员之一,是一种理想的校验码,可以用于检测和纠错发送端到接受端传输数据时发生的错误,可检测2位以上错误及在未检测到无法纠正错误时可以纠正1位错误,是由 R.W. Hamming 于1950年发明的一种数据纠错方式。冗余位是附加的二进制位数,用于添加到传送数据位上确保数据传送期间无数据丢失。冗余位的数量可以使用以下公式计算:
海明校验码Hamming code的结构如下图,整个的数据流长度由报文位数叫做数据位(m)和奇偶位 (n-m)组成,因此整个密码字的长度为[m+(n-m)].
2^r ≥ m + r + 1
where, r = redundant bit, m = data bit
假设数据位是7位,可以如下计算
= 2^4 ≥ 7 + 4 + 1
因此,冗余位的数量是 = 4位
Position | R8 | R4 | R2 | R1 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 1 |
2 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 1 | 1 |
4 | 0 | 1 | 0 | 0 |
5 | 0 | 1 | 0 | 1 |
6 | 0 | 1 | 1 | 0 |
7 | 0 | 1 | 1 | 1 |
8 | 1 | 0 | 0 | 0 |
9 | 1 | 0 | 0 | 1 |
10 | 1 | 0 | 1 | 0 |
海明码Hamming Code是如何进行工作的?
使用海明码进行错误检测和纠正的原理时依据它的海明距离,异或运算也称作模加法,对第二个数据字符串进行模加法,并且对 1s 的数量累加。
计算海明码的关键是使用额外的校验位去鉴别某一个单一的错误。具体如下:
如果它的检测位置上 ‘1’ 的数量为奇数,则设置一个奇偶检测位为1,如果它的检测位置上 ‘0’ 的数量为偶数,则设置一个奇偶检测位为0.例如:
因此我们选择 CB 为 4, 然后这些位添加到原始数据叫做奇偶校验位,最终 Bit Length (7) + Parity Bits (4) = Encrypted Data (11 bits)
因此,我们得到的新的二进制数据是 00110010000
海明码Hamming Code的主要应用:
海明码Hamming Code的优势:
海明码Hamming Code的劣势:
https://en.wikipedia.org/wiki/Parity_bit
https://en.wikipedia.org/wiki/Hamming_code
Cyclic Redundancy Check https://erg.abdn.ac.uk/users/gorry/course/dl-pages/crc.html