HTTP分段下載


現代WEB服務器都支持大文件分段下載,加快下載速度,判斷WEB服務器是否支持分段下載通過返回頭是否有 Accept-Ranges: bytes 字段.分段下載分為兩種,一種就是一次請求一個分段,一種就是一次請求多個分段。下面會一一講解。

請求分段中的一部分

請求頭部添加如下字段,0-1024代表文件最前面的1025個字節
Range: bytes=0-1024

Range字段支持的寫法

Range: bytes=0-1024 獲取最前面1025個字節
Range: bytes=-500   獲取最后500個字節
Range: bytes=1025-  獲取從1025開始到文件末尾所有的字節
Range: 0-0          獲取第一個字節
Range: -1           獲取最后一個字節

請求成功后服務器會返回狀態碼206, 並返回如下字段指示返回結果, 0-1024指示返回分段范圍, 7877指示文件總大小
Content-Range: bytes 0-1024/7877

下面是用curl請求百度首頁圖片前面1025個字節的示例, 可以看到返回長度1025.

請求命令

curl -v --header Range:bytes=0-1024  "http://www.baidu.com/img/bd_logo1.png"

請求頭部

GET /img/bd_logo1.png HTTP/1.1
User-Agent: curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: www.baidu.com
Accept: */*
Range:bytes=0-1024

返回頭部

HTTP/1.0 206 Partial Content
Date: Sun, 06 Sep 2015 07:49:07 GMT
Server: Apache
Last-Modified: Wed, 03 Sep 2014 10:00:27 GMT
ETag: "1ec5-502264e2ae4c0"
Accept-Ranges: bytes
Cache-Control: max-age=315360000
Expires: Wed, 03 Sep 2025 07:49:07 GMT
Content-Type: image/png
Content-Range: bytes 0-1024/7877
Content-Length: 1025
Age: 989

請求分段中的多個部分

請求頭部Range字段需要添加多個范圍
Range: bytes=0-1024,2000-3000

請求成功后同樣返回狀態碼206, 返回的Content-Type字段和請求一部分時不一樣, 其中multipart/byteranges;指示返回的多段請求類型, boundary指示多段內容之間的分割符
Content-Type: multipart/byteranges; boundary="Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222"

同樣我們以請求百度首頁logo圖片為例

請求命令

curl -v --header Range:bytes=0-1024,2000-3000  "http://www.baidu.com/img/bd_logo1.png"

請求頭部

GET /img/bd_logo1.png HTTP/1.1
User-Agent: curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: www.baidu.com
Accept: */*
Range:bytes=0-1024,2000-3000

返回頭部

HTTP/1.0 206 Partial Content
Date: Sun, 06 Sep 2015 07:49:07 GMT
Server: Apache
Last-Modified: Wed, 03 Sep 2014 10:00:27 GMT
ETag: "1ec5-502264e2ae4c0"
Accept-Ranges: bytes
Cache-Control: max-age=315360000
Expires: Wed, 03 Sep 2025 07:49:07 GMT
Content-Type: multipart/byteranges; boundary="Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222"
Content-Length: 2339
Age: 724

返回內容

--Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222
Content-Type: image/png
Content-Range: bytes 0-1024/7877
xxxx前面1025字節內容xxxxx
--Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222
Content-Type: image/png
Content-Range: bytes 2000-3000/7877
xxxx2000-3000中間1001個字節內容字節內容xxxxx
--Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222--

可以看到每段內容包含Content-Type和Content-Range字段, --boundary 表示內容分段, --boundar-- 表示內容結束.如果請求的Range字段范圍超出了文件大小, 則服務器返回406錯誤碼.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM