天天看點

HTTP範圍請求

​ 人們下載下傳檔案時斷網重連之後,需要一種可恢複的機制。所謂恢複是指能從之前下載下傳中斷處恢複下載下傳。

​ 要實作該功能需要指定下載下傳的實體範圍。像這樣,指定範圍發送的請求叫做範圍請求(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,重新開始下載下傳。

範圍請求流程圖如下:

HTTP範圍請求

(部分内容參考《圖解HTTP》和https://www.cnblogs.com/plokmju/p/http_range.html)