那為什么許多較大的下載最終還要校驗文件完整性?
TCP傳輸過程是可靠的,這里指的一次TCP請求是可靠的,一次請求包含了多個數(shù)據(jù)包的傳輸,這個過程是可靠的。但這僅僅保證了這一次TCP請求是可靠的,一次可靠并不能保證整個下載過程是可靠的。下面從幾個角度來分析下:
1. 大文件的傳輸并不都是一次TCP請求可以完成的,通常大文件會分成多次TCP請求通過Range:xxxx-的方式,分塊下載的,比如下載中斷后繼續(xù),并發(fā)下載等。下面嘗試從瀏覽器下載一個4G+的Windows操作系統(tǒng),我故意將網(wǎng)絡(luò)中斷重連了多次,造成了下載斷斷續(xù)續(xù),同時采用網(wǎng)絡(luò)抓包工具抓了每次的請求,可以看到下載這個文件時使用了多次TCP請求。
2.很多站點的文件會被鏡像到多個地址,但是經(jīng)過多次鏡像不能保證與最初的文件是完全一樣的,2016年2月20日,一個十分流行的Linux 分發(fā)版本 Linux Mint 被黑后植入了后門,這就造成了很多安裝這個鏡像的用戶為他人打開了入侵的后門。3.下載過程中斷,比如網(wǎng)絡(luò)突然斷了,瀏覽器突然死了,或者下載程序突然崩潰了,這時候并不一定都會有錯誤提示的,因此文件是不完整的,這時可以通過比較文件大小發(fā)現(xiàn)的。
4.但有時候下載的文件大小沒有問題,并不等同于文件是原始的文件,比如下載過程中的數(shù)據(jù)被篡改了,或者偽造了,或者連接的中間人網(wǎng)站等。上面的情形都可以通過將下載文件的校驗值,與源文件官網(wǎng)給出的校驗值比對來發(fā)現(xiàn)。