计算机中的错误校验¶
错误校验用于判断数据在存储、传输或处理过程中是否发生了错误;部分方法还能定位并纠正错误。核心区分是:
- 检错(error detection):发现数据可能有错,通常需要丢弃、重传或交给上层处理。
- 纠错(error correction):不仅发现错误,还能根据冗余信息恢复正确数据,适合无法方便重传的场景。
- 冗余:为数据额外加入校验位、校验和或校验码。冗余越多,检测/纠错能力通常越强,但传输和存储开销也越大。
一、总览:按应用模块分类¶
| 模块 | 常见方法 | 主要目标 |
|---|---|---|
| 计算机网络链路层 | 奇偶校验、二维奇偶校验、CRC、帧校验序列 FCS | 检测传输帧中的比特错误 |
| 网络传输层/应用层 | 校验和、序列号、确认、重传、消息摘要 | 检测端到端数据损坏或丢失 |
| 内存 | 奇偶校验内存、ECC 内存 | 检测或纠正内存位翻转 |
| 磁盘与存储 | 扇区校验、ECC、RAID 校验、scrubbing | 检测/恢复介质错误和磁盘故障 |
| CPU 与指令执行 | 指令/数据奇偶校验、机器检查、锁步校验 | 发现硬件内部数据或执行错误 |
| 数据库与文件 | 页校验和、日志校验、Merkle 树、文件哈希 | 发现页、文件或副本损坏 |
| 密码与安全 | MAC、数字签名、哈希摘要 | 检测篡改并验证来源;不是普通传输纠错 |
| 无线与高可靠通信 | Hamming、BCH、Reed-Solomon、LDPC、Turbo、交织 | 在重传困难或噪声较强时进行纠错 |
二、奇偶校验(Parity Check)¶
奇偶校验在数据后增加 1 个校验位,使整个码字中 1 的个数保持为偶数或奇数。
1. 偶校验例子¶
数据 1011001 中有 4 个 1,已经是偶数,因此偶校验位为 0,发送 10110010。如果传输后 1 的个数变成奇数,接收方就知道发生了错误。
2. 能力与局限¶
- 能检测奇数个比特错误。
- 不能可靠检测偶数个比特错误,因为错误可能相互抵消。
- 通常只能检错,不能指出错误发生在哪一位,也不能自行纠正。
- 串行通信、基础存储和简单内存保护中常见。
二维奇偶校验把数据按行列排列,分别增加行校验和列校验。单比特错误时,错误所在行和列的交点可以帮助定位并纠正;但多比特错误的能力取决于错误分布,不能简单认为所有多比特错误都能纠正。
三、校验和(Checksum)¶
校验和通常把数据分成固定长度的字,再进行加法、反码加法或其他规定运算,最后把结果作为校验字段。接收方对收到的数据重新计算并比较。
- IPv4 首部校验和只覆盖 IPv4 首部。
- TCP/UDP 校验和覆盖伪首部、TCP/UDP 首部和数据,用于端到端传输检错。
- 文件、日志和分布式存储也常把校验和与数据块一起保存。
校验和实现简单、开销较低,但对某些抵消型错误不如 CRC 强,通常不能纠错。需要注意:校验和相等只说明“未检测到错误”,不能证明数据绝对正确。
四、CRC 循环冗余校验¶
CRC 把比特串看成二进制多项式,发送方用约定的生成多项式进行模 2 除法,取余数作为 CRC;接收方对完整码字重新除法,余数符合约定则认为通过。
1. 计算思想¶
模 2 加法就是异或,不产生进位。不同协议使用不同参数,例如生成多项式、初始值、是否反射和最终异或值,因此不能只写“CRC-32”就假定所有实现完全相同。
2. 检错能力¶
在生成多项式满足设计条件时,CRC 可以可靠检测:
- 所有单比特错误;
- 很多多比特错误;
- 长度不超过校验阶数的突发错误;
- 一般具有很高的随机错误检出率。
CRC 主要是检错,不负责根据余数恢复原始数据。以太网帧的 FCS 通常使用 CRC 类机制。帧校验失败时,链路层一般丢弃该帧,再由协议机制决定是否重传。
五、汉明码与 ECC¶
汉明码在数据位中插入多个校验位,每个校验位负责检查特定位置集合。通过校验结果形成综合征(syndrome),可以定位错误位。
- 基本汉明码通常可纠正 1 位错误,并检测部分 2 位错误。
- SEC-DED(Single Error Correction, Double Error Detection)常在基本汉明码上增加整体奇偶位:可纠正单比特错误,检测双比特错误。
- ECC 是更广义的错误校正编码,内存 ECC 常采用 SEC-DED 或更强的变体。
内存读取时,控制器利用数据位和校验位重新计算综合征;若发现单比特错误,可在交给 CPU 前纠正,必要时记录告警。若检测到不可纠正错误,系统可能触发机器检查异常、记录日志或停止使用该内存区域。
六、磁盘、SSD 与 RAID 中的校验¶
1. 磁盘扇区校验与 ECC¶
磁盘控制器通常在扇区数据外保存纠错码,用于应对介质缺陷、磁头读写噪声和老化造成的位错误。读取时可以:
- 直接纠正少量错误并返回数据;
- 发现错误但仍可通过重读恢复;
- 多次恢复失败后报告不可恢复读错误。
SSD 还会使用 NAND 闪存控制器中的 ECC、坏块管理、磨损均衡和数据刷新等机制。闪存错误会随擦写次数和保存时间变化,因此控制器需要持续管理,而不只是一次读取时校验。
2. RAID 校验¶
- RAID 1:镜像,通过另一份副本恢复故障数据,核心是冗余复制,不是单纯校验码。
- RAID 5:分布式单校验,常用 XOR。已知其他数据块和校验块时,可恢复一个故障成员的数据。
- RAID 6:双校验,可在一定条件下恢复两个故障成员,常使用 P、Q 两类校验。
RAID 只能解决特定的磁盘故障或块损坏,不等于备份;误删除、勒索、应用错误可能会同步破坏所有副本。
3. Scrubbing¶
存储 scrubbing 会周期性读取数据并校验,提前发现潜在坏块,再利用副本或纠删码修复。它用于降低“长期不读取导致错误积累,最终无法恢复”的风险。
七、网络协议中的“校验”和“恢复”¶
1. 链路层¶
以太网帧通常包含 FCS/CRC。交换机或网卡发现 FCS 不正确时,通常丢弃该帧。链路层的 CRC 主要负责快速检错,不负责直接纠错。
2. 传输层¶
TCP/UDP 校验和用于检测端到端数据损坏;TCP 还结合序列号、确认、超时和重传恢复丢失或损坏的数据。这里要区分:
- 校验和:发现数据损坏;
- 序列号:识别顺序、重复和缺失;
- ACK:确认已收到;
- 重传:通过再次发送完成恢复。
UDP 校验和发现错误后通常由接收端丢弃,是否重传要由应用层设计。
3. 应用层¶
文件下载、对象存储和软件更新常在元数据中保存 MD5、SHA-256 或其他摘要。接收方重新计算摘要并比较,以发现下载不完整或文件损坏。摘要适合完整性校验,但普通哈希不等于纠错,也不天然等于防篡改;对抗主动攻击应使用带密钥的 MAC 或数字签名。
八、纠错编码:无法方便重传时使用¶
1. Hamming¶
适合较短数据块,能通过综合征定位少量错误,常用于内存和基础纠错场景。
2. BCH¶
一类可设计为纠正多个随机错误的循环码,常用于存储和通信系统。
3. Reed-Solomon(RS)¶
以符号而非单个位为基本单位,擅长处理突发错误和整段符号丢失,常见于光盘、二维码、通信和存储。
4. LDPC 与 Turbo¶
通过大量校验关系迭代译码,接近信道容量,常用于无线通信、卫星通信、硬盘或固态存储等高可靠场景。代价是译码计算复杂度较高。
5. 交织(Interleaving)¶
交织本身不是校验码,而是把相邻数据重新排列,使连续突发错误分散到多个码字中,再交给纠错码处理。它常与 RS、Turbo 或 LDPC 配合。
九、哈希、MAC、数字签名:安全完整性校验¶
1. 哈希摘要¶
对任意长度输入生成固定长度摘要。相同数据通常得到相同摘要,数据改变后摘要大概率改变。哈希用于文件完整性、内容寻址和数据结构校验,但不能纠正数据,也不能单独证明是谁生成的。
2. MAC¶
MAC 使用共享密钥生成认证标签。只有持有密钥的一方才能生成有效标签,因此同时提供完整性和来源认证。HMAC 是常见构造。
3. 数字签名¶
发送方用私钥签名,接收方用公钥验证,可验证完整性、来源和不可否认性。数字签名也只负责发现篡改,不负责恢复被修改的数据。
十、易混辨析与答题模板¶
1. 检错不等于纠错¶
奇偶校验、校验和、CRC 通常用于检错;汉明码、ECC、BCH、RS、LDPC 具有纠错能力。TCP 的重传是协议恢复,不是 CRC 自身把错误位改回来。
2. 物理层纠错与链路层检错¶
无线链路常用前向纠错 FEC,在接收端直接尝试恢复;以太网常用 CRC/FCS 检错,错误帧通常被丢弃。具体协议可能同时包含纠错和重传。
3. 校验通过不等于绝对正确¶
有限长度的校验码存在漏检概率;“通过校验”应表述为“未检测到错误”,不要写成“数据一定没有错误”。
4. 记忆框架¶
具体编码参数、能检出/纠正的错误数量和协议字段范围,以题目给出的生成多项式、码长、协议规范或教材定义为准。