无论通信系统如何可靠,都不能做到完美无缺。因此,必须考虑怎样发现和纠正信号传输重的差错。通信过程中出现的差错大致可以分为两类:
突发性差错影响局部,而随机性差错总是断续存在,影响全局。所以要尽量提高通信设备的信噪比,以满足要求的差错率。此外,要进一步提高传输质量,就需要采用有效的差错控制办法,常见的有:奇偶校验方法、海明码检验方法和循环冗余校验方法(CRC),在介绍他们之前必要的前缀知识点:
奇偶校验是最常用的、简单的数据验证方法,它通过加入一个“校验位”来检查数据传输中是否出现了错误。在奇偶校验中,将要传输的数据被分成固定长度的几个组(比如每8位分为一组),在每组的末尾增加一个“奇偶校验位”,使得每组中的1位数的个数为奇数或偶数。在接收端,根据接收到的数据,在每组的数据中计算校验位的奇偶性,如果发现出现了不一致的情况,则说明数据传输出现了错误。例如:在7位ASCll码后增加一位,使码字中1的个数变成奇数(奇校验:1011 010 + [1])或偶数(偶校验:1011 010 + [0])。
缺点:只能对付少量的随机性错误。
为了能检验突发性的位串出错,可以使用校验和的办法。这种方法把数据块中的每个字节当作一个二进制整数。在发送端发送过程中按模256相加。数据块发送完成后,把得到的和作为校验字节再发送出去。接收端在接受过程中对接受的数据块进行同样的加法运算,发送端数据块加完后用自己得到的校验和与接收端的校验和对比,从而发现是否出错。
有一种简单的实现方法:
在校验字节发送前,对累加器中的数取2的补码。这样,如果不出错,接收端在加完整个数据块以及校验和后累加器中是0。这种方法的好处是由于进位的关系,一个错误可以影响到更高位,从而使出错位对校验字节的影响扩大了。可以粗略的认为,随机的突发性错误对校验和的影响也是随机的。出现突发错误而得到正确的校验字节概率是1/256,于是就有255:1的机会能检查出任何错误。
海明码不仅可以检错还可以纠错,想要理解海明码,必备的知识点:
海明距离:一个码字要变成另一个码字时必须改变的最小位数,另一种解释:两个码字之间不用的比特数。把1011 01 00 变成 1011 01 11,故需要把最后两位的00变成11,海明距离则为2。
海明码原理:在数据中间加入几个校验码,码距均匀拉大,当某一位出错,会引起几个校验位的值发生变化。
海明不等式:校验码个数为k,可以表示2**k个信息,1个信息用来表示“没有错误”,其余2**k-1个表示数据中存在错误,如果满足:
(m为信息位,m+k为编码后的数总长度)
则在理论上k个校验码就可以判断是哪一位出现了问题。
第2**i(i=0,1,2,3...)位是校验位,其余位为数据位,用于存放数据。
比如一个数据:
([]:校验位,下标:校验位/数据位所处数据的第几位)
数据位是由校验位生成的,原理如下:
从下标为3位数据位开始,(3)=[2]+[1],(5)=[4]+[1],(6)=[4]+[2],(7)=[4]+[2]+[1],(9)=[8]+[1],(10)=[8]+[2],(11)=[8]+[2]+[1]。
可以看出:下标为(6)的数据位是由下标为[4]和[2]的校验位+1组成的,同样的下标为(7)的数据位是由下标为[4]和[2]的校验位组成的,以此类推...
如此,将他们全部按照偶校验计算,最终可以得到:
1 | [0] | 1 | [1] | 0 | 0 | 1 | [0] | 0 | 1 | 1 |
那么我们如何通过校验位和数据位的关系,进行数据校验呢?假设这个码字传输的过程中(6)号数据位出错,即接收端接受数据变成:
1 | [0] | 1 | [1] | 0 | 1 | 1 | [0] | 0 | 1 | 1 |
当接收端按照同样的规则计算出奇偶位时,发现[2]和[8]号校验位奇偶性正确。
[2]和[4]号校验位奇偶性不对,于是2+4=6即可定位错误发生在(6)号数据位。
数据末尾加入CRC循环冗余校验码只可以检错不可以纠错,发生错误只可以自动请求重发,海明码可以自动纠错。广泛用于网络通信和磁盘存储。这个知识点我们使用例题讲解的方法帮助理解:
解题思路:
2023年录制软考网络工程师 - 基础知识精讲视频 (2-10,2-11)
雷震甲.(2018.01) 《网络工程师教程(第五版)》,50-55.