转: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

时间: 2024-11-03 14:29:21

转:http range 用法与说明的相关文章

python 3 range用法

pytho range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); end: 计数到 end 结束,但不包括 end.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5 step:步长,默认为1.例如:range(0, 5) 等价于 range(0, 5, 1) range(10)

ABAP range 用法

转自http://www.sapjx.com/abap-range-table.html 1. Range Table 概述 Range Table 为 SAP R/3系统标准内表的一种,结构与 Selection Table 一致,由 SIGN, OPTION, LOW 和 HIGH字段组成: 可以通过 TYPE RANGE OF 语句或 RANGES 关键字定义 Range Table. Range Table 常用于Open SQL语句中的条件筛选,可以优化取数效率与程序性能. 2.定义R

golang之range用法

range表达式迭代语法 range在go中主要是用来做迭代用的,它可以迭代:array,slice,string,map,channel.但是在迭代的过程中有些注意事项是需要牢记的,否则在实际使用过程中可能出现和你预期不符合的问题,而且很难排插到. 语法 0. var  x Type :x = range expresstion 1. x := range expression 2. x,y := range expression range 右侧的expresstion,它可以是数组,指向数

一入python深似海--range()与for

range用法 使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节. 这里记录一下: range(1,5)#代表从1到5(不包含5) [1,2,3,4] range(1,5,2)#代表从1到5,间隔2(不包含5) [1,3] range(5)#代表从0到5(不包含5) [0,1,2,3,4] 再看看list的操作: array= [1,2,5,3,6,8,4] #其实这里的顺序标识是 [1,2,5,3,6,8,4] (0,1,2,3,4,5,

python学习笔记之-for循环

for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次. 基本构造是 for 元素 in 序列: statement 举例来说,我们编辑一个叫forDemo.py的文件 for a in [3,4.4,'life']: print a 这个循环就是每次从表[3,4.4,'life'] 中取出一个元素(回忆:表是一种序列),然后将这个元素赋值给a,之后执行隶属于for的操作(print). 介绍一个新的Python函数range(),来帮助你建立表. idx = range(5)

关于bootstrap的datepicker在meteor应用中的使用(不包含bootstrap框架)

1.安装bootstrap3-datepicker包 meteor add rajit:bootstrap3-datepicker 2.使用方法 Example In your handlebars template: <input type="text" class="form-control" id="my-datepicker"> In client-side JS code: Template.mytemplate.rende

三、python运算符

1 /和//的区别:/结果保留小数,例如5/3=1.666   而5//3=1 2 *和**:算术运算中,第一个代表乘,第二个代表幂.再字符串操作中,第一个代表拼接多少个相同字符串,第二个类似,见如下代码: var = 2*3 print(var) #输出6 var =2**3 print(var) #输出8 var = 'hello' print(var*2) #输出hellohello print(str(var)**3) #不可以这样使用 3 python中的三种控制流语句,if for

Python基础06 循环

Python基础06 循环 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 循环用于重复执行一些程序块.从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系.循环也会用到类似的写法. for循环 for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次. 基本构造是 for 元素 in 序列: statement 举例来说,我们编辑一个叫forDemo.py的文件 for a in [3,4.4,

Jieba分词包(三)——基于词频最大切分组合

Jieba分词包(三)--基于词频最大切分组合 在前面,我们已经知道dict中所有的单词和词频信息已经存在了一个trie树中,并且需要分词的句子已经构建成了一个DAG图,构建的过程也运用了dict.那么这次我们来说如何基于每句话的DAG图,找到一个组合路径,使得该组合最合理(即打分最高)? 我们直接针对Jieba分词的源代码来解释,其中已经有了很多注释: def calc(sentence,DAG,idx,route): #动态规划,计算最大概率的切分组合 #输入sentence是句子,DAG句