首页/网络/协议速查/Range 范围请求
HTTP 头与缓存70 条

Range 范围请求

请求资源的一个或多个字节区间(bytes=start-end),用于断点续传、视频拖动与多线程下载。

协议速查网络更新于 2026-10-13

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 的报文顺序去解读响应内容,按流编号看才准确。

易错点

  • 把 206 响应里的 Content-Length 当文件总长,多线程下载会算出错误的分片边界,最终拼出损坏文件
  • 对实时转码等动态生成内容使用 Range,源站不支持时播放器表现为反复缓冲、拖动失败
  • CDN 分片缓存与 Range 叠加时命中不同版本分片,离线视频可能拼接出错,应核对 CDN 的缓存键与回源策略
  • 断点续传不做 ETag 或 Last-Modified 校验,资源更新后仍按旧偏移续传,得到前后缝合的坏文件
  • 断点续传的客户端假设服务端一定支持 Range,遇到返回 200 全量时不会降级处理,结果把全量响应写进分片偏移,文件彻底损坏

数据来源与参考

  • RFC 9110 §14.1/§14.2(范围请求)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌