Http 协议中的Range请求头例子
来源:互联网 发布:java数据库接口开发 编辑:程序博客网 时间:2024/05/05 07:12
【原文地址:http://emacsist.github.io/2015/12/29/Http-协议中的Range请求头例子/】
HTTP 请求头 Range
请求资源的部分内容(不包括响应头的大小),单位是byte,即字节,从0开始.
如果服务器能够正常响应的话,服务器会返回 206 Partial Content
的状态码及说明.
如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK
.(这个要注意,要分段下载时,要先判断这个)
比如:类似下面的
➜ /tmp curl -H "Range: bytes=0-10" http://127.0.0.1:8180/bg-upper.png -v* Hostname was NOT found in DNS cache* Trying 127.0.0.1...* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)> GET /bg-upper.png HTTP/1.1> User-Agent: curl/7.35.0> Host: 127.0.0.1:8180> Accept: */*> Range: bytes=0-10>< HTTP/1.1 206 Partial Content* Server Apache-Coyote/1.1 is not blacklisted< Server: Apache-Coyote/1.1< Accept-Ranges: bytes< ETag: W/"3103-1435633968000"< Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT< Content-Range: bytes 0-10/3103< Content-Type: image/png< Content-Length: 11< Date: Tue, 29 Dec 2015 09:18:36 GMT<�PNG* Connection #0 to host 127.0.0.1 left intact➜
响应头就是 HTTP/1.1 206 Partial Content
Range 请求头格式
Range: bytes=start-end
例如:
Range: bytes=10-
:第10个字节及最后个字节的数据
Range: bytes=40-100
:第40个字节到第100个字节之间的数据.
注意,这个表示[start,end],即是包含请求头的start及end字节的,所以,下一个请求,应该是上一个请求的[end+1, nextEnd]
响应头
Content-Range
Content-Range: bytes 0-10/3103
这个表示,服务器响应了前(0-10)个字节的数据,该资源一共有(3103)个字节大小。
Content-Type
Content-Type: image/png
表示这个资源的类型
Content-Length
Content-Length: 11
表示这次服务器响应了11个字节的数据(0-10)
Last-Modified
Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT
表示资源最近修改的时间(分段下载时要注意这个东西,因为如果修改了,分段下载可能就要重新下载了)
ETag
ETag: W/"3103-1435633968000"
这个响应头表示资源版本的标识符,通常是消息摘要(类似MD5一样)(分段下载时要注意这个东西,或者缓存控制也要注意这个东西)
注意,每种服务器对生成ETag的算法不同,这个要特别注意 如果使用分布式缓存,要特别要保证每台服务器生成的ETag算法是一致的.
缓存的过期,要同时结合(ETag + Last-Modified)这两个响应头来判断.
强ETag
只要实体发生任何改变,都会改变ETag值.如:
ETag: "1234234234"
弱ETag
它在前面会有个 W/
,如:
ETag: W/"12342423"
分段下载
利用这个特点,我们可以使用分段下载(多线程下载,分布式下载)
思想:先请求一个 HEAD
方法的请求,获取总文件大小:
HEAD 请求
➜ /tmp curl -X HEAD http://127.0.0.1:8180/bg-upper.png -v* Hostname was NOT found in DNS cache* Trying 127.0.0.1...* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)> HEAD /bg-upper.png HTTP/1.1> User-Agent: curl/7.35.0> Host: 127.0.0.1:8180> Accept: */*>< HTTP/1.1 200 OK* Server Apache-Coyote/1.1 is not blacklisted< Server: Apache-Coyote/1.1< Accept-Ranges: bytes< ETag: W/"3103-1435633968000"< Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT< Content-Type: image/png< Content-Length: 3103< Date: Tue, 29 Dec 2015 10:16:16 GMT<* transfer closed with 3103 bytes remaining to read* Closing connection 0curl: (18) transfer closed with 3103 bytes remaining to read➜ /tmp
那个响应头的 Content-Length
就是总字节大小了(3103)字节.
多线程下载
假设分2条线程
线程1 下载
3103 / 2 = 1551➜ /tmp curl -H "Range: bytes=0-1551" http://127.0.0.1:8180/bg-upper.png -v -o 0-1151.png* Hostname was NOT found in DNS cache* Trying 127.0.0.1... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)> GET /bg-upper.png HTTP/1.1> User-Agent: curl/7.35.0> Host: 127.0.0.1:8180> Accept: */*> Range: bytes=0-1551>< HTTP/1.1 206 Partial Content* Server Apache-Coyote/1.1 is not blacklisted< Server: Apache-Coyote/1.1< Accept-Ranges: bytes< ETag: W/"3103-1435633968000"< Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT< Content-Range: bytes 0-1551/3103< Content-Type: image/png< Content-Length: 1552< Date: Tue, 29 Dec 2015 10:19:43 GMT<{ [data not shown]100 1552 100 1552 0 0 1376k 0 --:--:-- --:--:-- --:--:-- 1515k* Connection #0 to host 127.0.0.1 left intact➜ /tmp
这样子,线程1就下载了(0-1551)字节的数据了.
线程2 下载
➜ /tmp curl -H "Range: bytes=1552-3103" http://127.0.0.1:8180/bg-upper.png -v -o 1552-end.png* Hostname was NOT found in DNS cache* Trying 127.0.0.1... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)> GET /bg-upper.png HTTP/1.1> User-Agent: curl/7.35.0> Host: 127.0.0.1:8180> Accept: */*> Range: bytes=1552>< HTTP/1.1 416 Requested Range Not Satisfiable* Server Apache-Coyote/1.1 is not blacklisted< Server: Apache-Coyote/1.1< Accept-Ranges: bytes< Content-Range: bytes */3103< Content-Type: text/html;charset=utf-8< Content-Language: en< Content-Length: 954< Date: Tue, 29 Dec 2015 10:26:18 GMT<{ [data not shown]100 954 100 954 0 0 457k 0 --:--:-- --:--:-- --:--:-- 931k* Connection #0 to host 127.0.0.1 left intact➜ /tmp
合并
cat 0-1151.png 1552-end.png > filename.png
这样子就OK了.
HTTP 请求头注意
根据HTTP规范,HTTP的消息头部的字段名,是不区分大小写的.
3.2. Header Fields
Each header field consists of a case-insensitive field name followed
by a colon (“:”), optional leading whitespace, the field value, and
optional trailing whitespace.
- Http 协议中的Range请求头例子
- Http Range请求头格式
- Http协议头 Range、Content-Range分析
- Http文件断点下载(Http请求头的Range字段)
- Http/1.1协议 Content-Range头 用于http断点续传
- 有关http协议中的请求头和响应头 各个单词的含义
- HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头
- HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头
- HTTP协议及其请求头分析
- Servlet--获取Http协议请求头信息
- http协议学习-请求头Request Headers
- Http头 Range、Content-Range
- Http头 Range、Content-Range
- 【HTTP协议】HTTP请求、请求头、HTTP响应、状态吗、响应头、使用响应头编程
- 获取http协议请求行、请求头、请求转发
- HTTP协议(请求行、请求头、请求体)详解
- HTTP Range头域
- HTTP Range头域
- java反射使用
- c#网页请求模拟登陆中遇到的bug
- JPA入门例子(采用JPA的hibernate实现版本) .
- JavaScript-闭包(Closure)浅谈
- 也谈如何获取真实正确的 Windows 系统版本号
- Http 协议中的Range请求头例子
- 新手小白求解
- HDU1754-I Hate It
- C语言的make和Makefile
- zigbee技术
- android 年、月、日、时、分 时间获取
- MySQL EXPLAIN
- 2017 WHUWT Day3 (Div. 2) (贪心 DP //待更新
- IOCP相关梳理