计算机网络差错检测和纠正技术

        最近在学习计算机网络,对此也是十分的头疼,为了方便以后复习,同时也是为了能够帮助很多像我一样迷茫的人,所以对差错检测和纠正技术做一些说明。顺便说一下,我学习计网听的是中国科学技术大学的郑烇老师讲的,感受很不错。当然了配套教材就是《计算机网络自顶向下方法》。

为什么我们要进行差错检测和纠正技术?

     通俗的来说无论是计算机自身工作,还是两个端进行信息的传输实际上都涉及到比特(0 1 代码)   在数据进行传输的过程中,由于一些其他因素很有可能对发生比特损伤(某个0变成了1,或者某个1变成了0),这样就会造成一些不必要的损失,所以使用这种技术,可以较为有效的避免这些问题。当然了差错检测是我们能不能检测到错误,纠正技术是我们能不能把检测到的错误纠正过来,二者还是有区别的。

计算机网络的差错检测和纠正技术是怎么回事?

       这本书中是学习到了数据链路层才开始细说的,但实际上我们在前面学习运输层的时候,差错检测好像就被提了一嘴。那么我们直奔主题,来研究在传输数据中检测差错的三种技术:奇偶校验(它用来描述差错检测和纠正背后隐含的基本思想)、“检验和”方法(注意到这个方法的名字叫检验和,它通常更多的应用于运输层)和循环冗余检验(它通常更多的应用于适配器中的链路层)

1.奇偶检验

        也许这是我们差错检测的最简单的一种方式,由上图所示,前面的d比特是我们想要发送的数据,后面的一个比特是我们的校验比特。故名思意,对于奇校验,首先查看d比特数据里有多少个1,如果有奇数个1,那么就将那一位校验位设为0,如果是有偶数个1,就将那以为校验位设为0,实际上就是保证最后的数据(d比特数据+1比特校验)里面有奇数个1。对于偶校验,道理是相同的,就是保证最后的数据(d比特数据+1比特校验)里面有偶数个1。

        但是这种方法它是有弊端,第一点如果有偶数个数据位发生了改变,那么相当于奇偶性不变,就检查不出错误了。第二点,即使我们检查出来了错误,那么我们也不能找出究竟是哪一位比特出现了错误。针对第一个问题,一组数据中出现多个错误的概率其实是很低的,所以即使我们只能看出那么一位的错误,工作效率还是很高的。针对第二个问题,我们提出了二维奇偶校验

 它的原理和上面我们所讲述的其实是一样的,只不过它同时进行行校验和列校验,这样如果某一位比特发生了错误,那么行列就会同时出现错误,这样一来就可以找到发生错误的比特位。

2.检验和方法

        

         上面是书中对这部分的介绍,老实说我并没有看懂,这里欢迎大家去B站博主醋姑娘那里去看一下计算方法,在这里给出链接:​​​​​​https://www.bilibili.com/video/BV1Xz4y1y7dJ/?spm_id_from=333.337.search-card.all.clickhttps://www.bilibili.com/video/BV1Xz4y1y7dJ/?spm_id_from=333.337.search-card.all.click

把他的视频看会了,这个基本就能理解是怎么回事了,其实我们完全没有必要去看书中冰冷的文字

3.循环冗余检测

        这个才是我们的重头戏,其实这个内容如果你去看书,那里面很多的字母,名称,公式总是会使我们眼花缭乱。所以下面我仍然会给出书中对这部分的介绍,如果大家喜欢,当然可以看,但是如果你只是想弄明白这个是怎么回事的话,完全没有必要看。

 我感觉把这个弄明白,比较快的一种方法就是先知道它是怎么计算的,在这里免不了的就是还是要向大家介绍一些概念。

生成多项式G(x):它是接收方和发送方相互之间达成协议的一个多项式,这个是规定好的,不是我们自己算的,当时这个困扰了我。

模2算数:加法不进位,减法不借位,意思就是加法和减法是一样的,或者你可以直接理解为对二者进行异或运算(相同为0,不同为1,例如 1101 XOR 1100 = 0001)

由于在这里说明比较麻烦,所以我下面将会在草纸上说明。

        上面那个除法大家可能会有疑问,比如在开始进行计算的时候1101>1010,那么为什么我们还要商1呢,那是因为这并不是真正意义上的除法,模2运算相当于加减相同,这里不要困扰大家。

        我们已经计算得到了,余数为001,它有什么用呢?下面我继续带着大家分析。其实这种方法的宗旨就是将余数(001)添加到发送信息(101001)的后面 变成了 101001001,我们用组装后的这个数(101001001)作为被除数,前面的那个比特串(1101)仍然作为除数,我们再次进行除法运算,如果得到的余数为0,那么就证明数据传输成功。

        对于这个计算过程我想大家大致理解了,但是可能会有疑问,为什么这样做能确保数据没有出错呢?在我的理解看来,我们的方法核心就是在于找那个余数,我们在这里简单的设想一下,主机A想给主机B发送一串为101001的数据,那么主机B怎么知道他收到的信息就是正确的呢?他们俩首先有一个沟通,事先商量好一个多项式,这是他们俩都知道的,主机A通过一些计算知道了他发送数据的后面还得发送一个001(余数),主机B收到了来信,发现信息是101001001(没有错误),他再进行相关计算,发现余数恰好为零,那么信息没有错误,如果主机B收到的信息是100001001呢?你可以试着进行计算,看看余数还是0吗?

        为什么如果数据正确余数会为0呢?在我们前面求余数的时候,因为被除数是欲发送数据+一些0,而后来的被除数是欲发送数据+前面的余数,相当于我本来差个余数就给它整除了,然后你后来给我把这个余数加上了,那么整除是必然的。

这里还是要推荐B站上的计算机网络微课堂,讲解的也是非常的清楚。下面给出链接https://www.bilibili.com/video/BV1xJ411K7Wx/?spm_id_from=333.337.search-card.all.click&vd_source=550b0826afa852fcf4e8dfdac9e79806icon-default.png?t=M85Bhttps://www.bilibili.com/video/BV1xJ411K7Wx/?spm_id_from=333.337.search-card.all.click&vd_source=550b0826afa852fcf4e8dfdac9e79806

         我的讲解到这里也就结束了,强烈建议大家用电脑观看。


版权声明:本文为C_primer_plus_18原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。