HTTP 2xx范围内的状态码表明了:"客户端发送的请求已经被服务器接受并且被成功处理了".

TTP/1.1 200 OK是HTTP请求成功后的标准响应

HTTP/1.1 206状态码表示的是:"客户端通过发送范围请求头Range抓取到了资源的部分数据",一般用来

  • 解决大文件下载问题

  • 解决CDN和原始HTTP服务器问题

  • 使用工具例如lftp,wget,telnet测试断电续传

1、如何判断远程服务器是否支持HTTP 206

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

其中有两个我们比较关注的请求头:

Accept-Ranges: bytes - 该响应头表明服务器支持Range请求,以及服务器所支持的单位是字节(这也是唯一可用的单位).我们还能知道:服务器支持断点续传,以及支持同时下载文件的多个部分,也就是说下载工具可以利用范围请求加速下载该文件.Accept-Ranges: none 响应头表示服务器不支持范围请求.

Content-Length: 913  Content-Length响应头表明了响应实体的大小,也就是真实的图片文件的大小是913字节 .

2、如何发送一个range请求头

现在,你知道了该图片所在的服务器支持范围请求,你需要发送一个包含Range请求头的GET请求:

  1. Range: bytes=0-1024

完整的请求数据应该是这样的.首先第一行是:

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

然后需要发送Host请求头来指定请求资源所在的主机和端口号:

  1. Host: static.cnblogs.com

最后是要发送的Range请求头,指定了你想要的字节范围:

  1. Range: bytes=0-1024

a、使用telnet命令

telnet命令允许你使用Telnet协议来与远程主机(服务器)进行通信.所有的类Unix操作系统以及MS-Windows都包含有Telnet客户端.启动Telnet客户端并进入Telnet提示符,要执行命令:

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

想要通过端口号80连接远程服务器static.cnblogs.com,输入:

  1. telnet static.cnblogs.com 80

输出结果为:

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

在本例中,使用范围请求(0-1024 字节)来请求static.cnblogs.com上的/images/icon_form.gif文件

b、使用curl命令

curl命令是一个和远程服务器交换数据的工具.它支持HTTP/FTPSFTP/FILE协议上的范围请求,在下例中,使用两段范围来请求远程文件ifdata-welcome-0.png,然后使用cat命令将两段数据合并成完整文件:

  1. root@iZ25n2yx37sZ:~# curl -v -s --header "Range: bytes=0-2000" http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part1
  2. * About to connect() to images2015.cnblogs.com port 80 (#0)
  3. * Trying 106.2.189.18... connected
  4. > GET /news/24442/201608/24442-20160805112458981-1554012564.jpg HTTP/1.1
  5. > 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
  6. > Host: images2015.cnblogs.com
  7. > Accept: */*
  8. > Range: bytes=0-2000
  9. >
  10. < HTTP/1.1 206 Partial Content
  11. < Server: marco/0.17
  12. < Date: Mon, 22 Aug 2016 14:31:15 GMT
  13. < Content-Type: image/jpeg
  14. < Content-Length: 2001
  15. < Connection: keep-alive
  16. < X-Request-Id: ebeb021b9075223913e28033da978ce5; 6402d8710dc2ba320b03fc7663555a1d
  17. < X-Source: U/200
  18. < ETag: "a7efeb9fca51518501be9e16d064c366"
  19. < Last-Modified: Fri, 05 Aug 2016 03:26:04 GMT
  20. < Expires: Fri, 26 Aug 2016 23:05:26 GMT
  21. < Cache-Control: max-age=656155
  22. < Accept-Ranges: bytes
  23. < Age: 279706
  24. < X-Cache: MISS(S) from mix-bj-pek-106; HIT(R) from ctn-bj-pek2-027
  25. < Content-Range: bytes 0-2000/95164
  26. < 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
  27. <
  28. { [data not shown]
  29. * Connection #0 to host images2015.cnblogs.com left intact
  30. * Closing connection #0

第二部分以及合并

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

还可以使用-r选项(可以同时添加-v选项查看请求头和响应头):

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

3、如何开启Accept-Ranges响应头?

大部分web服务器都原生支持字节范围请求. Apache 2.x用户可以在httpd.conf中尝试mod_headers:

  1. Header set Accept-Ranges bytes

Lighttpd用户尝试在lighttpd.conf中进行下面的配置:

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

4、HTTP 416错误与断点续传

先看下HTTP 416错误代表什么吧?

所请求的范围无法满足 (Requested Range not satisfiable)

 

看了不明觉厉,因为从没遇见过。

##探索 问了下客户端的同学,发现下载使用的是HttpURLConnection,于是Google一下,得到一些关键信息:

  1. HTTP response code: 416是由于读取文件时设置的Range有误造成的,具体的说就是下面这行代码有误:
  2. httpConnection.setRequestProperty("RANGE", "bytes=1024-");
  3. 这个RANGE显然不能超出文件的size

而客户端设置的RANGE为文件大小。

试想,文件存在远程服务器上,如何知道文件大小?

至少要发起两次请求。第一次请求,不需要下载整个文件,只需要获得Response的Content-Length大小;第二次请求,将Content-Length值写进RANGE,实现下载。

  1. root@iZ25n2yx37sZ:~$ curl -v -s --header "Range: bytes=300000-" http://images2015.cnblogs.com/news/24442/201608/24442-20160805112458981-1554012564.jpg -o part2
  2. * About to connect() to images2015.cnblogs.com port 80 (#0)
  3. * Trying 106.2.189.18... connected
  4. > GET /news/24442/201608/24442-20160805112458981-1554012564.jpg HTTP/1.1
  5. > 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
  6. > Host: images2015.cnblogs.com
  7. > Accept: */*
  8. > Range: bytes=300000-
  9. >
  10. < HTTP/1.1 416 Requested Range Not Satisfiable
  11. < Server: marco/0.17
  12. < Date: Mon, 22 Aug 2016 14:44:03 GMT
  13. < Content-Type: text/html; charset=utf-8
  14. < Content-Length: 207
  15. < Connection: keep-alive
  16. < Cache-Control: no-store
  17. < Content-Language: en
  18. < Via: T.18922.R.1, M.ctn-bj-pek2-026
  19. < X-Cache: HIT(R) from ctn-bj-pek2-026
  20. < X-Request-Id: e6817ee753535f32b25e7651400269b7
  21. <
  22. { [data not shown]
  23. * Connection #0 to host images2015.cnblogs.com left intact
  24. * Closing connection #0

造成返回码416的原因,是设置的Range有误。解决办法也很简单,将第一次请求时的Range去掉。

  1. //删掉之后,整个世界都清净了!
  2. 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状态码206和416的更多相关文章

  1. 每天一个 HTTP 状态码 206

    206 Partial Content 206 Partial Content 是当客户端请求时使用了 Range 头部,服务器端回复的响应,表示只响应一部分内容. 实例 请求: GET /favor ...

  2. http 状态码含义

    HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码.随着协议的发展,HTTP规范中会定义更多的状态码. 小技巧: 假如你看到一个状态码518, 你并不知道具体51 ...

  3. Http状态码(转)

    什么是Http状态码?(转自http://bbs.tui18.com/thread-11597640-1-1.html) 百度百科上解释为:HTTP状态码(HTTP Status Code)是用以表示 ...

  4. HTTP状态码分类说明

    状态码分类 HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码.随着协议的发展,HTTP规范中会定义更多的状态码. 小技巧:  假如你看到一个状态码518, 你并 ...

  5. HTTP协议 (六) 状态码详解

    HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果 ...

  6. HTTP协议状态码详解

    HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫, ...

  7. Http报文 状态码

    一.HTTP报文 1.HTTP报文介绍 HTTP报文:用于HTTP协议交互的信息. HTTP报文由报文头部和报文主体(非必须)构成,中间由空行来分隔. 1.1 请求报文:客户端发起的报文. 1).报文 ...

  8. Web开发中常用的状态码

    在HtttpServletResponse类中有关于状态码的描述. static int SC_ACCEPTED Status code (202) indicating that a request ...

  9. HTTP协议6之状态码--转

    HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫, ...

随机推荐

  1. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  2. Erlang垃圾回收机制的二三事

    声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转 ...

  3. Spring面试基本问题(1)

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  4. nginx的pass_proxy遇到的坑

    Pass_proxy走内网,被请求方的php使用remote_addr得到就是转发机器的内网地址,如192.168.10.141这样的.走外网,被请求方php的remote_addr得到就是转发机器的 ...

  5. 【转】推荐介绍几款小巧的Web Server程序

    原博地址:http://blog.csdn.net/heiyeshuwu/article/details/1753900 偶然看到几个小巧有趣的Web Server程序,觉得有必要拿来分享一下,让大家 ...

  6. 使用coding、daocloud和docker打造markdown纯静态博客

    说起独立博客的技术演变,从数据库到纯文本放git是一大进步,从HTML到markdown又是一大进步. 解析技术有没有进步呢?既然markdown是纯文本了,再用PHP/Python/Ruby去实时解 ...

  7. asp.net web常用控件FileUpload(文件上传控件)

    FileUpload控件的主要中能:向指定目录上传文件,该控件包括一个文本框和一个浏览按钮. 常用的属性:FileBytes,FileContent.FileName.HasFile.PostedFi ...

  8. Codrops 实验:使用 Vibrant.js 提取图像颜色

    Codrops 分享了一个有趣的颜色提取实验.这个想法是创建图像的调色板,既有图像本身的潜移默化的影响,也有一些花哨的颜色延伸.通过使用 Vibrant.js 来提取图像中的颜色,并通过 CSS 过滤 ...

  9. 20个免费的 JavaScript 游戏引擎分享给开发者

    这篇文章收集了20个免费的 JavaScript 游戏引擎分享给开发者.这些游戏引擎能够帮助游戏开发人员更快速高效的开发出各种好玩的游戏. 使用 HTML5.CSS3 和 Javascript 可以帮 ...

  10. 优秀工具推荐:两款很棒的 HTML5 游戏开发工具

    HTML5 众多强大特性让我们不需要多么高深技术就能创建好玩的网页游戏,同时证明了开放的 Web 技术能与任何其他在游戏开发中使用的技术竞争.正如标题所说,这篇文章推荐的几款很棒 HTML5 游戏开发 ...