基於範圍請求 能夠實現 斷點續傳和多線程分片下載html
HTTP/1.1以後才支持,須要雙端都支持 服務器
服務端頭信息中有 Accept-Ranges:bytes 代表服務器支持範圍請求多線程
curl -I "http://www.gnu.org/software/gettext/manual/gettext.html" HTTP/1.1 200 OK Date: Sat, 08 Sep 2018 14:31:38 GMT Server: Apache/2.4.7 Access-Control-Allow-Origin: (null) Accept-Ranges: bytes Vary: Accept-Encoding Cache-Control: max-age=0 Expires: Sat, 08 Sep 2018 14:31:38 GMT Content-Length: 1408775 Content-Type: text/html Content-Language: en
範圍請求:curl
http code 返回 206 Partial Contentpost
客戶端請求頭:Content-Range: bytes 0-1408774/1408775url
start-end/content-lengthspa
end 最大爲 content-length - 1, start 從0開始, 包括開始和結束值,超過範圍有可能返回 HTTP 416 Range Not Satisfiable ,有的服務器會自動修正線程
Range 還有幾種不一樣的方式來限定範圍,能夠根據須要靈活定製: 1. 500-1000:指定開始和結束的範圍,通常用於多線程下載。 2. 500- :指定開始區間,一直傳遞到結束。這個就比較適用於斷點續傳、或者在線播放等等。 3. -500:無開始區間,只意思是須要最後 500 bytes 的內容實體。 4. 100-300,1000-3000:指定多個範圍,這種方式使用的場景不多,瞭解一下就行了
範圍請求示例:code
範圍請求須要在head中增長 Range: bytes=0-10htm
curl -I -r 0-100 "http://www.gnu.org/software/gettext/manual/gettext.html"
或
curl -H "Range: bytes=0-10" http://www.gnu.org/software/gettext/manual/gettext.html
HTTP/1.1 206 Partial Content Date: Sat, 08 Sep 2018 14:28:04 GMT Server: Apache/2.4.7 Access-Control-Allow-Origin: (null) Accept-Ranges: bytes Vary: Accept-Encoding Cache-Control: max-age=0 Expires: Sat, 08 Sep 2018 14:28:04 GMT Content-Range: bytes 0-100/1408775 # 本次返回內容的 開始-結束/總長度 Content-Length: 101 #本次返回的總長度 Content-Type: text/html Content-Language: en
資源變化
有時下載的過程當中資源能夠能已經發生變化了這時就須要從新下載, 能夠經過 ETag 或者 Last-Modified 來標識當前資源是否變化
ETag:當前文件的一個驗證令牌指紋,用於標識文件的惟一性。
Last-Modified:標記當前文件最後被修改的時間。
只須要在頭信息中傳入 etag或 Last-Modified的值,若果資源沒有發生變化會繼續返回206,不然返回200,此時須要從新下載
If-Range: xxx
If-Range 必須與 Range 配套使用。若是沒有 Range,那麼 If-Range 就會被忽略。
若是服務器不支持 If-Range,那麼 Range 也會被忽略。
Etag(Entity Tags)主要爲了解決 Last-Modified 沒法解決的一些問題。
一、某些文件週期性改變,但內容沒變,只是時間變了
二、某些文件改變很是頻繁(1s變化n次),後者只能夠精確到秒
三、某些服務器不能精確獲得文件的修改時間