校验方法
校验方式的核心作用是检测 / 纠正数据传输、存储或处理中的错误,保障信息准确性。408课程中主要是计算机组成原理和计算机网络中会详细学习和使用。
主要作用:
1.计算机组成原理中的作用
- 针对内存、CPU 缓存、磁盘等存储 / 处理场景,解决硬件噪声、电磁干扰导致的比特翻转问题。
- 保障指令执行、数据读写的准确性,避免计算结果错误或系统崩溃。
2.计算机网络中的作用
- 主要用于实现差错控制,比如
OSI模型的数据链路层、网络层和传输层都有差错控制的功能。
校验码是通过某种校验方式生成的具有发现错误或纠正错误的数据编码。原理是被校验数据(原始数据)中引入部分冗余信息(校验数据),得到最终的校验码(原始数据+校验数据)符合某种编码规则。
数据校验的流程:发送方对原始数据按照预定的编码规则进行编码,生产包含冗余信息的校验码,校验码传输给接收方,接收方利用预定的解码规则进行解析,并判断校验码是否符合编码规则,若不符合编码则说明出错了。
码距:码距是指编码中不同的两个二进制位之间的距离,又称为海明距离。且规定一个有效编码集中,任意两个码字的最小码距是该编码集的码距。校验码的目的就是扩大码距,码距越大,抗干扰能力、纠错能力越强;但数据冗余越大,编码效率却越低。
码距与纠错、纠错能力如下表:
| 码距 | 检错、纠错能力 | |
|---|---|---|
1 | d ≥ e+1 | 可检测e个错误 |
2 | d ≥ 2t+1 | 可纠正t个错误 |
3 | d ≥ e+t+1 && e ≥ t | 可检测e个错误并纠错t个错误 |
奇偶校验
奇偶校验是常见的简单校验码,通过检测二进制代码中1的个数的奇偶性进行数据校验;个数为奇数对应奇校验,个数为偶数对应偶校验。
简单奇偶校验
简单奇偶校验只有一个校验组、一个校验位,所以只能提供一位检错信息进行错误检查,无法纠错。
编码规则:增加一个校验位P,使得最终的校验码中数学1的个数为奇数或偶数,最小码距是2。
奇校验:整个校验码(有效信息位+校验位)中1的个数为奇数;
偶校验:整个校验码(有效信息位+校验位)中1的个数为偶数。
地址结构:
交叉奇偶校验
多重奇偶校验是把原始数据信息按某种规律分成若干校验组,每个数据位至少两个以上的校验组,当校验码中的某一个位发生错误时,能在多个检错位中被指出,使得偶数位错误也可以被检查出,还可以指出最大可能是哪位出错,从而将其纠错。
交叉奇偶校验是最典型的例子。原理是将原始数据按矩阵形式排列(行 + 列划分),对每行、每列分别进行奇偶校验并添加对应校验位,形成 “行校验位 + 列校验位” 的双重校验组。
- 每个数据位同时属于 “所在行” 和 “所在列” 两个校验组,满足 “一个数据位归属多个校验组” 的多重校验核心要求。
- 接收端通过核对行、列校验结果:若某行和某列校验均失败,可定位到交叉点的数据位是错误位;
- 既能检测出偶数个比特错误(突破简单奇偶校验的局限),还能定位并纠正单个比特错误,也可检测部分多比特错误。
当R1的C3出错时,行、列两个检错码都会报错,如果能假定是一位错,则可以直接通过行、列检错码的值来定位出错位。
同时可以实现多位错,比如R1的C3和C2都出错,虽然此时R1的行校验组的检错码没有发生变化,但是
C2和C3的列检错码会发生变化,可以检错出双位错。
总结:交叉奇偶校验能检测出所有的3位和3位以下的错误、奇数位错误、大部分偶数位错误,能纠正一位错误和部分多位错误。
优点:可以大大降低误码率,适用于中、低速传输系统和反馈重传系统。
循环冗余校验
循环冗余校验(CRC)是一种基于模2运算建立编码规则的校验码。
模2运算:分为模2加法、减法、乘法和除法运算。
①模2加、减法是没有进位和借位的二进制加法和减法。
0±0=1,0±1=1,1±0=1,1±1=1。
②模2乘法运算是根据模2加法运算求部分积之和,运算中不考虑进位。
③模2除法运算,是根据模2减法部分求部分余数,上商原则的:
部分余数首位为1,商上1,按模2运算减除数;
部分余数首位为0,商上0,减0;
部分余数位数小于除数的位数时,该余数是最后的余数。
地址结构:
循环冗余校验码的思想:
数据发送时,发生放和接收方双方约定一个“除数”,K个信息位+R个校验位作为”被除数“,添加校验位后需保证除法的余数为0。收到数据后,进行除法检查最终余数是否为0。若余数非0说明出错,则进行重传或纠错。
例题:
求有效信息110的CRC码,生成多项式G(x)=11101。
有效信息是110则M(x)=110=x^2+x,即信息位为3位;
多项式是G(x)=11101=x^4+x^3+x^2+1,而校验位为R位,R位为生产多项式最高次幂,即R=4。所以校验码位数为N=K+R=7。所以在信息位110后填充0000冗余为存放校验码。
接着,按模2除法:
求得商,余数,最后得到的CRC码为1101001。(把最终余数1001替代进原来的0000冗余位)。
检错和纠错:发送方发生CRC码1101001,接受方接收后用11101进行模2除。若余数为000代表没有出错。
注意:K个信息位,R个校验位,若生成多项式选择得当,且2^R≥K+R+1,则CRC码可纠正1位错误,但实际应用中一般只用来“检错”。
总结
循环冗余校验码构造
CRC码构造流程 |
|---|
①由生成多项式确定“除数”。若生产多项式中x的最高次幂为R,则“除数”有R+1 |
②K个信息位+R个0冗余位 |
③被除数、除数进行模2除,得到R位余数 |
④K个信息位+R个余数=CRC码 |
校验
CRC码校验逻辑 |
|---|
收到K+R位数据,与生成多项式模2除,计算R位余数 |
余数为0,说明无错误 |
余数非0,说明出错 |
检错、纠错能力
| 检错和纠错能力 |
|---|
| 可检测出所有奇数个错误 |
| 可检测出所有双比特错误 |
| 可检测出所有小于等于校验位长度的连续错误 |
| 若选择合适的生成多项式,且2^R≥K+R+1,则可纠正单比特错 |
海明校验
海明码的设计思路是将信息位分组进行偶校验→多个校验位→多个校验位标注出错位置。
实现逻辑:
确实校验位数量→确定校验位的分布→求检验位的值→检错纠错
| 求解步骤 |
|---|
确定校验位个数(k位校验位,n个信息位)。 |
确定校验位分布:、、分别在1,2,4,8...位;空出来的位置依次填入信息位。 |
求校验位,将信息位的位置序号用k位二进制表示出来,校验为与位置序号的第i位的信号归为一组进行偶校验。 |
| 纠错,对每个组进行分组异或(分组偶校验),求得S1、S2、S3...;S3S2S1=000说明无错误,反之有错误。 |
①确定海明码的位数
根据2^R≥K+R+1公式,确定校验位的位数。
②确定校验码位的分布
校验位Pi放在海明码号为2^(i+1)的位置上,信息位按顺序放在其余位置。得到海明码D4 D3 D2 P3 D1 P2 P1。
海明码的检错逻辑:
补充:传统的海明码校验无法区分1位错还是2错,为了区分1位错和2位错,还需要“全校验位”对整体进行偶校验。