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