常见校验方法
0. CRC校验(Cyclic Redundancy Check)
基本原理:
- 生成多项式:选择一个固定的多项式,称为生成多项式。这个多项式定义了CRC计算的方式。在实际应用中,这个多项式通常表示为一个二进制数。
- 数据处理:在原始数据后附加足够的0,其数量通常等于生成多项式的阶数。例如,如果多项式是8位长,就会附加8个0。
- 模二除法:将修改后的数据通过模二除法(除法操作中,加法和减法替换为异或操作)除以生成多项式。这种除法不涉及借位和进位。
- 计算校验和:除法的余数就是CRC校验和。这个校验和是通过原始数据和生成多项式计算得到的,然后将其作为错误检测的标志附加到数据末尾。
应用:
- 网络通信:在网络层如Ethernet(以太网)和其他许多类型的网络通信协议中,CRC用于保证数据包在网络传输过程中的完整性。数据包的接收方可以通过计算接收到的数据包的CRC来检测是否发生了传输错误。
- 数据存储:在数据存储设备如硬盘驱动器、固态硬盘和USB闪存驱动器中,CRC用于确保数据写入过程中没有错误发生。任何由于硬件故障、电磁干扰或软件缺陷引起的数据损坏都可以通过CRC检测到。
- 文件校验:软件下载或文件传输时,CRC可以用来验证文件的完整性。下载或接收文件后,用户可以执行CRC校验来确认文件是否在传输过程中被篡改或损坏。
- 实时系统:在实时数据传输如串行通信和无线通信系统中,CRC检测可以快速地发现错误,并要求数据重传,这对于保持数据传输的可靠性至关重要。
CRC异或运算的基本概念:
异或运算(XOR)是一种二进制运算,遵循以下规则:
- 相同为0(1 XOR 1 = 0 和 0 XOR 0 = 0)
- 不同为1(1 XOR 0 = 1 和 0 XOR 1 = 1)
在CRC计算中,我们利用这个运算来检测数据中的变化(错误)。生成多项式定义了这种检测的模式。
CRC校验的推演过程:
假设我们的输入数据是8位:1001 1100
(即0x9C),我们的任务是计算这个数据的4位CRC。
初始化和准备数据:
- 使用生成多项式:
0011
(即0x3) - 初始CRC设置为:
0000
- 数据左移4位(为CRC计算腾出位置):
1001 1100 0000
- 使用生成多项式:
- 逐位处理: 我们将从最高位开始逐位处理数据。这里,我们将数据的每一位与CRC的最高位(逐步生成)进行比较和处理。
第一轮处理(最高位):
- 当前CRC:
0000
,左移一位:0000 0
- 当前数据最高位:
1
- 异或结果(CRC最高位与数据最高位):
0 XOR 1 = 1
- 由于结果为1,我们需要将当前CRC(已左移的)与生成多项式
0011
进行异或:00000 XOR 0011 = 0011
- 当前CRC:
接下来的每一步都类似:
- 对于每一位,都重复“左移、比较、根据需要异或生成多项式”的过程。
最终CRC:
- 经过全部数据位的处理后,剩余在CRC寄存器中的4位即为最终的CRC结果。
示例:
我们来逐步看几个步骤的计算,仅考虑最初几个数据位的处理:
- 初始数据:
1001 1100 0000
,初始CRC:0000
处理第1位:
- CRC左移:
00000
(额外位考虑) - 异或操作(因为1 XOR 0 = 1):
00000 XOR 0011 = 0011
- CRC左移:
处理第2位:
- CRC左移:
00110
- 异或操作(因为0 XOR 1 = 1):
00110 XOR 0011 = 0001
- CRC左移:
处理第3位:
- CRC左移:
00010
- 不需要异或(因为0 XOR 0 = 0)
- CRC左移:
这个过程会持续直到所有的数据位都被处理过。最终的CRC值是在最后四位中产生的,这就是我们附加到原始数据后面的CRC校验码。
1. 校验和(Checksum)
- 基本原理:计算数据中所有字节的总和,通常采用模运算(如模256)来确保校验和的值在一个固定的范围内(如0到255)。接收方计算接收到的数据的校验和,与发送方发送的校验和进行比对。
- 应用:校验和广泛用于文件传输和数据通信,如TCP/IP协议栈中的UDP协议就使用简单的校验和来检测数据错误。
2. 奇偶校验(Parity Check)
- 基本原理:添加一个额外的奇偶校验位,以使得带有校验位的字节中1的个数为奇数(奇校验)或偶数(偶校验)。奇偶校验通常用于检测单比特错误。
- 应用:奇偶校验在串行通信和计算机内存中很常见,是最简单的错误检测编码。
3. LRC(纵向冗余校验)
- 基本原理:计算数据块中每一列(按位计算)的奇偶校验,生成一个校验字节。LRC是一种错误检测技术,用于校验数据块的完整性。
- 应用:LRC常用于银行卡磁条数据的传输校验。
4. MD5和SHA家族(散列函数)
- 基本原理:虽然不是传统意义上的“校验”,散列函数生成一个数据的固定长度的摘要或散列值。这些散列值通常用于验证数据的完整性,任何微小的数据变化都会导致散列值的显著变化。
- 应用:散列函数在安全传输、文件校验和数据完整性验证中非常重要。MD5、SHA-1和SHA-256是最常用的散列算法。
5. 互联网校验和(Internet Checksum)
- 基本原理:一种特定的校验和方法,用于在互联网协议(IP)、传输控制协议(TCP)和用户数据报协议(UDP)等互联网通信协议中检测数据的完整性和正确性。
- 应用:该校验和广泛应用于互联网数据包的错误检测。
6. 文件完整性校验码(例如: Adler-32)
- 基本原理:Adler-32是一种比CRC32更快但检错能力稍弱的校验和算法,主要计算数据的和以及这些和的和。
- 应用:常用于某些文件传输协议中,比如在zlib压缩库中广泛使用。