跳转至

计算机中的错误校验

错误校验用于判断数据在存储、传输或处理过程中是否发生了错误;部分方法还能定位并纠正错误。核心区分是:

  • 检错(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 除以生成多项式 → 得到余数 → 附在数据后发送
接收端:完整数据除以同一生成多项式,检查余数

模 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

磁盘控制器通常在扇区数据外保存纠错码,用于应对介质缺陷、磁头读写噪声和老化造成的位错误。读取时可以:

  1. 直接纠正少量错误并返回数据;
  2. 发现错误但仍可通过重读恢复;
  3. 多次恢复失败后报告不可恢复读错误。

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. 记忆框架

1
2
3
4
5
6
7
奇偶校验:最简单,检查 1 的奇偶性
校验和:分组运算,简单通用
CRC:多项式除法,链路层检错强
汉明/ECC:定位并纠正少量位错误
RAID/副本:用冗余数据恢复故障块
FEC:不依赖重传,接收端直接纠错
哈希/MAC/签名:验证完整性,重点在安全属性

具体编码参数、能检出/纠正的错误数量和协议字段范围,以题目给出的生成多项式、码长、协议规范或教材定义为准。