文章目录
奇偶校验
检验和方法
循环冗余检测
比特级差错检测和纠正(bit-level error detection and correction)。
即对从一个节发送到另一个物理上连接的领近节点的链路层帧中的比特损伤进行检测和纠正。
在发生节点,为了保护比特免受差错,使用检测和纠正比特(Error-Detection and-Correction,EDC),来增强数据D。
如图6-3,链路级帧中的D和EDC,都将被发生到接受节点。但是可能由于比特翻转,D‘和EDC’和初始的D和EDC不同。
差错检测和纠正技术使接受方有时但并非总是检测出已经出现的比特差错,即使采用差错检测比特,也还是可能有未检出比特差错(undetected bit error);
这主要取决于检测技术的复杂度,一般越复杂的技术可以大概率保证检测的准确率,但是又导致了开销的增加。
有很多复杂的不作介绍。这里只介绍简单的三种技术:奇偶校验(基本思想)、检验和方法(更多应用于运输层)、循环冗余检测(CRC,通常应用在适配器中的链路层)
奇偶校验
最简单的方式之一:采用单个奇偶校验位(parity bit)
假设要发送的信息D有d比特。
在偶校验方案中,发送方只要包含一个附加的比特,选择它的值,使得这d+1比特(初始信息加上一个校验比特)中1的总数是偶数。
对于奇检验方案,选择检验比特使有奇数个1。
接受方只需要数一下接受的d+1比特中1的个数即可。
如果在采用偶校验方案中发现了奇数个值为1的比特,接受方便可以知道至少出现了一个比特差错。但是没有出现差错也不意味着没有差错。当正好出现偶数个差错的时候便无法检验出。
于是有了奇偶校验的二维奇偶校验(two-dimensional parity)。
D中的d比特被划分为i行j列。产生的i+j+1奇偶校验比特构成了链路层帧的差错检测比特。
在这个方案中,包含比特值改变的列和行的校验值都将出现差错,因此接收方不仅可以检测到出现了单个比特差错的事实,而且还可以利用存在奇偶校验差错的列和行的索引来实现识别发生差错的比特并纠正它。
如图6-5所示。
接受方检测和纠正差错的能力被称为前向纠错(Forward Error Correction,FEC)。FEC技术很有价值,它是在接受方进行的,因此它可以减少所需的发送方重发的次数。它允许在接收方立即纠正差错。FEC避免了不得不等待的往返时延,这对实时网络应用可能很重要。
检验和方法
在检验和技术中,d比特数据被作为一个k比特整数的序列处理。
一个简单检验和方法就是将这k比特整数加起来,并且将得到的和作为差错检测比特。
因特网检验和(Internet checksum)就是基于这种方法,即数据的字节作为16bit的整数对待并求和,这个和的反码形成了携带在报文端首部的因特网检验和。
在TCP和UDP协议中,对所有的字段(包括首部和数据字段)都计算因特网检验和。在其他协议,如XTP,对首部计算一个检验和,对整个分&组计算另一个检验和。
相比CRC,需要相对小的开销,但是提供的差错保护相对弱。
循环冗余检测
现如今的计算机网络中广泛应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check,CRC)编码。CRC编码也称为多项式编码,因为该编码能够将要发生的比特串看作为系数是0和1的一个多项式,对比特的操作被解释为多项式运算。
考虑一个d比特的数据D,发生节点要将它发生给接受节点。发送方和接受方必须首先协商一个r+1比特模式,称为生成多项式(generator),将其表示为G。要求G的最高有效位的比特(最左边)为1。
对于一个的数据端D,发送方要选择r个附加比特R,并将它们附加到D上,使得到的d+r比特模式(被解释为一个二进制数)用模2运算恰好能够被G整除(即没有余数).
用CRC进行差错检测的过程:接受方用G去除接受到的d+r比特。如果余数为非零,则知道出现了差错。否则将接受。
所有CRC计算采用模2算术来做。在加法中不进位,在减法中不借位。意味着加法和减法是相同的。这两种操作等价于按位异或(XOR)。
//XOR
1011 XOR 0101 = 1110
1001 XOR 1101 = 0100
//+
1011 + 0101 = 1110
1001 + 1101 = 0100
//-
1011 - 0101 = 1110
1001 - 1101 = 0100
乘法和除法和二进制算术一样,乘以2^k,使用左移k位。
这样,给定D和R , D*2r XOR R = nG
我们要选择R使得G能够出意D * 2r XOR R 而没有余数。
对等式两边都用R异或,得到:
D * 2^R = nG XOR R
我们用G来除D*2^R,得到的余数值刚好是R。
例如当D = 101110,d = 6,G = 1001 和 r = 3 时。传输的9个比特是101110011。
计算过程如下。
D后面附加加的3(r)个0,是乘以 23 (2r) , 即左移3(r)位补的0。