HTTP状态码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状态码206和416的更多相关文章
- 每天一个 HTTP 状态码 206
206 Partial Content 206 Partial Content 是当客户端请求时使用了 Range 头部,服务器端回复的响应,表示只响应一部分内容. 实例 请求: GET /favor ...
- http 状态码含义
HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码.随着协议的发展,HTTP规范中会定义更多的状态码. 小技巧: 假如你看到一个状态码518, 你并不知道具体51 ...
- Http状态码(转)
什么是Http状态码?(转自http://bbs.tui18.com/thread-11597640-1-1.html) 百度百科上解释为:HTTP状态码(HTTP Status Code)是用以表示 ...
- HTTP状态码分类说明
状态码分类 HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码.随着协议的发展,HTTP规范中会定义更多的状态码. 小技巧: 假如你看到一个状态码518, 你并 ...
- HTTP协议 (六) 状态码详解
HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果 ...
- HTTP协议状态码详解
HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJAX,REST,网络爬虫, ...
- Http报文 状态码
一.HTTP报文 1.HTTP报文介绍 HTTP报文:用于HTTP协议交互的信息. HTTP报文由报文头部和报文主体(非必须)构成,中间由空行来分隔. 1.1 请求报文:客户端发起的报文. 1).报文 ...
- Web开发中常用的状态码
在HtttpServletResponse类中有关于状态码的描述. static int SC_ACCEPTED Status code (202) indicating that a request ...
- HTTP协议6之状态码--转
HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJAX,REST,网络爬虫, ...
随机推荐
- 示例 Edit 关闭键盘再显示
在某一些 Android 的机子上,点入 Edit 显示会键盘,但关闭键盘再点一次 Edit 后,键盘并不会再次显示出来. 实机测试: Sony Xperia ST17i:无法再次显示. Nexus ...
- IOS个人帐号推送证书创建
(IOS个人帐号推送证书制作所有步骤: 可以直接将产品推送证书和开发者推送证书一起制作到一个Identifier帐号下) 一. 首先需要创建一个id:有推送功能的(App ID Suffix)只有它才 ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- 框架SpringMVC笔记系列 二 传值
主题:SpringMVC(第一节中再回顾复习一次) 学习资料参考网址: 1.http://www.icoolxue.com 2.http://haohaoxuexi.iteye.com/blog/13 ...
- MongoDB环境准备
1.安装MongoDB MongoDB的安装非常简单,只需要将下载的MongoDB的压缩文件解压到任意目录,并将其中的bin目录加入到系统的path环境变量中即可 2.启动MongoDB 在启动Mon ...
- angular学习的一些小笔记(中)之基础ng指令
一.布尔属性指令: ng-disabled:就是ng-disabled=true-->就指向不可用 <!doctype html> <html ng-app="&qu ...
- Timeline Portfolio - 时间轴作品集效果
这里分享一个超炫的时间轴展示作品集效果.设计师和前端开发人员可以借助这个效果来制作新颖的作品集和个人简历.时间轴专门用来呈现出年代的一系列事件.您可以把这种效果嵌入各种媒体,包括微博,视频和地图,并把 ...
- Grid – 入门必备!简单易懂的响应式设计指南
如今,人们使用各种各样的移动设备访问网页,设计师们需要去适配不同的屏幕,让用户在都能有最佳的浏览体验.Grid 是一个简单的响应式设计指南,按照这些简单的步骤,你的就能够掌握基础的响应网页设计技巧. ...
- Ajax中get和post使用问题
使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化: 解决方法:在?后面链接一个num=[随机数Math.rando ...
- 《javascript权威指南》读书笔记(连载)
这是一篇很长的博客 终于把权威指南给买回来了,之前一直犹豫,第一:书太厚,怕买了不能坚持看完.第二:觉得太贵,最少100¥.现在实习也能发点工资了,给自己定了一个志愿:把一个月的工资用于买书.这么一想 ...