实际通信链路都是不理想的,比特在传输过程中可能会产生差错,1可能会变成0,0也可能会变成1,这就是比特差错。比特差错是传输差错中的一种,这里只讨论比特差错
差错控制技术主要有两种:请求重传ARQ和向前纠错FEC(检错编码和纠错编码)。在ARQ方式中,接收端检测到差错的时候,就设法通知发送端重发,直到接收到正确的信息为止。在FEC方式中,接收端不但能够发现差错,而且能够确定比特串的错误位置,从而加以纠正。
检错编码
都采用冗余编码技术,其核心思想是在有效数据被发送钱,先按某种关系附加的一定冗余位,构成一个符合某一规则的码字后再发送。当要发送的有效数据变化的时候,相应的冗余位也会发生相应的变化。常见的检错编码是奇偶校验码和循环冗余码。
奇偶校验码
一种最基本的校验码。由n-1位信息元素和1位校验元组合,如果是奇校验码,那么再附加一个校验元后,码长位n的码字中"1"的个数位为技术;如果是偶校验码,那么再附加一个校验元后,码长为n的码字中"1"的个数为偶数。它只能检测奇数位的出错情况,但不知道哪些位错了,也不能发现偶数位的出错情况。
CRC循环冗余码
又称为多项式码。给定一个m bit的帧或报文,发送器生成一个r bit的序列,称为帧检验序列(FCS)。这样所形成的帧将由m+r比特组成。发送方和接收方事先商定一个多项式G(x),最高位和最低位必须为1,让这个带检验码的帧刚好能被事先的多项式G(x)整除。接收方用相同的多项式去除收到的帧,如果没有余数,那么认为没有差错。
假设一个帧有m位,其对应的多项式是M(x),则计算冗余码的步骤如下:
- 加0,假设G(x)的阶为r,那么在帧的低位端加上r个0
- 模2除。利用模2除法,用G(x)对应的数据串去除(1)中计算出的数据串,得到的余数即为冗余码(一共r位,前面的0不可省略)
多项式以2为模运算。按照模2运算规则,加法不进位,减法不借位,做异或操作。
通过循环冗余码(CRC)的检错技术,数据链路层做到了对帧的无差错的接收。也就是说,凡是接收端数据链路层接收到的帧,我们都认为这些帧在传输过程中没有产生差错;而接收端丢弃的帧虽然也收到了,但最终因为有差错而被丢弃,也就是未被接收。
纠错编码
海明码
实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到几个奇偶校验组中。当其中一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错位,还能指出错位的位置,为自动纠错提供依据。
以数据码0101为例讲述海明码的编码原理和过程:
(1)确定海明码的位数
设n为有效信息的位数,k为校验位的位数,信息位n和校验位k应满足
n
+
k
<
=
2
k
−
1
(
若要检测两位错,则需要再增加
1
位信息位,也就是
k
+
1
位
)
n+k<=2^k-1 (若要检测两位错,则需要再增加1位信息位,也就是k+1位)
n+k<=2k−1(若要检测两位错,则需要再增加1位信息位,也就是k+1位)
海明码位数位n+k=7<=2³-1成立,则n、k有效。设信息位为D₁D₂D₃D₄(1010)共4位。校验位为P₃P₂P₁,共3位,对应的海明码为:H₇H₆H₅H₄H₃H₂H₁
(2)确定校验位的分布
把校验码放在海明码的2n的位置,按序把空填满。
(3)分组以形成校验关系
每个数据位用多个校验位进行校验,但要满足条件:被校验数据位的海明位号等于校验该数据位的各校验位海明位号之和。另外,校验位不需要再被校验。注意,这里说的位号是H的位号。
也就是说,D₁由P₁P₂校验;D₂由P₃P₁校验;D₃由P₃P₂校验;D₄由P₃P₂P₁校验
(4)校验位取值
校验位 P i P_{i} Pi的值为第 i i i组所有位求异或。根据(3)的分组可以知道:
P 1 = D 1 ⊕ D 2 ⊕ D 4 = 0 ⊕ 1 ⊕ 1 = 0 P_{1}=D_{1}⊕D_{2}⊕D_{4}=0⊕1⊕1=0 P1=D1⊕D2⊕D4=0⊕1⊕1=0
P 2 = D 1 ⊕ D 3 ⊕ D 4 = 0 ⊕ 0 ⊕ 1 = 1 P_{2}=D_{1}⊕D_{3}⊕D_{4}=0⊕0⊕1=1 P2=D1⊕D3⊕D4=0⊕0⊕1=1
P 3 = D 2 ⊕ D 3 ⊕ D 4 = 1 ⊕ 0 ⊕ 1 = 0 P_{3}=D_{2}⊕D_{3}⊕D_{4}=1⊕0⊕1=0 P3=D2⊕D3⊕D4=1⊕0⊕1=0
所以,1010对应的海明码位1010010(下划线是校验位,其他为信息位)
(5)海明码的校验原理
每个校验组分别利用校验位和参形成该校验位的信息位进行奇偶校验检查,构成k个校验方程:
S 1 = P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 S_{1}=P_{1}⊕D_{1}⊕D_{2}⊕D_{4} S1=P1⊕D1⊕D2⊕D4
S 2 = P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 S_{2}=P_{2}⊕D_{1}⊕D_{3}⊕D_{4} S2=P2⊕D1⊕D3⊕D4
S 3 = P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 S_{3}=P_{3}⊕D_{2}⊕D_{3}⊕D_{4} S3=P3⊕D2⊕D3⊕D4
将得到的结果按照 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1(从高到低)排列,会得到一串01比特数,将其转换为十进制数,如果结果为0则表示没有错误,如果为1则表示第一位(这个第一位指的是H中的第一位)出错。直接将该位取反就达到了纠错的目的。