校检码
(一)奇偶校验码
思想
![image-20220128142752962](https://i-blog.csdnimg.cn/blog_migrate/eb9e6908ae7c39b0dd03bbc21e80b172.png)
如果使用两个比特位来表示传输信息,那么可以做到一一对应的关系。但是如果传输的信息发生跳变(发送的是01,接收到的是00),由于00是合法的,所以接收端是发现不了错误的。进行优化:用三个比特位表示传输信息,那么就会有四种冗余状态,这样就可以检查储错误(发送的是001,接收到的是000,但是000是非法的状态,所以接收方就会发现错误)。
码字:由若干位代码组成的字。(也就是不同的情况,分为合法的码字和非法的码字)
两个码字间的距离: 将两个码字逐位对比,具有不同位的个数称为两个码字的距离。(左边表中的码字为1,右边表中的码字为2)
码距: 合法码字之间的最小距离。左边的编码方案码距为1,右边的编码方案的码距为2。
如果码距为1,那么倘若发生跳变,那么也不会发现。如果码距为2,如果只有一个比特位发生跳变,那么跳变完的码字肯定不是合法的码字,接收端就会发现错误。
所以,当码距=1的时候是没有检错能力的;当码距=2的时候,有检错能力;当码距>=3时,可能具备检错和纠错的能力。
重点
![image-20220128144817044](https://i-blog.csdnimg.cn/blog_migrate/0c361cbdf1cdf455367dc4947d91ebd1.png)
如果使用奇校验码,那么必须保证调整完奇偶校验位后整个编码的1的个数为奇数个。使用偶校验码也是同样的道理。
例:如果使用偶校验码,在传输信息的过程中有一位比特发生跳变,那么接收端收到的1的个数肯定是奇数个,发现错误。但是如果有偶数位发生跳变,那么接收端就不会发现错误。这就是奇偶校验的局限性。
-
偶校验的硬件(机器)实现?
(1)将奇偶校验位补上 : 将所有位进行异或后的得数。
(2)判断正误的过程:将所有位进行异或,结果是1就证明是错误的。
复习
奇偶校验的码距就是1,只能检查出奇数位跳变的错误,而且清楚错误的位置,只能要求发送端重传
(二)海明码
思想
在偶检验的基础上的改进。将有n位信息位的数据分成k组,每组分别进行偶校验,每个分组会对应一个校验位,最终就会携带k个校验位。多个校验位可以携带多种状态信息,不但可以反映出对错,也可以反映出出错的位置。
重点
-
需要多少位的校验位呢?
有n个信息位,k个校验位,总共的位数是n+k位。一共有2的k次方种状态。n+k位都可能会发生跳变,而且还有不发生跳变的情况,所以必须保证2的k次方种状态将这些情况全部包括。所以必须满足2的k次方>=n+k+1。
如上,信息位是4位,通过计算可以得出需要3个校验位。所以海明码一共7位,然后校验位必须按照1,2,4,8的这种顺序来插入。怎么分的组,每一组的校验位怎么求呢?将信息位写成二进制的形式,按照1,2,4的权重进行分组。比如:3化成二进制是011,那么1处的权重是1,那么它的校验位是1,2处的权重是1,那么它的校验位也有2,但是没有4。依次类推:P1对应的分组中有3,5,7;P2对应的分组中有1,3,4;P3对应的分组中有2,3,4。P1,P2,P3这三个校验位的值就可以通过自己分组中信息位的异或算出,结果分别是0,1,0。接收端的纠错:将组内的数全部异或(包括校检位),如果结果时都是0,那么没有发生跳变。如果检验位(S3,S2,S1,这里的编码按照从大到小来规定)的结果是110,那就说明是第六位(H6)出现问题。
补充图片:
![image-20220128154151173](https://i-blog.csdnimg.cn/blog_migrate/2ac3814c9b7b960ed5de82c6731bbc5f.png)
海明码具有两位的检错能力和一位的纠错能力
但是,海明码在这种状态下是没有办法区分是1位比特跳变 还是 两位比特跳变。不能仅仅通过S1 = 1,S2 = 1就判断是H3出的问题。可能是P2和P1都出现了问题。所以有必要进行优化,增加全校验位。
-
全校验:就是对整个编码进行依次总的偶校验。首先设置初始值,因为前面已经有了3个1,所以它必须也是1。
这个时候,
1,如果S3 S2 S1的值为:000,而且全体偶校验的结果是0,那么整个编码就没有出现问题。2, 如果S3 S2 S1的值不是000,而且全体偶校验的结果是1,有一位出错,直接找出来就行。
3,如果S3 S2 S1的值不是000,而且全体偶校验的结果是0,那么证明有两位出错(无法确定),需要重传。
复习
(三)循环冗余校验码(CRC)
思想
要传输的数据 除一个生成多项式(发送方和接收方已经约定好的) 得到商 和 余数。 将数据与余数一块传给接收方。余数和要传输的数据相加后再除以之前的生成多项式,若结果是0,那么传输过程中没有发生改变。
若生成多项式的位数是r位(这个位数是看位置数的最高次方数+1(包括0次方),比如x的3次方+ x +1 化成标准形式就是1001),那么在数据后面加上的余数的位数一定是r-1位。
- 总结:
在传输之前,先将余数求出来:若生成多项式的位数是r位,那么就先在数据之后加上r-1位的0,然后通过与生成多项式作除得到余数。这个余数就是FCS帧检验序列/冗余码。然后将冗余码拼接到数据的后见传给接收方,由接收方对其 除生成多项式来进行检验。
注意:在计算二进制与二进制的除法的时候,写商的时候只看最高项时不是1,然后就商1,后面的数进行异或。
接收方在收到了数据和冗余码以后 与 除数进行相除,余数不是000,就说明出错。
余数的值和出错位的关系是以8为周期进行循环:
![image-20220128162853084](https://i-blog.csdnimg.cn/blog_migrate/c9ee54350da2f036623c68e2953dafbd.png)
那是不是说循环冗余校验码只有差错的能力,没有纠错的能力呢?其实是不对的,因为上面的例子不能纠错是因为信息位太长了,上面例子中的信息位置如果短一点,保证在4位或4位以内,那么就可以找到出错位进行纠错。
总结:生成多项式决定着余数的个数,余数的个数决定着能够纠错的上限个数,上限个数 = 数据数+余数。
余数如果有3个,那么可以纠错7个(1个正确)。因为余数自身个数为3,所以数据数上限就是4。
这就与那个公式相呼应了:2的R次方 >= K + R + 1
如果满足这个公式,CRC校验码就有可以纠正一位错误的能力。
![image-20220128164039177](https://i-blog.csdnimg.cn/blog_migrate/bc33bff8c2f819429886cc13aa2dcaa8.png)