传输数据中检测差错的技术
比特级差错检测和纠正(bit・level error detection and correction) ,即对从一个节点发送到另一个物理上连接的邻近节点的链路层帧中的比特损伤进行检测和纠正, 它们通常是链路层提供的两种服务。在传输数据中检测差错的3种技术:奇偶校验(它用来描述差错检测和纠正背后隐含的基本思想)、检验和方法(它通常更多地应用于运输层)和循环冗余检测(它通常更多地应用在适配器中的链路层)。
奇偶校验
也许差错检测最简单的方式就是用单个奇偶校验位(parity bit)假设要发送的信息中有d个比特。在偶校验方案中,发送方只需包含一个附加的比特,选择它的值,使得这d+1比特(初始信息加上一个校验比特)中1的总数是偶数。对于奇校验方案,选择校验比特值使得有奇数个1。
采用单个奇偶校验位方式,接收方的操作也很简单。接收方只需要数一数接收的d + 1
比特中1的数目即可。如果在采用偶校验方案中发现了奇数个值为1的比特,接收方知道
至少出现了一个比特差错。更精确的说法是,出现了奇数个比特差错。但是如果出现了偶数个比特差错,那会发生什么现象呢?你应该认识到这将导致一个未检出的差错。在突发差错的情况下,使用单比特奇偶校验保护的一帧中未检测出差错的概率能够达到50% 。使用二维奇偶校验(two-dimensional parity)方案,包含比特值改变的列和行的校验值都将会岀现差错。因此接收方不仅可以检测到出现了单个比特差错的事实,而且还可以利用存在奇偶校验差错的列和行的索引来实际识别发生差错的比特并纠正它!
接收方检测和纠正差错的能力被称为前向纠错(Forward Error Correction, FEC)。这些技术通常用于如音频CD这样的音频存储和回放设备中。在网络环境中,FEC技术可以单独应用,或与链路层ARQ技术一起应用,ARQ技术与我们在第3章研究的协议类似。FEC技术很有价值,因为它们可以减少所需的发送方重发的次数。也许更为重要的是,它们允许在接收方立即纠正差错。FEC避免了不得不等待的往返时延,而这些时延是发送方收到NAK分组并向接收方重传分组所需要的,这对于实时网络应用[Rubenstein 1998]或者具有长传播时延的链路(如深空间链路)可能是一种非常重要的优点。
检验和方法
在检验和技术中,比如d比特数据被作为一个k比特整数的序列处理。一个简单检验和方法就是将这丘比特整数加起来,并且用得到的和作为差错检测比特。因特网检验和(Internet checksum)就基于这种方法,即数据的字节作为16比特的整数对待并求和。这个和的反码形成了携带在报文段首部的因特网检验和。接收方通过对接收的数据(包括检验和)的和取反码,并且检测其结果是否为全1比特来检测检验和。如果这些比特中有任何比特是0,就可以指示出差错。
循环冗余检测
现今的计算机网络中广泛应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check, CRC)编码。CRC编码也称为多项式编码(polynomial code),因为该编码能够将要发送的比特串看作为系数是0和1 一个多项式,对比特串的操作被解释为多项式算术。
CRC编码操作如下。 考虑d比特的数据D,发送节点要将它发送给接收节点。 发送方和接收方首先必须协商一个r+ 1比特模式, 称为生成多项式(general),我们将其表示为G。我们将要求G的最高有效位的比特(最左边) 是1。 CRC编码的关键思想如图所示。 对于一个给定的数据段D,发送方要选择r个附加比特R 并将它们附加到D上,使得得到的d +r比特模式(被解释为一个二进制数) 用模2算术恰好能被G整除(即没有余数)。用CRC进行差错检测的过程因此很简单: 接收方用G去除接收到的d+r比特。 如果余数为非零, 接收方知道出现了差错; 否则认为数据正确而被接收。