人們下載下傳檔案時斷網重連之後,需要一種可恢複的機制。所謂恢複是指能從之前下載下傳中斷處恢複下載下傳。
要實作該功能需要指定下載下傳的實體範圍。像這樣,指定範圍發送的請求叫做範圍請求(Range Request)。基于範圍請求也可實作多線程分片下載下傳。
隻有雙端(用戶端和伺服器端)都支援HTTP/1.1才能使用範圍請求。
1.範圍請求的請求封包
在HTTP/1.1的請求封包中,有一個首部字段
Range
來指定請求資源的byte範圍。
範圍請求封包示例:
GET /tip.jpg HTTP/1.1
Host: www.baidu.com
Range: bytes =5001-10000
想要繼續下載下傳後邊的位元組在請求頭加
Ranges:bytes=10000-
即可。
byte範圍指定形式如下:
- 5001-10000:指定開始和結束的範圍
- 5001- :指定開始區間,表示從5001位元組之後的所有内容
- -3000:指定結束區間,表示從一開始到3000位元組
- -3000, 5001-:表示多重範圍
2.範圍請求的響應封包
針對範圍請求,通過響應頭
Accept-Ranges:bytes
表示目前資源支援範圍請求,響應會傳回狀态碼為
206 Partial Content
的響應封包。針對請求封包中的Range字段,響應封包中也又響應的字段
Content-Range
來标記響應的實體内容範圍。
範圍請求的響應封包示例:
HTTP/1.1 206 Partial Content
Date: Fri, 13 Jul 2019 17:38:17 GMT
Content-Range: bytes 5001-10000/10000
Content-Length: 5000
Content-Type: image/jpeg
Content-Range
字段的格式如上,首先表示機關是byte,然後表明本次響應的實體長度,和所請求資源的總長度,上例則表示本次響應了從5001到10000位元組的圖檔,該圖檔的總大小為10000位元組。而
Content-Length
表示的是此次響應的實體内容長度。
另外,對于多重範圍請求,響應會在首部字段
Content-Type
标明
multipart/byteranges
後傳回響應封包。
如果伺服器不安無法響應範圍請求,則會傳回狀态碼200 OK和完整的實體内容。
3.請求失效
在下載下傳檔案時暫停,繼續時從頭開始。可能時http請求失效了,也有可能是所請求的資源在這個過程中發生了變化,比如背景開發者更新了這個圖檔。如果下載下傳的過程中伺服器端資源更新了,而下載下傳的URL沒有變,如果能夠繼續下載下傳,下載下傳完成之後就可能出現兩部分不能正确拼接的錯誤情況。
在HTTP協定中,響應封包可以通過
ETag
字段或者
Last-Modified
字段辨別資源是否更新。請求封包則使用
If-Range
字段把
ETag
字段或者
Last-Modified
字段的内容複制即可。
如果兩次操作都是同一個資源,則傳回206,并繼續後續操作。否則則傳回200,重新開始下載下傳。
範圍請求流程圖如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB10MBRVT1kEROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL2QTMxUjNzMjM5IjMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(部分内容參考《圖解HTTP》和https://www.cnblogs.com/plokmju/p/http_range.html)