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

原文链接:https://www.cnblogs.com/jhj117/p/5462794.html

http range 用法与说明相关推荐

  1. Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  2. for in在python中什么意思_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  3. python for i in range(len())_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  4. python中for in range的用法_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  5. python中 for i in range(10)_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  6. java range对象_Java LocalTime range()用法及代码示例

    LocalTime类的range()方法用于获取最小值和最大值形式的字段范围,并将该字段作为参数传递给此方法.此方法的返回值是该字段的ValueRange对象,并且该方法仅对LocalTime对象支持 ...

  7. java range(10)_Java Year range()用法及代码示例

    Year类的range()方法用于获取最大值和最小值的字段范围,并将该字段作为参数传递给此方法.此方法的返回值是该字段的ValueRange对象,并且该方法仅对Year对象支持的那些字段返回Value ...

  8. mysql range用法_MySQL中Explain的用法总结(详细)

    本篇文章给大家带来的内容是关于MySQL中Explain的用法总结(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 执行计划(query Execution plan) 语法e ...

  9. python中range用法

    作用: 可以快速的生成一个特定范围的数字列表,但是他生成的数据类型并不是列表类型!只是和列表类似而已,生成一串整型数字. content1=range(0,5,1) print(type(conten ...

  10. python range step_python range用法

    Python range() 函数用法 python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法range(start, stop[, step]) 参数说明: st ...

最新文章

  1. 川崎机器人示教盒维修_专业维修丹阳市KUKA库卡KRC2库卡C4主板维修{苏州罗韦维修}...
  2. SunlightChain 区块链宣言
  3. Nutanix CE on Lenovo W520 初探
  4. [转]Asp.NET生成静态页面并分页
  5. 怎样快速查看文档是否统一_开发到底喜欢看怎样的需求文档
  6. Windows Internals 笔记——关联性
  7. Ubuntu16.04 换阿里源
  8. BZOJ 2157: 旅游
  9. C++中public protected private的区别
  10. 使用Java 8进行分组,转换和归约
  11. Tomcat提示Null component
  12. mysql聚簇索引 和主键的区别_[MySQL] innoDB引擎的主键与聚簇索引
  13. 2018 NLPCC Chinese Grammatical Error Correction 论文小结
  14. win7 下安装python用的dlib库
  15. nuxtjs+express+vue2+vuex搭建的服务端渲染(SSR)个人网站项目
  16. 【紫书第十章】数论与概率入门
  17. 如何自己开发FreeCAD的宏插件
  18. Win11添加新的Microsoft Teams集成:共享屏幕变得更容易
  19. 分站php源码,企业网站管理系统云优CMS v2.0.5 分站版
  20. 【第一章】google guava 之 Joiner学习

热门文章

  1. log4j的ConversionPattern参数的格式含义(转)
  2. Python-二维码处理(qrcode、pyzbar)
  3. 论文:Representative Forgery Mining for Fake Face Detection
  4. [转载]修丕勋与林占令
  5. Ubuntu16.04(64位)安装chrome浏览器
  6. JDBC学习笔记(六)
  7. java 监听单选按钮_JRadioButton(单选按钮)添加事件监听
  8. pytorch版Mask RCNN
  9. laravel图片和文件的上传
  10. Hadoop读书笔记(四)HDFS体系结构