文章目录
概述
现实环境中,数据的传输很有可能受到干扰而出现错误,为了确保数据传递的正确,就需要有差错控制技术。要实现差错控制,就要具备两种能力,其一是发现错误,其二是纠正错误。
在数据链路层里常用的数据校验方法有奇偶校验码(PCC, Parity Check Code)和循环冗余校验(CRC, Cyclic Redundancy Check),这些都统称为检错码(Error-detecting code)。
而差错纠正方面针对不同类型的传输有不同实现,如字符的异步传输一般采用反馈检测法,即接收一帧往源发回一帧,发送端如果判断出错则重发一帧,对应的还有自动重发法等等。
也有一些具有纠错功能的编码,它们又称为纠错码(Error-Correcting Code)或前向纠错码(Forward Error Correction),**海明码(Hamming Code)**就是纠错码。
下面详细看看各种差错控制方法。
检错码(Error-detecting Code)
奇偶校验码(Parity Check Code)
奇偶校验码是非常广泛使用的一种检错方法,它具有实现简单的优势。它有效用于检测单个错误,基本思想就是在原信息码最后加一位校验位,使得整个编码始终为奇数位或者偶数位(一般为编码中1的个数),这就是奇校验和偶校验。
从这个原理也可以看出来,奇偶校验无法判断大于一个的错误,所以就校验码一般用于错误率低的环境。
假设要传输7位二进制码1011010,要做偶校验,那么其最终传输的编码就是10110100。如果目的地收到的编码最终不为偶数,那么就知道里面一定出现了错误,注意,不能说最终编码是偶数就一定没有错误,这也就是奇偶校验的局限所在。
循环冗余校验(Cyclic Redundancy Check)
再考虑CRC之前得先简单了解一下模2运算和多项式表示二进制码串。
模2运算
模2运算和普通算术运算最主要的不同在于模2无进位,也无借位。
加法规则为:1+1=0、1+0=1、0+1=1、0+0=0
减法规则为:1-1=0、1-0=1、0-1=1、0-0=0
很容易可以看出来实际上就是异或运算。
但乘法和一般运算一致,不同的是,多位数乘法中间结果相加用的是模2加法。
乘法和除法示例如下:
图片来自《深入理解计算机网络》
码多项式(多项方式)
其表达方式和二进制转十进制是类似的,如有二进制串10011100,那么它的码多项式表述如下:
x
7
+
x
4
+
x
3
+
x
2
x^7+x^4+x^3+x^2
x7+x4+x3+x2
注意发现它与二进制转十进制的规律,不再赘述。
CRC流程
CRC的原理看起来有点复杂,但实际上就是在待发送数据后面加一段校验码,接收方通过模2除法来发现是否出现了位变动(因为基于模2运算的特性,任一位变动都会影响结果),它的具体实现有如下步骤:
- 选择一个用于进行模2除法的除数供接收方使用,一般使用码多项式表达,所以CRC又称多项式编码法。
- 设选定除数的二进制位数为k,待发送的数据帧位数为m。在m后面加上k-1位0为新的帧,然后将该新帧模2除选定的除数,所得的余数就是该帧的CRC校验码,又称FCS(帧校验序列)。要注意的是,余数的位数也一定为k-1位,0也不能忽略。
- 将该FCS附加在原数据帧后面,构建成一个新帧发送到接收端。
- 接收端将附加了FCS的帧模2除之前定出的除数,无余数则表明无差错。
从该流程就可以看出,CRC的关键有二:预先确定双方用于CRC的除数、通过原始帧与除数计算出FCS。其中前者可以随机选择,也可以使用国际上通行的标准。但要注意,除数的最高位和最低位必须为1。
国际上的标准有如:
IBM的SDLC规程使用CRC-16,它规定除数为:
x
16
+
x
15
+
x
2
+
1
它
所
对
应
的
二
进
制
串
为
:
11000000000000101
x^{16}+x^{15}+x^2+1 \\它所对应的二进制串为:11000000000000101
x16+x15+x2+1它所对应的二进制串为:11000000000000101
ISO的HDLC、ITU的SDLC、X.25等等规程中使用CCITT-CRC-16,它规定除数为:
x
16
+
x
15
+
x
5
+
1
它
所
对
应
的
二
进
制
串
为
:
11000000000100001
x^{16}+x^{15}+x^5+1 \\ 它所对应的二进制串为:11000000000100001
x16+x15+x5+1它所对应的二进制串为:11000000000100001
计算示例
设CRC除数码多项式(又叫生成多项式)为 G ( x ) = x 4 + x 3 + 1 G(x) = x^4+x^3+1 G(x)=x4+x3+1,要求出二进制序列10110011的FCS,下面是计算过程:
- 生成多项式转换为二进制串:11001
- 给原数据帧加上k-1个0,这里生成多项式为5位,因此加4位0,得到数据帧10110011 0000。
- 对得到的数据帧使用模2除法除以生成多项式,得到余数0100(注意,余数一定是k-1位,0也不能忽略)
- 用第3步的结果和原数据帧组合成新的数据帧10110011 0100发送给接收方。
- 接收到数据帧后用模2除法除以选定的生成多项式,如余数为0则无差错,否则则有差错。
纠错(Error-correcting)
纠错有编码纠错以及方法纠错两种,编码纠错常见的有海明码,这类有纠错能力的编码又叫做纠错码(Error-correcting Code)。纠错方法有反馈检测法等。下面详细讲讲这两种方式。
反馈检测法
这是一种实施容易,但不常用的差错控制法,这种方法的信道利用率低。它的基本原理是,接收端收到的所有内容都回传至发送端,如果发送端收到后发现错误则重传错误的帧。
这种基础的方式也会遇到问题,如整个帧全都丢失了,这样发送方自然就无法接收到任何反馈,因为对方根本没有收到。为了避免这种情况,通常引入一个计时器来为每个帧限定反馈信息的时间,如果超时仍然没有收到,则认为传输出了差错,直接重传该帧。有时候因为网络延迟导致接收端可能收到多次同一数据帧,为了防止这种现象,数据链路层有一种帧序列号的方法来对每个帧编号,接收端可以通过判断帧编号来甄别这种现象。
海明码(Hamming Code)
海明码是一个有多个校验位,具有检测并纠正一位错误的纠错码,因为它只能纠正一位错误,所以一般只能用于信道条件比较好的环境中。
它的基本思想是将有效信息按规律分组,使的校验码不仅可以发现错误,还能知道错误发生的位,最终将错误的位取反即纠正成功。
基本上是通过对不一样的分组进行奇偶校验,最终比对多组的结果即可锁定出错的位,因为这个原理导致海明码只能发现并纠错一位。
它的原理有点类似于一个数学游戏叫做国王与毒酒。
细节比较繁琐,在这篇文章中详细说明了:计算机系统基础知识_校验码。