206 与范围响应
206 Partial Content 是服务端接受范围请求后返回的响应:请求里带 Range 头指定字节区间,响应体只包含这一段内容,并用 Content-Range 标明本次返回的区间以及资源总长度。音视频拖动进度、下载断点续传、多线程分片下载都依赖它。服务端可以选择忽略 Range 直接返回 200 全量,所以客户端必须能处理这种情况。
基本信息
| 名称 | 206 Partial Content |
|---|---|
| 作用 | 只返回请求的一个或多个字节区间 |
| 规范 | RFC 9110 第 15.3.7 节,范围请求定义见第 14 章 |
| 关键响应头 | Content-Range: bytes 0-999/12345 |
| 配套请求头 | Range 指定区间,If-Range 用于资源变更时退回全量 |
| 越界响应 | 请求区间超出资源长度时返回 416 Range Not Satisfiable |
请求与校验片段
请求与校验片段
curl -si -r 0-999 https://download.example.com/big.iso | head -8 # 取前 1000 字节
# HTTP/1.1 206 Partial Content
# Content-Range: bytes 0-999/1073741824 # 本次区间 0 到 999,资源总长约 1GB
# Accept-Ranges: bytes # 服务端声明支持字节范围
curl -sI https://download.example.com/big.iso | grep -i accept-ranges # 先确认是否支持续传
curl -si -r 1073741824- https://download.example.com/big.iso | head -1 # 越界:期望 416输出逐列读法
| 观察项 | 含义 | 正常与异常 |
|---|---|---|
| 状态码 206 | 服务端接受了范围请求 | 返回 200 说明 Range 被忽略,只能按全量处理 |
| Content-Range | 本次区间与资源总长 | 缺少总长就无法计算断点位置 |
| Content-Length | 本次响应体字节数 | 它是片段长度而不是文件总长,别用它判断文件大小 |
| Accept-Ranges | 是否声明支持字节范围 | 值为 none 或缺失时续传会退化为全量下载 |
| ETag 与 Last-Modified | 版本校验值 | 续传前用它确认资源没有变化 |
典型使用场景
- 视频播放器拖动进度条:只拉取跳转位置附近的片段,不必重新下载整个文件
- 下载工具断点续传:中断后带上次的偏移继续请求剩余区间
- 多线程分片下载:按字节区间切开并并行拉取,最后按顺序拼接
- CDN 边缘回源:只向源站回源缺失的区间,减少回源流量
- 日志或大文件增量拉取:按偏移量顺序追加,避免重复传输
服务器不支持范围请求时通常忽略 Range 返回 200 全量内容,这属于合法行为;客户端遇到 200 必须放弃分片逻辑并按完整资源处理。
搭配 If-Range 使用更稳:把 ETag 或 Last-Modified 放进 If-Range,资源已变更时服务端会自动返回 200 全量,避免把两个版本的内容拼接在一起。