转:http range 用法与说明
转:
http://www.cnblogs.com/Googler/archive/2010/08/19/1803700.html
HTTP RANGE
Range,是在 HTTP/1.1(http://www.w3.org/Protocols/rfc2616/rfc2616.html)里新增的一个 header field,也是现在众多号称多线程下载工具(如 FlashGet、迅雷等)实现多线程下载的核心所在。
Range 的规范定义如下:
ranges-specifier = byte-ranges-specifier
byte-ranges-specifier = bytes-unit “=” byte-range-set
byte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )
byte-range-spec = first-byte-pos “-” [last-byte-pos]
first-byte-pos = 1*DIGIT
last-byte-pos = 1*DIGIT
(RFC2616 里充斥着这种形式的定义,一开始觉得挺乱,后来习惯了就发现其实挺科学,挺好理解的:))
值得注意的就是 byte-range-set 是一个 byte-range 的集合,所以在实际请求中完全可能会出现如下这种形式:
Range: bytes=123-567,789-
这个数据区间是个闭合区间,起始值是 0,所以“Range: bytes=0-1”这样一个请求实际上是在请求开头的 2 个字节。
byte-range-spec 里的 last-byte-pos 可以省略,代表从 first-byte-pos 一直请求到结束位置。其实 first-byte-pos 也是可以省略的,只不过就不叫 byte-range-spec 了,而是叫 suffix-byte-range-spec,规范如下:
suffix-byte-range-spec = “-” suffix-length
suffix-length = 1*DIGIT
比如“Range: bytes=-200”,它不是表示请求文件开始位置的 201 个字节,而是表示要请求文件结尾处的 200 个字节。
如果 byte-range-spec 的 last-byte-pos 小于 first-byte-pos,那么这个 Range 请求就是无效请求,server 需要忽略这个 Range 请求,然后回应一个 200 OK,把整个文件发给 client。
如果 byte-range-spec 里的 first-byte-pos 大于文件长度,或者 suffix-byte-range-spec 里的 suffix-length 等于 0,那么这个 Range 请求被认为是不能满足的,server 需要回应一个 416 Requested range not satisfiable。
server 除了要能理解 Range 请求之外,在回应 client 时还要使用 Content-Range 来告诉 client 他到底发送了多少数据,Content-Range 的规范定义如下:
Content-Range = “Content-Range” “:” content-range-spec
content-range-spec = byte-content-range-spec
byte-content-range-spec = bytes-unit SP byte-range-resp-spec “/” ( instance-length | “*” )
byte-range-resp-spec = (first-byte-pos “-” last-byte-pos) | “*”
instance-length = 1*DIGIT
详尽的细枝末节就不在这里记述了,举个例子说明一下,比如某文件的大小是 1000 字节,client 请求这个文件时用了 “Range: bytes=0-500”,那么 server 应该把这个文件开头的 501 个字节发回给 client,同时回应头要有如下内容:
Content-Range: bytes 0-500/1000
Range 请求的一些注意事项:
1) 不支持 Range 请求的 server 要用“Accept-Ranges: none”对 client 表明心意;server 也可以主动告诉 client “Accept-Ranges: bytes”,但是 client 也可以在没有收到这个指示的前提下向 server 发 Range 请求。
2) byte-range-set 中的区间可以是“有洞”的,也可以是部分重叠的
3) 单区间的 byte-range-set 正常回应就可以了,但是多区间 byte-range-set 需要 server 使用 multipart/byterange 来回应
Range头域
Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
转:http range 用法与说明的更多相关文章
- Python基础学习Day4 列表的使用方法、range 用法、in用法
一.列表 1.1列表:python基础数据类型之一:其他语言也有列表的概念,js 数组,可索引 ,可切片,可加步长 1.2列表的索引,切片,切片+ 步长 结果: 注意:列表里元素的数据类型,就是它本身 ...
- python之变量的数据类型(2)list 、 tuple 及range用法
一.变量的数据类型(2) 1.list 类型 列表的特点: 列表是一个可变的数据类型 列表由[]来表示, 每一项元素使用逗号隔开. 列表什么都能装. 能装对象的对象. 列表可以装大量的数据 列表的索引 ...
- 转 python range 用法
详细记录python的range()函数用法 使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的 ...
- python基础-range用法_python2.x和3.x的区别
#range帮助创建连续的数字,通过设置步长来指定不连续 python2.7 #直接就在内存中创建出来(0-99) >>> range(100)[0, 1, 2, 3, 4, 5, ...
- day5 range 用法示例
函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: ...
- python range用法
1. range(n) 相当于枚举 从0<=i<n的整数 增量为1 for i in range(4): print(i) 结果:0 1 2 3 2. range(5,10) 相当于枚举 ...
- ABAP range 用法
转自http://www.sapjx.com/abap-range-table.html 1. Range Table 概述 Range Table 为 SAP R/3系统标准内表的一种,结构与 Se ...
- Python3---常见函数---range()用法
0X01函数说明: python range() 函数可创建一个整数列表,一般用在 for 循环中. 0X02函数语法: range(start,stop[,step]) start: 计数从 sta ...
- range用法(倒序取值)
range(4,-1,-1) #倒数取值 ''' start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: 计数到 stop 结束,但 ...
随机推荐
- 新浪SAE数据库信息wordpress设置(用户&密码&主地址)
新浪SAE数据库信息wordpress设置(用户&密码&主地址) 此账号仅能在SAE平台上使用,不能从外部连接我们建议开发者使用SaeMysql操作数据库如果您想自己实现数据库相关操作 ...
- ActiveMQ简介与安装
开源消息总线 支持JMS1.1和J2EE 1.4规范的 JMS Provider实现(持久化,XA消息,事务) 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去 支持 ...
- 理解MFC 文档、视图、框架[转]
理解文档/视图框架 出处.雷神 了解文档和视图的相互作用关系是编写MFC程序的基本功.但是MFC的应用程序框架把文档和视图之间 ...
- DeleteDC() 与 ReleaseDC() 的区别 [转]
DeleteDC 该函数删除指定的设备上下文环境(DC). 原型: BOOL DeleteDC(HDC hdc): 参数: hdc:设备上下文环境的句柄. 返回值: 成功,返回非零值:失败,返回零.调 ...
- 解决从内部存储设备安装apk提示Permission Denied
做应用商店,下载apk,考虑一种情况,如果没有sd卡的情况下就将apk下载到 Internal Cache目录下. 下载都正常,但是在安装的时候提示Permission Denied /data/da ...
- linux 压缩与解压缩
tar 命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可 ...
- 博客标题栏增加一个"闪存“按钮
最近来博客园喜欢去闪存上看看,也就是一个类似微博的东西,但是貌似没看到哪里有这个按钮. 所以只要自己动手搞一个. 暴力猴js: // ==UserScript== // @name fwindpeak ...
- 理解C++ static
1.为什么设计static?考虑下面的需求: 在程序运行过程中,在一个范围内,有一个对象大家共享,而且可以多次使用,状态能够保持,对象的生命周期一直持续到程序运行结束. 2.静态对象要分配在全局数据区 ...
- discuz+ecmall+phpcms整合
所需软件 discuzx1.5 (包含ucenter1.5) ecmall2.3 phpcms v9.5 1.先安装discuz1.5 2.然后安装ecmall2.3 3.最后安装phpcms v9. ...
- 如何进行js动态生成option?如何实现二级连动?
何为二级连动? 首先要明白什么是二级连动!顾名思义,就是一个动,另外一个也跟着一起动 看下面的例子: 这里有一个“市级”的选择列表框,还有一个“县级”的选择列表框,如果“市级”的选择列表框中的值发现变 ...