差错检测和纠正技术
数据在传输的过程中难免会出现差错(比如经过路由转发时),因此我们需要一些差错检测和纠正技术来检测数据中的差错并纠正,使接收方收到正确的数据,也避免发送方对数据进行重传。
下图是差错检测和纠正的场景示意图。
??????
在发送结点为了保护数据中比特免受差错,使用差错检测和纠正比特(Error-Detection and-Correction,EDC)来增强数据D。通常需要受保护的数据不仅包括从网络层传递下来需要通过链路传输的数据报,而且包括链路帧首部中的链路级的寻址信息、序号和其他字段。
链路级帧中的D和EDC都被发送至接收结点。接收结点接收到比特序列D‘和EDC‘。因为在传输中,比特可能发生翻转所以导致D‘和EDC‘与初始的D和EDC不同。
在接收方这边,它的挑战是在仅知D‘和DEC‘的情况下,就判断D‘和初始的D是否一致。差错检测和纠正技术也使接收方检测出已经出现的比特差错,但也可能有未检出比特差错(undetected bit error),也就是说,接收方接收的信息中还会包含比特差错。所以我们要选择一个差错检测方案使这种事情发生的概率很小。一般而言,差错检测和纠正技术越复杂,开销也就越大。
下面介绍传输数据中检查差错的3种技术。奇偶校验(它用来描述差错检测和纠正背后隐含地基本思想)、检验和方法(通常更多地应用于应用层)和循环冗余检测(通常更多地应用于适配器中的链路层)。
奇偶校验
也许差错检测最简单的方式就是用单个奇偶校验位(parity bit)。在偶校验方案中,发送方只需包含一个附加的比特,选择它的值,使得这d+1个比特(初始信息加上一个校验比特)中1的总数为偶数。对于奇校验方案,选择校验位比特值使得有奇数个1。
下图是1比特偶校验。
?????????????
采用单个奇偶校验位的方式,接收方操作也很简单。统计d+1中比特为1的个数,在采用偶校验方法中如果出现了奇数个1,接收方知道至少出现了一个比特差错,准确地说为,出现了奇数个比特差错。
倘若出现了偶数个比特差错,这将会导致出现未检出的差错。经过测量,这种差错经常以“突发”形式聚集在一起,所以我们需要一个更健壮的差错检测方案(实践中也是使用更健壮的方案)。在介绍实践中使用的方案,我们继续介绍奇偶校验的一种简单的一般化方案,深入理解纠错技术。
下图显示的是单比特奇偶检验方案的二维一般化方案。d个比特被划分为i行j列。对每行每列计算奇偶值。产生i+j+1奇偶比特构成了链路层帧的差错检测比特。比特被改变的行和列都可以检测出现差错,并且还可以利用存在奇偶校验差错的列和行的索引来实际识别发生差错的比特并纠正它。
?????????????
现在假设初始d比特中出现了单个比特差错。下图是一个例子。
?????????????
接收方检测和纠错的能力被称为前向纠错(Forward Error Correction,FEC)。这些技术通常用于如音频CD这样的音频存储和回放设备中。接收方发现错误可以立即纠错,避免了使发送方重传数据,这对实时网络应用和具有长传播时延的链路(如深空间链路)很有帮助。
检验和
在检验和技术中,将d比特数据作为一个k比特整数的序列处理。
一个简单的检验和方法就是将这k比特整数加起来,并且用得到的和作为差错检测比特。
检验和需要相对较小的分组开销。
因特网检验和(Internet checksum)便是基于这种方法,即数据的字节作为16比特的整数对待并求和。这个和的反码形成了携带在报文段首部的检验和字段。
接收方通过对接收的数据(包括检验和)的和 取反码,并且检测其结果结果是否全为1比特来检测检验和。如果这些比特中有任何比特为0,就可以指示错误。
循环冗余检测
如今的计算机网络中广泛地应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check,CRC)编码。CRC编码也称为多项式编码(polynomial code),该编码能够将发送的比特串看作为系数是0和1一个多项式,对比特串的操作被解释为多项式运算。
CRC编码操作如下
考虑d比特数据D,发送结点要将它发送给接收结点。
发送方和接收方首先必须商议一个r+1比特模式,称为生成多项式(generator),将其表示为G,要求G的最高有效位为1(最左边)。
对于一个给定的数据段D,发送方要选择r个附加比特R,并将它们附加到D上使得得到的d+r比特模式(被解释成一个二进制数)用模2算术恰好能被G整除。在接收方这边,用G除以接收到的d+r比特,如果余数不为0,接收方便知道了差错,若余数为0,则接收数据。
????????
所有CRC采用模2运算算术,在加法中不进位,减法中不借位,即等价于异或运算(XOR),乘法和除法也相同。并且,D*2^k XOR R产生如上图所示的d+r比特模式。
举例说明
???????????????
如上图所示,D = 101110,d = 6,G = 1001,和r = 3的情况下计算R。得出R = 011。
于是发送方会传输9个比特101110011。
国际标准已经定义了8,12,16和32比特生成多项式G。其中CRC-32 32比特的标准被多种链路级IEEE协议采用。
每个CRC标准都可以检测小于r+1比特的突发错误(意味着所有连续的r比特或者更少的差错都可以检测到)。每个CRC标准也能检测任何奇数个比特差错。
《计算机网络 自顶向下方法》学习笔记