首页IT科技HTTP Range说明 lenoval的专栏 博客频道 CSDN.NET

HTTP Range说明 lenoval的专栏 博客频道 CSDN.NET

时间2025-09-16 18:41:58分类IT科技浏览4847
导读:分类: ASP.NET 2010-01-04 14:27 363人阅读 评论(0 收藏 举报 Range ...

分类:

ASP.NET

2010-01-04 14:27 363人阅读 评论(0) 收藏 举报

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-99
声明:本站所有文章                ,如无特殊说明或标注                         ,均为本站原创发布                。任何个人或组织        ,在未征得本站同意时        ,禁止复制                         、盗用        、采集        、发布本站内容到任何网站                         、书籍等各类媒体平台        。如若本站内容侵犯了原著者的合法权益                         ,可联系我们进行处理                         。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
linux卸载ntp命令(umount.nfs命令 – 卸载NFS文件系统) 用电视写代码(电视剧里的代码真能运行吗?)