那为什么许多较大的下载最终还要校验文件完整性?
TCP传输过程是可靠的,这里指的一次TCP请求是可靠的,一次请求包含了多个数据包的传输,这个过程是可靠的。但这仅仅保证了这一次TCP请求是可靠的,一次可靠并不能保证整个下载过程是可靠的。下面从几个角度来分析下:
1. 大文件的传输并不都是一次TCP请求可以完成的,通常大文件会分成多次TCP请求通过Range:xxxx-的方式,分块下载的,比如下载中断后继续,并发下载等。下面尝试从浏览器下载一个4G+的Windows操作系统,我故意将网络中断重连了多次,造成了下载断断续续,同时采用网络抓包工具抓了每次的请求,可以看到下载这个文件时使用了多次TCP请求。
2.很多站点的文件会被镜像到多个地址,但是经过多次镜像不能保证与最初的文件是完全一样的,2016年2月20日,一个十分流行的Linux 分发版本 Linux Mint 被黑后植入了后门,这就造成了很多安装这个镜像的用户为他人打开了入侵的后门。3.下载过程中断,比如网络突然断了,浏览器突然死了,或者下载程序突然崩溃了,这时候并不一定都会有错误提示的,因此文件是不完整的,这时可以通过比较文件大小发现的。
4.但有时候下载的文件大小没有问题,并不等同于文件是原始的文件,比如下载过程中的数据被篡改了,或者伪造了,或者连接的中间人网站等。上面的情形都可以通过将下载文件的校验值,与源文件官网给出的校验值比对来发现。