Range 请求部分内容
Range 请求头用 bytes=起始-结束 的形式告诉服务端只取资源的某一段字节,断点续传、视频拖动、多线程下载都建立在它之上。服务端支持时返回 206 与 Content-Range,标明本次返回的区间和资源总长度;不支持时可以忽略它并返回 200 全量内容,因此客户端必须能接受全量响应。
基本信息
| 请求头 | Range: bytes=start-end |
|---|---|
| 作用 | 只请求资源的指定字节区间,可与 If-Range 配合 |
| 规范 | RFC 9110 第 14.2 节 |
| 响应 | 206 加 Content-Range;多区间时返回 multipart/byteranges;不支持则回 200 全量 |
| 涉及端口 | HTTP 80 与 HTTPS 443,与协议层无关 |
单区间与多区间请求
单区间与多区间请求
curl -si -r 0-999 https://download.example.com/f.bin | grep -i content-range # 单区间
# Content-Range: bytes 0-999/1048576 # 本次返回前 1000 字节,总长 1MB
curl -si -H 'Range: bytes=0-99,200-299' https://download.example.com/f.bin | grep -i content-type
# Content-Type: multipart/byteranges; boundary=... # 多区间用 multipart 包裹
curl -si -r 1048576- https://download.example.com/f.bin | head -3 # 从总长往后取:服务端应回 416输出逐列读法
| 观察项 | 含义 | 正常与异常 |
|---|---|---|
| 状态码 206 | 服务器接受了范围请求 | 返回 200 说明服务端忽略了 Range,客户端需按全量处理 |
| Content-Range | 本次区间与资源总长 | 总长用于断点定位,缺失则无法续传 |
| Content-Length | 本次响应体字节数 | 是片段长度而非文件总长,别拿它判断文件大小 |
| Accept-Ranges: bytes | 服务端声明支持字节范围 | 缺失或为 none 时,续传会退化成全量下载 |
| 416 | 请求区间越界 | 说明本地记录的偏移已经失效,应重新获取资源信息 |
Range 配合 If-Range(携带 ETag 或 Last-Modified)可以在资源已变更时自动退回全量下载,避免把两次不同版本的内容拼在一起。
HTTP/2 与 HTTP/3 保留了同样的 Range 语义,但底层变成多路复用的帧结构,抓包时不要按 HTTP/1.1 的报文顺序去解读响应内容,按流编号看才准确。