差错控制🍉
无论通信系统如何可靠,都不能做到完美无缺。因此,必须考虑怎样发现和纠正信号传输重的差错。通信过程中出现的差错大致可以分为两类:
- 一类是由热噪声引起的随机错误;热噪声:一种由电子的热运动产生的,热噪声时刻存在,具有很宽的频谱,且幅度较小。通信线路的信噪比越高,热噪声引起的差错就越少。这种差错具有随机性,影响个别位,称其为随机性差错。
- 另一类是由冲击噪声引起的突发错误。冲击噪声:是一种外界的电磁干扰,例如打雷闪电时产生的电磁干扰,电焊机引起的电压波动等。冲击噪声持续的时间短而幅度大,往往引起一个位串出错。根据它的特点,称其为突发性差错。
突发性差错影响局部,而随机性差错总是断续存在,影响全局。所以要尽量提高通信设备的信噪比,以满足要求的差错率。此外,要进一步提高传输质量,就需要采用有效的差错控制办法,常见的有:奇偶校验方法、海明码检验方法和循环冗余校验方法(CRC),在介绍他们之前必要的前缀知识点:
- 检错:接收方知道有差错发生,但不知道是怎样的差错,向发送方请求重传。
- 纠错:接收方知道有差错发生,而且知道是怎样差错。
- 差错控制原理:传输k位,加入r位冗余(如何加入取决于使用什么校验算法),接收方收到进行计算比较。
检错码(奇偶校验法)👑
奇偶校验是最常用的、简单的数据验证方法,它通过加入一个“校验位”来检查数据传输中是否出现了错误。在奇偶校验中,将要传输的数据被分成固定长度的几个组(比如每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]的校验位组成的,以此类推...
- ACK1 = (3,5,7,9,11),即(3),(5),(7),(9),(11)号数据位参与[1]位校验位的校验;
- ACK2 = (3,6,7,10,11),即(3),(6),(7),(10),(11)号数据位参与[2]位校验位的校验;
- ACK4 = (5, 6, 7),即(5),(6),(7)号数据位参加[4]位检验位的校验;
- ACK8 = (9, 10, 11),即(9),(10),(11)数据位参与[8]位校验位的校验。
如此,将他们全部按照偶校验计算,最终可以得到:
1 | [0] | 1 | [1] | 0 | 0 | 1 | [0] | 0 | 1 | 1 |
- [2]号校验位,填充的数字是0:因为(3),(6),(7),(10),(11)号数据位中一共有4个1,为偶数。
- [4]号校验位,填充的数字是1:因为(5),(6),(7)号数据位只有(7)号数据位有一个1,所以需要添加一个1使得1的数量为偶数。
- 以此类推...
那么我们如何通过校验位和数据位的关系,进行数据校验呢?假设这个码字传输的过程中(6)号数据位出错,即接收端接受数据变成:
1 | [0] | 1 | [1] | 0 | 1 | 1 | [0] | 0 | 1 | 1 |
当接收端按照同样的规则计算出奇偶位时,发现[2]和[8]号校验位奇偶性正确。
[2]和[4]号校验位奇偶性不对,于是2+4=6即可定位错误发生在(6)号数据位。
CRC循环冗余校验码👑
数据末尾加入CRC循环冗余校验码只可以检错不可以纠错,发生错误只可以自动请求重发,海明码可以自动纠错。广泛用于网络通信和磁盘存储。这个知识点我们使用例题讲解的方法帮助理解:
解题思路:
- 判断校验数位:生成多项式的最高次方是几,校验位就是几位。(答案:4位校验位)
- 补齐数据位后面的0。(答案:10111 0000)
- 提取生成多项式的系数:
- 采用第二步得到的结果,除以第三步得到的结果(异或运算):(10111 0000)异或运算(10011)余数就是CRC校验码,余数不够位,前面补0。
参考资料🍉
2023年录制软考网络工程师 - 基础知识精讲视频 (2-10,2-11)
雷震甲.(2018.01) 《网络工程师教程(第五版)》,50-55.