刚刚学习了关于数据链路层的差错检测这一章节,在这里对两种常用纠错码和检错码原理进行总结。
纠错码
1. 海明码
首先先了解一下海明码的定义。
- 海明距离
两个码字之间不同的位数。
即异或之后1的个数。
码字:一个包含数据位和校验位的数据结构
- 全部海明距离:
对于一个合法码字列表,在这个列表中具有最小海明距离的码字,此距离即为整个编码的海明距离。
合法码字:即在编码方案好的列表中的码字
非法码字:不在合法码字列表中的码字
- 海明码意义:
①:对于两个码字,若其海明距离为d,则需要d个1位错误才能够将一个码字转化为另一个码字。
举个例子,对于下面两个码字:
11111111 00001111
它们的海明距离为4,若第一个码字只发生3位错误,那么它无论如何也无法变成00001111,只有发生4位错误才会变成00001111(也就是前4位均发生错误)。
②:为了检测d个错误,必须要一个距离为d+1的编码方案
根据①,可知只有发生d位错误才能够从一个合法码字到另外一个合法码字。
③:为了纠正d个错误,必须要一个距离为2d+1(一定为奇数)的编码方案。
什么意思,举个例子,对于下面的一个编码方案:
1111111111 0000011111 1111100000 0000000000
这个编码方案海明距离为5。(具体怎么算,请你试一下)
假设1111111111发生了3位错误变为 0001111111,此时计算这个给码字与所有合法码字的海明距离
码字 | 海明距离 |
---|---|
1111100000 | 8 |
0000011111 | 2 |
0000000000 | 7 |
1111111111 | 3 |
则0001111111有最大概率是由0000011111发生错误转变而来的,因为他俩之间的海明距离最小,但实际上我们知道它是从1111111111转变而来的。
事实上,要纠正错误,要计算该码字与合法码字列表中所有码字的海明距离,而距离为2d+1的编码方案中,各个合法码字离得足够远,因此即使发生d位错误,也还是离它原来的合法码字最近。
因此,我们需要一个编码方案,使得编码错误之后,其仍然离自己原来的合法码字距离最近。
2. 纠正一位错误的海明码
假设码字有m个数据位和r个校验位,要能够纠正单个错误,应该有如下关系:
m
+
r
+
1
≤
2
r
(
1
)
\begin{array}{l}m+r+1\leq2^r\\\end{array} \qquad (1)
m+r+1≤2r(1)
纠正一位错误的海明码步骤如下:
Ⅰ、将要发送的码字进行编号,从1~n,其中,编号为
2
n
2^n
2n的位为校验位,其余位为数据位。
Ⅱ、每一个位以其二进制展开式写出。
Ⅲ、每一个校验位都有属于它自己的校验集合:该集合包含了每一个数据位的展开式包含该校验位编号的数据位编号。
例如:11=1+2+8,因此校验位1,2,8的校验集合中都含有11
特别的:所有的奇数位二进制展开都包含1,所以1的校验集合为所有奇数位
Ⅳ、对于某个位出错,只需要检查校验集合中包含了该位的那些校验位。
Ⅴ、此时海明码为海明距离只有一位的编码,这里可以采用奇偶校验码。
偶校验:
当1的个数为偶数个时,校验位为0;
奇校验:
当1的个数为奇数个时,校验位为0;
如果是单纯的奇偶校验,则校验码一般加在编码的末尾,附加到数据位中。
如:11111111–>发送的码字:111111110(偶校验)111111111(奇校验)
例如:
下例采用奇校验。
这里选用数据位为7,校验位为4,满足(1)式
校验位 | 校验集合(不包括校验位自己) | 对应位数据 | 校验和(奇) |
---|---|---|---|
1 | 3,5,7,9,11 | 1,0,0,0,1 | 1 |
2 | 3,6,7,10,11 | 1,0,0,0,1 | 1 |
4 | 5,6,7 | 0,0,0 | 1 |
8 | 9,10,11 | 0,0,1 | 0 |
Ⅵ、发送方计算初始校验位
码字序号 | r1 | r2 | m3 | r4 | m5 | m6 | m7 | r8 | m9 | m10 | m11 |
---|---|---|---|---|---|---|---|---|---|---|---|
待发送的码字 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | ||||
对应的校验码 | 1 | 1 | 1 | 0 | |||||||
海明码 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
接收到的码字(发生1位错误) | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
重新计算校验位 | 1 | 0 | 1 | 0 |
Ⅶ、接收方再次计算校验位
校验位 | 校验集合(包括从发送方收到的校验位) | 对应位数据 | 校验和(奇) |
---|---|---|---|
1 | 1,3,5,7,9,11 | 1,1,0,1,0,1 | 1 |
2 | 2,3,6,7,10,11 | 1,1,0,0,0,1 | 0 |
4 | 4,5,6,7 | 1,0,1,0 | 1 |
8 | 8,9,10,11 | 0,0,0,1 | 0 |
Ⅷ、错误纠正。
由得到的各个校验位可以获得校验结果1010,对于奇(偶)校验来说,校验结果为0是正确,所以,发生错误的是1和4,因此根据校验结果可以判断1+4=5,第5位发生了错误。于是将其取反码,可以纠正这一位错误。
在计算机中可以使用一个差错计数器(count)计数,对每一位校验码重新计算之后如果结果不是0,则差错计数器count+=检验码编号,最后count的值即为出错的位编号。
这里利用了奇偶校验的特性,如果是没发生错误的,应该和之前的奇偶校验码进行异或运算后结果为0(也称为模2运算)
在这里,使用奇偶校验的区别仅仅在于1的个数的奇偶性。
检错码
3、循环冗余校验码(CRC)/多项式编码
这种方法是将01位串视为一个多项式的系数。
计算CRC的步骤:
Ⅰ、在发送之前,发送方和接收方约定一个生成多项式
G
(
x
)
G(x)
G(x)。该多项式必须保证有最高位和最低位的系数为1。最高位阶为r(即该多项式编码带有r位校验位)注意:区别于
G
(
x
)
G(x)
G(x)对应的位串有r+1位。
Ⅱ、对于一个含有m位数据位的帧,(m>r),其对应一个m阶多项式
M
(
x
)
M(x)
M(x),在该帧的低位端加上r个0,即该帧现在包含m+r位,此时对应的多项式可以写为
x
r
M
(
x
)
x^rM(x)
xrM(x)(可以理解为阶数为m+r的多项式每一项都提取公因式
x
r
x^r
xr)
Ⅲ、利用模2除法:用
x
r
M
(
x
)
x^rM(x)
xrM(x)对应的位串除以
G
(
x
)
G(x)
G(x)的位串。
Ⅳ、利用模2减法:用
x
r
M
(
x
)
x^rM(x)
xrM(x)对应的位串减去Ⅲ除法中的余数(对应多项式小于r阶)。得到结果记为
T
(
x
)
T(x)
T(x),即将被传输的带校验和的帧。得到的
T
(
x
)
T(x)
T(x)可被
G
(
x
)
G(x)
G(x)除尽。
模2运算
模2加,减:
每一位独立的加法和减法。等价于对每一位做异或运算。
模2乘法:
每一位独立进行算术乘法
模2除法: 步骤如下
a)被除数位数大于除数位数或者部分余数位数与除数一样多,且最高位为1时皆可商1;否则商0,且此时被除数就是余数。
b)直到余数的位数小于除数位数,除法停止。
c)在模2除法中每一位计算都使用模2减法
模2运算例子:
G
(
x
)
=
x
4
+
x
+
1
G(x)=x^4+x+1
G(x)=x4+x+1 对应位串:10011
M
(
x
)
M(x)
M(x) 对应位串:101011111
根据这个计算可得到
T
(
x
)
T(x)
T(x)对应的位串11010111110010即为将要传出的帧。
Ⅴ、检错能力:
对于接收方收到多项式,可以拆分为
E
(
x
)
+
T
(
x
)
E(x)+T(x)
E(x)+T(x),接收方计算
(
E
(
x
)
+
T
(
x
)
)
/
G
(
x
)
(E(x)+T(x))/G(x)
(E(x)+T(x))/G(x),因为
T
(
x
)
/
G
(
x
)
T(x)/G(x)
T(x)/G(x)是整数,所以这个结果取决于
E
(
x
)
/
G
(
x
)
E(x)/G(x)
E(x)/G(x),如果可以整除,则没有发生错误,但是如果错误发生在
G
(
x
)
G(x)
G(x),也可以整出,但是错误将无法被检测出来。
如果发生在
E
(
x
)
E(x)
E(x),则对于是否整除(是否能够检测出错误),现讨论如下:
一位错误:
E
(
x
)
E(x)
E(x)发生了一位错误,为
x
i
x^i
xi,那么
E
(
x
)
E(x)
E(x)则不会整除
G
(
x
)
G(x)
G(x)。所以可以检测出所有的一位错误。
两个独立的一位错误:
E
(
x
)
E(x)
E(x)=
x
i
+
x
j
x^i+x^j
xi+xj(
i
>
j
i>j
i>j)
→
\rightarrow
→
E
(
x
)
=
x
j
(
x
i
−
j
+
1
)
E(x)=x^j(x^{i-j} +1)
E(x)=xj(xi−j+1),如果
G
(
x
)
G(x)
G(x)不能除尽
x
i
−
j
+
1
x^{i-j} +1
xi−j+1,(
i
−
j
=
1
,
2
,
⋯
,
k
i-j=1,2,\cdots,k
i−j=1,2,⋯,k)(k为最大帧长),则可以检测到该错误。
奇数个位发生错误:
则
E
(
x
)
E(x)
E(x)包含奇数项,而在模2系统中,所有奇数项多项式都不包含因子
x
+
1
x+1
x+1,因此,如果
G
(
x
)
G(x)
G(x)包含因子
x
+
1
x+1
x+1,则可以检测所有奇数位错误。
带有r个校验位的多项式编码可以检测到所有长度小于等于r位(小于r位)的突发错误
如果突发错误为k位:
对应的
E
(
x
)
E(x)
E(x)可以用
x
i
(
x
k
−
1
+
x
k
−
2
+
.
.
.
+
1
)
x^i(x^{k-1}+x^{k-2}+...+1)
xi(xk−1+xk−2+...+1),i取决于突发错误的位置离帧的最右端的距离有多远。如果
k
−
1
<
r
k-1<r
k−1<r,则
G
(
x
)
G(x)
G(x)不会除尽
E
(
x
)
E(x)
E(x)。
如果突发错误为
r
+
1
r+1
r+1位:则其最高位和最低位系数为1,当且仅当其每一位与
G
(
x
)
G(x)
G(x)一样才可整除。是否能够整除取决于中间的
r
−
1
r-1
r−1位。
若每一位错误等概率,这样一个不正确的帧被作为正确帧接收的概率为:
1
/
2
r
−
1
1/2^{r-1}
1/2r−1
同样的,对于一个长度大于r+1位的错误发生时,当有r位校验位的编码,其被当为正确的帧被接收的概率为
1
/
2
r
1/2^r
1/2r
在IEEE 802中被广泛使用的是r=32的CRC。