摘录
校验和用于检测数据传输和存储中的意外错误。它充当数字指纹以验证完整性并防止损坏。
当数据在设备之间传输或存储在内存中时,可能会出现错误导致数据损坏。校验和是一种简单的技术,用于检测此类意外错误并保护数据完整性。本博客讨论了校验和的工作原理、不同的校验和算法以及校验和在误差检测中的应用。
校验和简介
校验和是一种计算出的数值,代表着数据块的内容。它就像数据的数字指纹一样。
通过将接收端计算得到的校验和值与原始数据的实际校验和进行比较,校验和可以检测数据传输或存储过程中的错误。任何不匹配都表示数据已损坏。
校验和的工作原理
校验和生成的基本过程如下:
对数据块的二进制值执行算术运算(如加法或乘法)。
将结果截断为一个固定长度,通常是 16 位或 32 位。
截断后的值作为校验和。
例如,对单词"你好"进行校验和:
将’你好’转换为其 ASCII 值:228+189+160+229+165 = 971
将总和 971 截断为 16 位:0000001111000011
这个二进制字符串就是校验和值。
在接收端,再次计算校验和并与原始校验和进行比较,以检测错误。
校验和算法的类型
有不同的校验和算法,使用各种算术运算:
互联网校验和
用于TCP/IP网络。计算简单且快速。对 16 位数据字执行加法。对于常见的位翻转等错误检测能力较差。
循环冗余校验(CRC)
使用多项式除法的强大校验和方法。用于存储设备、文件传输和网络协议。可以检测常见错误和突发错误。比简单的校验和计算更消耗计算资源。
Adler-32 校验和
通过对数据字节及其位置进行求和,使用质数模算术。未检测到错误的概率较低。用于 Zip、PNG 图像格式等。比 CRC 更快,但抗错误性较差。
校验和的应用
在需要数据完整性保证的系统中,校验和是无处不在的:
网络协议
TCP、UDP和 IP 都使用校验和来检测数据包错误。校验和失败会导致丢弃损坏的数据包。
文件传输
像 FTP 这样的协议使用 CRC 校验和来验证成功的文件传输。Torrent 客户端使用校验和来验证已下载文件的完整性。
数据存储
文件系统和RAID阵列使用校验和来检测和恢复磁盘错误。数据库使用校验和来防止由于损坏而导致的崩溃。
校验和的限制
校验和有一些限制:
- 它们只能检测错误,而不能纠正错误。
- 简单的校验和可能无法检测到所有错误。
- 虽然不太可能,但校验和碰撞是可能发生的。
- 错误检测依赖于校验和正确传输或存储。
更高级的错误检测代码,如海明码,克服了其中一些限制。
结论
校验和作为对存储、传输和处理过程中引入的随机数据错误的第一道防线。它通过冗余实现了数据完整性验证。在关键系统中,使用校验和和纠错码提供了对数据损坏的强大保护。