提供 ISO 文件供下载的网站通常会提供这些文件的 md5 校验和,我们可以使用它来确认文件已正确下载,并且没有损坏。
为什么这是必要的?当然,TCP 的纠错特性就足够了。如果数据包没有被正确接收,它将被重新传输。TCP/IP 连接的本质难道不能保证数据完整性吗?
Kon*_*ski 20
为什么应该检查 md5sum 可能有无数个原因,但我想到了几个原因:
无论如何,它只需要几秒钟。
Håk*_*ist 20
正如其他人所指出的那样,数据损坏的可能性有很多,传输层的任何校验和都无济于事,例如在发送端计算校验和之前已经发生损坏,MITM 拦截和修改流(数据以及作为校验和),在接收端验证校验和后发生损坏等。
如果我们忽略所有这些其他可能性,而专注于TCP 校验和本身的细节以及它在验证数据完整性方面的实际作用,那么就检测错误而言,该校验和的属性根本不全面。选择这种校验和算法的方式反映了对速度与时间段(1970 年代后期)相结合的要求。
这是怎样的TCP校验和计算公式为:
校验和:16 位
校验和字段是标题和文本中所有 16 位字的补码和的 16 位补码。如果一个段包含奇数个要校验和的报头和文本八位字节,最后一个八位字节在右边用零填充以形成一个 16 位字用于校验和目的。填充不作为段的一部分传输。在计算校验和时,校验和字段本身被替换为零。
这意味着在以这种方式对数据求和时平衡的任何损坏都不会被检测到。这将允许对数据进行多种类型的损坏,但仅举一个简单的例子:更改 16 位字的顺序将始终无法检测到。
在实践中,它捕获了许多典型的错误,但根本不保证完整性。L2 层如何进行完整性检查(例如以太网帧的 CRC32)也有帮助,尽管仅用于本地链路上的传输,而且许多损坏的数据甚至从未传递到 TCP 堆栈。
就确保数据完整性而言,使用强散列或最好是加密签名来验证数据处于完全不同的水平。两者几乎不能相提并论。
TCP/IP 确实保证数据完整性*。但它不能保证 100% 的文件已被下载。发生这种情况的原因可能有很多。例如:您可能会挂载一个在中间某处丢失一两个字节的 ISO。除非您需要一两个已损坏的特定文件,否则您不会遇到问题。比较校验和确保您确实下载了整个文件。
* 见评论
TCP 校验和只有 16 位。这意味着,在没有其他校验和的情况下,每 65536 个损坏的数据包中有一个将被视为未损坏。例如,如果您通过嘈杂的链接以 1% 的损坏率下载 8GB 的 DVD 映像,那么您会期望有 81 个无法检测到的损坏数据包。
MD5 是一个更大的校验和,为 128 位。这 81 个数据包产生与原始校验和相同的数据的几率约为 1,000,000,000,000,000,000,000,000,000,000,000 中的 1。
验证通过 HTTP 下载的文件的校验和有多种原因:
评论中有1 个来源,因为大声笑代表