从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一种解决方案就是接收方只负责发现这种比特错。如果一个帧有位错误,就直接把这个帧丢弃,并且想办法通知发送方,让他重新传输这个帧,关于如何通知发送方重传帧这个问题,我们会在可靠传输功能里边再进行探讨。在差错控制这个部分,我们先把注意力放在如何发现比特错误上。使用检错编码技术可以发现比特错,我们会学习奇偶校验码和 CRC,也就是循环冗余校验码这两种检错编码技术。除了直接把帧丢弃重传之外,还可以有第二种解决方案,就是接收方可以发现并且纠正帧内部的比特错误。如果要纠正这种比特错误,我们就需要使用纠错编码的技术,之后我们会探讨海明教验码,这就是一种纠错编码。既可以发现比特错,同时还可以纠正比特错。
在这个视频中,我们先探讨最简单的奇偶校验码。我们会首先介绍奇偶校验的这种校验原理,如何检测出比特错误,紧接着,我们会为跨考的同学补充异或运算的一个规则。在这个视频中,我们依然需要对异或运算进行一个简单的补充,因为除了奇偶校验之外,接下来要学习的CRC校验码以及海明校验码都需要使用到异或运算。
接下来看奇偶校验码的校验原理,奇偶校验具体来说可以分为两种,一种就是奇校验,另一种是偶校验。二者的原理类似。假设有n个有效信息位,我们会在这n个信息位之前或者之后增加一个比特的这种奇偶校验位,如果我们采用的是奇校验的规则,那么我们添加这一个比特之后需要确保这 n+1位当中总共有奇数个1。相应的如果是偶校验的规则,那么我们需要确保添加了这一位之后,整体来看总共需要有偶数个1。
举个例子,假设这儿给出了两个比特串,我们分别求这两个比特串的基叫页码和偶叫页码。我们假设这个校验位是添加在有效信息位之前,那如果我们采用的是基校验的规则。看第一个比特串,这个比特串总共有七个信息位。其中包含一个一两个一三个一四个一,我们需要在这七个信息位之前增加一个校验位。并且要确保整体来看总共有奇数个1,那么原本有四个1,因此这个校验位我们就得填1,这样的话,整体就有五个1,也就是奇数个1。再来看第二个比特串,同样有七个比特的信息位,那么其中包含一个两个三个四个五个一。所以前边这个校验位,我们只需要添零。这是采用奇校验的规则,如果采用的是偶校验规则,原理类似。前边这个比特串,总共有四个1,添加这个校验位之后,需要确保整体来看总共有偶数个1,因此这个校验位我们只能添0。对于第二个比特串,总共有一个两个三个四个五个一,所以为了使整体拥有偶数个1,我们需要在校验位这儿再添加一个比特1。这就是基于偶校验规则的校验位的确定。在计算机网络中,发送方给接收方发送一个帧,那么发送方的数据链路层,会在帧的数据部分添加这个校验位的信息,然后把校验位和信息位一起发给接收方,而接收方的数据链路层又会基于奇偶校验的规则去检查整个帧有没有出错。
接收方的数据链路层是这么来检错的,如果发送方和接收方共同约定使用奇校验的规则,接收方的数据链路层收到这个帧之后会检查这个帧的校验位和信息位里边含有的比特1是不是奇数个?如果是奇数个,那么就认为没有错误。如果不是奇数个,就认为有错误。在现实应用中,偶校验要比基校验更常用,一些原因是偶校验很容易用简单的异或门来实现。
我们简单介绍一下异或运算的规则,异或运算又称为模2加运算,如果两个比特进行异或运算,那么当且仅当两个比特都相异不同的时候,运算的结果才等于1。比如说第二个式子0和1两个比特相异,它们俩异或运算得到的结果是1,第三个式子1和0两个比特相异,所以它们俩异或得到的结果等于1。相反,两个零进行异或得到的结果是0,两个0进行异或得到的结果也是零,这就是异或运算的规则。
如果我们把几个比特的信息位全部一起来异或就可以得到偶校验位。比如我们以这一串比特串为例,刚才我们用手算的方式得到它的偶校验位等于0。如果用机器计算偶校验位,我们只需要把这七个比特依次进行异或。首先1和0异或等于1,这个1和后一个0异或同样等于1,这个1和后一个1再进行异或等于0,这个0和后一个1继续异或等于1,这个1再和后一个0进行异或等于1,最后还有一个1再进行异或最后的结果就是0。所以把这七个信息位分别异或最终计算的结果是零,可以看到这个计算的结果和我们刚才手算求得的偶校验位是一致的。所以如果要用硬件来求偶校验位会非常快,只需要用异或门就可以实现。
第二个例子也是类似的,把所有的这七个信息位分别异或最终得到的结果就是1,和我们手算求得
的偶校验位是相同的。这儿就不再赘述。
这就是数据的发送方要做的事情,他会把帧的这n个信息位分别进行异或求得一个偶校验位,然后把这个偶校验位加入到信息位的前面。当然,也可以加入到信息位的后面这个都 OK,那么发送方会把这个校验位和n比特的信息位一起传给数据的接收方,而数据的接收方他的数据链路层会对收到的这 n+1个比特进行偶校验。进行偶校验,也可以用异或运算来实现。接收方会把所有的比特依次进行异或运算。我们总共收到八个比特,大家可以自己算一下这八个比特进行异或得到的结果等于0,此时说明这八个比特并没有发生错误。这个式子对应的是偶校验的第一个,这个比特串八个比特都没有发生错误,现在假设数据的接收方接收到的是后面的这八个比特,并且这八个比特当中最后一个比特1跳变成了0。此时对所有的比特进行异或运算,得到的结果就是1,结果为1,说明出现了比特错误。我们可以用人类视角数一数,总共有几个1,总共有五个1,接收方收到的这八个比特当中包含奇数个1。这并不符合偶校验的规则。所以我们从人类视角来看也能发现,这八个比特当中肯定有某些比特出现了错误。
接下来再看一个例子,同样是发送这八个比特。假设最后的两个比特发生了跳变,都是从1变成了0,那么此时数据的接收方对这八个比特进行异或运算之后,得到的结果等于零结果为零,意味着这一串比特符合偶校验的规则。我们从人类的视角来数一下,里边包含四个1,有偶数个1,因此这串二进制数是符合偶校验的规则的。然而,我们从上帝视角可以知道,这一串二进制数当中有两个比特发生了错误。因此,如果有偶数个比特发生错误,那么,数据的接收方将无法检测出这种错误。
刚才我们主要介绍了偶校验的硬件实现的原理,对于奇校验来说,硬件实现原理也是类似的,同样可以通过异或运算去实现。对于计算机网络的考试来说,我们只需要能够用人类的算法确定这个校验位等于多少,以及能够分辨一串二进制数是否符合校验的规则就可以了,大家不需要深究机器实现原理。
在这个视频中我们介绍了一种最简单的检错技术:奇偶校验码。我们提到了信息位、校验位这两个概念。信息位指的就是帧内部的有效数据,而校验位在有的教材中又会把它称为冗余位,因为校验位是我们为了给帧的数据部分纠错或者检错而附加的一些冗余比特信息。对于奇偶校验来说校验原理很简单,我们只需要在n比特信息位的首部或者尾部添加一个比特的校验位。如果数据的发送方和接收方约定的是奇校验规则,就需要确保添加了这个校验位之后。整体来看,总共会有奇数个1,而如果采用偶校验的约定,就需要确保添加校验位之后整体来看,有偶数个1。
需要注意的是,这种奇偶校验码只能检测出奇数位的错误,如果刚好有偶数个比特发生了这种比特跳变,奇偶校验码是没办法检测出这种错误的。同时,奇偶校验码只能检错,不能纠错。在这个视频中,我们也为跨考的同学补充了异或运算,又叫模2加运算的运算规则。当两个比特进行异或运算的时候,只有二者相异的时候,计算的结果才等于1,否则为0,当我们采用偶校验规则的时候,数据的接收方会把所有的信息位和校验位全部进行异或,如果异或的结果等于0,说明没有错误,如果等于1,说明有错误。如果恰巧有偶数个比特发生错误,那么此时数据的接收方,这个异或的结果也会等于零,也就是说发现不了偶数比特的错误。
以上就是这个视频的全部内容。