HTTP Range规范(RFC7233)
允许服务器基于客户端的请求只发送响应包体的一部分给到客户端,而客户端自动将多个片断的包体组合成完成的体积更大的包体
- 支持断点续传
- 支持多线程下载
- 支持视频播放器实时拖动
服务器通过Accept-Range头部表示是否支持Range请求
- Accept-Range头部表示是否支持Range请求
- Accept-Ranges: bytes 支持
- Accept-Ranges: none 不支持
Range请求范围的单位
基于字节,设包体总长度为10000
- 第1个500字节:bytes=0-499
- 第2个500字节
- bytes=500-999
- bytes=500-600,601-999
- bytes=500-700,601-999
- 最后1个500字节
- bytes=-500
- bytes=9500-
- 仅要第1个和最后一个字节:bytes=0-0,-1
- 要500字节之后的字节:bytes=500-
Range条件请求
If-RangeHTTP 请求报头使得范围请求的条件:如果条件被满足,该范围的请求将被发出,并且服务器发送回一个206Partial Content与适当的身体的答案。如果条件未满足,则会返回具有200OK状态的完整资源。
这个头文件可以与Last-Modified验证器一起使用,也可以与一个ETag,但不与两者一起使用。
最常见的用例是恢复下载,以确保自从收到最后一个片段后,存储的资源未被修改。
- 如果客户端已经得到了Range响应的一部分,并想在这部分响应未过期的情况下,获取其他部分的响应
- 常与If-Unmodified-Since或者If-Match头部共同使用
- If-Range = entity-tag / HTTP-date
- 可以使用Etag或者Last-Modified
指令
唯一表示请求资源的实体标记。它是位于双引号(像 “675af34563dc-tr34”)之间的一串 ASCII 字符,可以加前缀W/以表示应使用弱比较算法。 “星期一”,“星期二”,“星期三”,“星期二“,”星期五“,”星期六“或”太阳“(区分大小写)。 2位数日期编号,例如”04“或”23“。 ,“Mar”,“Apr”,“May”,“Jun”,“Jul”,“Aug”,“Sep”,“Oct”,“Nov”,“Dec”(区分大小写)例如“1990”或“2016”。<小时> 2位数的小时数,例如 “09”GMT
格林威治标准时间。HTTP 日期总是以 GMT 表示,从不以本地时间表示。例子
If-Range: Wed, 21 Oct 2015 07:28:00 GMT
- 可以使用Etag或者Last-Modified