關於http斷點續傳那點事
一、斷點續傳
所謂斷點續傳,即在檔案傳輸過程中,由於主動或者被動原因中斷了傳輸過程。下一次重新建立連線,不需要從頭開始繼續下載。這個流程就可以稱之為斷點續傳。
斷點續傳流程可以歸納為:將任務(一個檔案或壓縮包)人為的劃分為一個或多個部分,每一個部分採用一個執行緒進行上傳/下載,如果碰到網路故障,可以從已經上傳/下載的部分開始繼續上傳/下載未完成的部分,而沒有必要從頭開始上傳/下載。
二、斷點續傳的用途
有時使用者上傳/下載檔案需要歷時數小時,萬一線路中斷,不具備斷點續傳的 HTTP/FTP 伺服器或下載軟體就只能從頭重傳,比較好的 HTTP/FTP 伺服器或下載軟體具有斷點續傳能力,允許使用者從上傳/下載斷線的地方繼續傳送,這樣大大減少了使用者的煩惱。
常見的支援斷點續傳的上傳/下載軟體:QQ 旋風、迅雷、快車、電驢、酷6、土豆、優酷、百度視訊、新浪視訊、騰訊視訊、百度雲等。
在 Linux/Unix 系統下,常用支援斷點續傳的 FTP 客戶端軟體是 lftp。
三、Range & Content-Range
HTTP1.1 協議(RFC2616)開始支援獲取檔案的部分內容,這為並行下載以及斷點續傳提供了技術支援。它通過在 Header 裡兩個引數實現的,客戶端發請求時對應的是 Range ,伺服器端響應時對應的是 Content-Range。
Range
用於請求頭中,指定第一個位元組的位置和最後一個位元組的位置,一般格式:
Range:(unit=first byte pos)-[last byte pos]
Range 頭部的格式有以下幾種情況:
Range: bytes=0-499 表示第 0-499 位元組範圍的內容
Range: bytes=500-999 表示第 500-999 位元組範圍的內容
Range: bytes=-500 表示最後 500 位元組的內容
Range: bytes=500- 表示從第 500 位元組開始到檔案結束部分的內容
Range: bytes=0-0,-1 表示第一個和最後一個位元組
Range: bytes=500-600,601-999 同時指定幾個範圍
Content-Range
用於響應頭中,在發出帶 Range 的請求後,伺服器會在 Content-Range 頭部返回當前接受的範圍和檔案總大小。一般格式:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
例如:
Content-Range: bytes 0-499/22400
0-499 是指當前傳送的資料的範圍,而 22400 則是檔案的總大小。
HTTP/1.1 200 Ok(不使用斷點續傳方式)
HTTP/1.1 206 Partial Content(使用斷點續傳方式)
四、如何驗證伺服器支援 斷點續傳呢?
執行如下指令:
curl -I --range 0-9 http://www.baidu.com/img/bdlogo.gif
響應如下:
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Cache-Control: max-age=315360000
Connection: Keep-Alive
Content-Length: 10
Content-Range: bytes 0-9/1575
Content-Type: image/gif
Date: Mon, 22 Oct 2018 07:09:17 GMT
Etag: "627-4d648041f6b80"
Expires: Thu, 19 Oct 2028 07:09:17 GMT
Last-Modified: Fri, 22 Feb 2013 03:45:02 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: Apache
Set-Cookie: BAIDUID=6D311DFAA45F7ED39571527EC3A6F50F:FG=1; expires=Tue, 22-Oct-19 07:09:17 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
注意到:
能夠找到 Content-Range,則表明伺服器支援斷點續傳。
有些伺服器還會返回 Accept-Ranges,輸出結果 Accept-Ranges: bytes ,說明伺服器支援按位元組下載。
一些重要欄位含義剖析:Etag、Last-Modified、If-Range 可以參考: https://www.cnblogs.com/findumars/p/5745345.html
相關文章
- js關於物件那點事JS物件
- http斷點續傳原理:http頭 Range、Content-RangeHTTP斷點
- 關於 Flex 的那點事兒Flex
- 【幣乎】關於 KEY 那點事
- 基於tcp的http應用,斷點續傳,範圍請求TCPHTTP斷點
- 關於 Grid 佈局的那點事兒
- 微信圈圈 - 關於微信那點事
- 資料壓縮傳輸與斷點續傳那些事兒斷點
- 關於實時推送系統的那點事
- 斷點續傳教學例子斷點
- 上傳——斷點續傳之理論篇斷點
- 關於阿里雲多活容災的那點事阿里
- 12. 斷點續傳的原理斷點
- scp實現斷點續傳---rsync斷點
- C# HTTP實現斷點續傳客戶端和服務端C#HTTP斷點客戶端服務端
- 上傳——斷點續傳之實踐篇斷點
- Android斷點續傳下載器JarvisDownloaderAndroid斷點JAR
- Java實現檔案斷點續傳Java斷點
- 關於蘋果企業開發者賬號那點事蘋果
- php 學習筆記之關於時區的那點事PHP筆記
- 前端筆記之JavaScript(三)關於條件判斷語句、迴圈語句那點事前端筆記JavaScript
- 大檔案上傳、斷點續傳、秒傳、beego、vue斷點GoVue
- 佈局那點事
- 前端加密那點事前端加密
- 作用域那點事
- 遞迴那點事遞迴
- Android Activity那點事Android
- Java synchronized那點事Javasynchronized
- Flutter FocusNode 焦點那點事-(一)Flutter
- OSS網頁上傳和斷點續傳(STSToken篇)網頁斷點
- 1. 大檔案上傳如何斷點續傳斷點
- 斷點續傳瞭解一下啊?斷點
- JAVA編寫的斷點續傳小程式Java斷點
- 使用Visual C#實現斷點續傳C#斷點
- 使用curl斷點續傳下載檔案斷點
- 【GoLang 那點事】gRPC 攔截器那點事,希望幫到你(六)GolangRPC
- Java斷點續傳(基於socket與RandomAccessFile的簡單實現)Java斷點randomMac
- 前端筆記之JavaScript(五)關於陣列和字串那點事前端筆記JavaScript陣列字串