1. 简介

在计算机网络中,数据从一个设备传输到另一个设备时,可能会受到干扰,导致接收端收到的数据与发送端不一致。为了确保数据完整性,CRC(Cyclic Redundancy Check)与 Checksum(校验和)是两种广泛使用的数据校验机制

本文将分别介绍这两种机制的工作原理、优缺点,并通过示例代码与图示帮助你更好地理解它们。

2. 错误类型

数据在传输过程中可能因干扰导致比特位发生变化,错误主要分为两类:

2.1 单比特错误(Single-Bit Error)

指在一个数据字节中,只有一个比特位发生错误

crc 1

2.2 突发错误(Burst Error)

指在一个数据字节中,有多个比特位同时发生错误

crc 2

3. CRC 是什么?

CRC(Cyclic Redundancy Check)是一种基于多项式除法的错误检测机制,用于检测数据在传输过程中是否被意外修改。

术语解释:

  • Cyclic(循环):源于循环码理论
  • Redundancy(冗余):指的是附加在数据末尾的校验位

CRC 的核心思想是:发送方在发送数据前计算一个 CRC 值并附加在数据末尾,接收方对接收的数据进行相同的 CRC 运算,若余数为零则认为数据完整,否则判定为数据出错

3.1 CRC 的工作原理

CRC 基于模 2 除法(Modulo-2 Division)进行运算,其中加法和减法都通过异或(XOR)操作完成。例如:1 + 1 = 0。

发送方在原始数据后追加若干个 0(数量为多项式位数 - 1),然后用这个扩展后的数据除以一个预定义的除数(即多项式对应的二进制数),余数即为 CRC 校验码。

接收方将接收到的数据(含 CRC)再做一次同样的除法运算,若余数为 0,则数据无误。

3.2 发送端的 CRC 计算示例

我们以多项式 x³ + x + 1(二进制表示为 1011)为例,对数据 11010011101100 进行 CRC 计算。

  1. 数据末尾补 3 个 0:11010011101100000
  2. 使用 1011 作为除数进行模 2 除法:
11010011101100000
1011
01100011101100000
 1011
00111011101100000
  1011
00010111101100000
   1011
00000001101100000
       1011
00000000110100000
        1011
00000000011000000
         1011
00000000001110000
          1011
00000000000101000
           1011
00000000000000100

最终余数为 100,这就是 CRC 校验码,附加在原始数据后发送。

3.3 接收端的 CRC 验证示例

接收方收到数据后,将包含 CRC 的完整数据再次进行模 2 除法,如果余数为 0,说明数据未被篡改。

假设收到的数据为 11010011101100100(原始数据 + CRC):

11010011101100100
1011
01100011101100100
 1011
00111011101100100
  1011
...

最终余数为 0,说明数据无误。

如果数据中某位被翻转(如第 15 位由 0 变为 1):

11010011101101100
...
余数为非零值,说明数据被篡改。

4. Checksum 是什么?

Checksum 是另一种用于检测数据完整性的机制。它通过哈希函数将数据映射为一个固定长度的字符串,用于验证数据是否在传输过程中被修改。

常见算法包括:MD5、SHA-1、SHA-256、SHA-512 等。

4.1 如何计算 Checksum?

大多数操作系统和编程语言都提供了 Checksum 的计算工具:

✅ Linux 系统使用 cksum 命令:

cksum filename

✅ PowerShell 中使用 Get-FileHash

Get-FileHash C:\baeldung\Hello.txt

输出如下:

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          45356929829DC9FDED17E755DB91B93C25A4ED3FB9D60D92D4BD1E935A0ECC75       C:\baeldung\Hello.txt

你可以通过 -Algorithm 参数指定使用不同的算法:

Get-FileHash C:\baeldung\Hello.txt -Algorithm SHA512

输出:

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA512          3B6FC410AAC9453DF953A84E806FF789A88549AD35DBB6EA30C832AF32316AC4832... C:\baeldung\Hello.txt

5. CRC 与 Checksum 对比总结

比较维度 CRC Checksum
用途 检测传输过程中的数据错误 验证数据完整性
错误检测能力 支持检测多比特错误(如双比特) 主要检测单比特错误
实现复杂度 使用多项式除法,复杂度较高 使用哈希函数,相对简单
可靠性 数学基础强,可靠性更高 相对较低,容易发生碰撞
应用场景 网络通信、硬件传输 文件完整性校验、软件分发
出现时间 较新,是 Checksum 的改进 早期广泛使用

6. 结语

本文详细介绍了 CRC 与 Checksum 两种数据校验机制的原理、实现方式以及它们之间的区别。

✅ CRC 更适合用于网络传输、硬件通信等对数据完整性要求极高的场景;
✅ Checksum 更适合用于文件校验、数据完整性验证等场景。

⚠️ 选择时应根据实际需求权衡:如果你需要检测多比特错误,CRC 是更好的选择;如果你只需要简单的完整性校验,Checksum 更加轻量高效。


原始标题:CRC Vs Checksum