跳到主要内容

2. 范围单位 (Range Units)

一个表示可以按照各种结构单位划分为子范围, 具体取决于该表示的媒体类型所固有的结构. 这个"范围单位" (range unit) 用在 Accept-Ranges 响应头字段 (第 2.3 节) 中, 以通告对范围请求的支持; 用在 Range 请求头字段 (第 3.1 节) 中, 以界定所请求的表示的各个部分; 还用在 Content-Range 有效载荷头字段 (第 4.2 节) 中, 以描述正在传输的是表示的哪一部分.

range-unit = bytes-unit / other-range-unit

2.1 字节范围 (Byte Ranges)​

由于表示数据在有效载荷中是作为八位组 (octet) 序列传输的, 对于任何可通过 HTTP 传输的表示 ([RFC7231] 第 3 节) 而言, 字节范围都是一种有意义的子结构. 定义 "bytes" 范围单位用于表达数据的八位组序列的子范围.

bytes-unit = "bytes"

一个字节范围请求可以在单个表示内指定单个字节范围, 或者一组字节范围.

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

byte-range-spec 中的 first-byte-pos 值给出该范围中第一个字节的字节偏移量. last-byte-pos 值给出该范围中最后一个字节的字节偏移量; 也就是说, 所指定的字节位置是包含在内的. 字节偏移量从零开始.

byte-ranges-specifier 值的示例:

  • 前 500 个字节 (字节偏移量 0-499, 包含在内): bytes=0-499

  • 第二个 500 字节 (字节偏移量 500-999, 包含在内): bytes=500-999

如果 last-byte-pos 值存在且小于 first-byte-pos, 则该 byte-range-spec 是无效的.

客户端可以在不知道所选表示大小的情况下限制所请求的字节数. 如果 last-byte-pos 值缺失, 或者该值大于或等于表示数据的当前长度, 则该字节范围被解释为该表示的剩余部分 (即, 服务器将 last-byte-pos 的值替换为比所选表示的当前长度小 1 的值).

客户端可以使用 suffix-byte-range-spec 请求所选表示的最后 N 个字节.

suffix-byte-range-spec = "-" suffix-length
suffix-length = 1*DIGIT

如果所选表示短于指定的 suffix-length, 则使用整个表示.

其他示例, 假设表示长度为 10000:

  • 最后 500 个字节 (字节偏移量 9500-9999, 包含在内): bytes=-500 或 bytes=9500-

  • 仅第一个和最后一个字节 (字节 0 和 9999): bytes=0-0,-1

  • 第二个 500 字节 (字节偏移量 500-999, 包含在内) 的其他有效 (但非规范) 的指定:

    bytes=500-600,601-999
    bytes=500-700,601-999

如果一个有效的 byte-range-set 至少包含一个 first-byte-pos 小于表示当前长度的 byte-range-spec, 或至少包含一个 suffix-length 非零的 suffix-byte-range-spec, 则该 byte-range-set 是可满足的 (satisfiable). 否则, 该 byte-range-set 是不可满足的 (unsatisfiable).

在字节范围语法中, first-byte-pos, last-byte-pos 和 suffix-length 以十进制八位组数表示. 由于有效载荷的长度没有预定义的限制, 接收方必须 (MUST) 预料到可能出现非常大的十进制数, 并防止因整数转换溢出而导致的解析错误.

2.2 其他范围单位 (Other Range Units)​

范围单位是可扩展的. 新的范围单位应当向 IANA 注册, 如第 5.1 节所定义.

other-range-unit = token

2.3 Accept-Ranges​

"Accept-Ranges" 头字段允许服务器表明它对目标资源支持范围请求.

Accept-Ranges = acceptable-ranges
acceptable-ranges = 1#range-unit / "none"

对给定目标资源支持字节范围请求的源服务器可以 (MAY) 发送 Accept-Ranges: bytes, 以表明支持哪些范围单位. 客户端可以在未收到针对相关资源的此头字段的情况下生成范围请求. 范围单位在第 2 节中定义.

对目标资源不支持任何类型范围请求的服务器可以 (MAY) 发送 Accept-Ranges: none, 以建议客户端不要尝试范围请求.