原理
將文件數(shù)據(jù)按照請求要求,分成一段一段的下載。類似于我們常見的分頁顯示。
斷點(diǎn)續(xù)傳的好處,防止大文件下載過程出現(xiàn)網(wǎng)絡(luò)異常,而前功盡棄。缺點(diǎn)是要發(fā)起多次請求,資源占用大,相對復(fù)雜
參數(shù)說明
請求頭
Range:告知服務(wù)端,客戶端下載該文件想要從指定的位置開始下載,至于 Range 字段屬性值的格式有以下幾種:
Range:bytes=0-500
表示下載從0到500字節(jié)的文件,即頭500個字節(jié) ,[0-500]前閉后閉。0<=range<=500
Range:bytes=501-1000
表示下載從500到1000這部分的文件,單位字節(jié)
Range:bytes=-500
表示下載最后的500個字節(jié)
Range:bytes=500-
表示下載從500開始到文件結(jié)束這部分的內(nèi)容
Range:bytes=500-600,700-1000
表示下載這兩個區(qū)間的內(nèi)容
If-Range:用于判斷實體是否發(fā)生改變,如果實體未改變,服務(wù)器發(fā)送客戶端丟失的部分,否則發(fā)送整個實體.
If-Range 可以使用 Etag 或者Last-Modified 返回的值。當(dāng)沒有 ETag 卻有 Last-modified 時,可以把 Last-modified 作為 If-Range 字段的值。
如果請求報文中的 Etag與服務(wù)器目標(biāo)內(nèi)容的 Etag相等,即沒有發(fā)生變化,那么應(yīng)答報文的狀態(tài)碼為 206。如果服務(wù)器目標(biāo)內(nèi)容發(fā)生了變化,那么應(yīng)答報文的狀態(tài)碼為 200。

響應(yīng)頭
Content-Length:只表示此鏈接中下載的文件大小
Content-Range:用于告知客戶端此鏈接下載的文件是哪個部分的,以及文件的總大小。
Content-Range:bytes 501-1000/2000
#501-100 請求頭里range的值
#2000 文件總大小
#bytes 字節(jié)方式
Last-Modified:表示資源最近修改的時間(分段下載時要注意這個東西,因為如果修改了,分段下載可能就要重新下載了)
ETag:這個響應(yīng)頭表示資源版本的標(biāo)識符,通常是消息摘要(類似MD5一樣)(分段下載時要注意這個東西,或者緩存控制也要注意這個東西)
注意,每種服務(wù)器對生成ETag的算法不同,這個要特別注意 如果使用分布式緩存,要特別要保證每臺服務(wù)器生成的ETag算法是一致的.
緩存的過期,要同時結(jié)合(ETag + Last-Modified)這兩個響應(yīng)頭來判斷.
強(qiáng)ETag
只要實體發(fā)生任何改變,都會改變ETag值.如:
ETag: "1234234234"
弱ETag
它在前面會有個W/,如:
ETag: W/"12342423"
測試
第一次請求Range:bytes=0-12000

從請求信息可以看出我們請求的資源大小是
0-12000的字節(jié)。從響應(yīng)頭信息可以看出
Etag和Last-Modified信息。Content-Range:bytes 0-12000/119319文件大小是119319字節(jié)大小
打開下載的文件。

文件只顯示
0-12000的部分
第二次請求Range:bytes=12001-3600

Etag和Modified的值是沒有變。打開下載的圖片

第三次次請求Range:bytes=5000-66000
這次請求range范圍和前面的有交集,下載內(nèi)容也是交集。

第四次請求Range:bytes=66001-
下載66001及剩下所有數(shù)據(jù)。
