1. 程式人生 > >關於http斷點續傳那點事

關於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 ,說明伺服器支援按位元組下載。