tcp的传输过程是可靠的,那为什么许多较大的下载最终还要校验文件完整性?
2023-06-13 09:11:41 时间
大家好,我是飞哥!
前几天我在知乎上回答过一个问题,这个问题问的比较有意思。我回答了一下,收获的赞还不少,所以今天分享给大伙儿。
虽然是tcp的传输过程是可靠的,但确实在大文件下载的时候还是应该校验一下的。飞哥总结的原因有如下几个:
1)TCP 的可靠传输就是保证在传送丢失或者是包校验和出错的时候重传,但 crc 校验只能大概判断一下,并不能保证数据 100% 正确。
2)传输层协议只保证传输过程的校验。假如发送方进程在部分数据还没有发送的时候,进程崩溃了,或者断点续传的时候断点计算漏了。这时候数据还没有进入到传输层,整体上也就无法保证了。
3)传输过程中我们的包要经过很多复杂的环境,在 HTTP 时代,中间的某个环节的运营商出于利益驱使完全是有能力修改传输的数据的(运营商劫持),当然现在 HTTPS 的广泛应用使得这种情况已经好多了。
4)tcp 接收方传输层的 ack 确认其实只是确认的接收方的内核正确地收到了。这时候用户进程有没有收到其实不一定。假如用户进程还没来得及接收,进程崩溃了。或者读取内核中的数据时候发生了极低概率的内存翻转等错误,或者是说接收正确,但是写硬盘的时候出错了。
以上这些这些错误都是所谓可靠的 tcp 所无法照顾到的场景。
总之,tcp 可靠是有一定的局限范围的,在应用中有各种各样的错误无法靠传输过程的可靠来解决。所以,大文件下载都是需要最终在校验一遍完整性的。
本问题牵涉到网络包的收发,相关技术点可以参考飞哥之前这两篇深度解析的文章。
相关文章
- SPPS下载保姆级安装教程
- tcp和udp的区别和使用场景_TCP跟UDP有什么不同
- TCP三次握手图_tcp为什么三次握手
- tcp rst报文_TCP报文格式
- LabVIEW 2018软件下载和安装教程
- Photoshop 2021正式版更新,附全系列下载
- 软件|Adobe Acrobat Pro DC 2022最新版安装包下载及安装教程
- VMware软件下载,好用的虚拟机软件VMware中文版电脑下载安装
- Redis RPM包安装:快速、简单和安全(redisrpm下载)
- 端口开放Linux 检测TCP端口开放情况的实现(linux判断tcp)
- Linux查看TCP连接数的命令行技巧(linux查看tcp连接数)
- 分享MySQL安装包:从百度云上轻松下载(mysql安装包百度云)
- MySQL数据库表:快速下载(mysql数据库表下载)
- 探索Linux下TCP编程的无限可能(linux的tcp编程)
- MySQL远程连接的TCP协议研究(mysql协议tcp)
- 学会使用FTP命令,Linux下载上传不是问题!(ftp命令linux)
- 深入理解Linux下的TCP协议栈(linux tcp协议栈)
- Linux 下NC命令TCP连接实例(linux nc tcp)
- Linux如何断开TCP连接(linux断开tcp连接)
- Linux如何关闭TCP连接(linux关闭tcp连接)
- Linux下TCP流量转发技术研究(linux tcp 转发)
- MSSQL远程访问:TCP端口号码确定(mssql端口 tcp)
- 使用TCP协议探测Redis连接状态(tcp查看redis连接)
- 轻松下载最新版MySQLMySQL官网提供最新稳定版本下载资源(mysql下载最新版)
- 学习MySQL 这里是57版本的下载教程(mysql下载教程5.7)
- 深入探讨Oracle中的TCP协议的特点(oracle tcp格式)