链路层的差错检测和纠正

链路层的差错检测和纠正

差错检测和纠正基本概念

首先需要对差错检测和纠正有一个基础的理解,只要能回答上以下问题就算合格。

前导术语:
干扰:对有用信号的接收造成损伤。

问题一:为什么链路层会需要差错检测和纠正?
:因为数据在链路传输过程中,会受到干扰的影响,从而改变信号的波形。所以需要差错检测和纠正的技术,让数据帧到达接收结点时可以保证有一个可接受的准确率。

前导术语:
单个位差错:在给定的数据单元中(例如一个字节、字符或分组)中仅有一位发生从1到0或从0到1的变化。
突发性差错:在数据单元中有两位或更多位发生1到0或0到1的变化。

问题二:现实中的差错一般是单个位差错还是突发性差错?
:用一个例子来解释:假设某条链路的传输速率是10Mbps,那一个位的持续时间就是1/10000000s。这个时间远远低于干扰的持续时间。比如某段噪声的持续时间为1ms(1/1000s),那么在10Mbps的链路上,它可以影响10_000_000 / 1000 = 1w个比特,也就是会导致这1w个比特中的多个比特产生差错,这样的差错类型当然属于突发性差错。所以,本质上受干扰影响的位的数量取决于链路的传输速率和噪声的持续时间。链路的速率越高,噪声的持续时间越长,影响的位数越多。

前导术语:
冗余:冗余就是多余的意思,冗余位就是用多余的01比特串来实现检错或纠错的功能。

问题三:检错和纠错的区别是什么?谁更难实现?
答: 检错的回答是 是或者否,只要确定是否有错即可。纠错不仅需要发现错误,更重要的是要把错误的数据改变成正确的数据。纠错的难度是远远大于检错的,因此需要更多的冗余位。而且错误的位数越多,纠错的难度就越大。纠错需要找到错误的位的具体位置,比如你有8位的数据,如果只有1个差错,出错的位置就8种,如果有2位差错,出错的位置就有整整28种可能,如果有3位就整整168种可能。所以纠错是非常难的事情,这点需要提前有一个感性的认识。

问题四:纠错有两种方式,什么是前向纠错?什么是重传纠错?
:前向纠错(forward error correction)是接收方通过冗余位直接纠正错误的报文。重传纠错是接收方检测出有差错后,丢弃掉有差错的报文,并且让发送方重新发送报文的技术。

问题五:发送方和接收方实现差错检测和纠错的基本逻辑是什么?
答: 发送方通过给数据增加对应的冗余位来检错和纠错,纠错和纠错的核心是冗余位和数据位存在某种关系,如果接收方发现对应关系符合,就认为数据没错。如果接收方发现对应关系不符合,就认为数据出错。如何添加冗余位就是具体的编码方式,编码的优秀要看冗余位的开销和方法的健壮性(也就是成功检测出错误或者纠正错误的概率越大就健壮)。

发送方和接收方的逻辑

问题六:有算法可以保证一定能检测或者纠正错误么?
:并没有!任何算法只能在某些情况下可以检测出错误,好的算法能够在更多的情况下检测出错误,但是理论上总会有错误无法被检测出来。
原理很简单,检测错误实际依赖冗余位和数据位的关系,如果数据位和冗余位都出错,但是错误的两者竟然符合算法规定的关系,那么就检测不出来。这就好比数据位是函数的自变量,编码是某个函数,冗余位是函数的值。如果数据位和冗余位都改变了,也就是自变量和函数值都改变了,但是改变后两者还是满足这个关系,那么就检测不出来。
由于冗余位是需要额外的数据开销的。所以算法一般会规定可能检测的最多差错位数,当某个数据单元产生的差错超过了最多位数,这个编码就可能不适用了。

  
  

块编码

块编码是一类常用的编码方式,还有一类称为卷积编码,超过了我需要掌握的范围。下面要介绍的内容可以对块编码的基本形式有一个粗浅的理解。

前导术语:
块编码:就是将数据分成块,每块都进行编码,实际传输的是编码后的值。
数据字:把原始报文分成块,每块有k位,这k位01字符串就是数据字。
冗余位:使用某种编码方式,对数据字生成对应的一串数字,用于检错和纠错,这串数字有r位,称为冗余位。
码字:把k位数据字和r位冗余位加在一起,得到n = k + r 位字符串,称为码字。比如数据位是 01,冗余位是1,那么加在一起,码字就是011。

问题一:块编码数据位和码位是一一对应的么?
:是。 块编码是一对一的,相同的数据位总是编码成相同的码字。 这里有很有趣的地方。假设数据位是k位,那么一共有2k种可能的数据位,假设码字是n = k+r位,那么码字一共有2n种可能。也就是多了2n-2k种可能。

前导术语:
有效码字:我们对每种可能的数据字进行编码,得到的对应码字就是有效码字,把所有有效码字列在一起,就形成了有效码字表。很容易明白,如果数据字是k位,那么有效码字的数量是2k。这是因为数据字和码字是一一对应的。

问题二:接收方怎么检查接收到的码字是否有出错?
:接收方的思路很简单,接收方本身就存储有有效码字的列表,如果接收到的码字是有效码字,就认为没有出错,如果接收到的码字不在有效码字表里面,就认为传输过程中出错了。
对于上面的问题进一步思考,很自然会发现有这种尴尬的情况。接收到的码字出错了,但是意外的是它居然从原本的有效码字变成了另一个有效码字,这样接收方就无法发现这个错误了。
对此,每个编码方案的做出了聪明的设计,可以确保在有限的出错位数的前提下,比如一个数据单元的出错位数小于等于3位,码字不可能从一个有效码字变成另一个有效码字,因此就杜绝了这种情况的发生。
(对于上面提到的这种设计思想,只要看完下一部分讲解的最小汉明距离就可以轻而易举的理解)

  
  

汉明距离

术语:
汉明距离:两个相同长度的字符串的汉明距离指对应位不同的数量。用d(x,y)表示汉明距离,其中x和y是相同长度的字符串。
举例:比如011和110就是两个相同长度的字符串,对应的第三位和第一位都不相同,所以汉明距离就是2。
对于01字符串,只需要将两个字符串异或,1的数量就是不同位的数量,也就是汉明距离的值。

最小汉明距离:对于所有的码字,两两进行计算汉明距离,所有可能对中最小的值就是最小汉明距离。用dmin表示。

问题一:最小汉明距离和最多的差错个数有什么关系?
:这个问题非常有意思。汉明距离的本质其实就是一对字符串不同的位数。发送的码字通过不可靠的传输可能会变成其他码字,比如发送的码字是011,接收到的码字却是101,第一位和第二位都出错了,出差错的个数是2。如果把发送的码字和接收到的码字看成一对,求汉明距离,当然也会得到2.
所以,本质上差错的个数就是发送码字和接收码字的汉明距离。
我们担心的是差错无法被检测,无法被检测的根源是某个有效码字出错了,但是却碰巧变成了另一个有效码字。
注意:有趣的地方来了!如果对整个有效码字表求最小汉明距离,假设dmin = s+1。这就代表任意两个有效码字的差异都大于s位。如果我们保证最多的差错个数为s位,那么不管怎么出错,码字都没办法从一个有效码字变成另一个有效码字!这就保证了有效码字表在给定最多差错个数的前提下是绝对有效的。

从几何意义上看待最多差错个数与最小汉明距离的关系。
假设原本码字的值为x,出错的最多个数为s。那么所有出错的可能都在以x为圆心,s为半径的圆内部和边上。如果有效码字表的最小汉明距离为s+1,那么其余的有效码字一定在圆外,和出错的码字没有任何地方有重叠。
差错检测中最小汉明距离的集合意义
图片说明:x是发送的有效码字,y是任一其他有效码字。空心圆表示某个出错后的可能结果。由于出错的结果都在圆内,所以不可能从一个有效码字变成另外一个有效码字。

问题二:纠错的最小汉明距离和最多出错位数的关系是什么?
:先看下图,假设可能出错位数为t位,那么每个有效码字可能出错的结果就在以自身为中心,t为半径的圆内。比如下图的x区域和y区域。如果有效码字表的最小汉明距离大于2t,那么每个有效码字出错的结果就没有重叠。如果得到某

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值