歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> HTTP狀態碼206和416,狀態206和416

HTTP狀態碼206和416,狀態206和416

日期:2017/3/6 9:21:44   编辑:學習Linux

HTTP狀態碼206和416,狀態206和416


HTTP狀態碼206和416,狀態206和416


HTTP 2xx范圍內的狀態碼表明了:"客戶端發送的請求已經被服務器接受並且被成功處理了".

TTP/1.1 200 OK是HTTP請求成功後的標准響應

HTTP/1.1 206狀態碼表示的是:"客戶端通過發送范圍請求頭Range抓取到了資源的部分數據",一般用來

  • 解決大文件下載問題

  • 解決CDN和原始HTTP服務器問題

  • 使用工具例如lftp,wget,telnet測試斷電續傳

1、如何判斷遠程服務器是否支持HTTP 206

root@iZ25n2yx37sZ:~# curl -I http://static.cnblogs.com/images/icon_form.gif
HTTP/1.1 200 OK
Server: Tengine
Content-Type: image/gif
Content-Length: 913
Connection: keep-alive
Date: Mon, 22 Aug 2016 03:30:54 GMT
Cache-Control: public,max-age=86400
Accept-Ranges: bytes
ETag: "6821606d29bce1:0"
Last-Modified: Fri, 15 Feb 2013 03:06:19 GMT
Via: cache22.l2cm9-1[0,304-0,H], cache48.l2cm9-1[0,0], kunlun9.cn3[0,200-0,H], kunlun8.cn3[0,0]
Age: 38765
X-Cache: HIT TCP_MEM_HIT dirn:11:775286164
X-Swift-SaveTime: Mon, 22 Aug 2016 03:34:29 GMT
X-Swift-CacheTime: 86400
Timing-Allow-Origin: *
EagleId: d38a7a8814718754198854631e

其中有兩個我們比較關注的請求頭:

Accept-Ranges: bytes - 該響應頭表明服務器支持Range請求,以及服務器所支持的單位是字節(這也是唯一可用的單位).我們還能知道:服務器支持斷點續傳,以及支持同時下載文件的多個部分,也就是說下載工具可以利用范圍請求加速下載該文件.Accept-Ranges: none 響應頭表示服務器不支持范圍請求.

Content-Length: 913 Content-Length響應頭表明了響應實體的大小,也就是真實的圖片文件的大小是913字節 .

2、如何發送一個range請求頭

現在,你知道了該圖片所在的服務器支持范圍請求,你需要發送一個包含Range請求頭的GET請求:

Range: bytes=0-1024

完整的請求數據應該是這樣的.首先第一行是:

GET /images/misc/static/2012/11/ifdata-welcome-0.png HTTP/1.1 

然後需要發送Host請求頭來指定請求資源所在的主機和端口號:

Host: static.cnblogs.com

最後是要發送的Range請求頭,指定了你想要的字節范圍:

Range: bytes=0-1024 

a、使用telnet命令

telnet命令允許你使用Telnet協議來與遠程主機(服務器)進行通信.所有的類Unix操作系統以及MS-Windows都包含有Telnet客戶端.啟動Telnet客戶端並進入Telnet提示符,要執行命令:

telnet your-server-name-here www
telnet your-server-name-here 80

想要通過端口號80連接遠程服務器static.cnblogs.com,輸入:

telnet static.cnblogs.com 80 

輸出結果為:

root@iZ25n2yx37sZ:~# telnet static.cnblogs.com 80
Trying 211.138.122.237...
Connected to static.cnblogs.com.w.alikunlun.com.
Escape character is '^]'.
GET /images/icon_form.gif HTTP/1.1
Host: static.cnblogs.com
Range: bytes=0-1024

在本例中,使用范圍請求(0-1024 字節)來請求static.cnblogs.com上的/images/icon_form.gif文件

b、使用curl命令

curl命令是一個和遠程服務器交換數據的工具.它支持HTTP/FTPSFTP/FILE協議上的范圍請求,在下例中,使用兩段范圍來請求遠程文件ifdata-welcome-0.png,然後使用cat命令將兩段數據合並成完整文件:

root@iZ25n2yx37sZ:~# curl -v -s  --header "Range: bytes=0-2000" http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part1
* About to connect() to images2015.cnblogs.com port 80 (#0)
*   Trying 106.2.189.18... connected
> GET /news/24442/201608/24442-20160805112458981-1554012564.jpg HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: images2015.cnblogs.com
> Accept: */*
> Range: bytes=0-2000
> 
< HTTP/1.1 206 Partial Content
< Server: marco/0.17
< Date: Mon, 22 Aug 2016 14:31:15 GMT
< Content-Type: image/jpeg
< Content-Length: 2001
< Connection: keep-alive
< X-Request-Id: ebeb021b9075223913e28033da978ce5; 6402d8710dc2ba320b03fc7663555a1d
< X-Source: U/200
< ETag: "a7efeb9fca51518501be9e16d064c366"
< Last-Modified: Fri, 05 Aug 2016 03:26:04 GMT
< Expires: Fri, 26 Aug 2016 23:05:26 GMT
< Cache-Control: max-age=656155
< Accept-Ranges: bytes
< Age: 279706
< X-Cache: MISS(S) from mix-bj-pek-106; HIT(R) from ctn-bj-pek2-027
< Content-Range: bytes 0-2000/95164
< Via: T.77102.S.1, T.088.M.1, T.088.M.2, V.cache_img_92, S.mix-bj-pek-108, V.mix-bj-pek-106, T.18922.R.1, M.ctn-bj-pek2-027
< 
{ [data not shown]
* Connection #0 to host images2015.cnblogs.com left intact
* Closing connection #0

第二部分以及合並

curl  --header "Range: bytes=0-2000" http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part1
curl  --header "Range: bytes=2001-" http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part2
cat part1 part2 >> test1.png

還可以使用-r選項(可以同時添加-v選項查看請求頭和響應頭):

curl -r 0-2000 http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part1
curl -r 2001-" http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part2
cat part1 part2 >> test1.png

3、如何開啟Accept-Ranges響應頭?

大部分web服務器都原生支持字節范圍請求. Apache 2.x用戶可以在httpd.conf中嘗試mod_headers:

Header set Accept-Ranges bytes

Lighttpd用戶嘗試在lighttpd.conf中進行下面的配置:

## enabled for all file types ##
server.range-requests = "enable"
## But, disable it for pdf files ##
$HTTP["url"] =~ "\.pdf$" {
    server.range-requests = "disable"
}

4、HTTP 416錯誤與斷點續傳

先看下HTTP 416錯誤代表什麼吧?

所請求的范圍無法滿足 (Requested Range not satisfiable)

 

看了不明覺厲,因為從沒遇見過。

##探索 問了下客戶端的同學,發現下載使用的是HttpURLConnection,於是Google一下,得到一些關鍵信息:

HTTP response code: 416是由於讀取文件時設置的Range有誤造成的,具體的說就是下面這行代碼有誤:
httpConnection.setRequestProperty("RANGE", "bytes=1024-");
這個RANGE顯然不能超出文件的size

而客戶端設置的RANGE為文件大小。

試想,文件存在遠程服務器上,如何知道文件大小?

至少要發起兩次請求。第一次請求,不需要下載整個文件,只需要獲得Response的Content-Length大小;第二次請求,將Content-Length值寫進RANGE,實現下載。

root@iZ25n2yx37sZ:~$ curl -v -s  --header "Range: bytes=300000-" http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part2
* About to connect() to images2015.cnblogs.com port 80 (#0)
*   Trying 106.2.189.18... connected
> GET /news/24442/201608/24442-20160805112458981-1554012564.jpg HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: images2015.cnblogs.com
> Accept: */*
> Range: bytes=300000-
> 
< HTTP/1.1 416 Requested Range Not Satisfiable
< Server: marco/0.17
< Date: Mon, 22 Aug 2016 14:44:03 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 207
< Connection: keep-alive
< Cache-Control: no-store
< Content-Language: en
< Via: T.18922.R.1, M.ctn-bj-pek2-026
< X-Cache: HIT(R) from ctn-bj-pek2-026
< X-Request-Id: e6817ee753535f32b25e7651400269b7
< 
{ [data not shown]
* Connection #0 to host images2015.cnblogs.com left intact
* Closing connection #0

造成返回碼416的原因,是設置的Range有誤。解決辦法也很簡單,將第一次請求時的Range去掉。

//刪掉之後,整個世界都清淨了!
conn.setRequestProperty("Range", "bytes=" + startPosition);// startPosition=0

討論 下載地址是CDN地址,莫非CDN不支持斷點續傳?

恰好相反,416正是支持斷點續傳的標志。服務器得到一個Range之後,需要對它的取值進行檢驗,包括:

開始位置非負

結束位置需要大於開始位置

開始位置需要小於文件長度減一 (因為這裡的位置索引是從0開始的)

若結束位置大於文件長度減一,則需要把它的值設置為文件長度減一

  

參考文章

http://spetacular.github.io/2015/01/30/http-code-416-and-download.html
http://www.checkupdown.com/status/E416_cn.html
http://blog.csdn.net/zollty/article/details/9176829
http://www.pureweber.com/article/resumable-download
http://emacsist.github.io/2015/12/29/Http-%E5%8D%8F%E8%AE%AE%E4%B8%AD%E7%9A%84Range%E8%AF%B7%E6%B1%82%E5%A4%B4%E4%BE%8B%E5%AD%90/
http://blog.csdn.net/zollty/article/details/9176829/

http://xxxxxx/Linuxjc/1152145.html TechArticle

Copyright © Linux教程網 All Rights Reserved