数据链路层差错控制——奇偶校验码、循环冗余码和汉明码(海明码)

差错控制

传输中的差错由噪声引起。一类称为热噪声,是信道所固有的、持续的,并且随机的。另一类是外界环境造成的短暂的冲击噪声。热噪声可以通过提升信噪比降低干扰。而后者不可以通过提升信号幅度来避免干扰,带来差错

通常采用编码技术来进行差错控制,主要有两类:自动重传请求(ARQ)和前向控制(FEC)。在ARQ方式中,接收端只进检错,而不进行纠错。而在FEC方式中,不仅进行检错,还可以检测出二进制数码错误位置,并加以纠正。常见的检错编码有奇偶校验码和循环冗余校验码海明码是常用的纠错编码

奇偶校验码

包含奇校验偶校验。由n-1位信息元和1位校验元组成,属于冗余编码技术。如果是奇校验,在添加一个校验码之后,码长为n的码字中1的个数为奇数个。在偶校验中,添加1位校验码之后,码字中1的个数为偶数个。

循环冗余校验码(CRC)

又称多项式码。将一个由二进制数位串组成的代码和一个仅有0和1两个系数的多项式建立一一对应关系。例如:1110011有7位,其对应的多项式为 X 6 + X 5 + X 4 + X + 1 X^6+X^5+X^4+X+1 X6+X5+X4+X+1,而多项式 X 5 + X 4 + X 2 + X X^5+X^4+X^2+X X5+X4+X2+X对应的二进制码串为110110.

CRC检错过程为:发送端发送一个m bit的帧,并生成一个r bit的序列,称为帧检验序列。发送方和接受方事先约定一个多项式 G ( x ) G(x) G(x),使这个带检验码的帧正好被 G ( x ) G(x) G(x)整除。从而进行检验。

帧检验序列的计算过程为:假设一帧有m位,其对应的多项式为 M ( x ) M(x) M(x)

  1. 加0操作。假设约定好的多项式 G ( x ) G(x) G(x)的阶为 r r r,在待发送的m帧后面加上 r r r个0.
  2. 模2除法操作。利用模2除法,用 G ( x ) G(x) G(x)去除(1)中得到的数据串,得到的余数即为帧检验序列,共 r r r位,前面的0不可省略。(PS:模2运算加减法满足异或操作,乘除法类似二进制运算)

帧检验序列(冗余码)的计算举例:设 G ( x ) = 1101 G(x)=1101 G(x)=1101(即 r = 3 r=3 r=3),待传送数据 M = 101001 M=101001 M=101001(即 m = 6 m=6 m=6),经模2除法运算后的结果是:商 Q = 110101 Q=110101 Q=110101(没有实际用途),余数为 R = 001 R=001 R=001。所以发送出去的数据为101001001.
冗余码的运算过程

海明码

海明码可以发现双比特错误,但只能纠正单比特错误。海明码将码字内的位从左至右依次编号,编号为2的幂的位为校验位,其余位填入要传输的m位数据。将编号为k的数据位改写成2的幂的和,例如11=1+2+8,29=1+4+8+16。编号为k的数据仅由扩展式中所示编号的位检测。

m个信息位插入 r r r个校验位组成m+r位码字,他们必须满足的关系是 2 r ≥ m + r + 1 2^{r} \geq m+r+1 2rm+r+1.以典型的4位数据编码为例,海明码加入3个校验位。
数据位:1位 2位 3位 4位 5位 6位 7位
代码: P 1 P 2 D 1 P 3 D 2 D 3 D 4 P_{1} P_{2} D_{1} P_{3} D_{2} D_{3} D_{4} P1P2D1P3D2D3D4
其中 P P P为校验位, D D D为数据位。

以数据码1101为例。此时 D 1 = 1 , D 2 = 1 , D 3 = 0 , D 4 = 1 D_{1}=1,D_{2}=1,D_{3}=0,D_{4}=1 D1=1,D2=1,D3=0,D4=1。对于7位码字的编号为(4位数据,3位检验):1位=1,2位=2,3位=1+2,4位=4,5位=1+4,6位=2+4,7位=1+2+4。因此, P 1 P_{1} P1所检验的位数为1,3,5,7(码字编号中对应数字1的)。另 P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 = 0 P_{1} \oplus D_{1} \oplus D_{2} \oplus D_{4}=0 P1D1D2D4=0,求得 P 1 = 1 P_{1}=1 P1=1 P 2 P_{2} P2所检验的数据位为2,3,6,7(码字编号中对应数字2的)。令 P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 = 0 P_{2} \oplus D_{1} \oplus D_{3} \oplus D_{4} =0 P2D1D3D4=0,得 P 2 = 0 P_{2}=0 P2=0 P 3 P_{3} P3检验的数据位为4,5,6,7(码字编号中对应数字4的)。令 P 3 ⊕ D 4 ⊕ D 5 ⊕ D 6 ⊕ D 7 = 0 P_{3} \oplus D_{4} \oplus D_{5} \oplus D_{6} \oplus D_{7}=0 P3D4D5D6D7=0,得 P 3 = 0 P_{3}=0 P3=0.因此海明码的编码结果为:1010101.(PS: ⊕ \oplus 表示异或运算)

纠错过程:接受方接受到的正确码字应为1010101。当受到干扰接收到的码字为1010111。 D 1 D_{1} D1位由0变为1。检测时, P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 = 0 P_{1} \oplus D_{1} \oplus D_{2} \oplus D_{4}=0 P1D1D2D4=0,第一位纠错码正确。 P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 = 1 P_{2} \oplus D_{1} \oplus D_{3} \oplus D_{4} =1 P2D1D3D4=1,第二位纠错码为1,有错误。 P 3 ⊕ D 4 ⊕ D 5 ⊕ D 6 ⊕ D 7 = 1 P_{3} \oplus D_{4} \oplus D_{5} \oplus D_{6} \oplus D_{7}=1 P3D4D5D6D7=1,第三位纠错码为1,有错误。三个纠错码从高到低排列为110,对应的十进制为6,即为第六位数据发生错误,也就是 D 1 D_{1} D1位,取反即可。

有任何问题,欢迎留言交流。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值