为什么在下载文件时比较校验和是好的做法?

提供下载ISO文件的网站通常会提供这些文件的md5校验和,我们可以使用这些校验和来确认文件已经正确下载,并且没有被破坏。

为什么这是必要的? 当然TCP的纠错属性是足够的。 如果一个数据包没有被正确接收,它将被重新发送。 TCP / IP连接的本质不是保证数据完整性吗?

可能有几十个理由为什么我们应该检查md5sum,但有几个出现在我的脑海里:

  • 恶意活动 – 您的ISO可能在从服务器上的路上被篡改
  • 页面本身是伪造的(最好也有md5sums签名:))
  • 损坏的下载(尽pipeTCP错误更正)(检查了这一点 )
  • ISO烧毁不正确

无论如何,这只需要几秒钟。

正如其他人所指出的那样,在传输层的任何校验和都无法帮助的情况下,数据损坏的可能性很大,例如在发送端计算校验和之前腐败已经发生,MITM拦截并修改stream(数据也是如此作为校验和),在validation接收端的校验和之后发生腐败等。

如果我们忽视所有这些其他的可能性,并关注TCP校验和本身的细节,以及它在validation数据完整性方面的实际作用,则会发现这个校验和的属性在检测错误方面并不全面。 这种校验algorithm的select方式反映了速度与时间段(20世纪70年代后期)相结合的要求。

这是如何计算TCP校验和 :

校验和:16位

校验和字段是头部和文本中所有16位字的补码和的16位补码。 如果一个段包含校验和的奇数个头和文本字节,则最后一个八位字节在右边用零填充以形成一个16位字用于校验和。 垫没有传输作为部分的一部分。 在计算校验和时,校验和字段本身被replace为零。

这意味着,以这种方式总结数据时,任何损坏都不会被察觉。 对于数据来说,有许多types的腐败,但这只是一个微不足道的例子:改变16位字的顺序总是不被发现。

在实践中,它捕获了许多典型的错误,但完全不能保证完整性。 L2层如何进行完整性检查(例如,以太网帧的CRC32)也有所帮助,尽pipe仅用于本地链路上的传输,并且许多数据损坏的数据甚至不会传递到TCP堆栈。

在确保数据完整性方面,使用强散列或优选密码签名validation数据是完全不同的级别。 这两者甚至可以媲美。

TCP / IP确保数据完整性*。 但是并不能保证100%的文件已被下载。 可能有很多原因,为什么会发生这种情况。 例如:你可以挂载一个在中间某个地方丢失一个或两个字节的ISO文件。 直到您需要一个或两个损坏的特定文件时,才会有问题。 比较校验和可确保您确实下载了整个文件。

*见评论

TCP校验和只有16位。 这意味着在没有其他校验和的情况下,每65536个被破坏的数据包中将有一个被认为是未损坏的。 例如,如果您通过嘈杂的链接下载8GB的DVD映像,其损坏率为1%,那么您预计会有81个无法察觉的损坏的数据包。

MD5是一个更大的校验和,在128位。 那些与原来产生相同校验和的81包的几率约为十亿分之一十亿。

validation通过HTTP下载的文件的校验和有几个原因:

  • 确保您收到整个文件
    • 某些客户端(例如Firefox )可能会将中断的连接视为成功的下载,而将截断的文件留给您,但声称已下载成功
  • 确保您收到了正确的文件
    • 例如一辆越野车,受损或恶意的服务器可能会给你另外的东西
    • 有人可能会篡改传输(中间人攻击) – 即使HTTPS从此不安全,如果您的系统受到例如Superfish的危害,或者使用的encryption方法很弱
    • 他们也可能只是给你一个虚假的下载页面,所以你甚至没有连接到真正的服务器(但在这种情况下,如果你从同一个假服务器获得它们,校验和将不会有多大帮助)
    • 由于各种原因1 ,有些ISP被注入Javascript页面, 取决于如何实施,它可能会破坏一些文件下载
    • 镜像可能托pipe了文件的过时版本,或者pipe理员可能上传了错误的文件
  • 确保文件没有被TCP无法检测到的东西损坏
    • 例如文件可能在服务器上被损坏,所以TCP将只确保已经损坏的文件在传输中没有被进一步破坏
    • 或者在到达目的地后,可能会由于错误的内存/磁盘,错误的文件系统驱动程序等而损坏
    • TCP校验和只有16位,所以机会是不是天文数字(65536中的1),一个损坏的数据包将不会被检测
  • 使用ISO,确保光盘正确刻录

1来源评论,因为哈哈代表

丹尼尔,取决于你所使用的ISO下载工具。 如果是说Firefox ..它可能会显示文件下载。 但是,您可能没有完整的ISO。 如果你刻录它然后尝试使用它,信息可能会丢失。 这在不同的托pipe文件的networking服务器上时有发生。

至less比较文件大小(总字节数或位数)确保它们匹配是一个好习惯。 Windows将显示不同的文件字节数,然后说Linux。 MD5总和检查将显示相同的值不pipe哪个操作系统使用。 希望这有助于一点。 干杯…

我注意到很多有趣的答案,但还有最后一件事要考虑: 两个将军的问题

两个将军问题和拜占庭将军问题特别考虑了通过不可靠渠道可靠传递信息的意义。

校验和只是“增加可靠性”的另一个层面,而失败几率很小。 这就是它如此受欢迎的原因。