查看原文
其他

tcp的传输过程是可靠的,那为什么许多较大的下载最终还要校验文件完整性?

张彦飞allen 开发内功修炼 2022-06-23

大家好,我是飞哥!

前几天我在知乎上回答过一个问题,这个问题问的比较有意思。我回答了一下,收获的赞还不少,所以今天分享给大伙儿。

虽然是tcp的传输过程是可靠的,但确实在大文件下载的时候还是应该校验一下的。飞哥总结的原因有如下几个:

1)TCP 的可靠传输就是保证在传送丢失或者是包校验和出错的时候重传,但 crc 校验只能大概判断一下,并不能保证数据 100% 正确。

2)传输层协议只保证传输过程的校验。假如发送方进程在部分数据还没有发送的时候,进程崩溃了,或者断点续传的时候断点计算漏了。这时候数据还没有进入到传输层,整体上也就无法保证了。

3)传输过程中我们的包要经过很多复杂的环境,在 HTTP 时代,中间的某个环节的运营商出于利益驱使完全是有能力修改传输的数据的(运营商劫持,当然现在 HTTPS 的广泛应用使得这种情况已经好多了。

4)tcp 接收方传输层的 ack 确认其实只是确认的接收方的内核正确地收到了。这时候用户进程有没有收到其实不一定。假如用户进程还没来得及接收,进程崩溃了。或者读取内核中的数据时候发生了极低概率的内存翻转等错误,或者是说接收正确,但是写硬盘的时候出错了。

以上这些这些错误都是所谓可靠的 tcp 所无法照顾到的场景。

总之,tcp 可靠是有一定的局限范围的,在应用中有各种各样的错误无法靠传输过程的可靠来解决。所以,大文件下载都是需要最终在校验一遍完整性的。

本问题牵涉到网络包的收发,相关技术点可以参考飞哥之前这两篇深度解析的文章。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存