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

服务器响应

206 Partial Content

image.png

416 Range Not Satisfiable

  • 请求范围不满足实际资源的大小,其中Content-Range中的complete-length显示完整响应的长度例如

    • Content-Range: bytes */1234

      200 OK

  • 服务器不支持Range请求时,则以200返回完成的响应包体