Content-Range 是什么
Content-Range 用于分段传输:在 206 响应里标注本片段在完整资源中的起止字节与资源总长,格式是 bytes 起-止/总长;总长未知时写星号。它同样出现在 416 响应里,形态是 bytes 星号/总长,用来告诉客户端资源的实际大小,方便改小 Range 重新请求。多线程下载器与断点续传都依赖这个头完成拼接。
基本信息
| 名称 | Content-Range |
|---|---|
| 作用 | 描述片段位置与资源总长 |
| 规范 | RFC 9110 §14.4 |
| 格式 | bytes 起-止/总长,总长未知用星号 |
| 配套状态码 | 206 表示片段,416 表示范围不满足 |
| 配套请求头 | 与 Range、If-Range 联合使用 |
读取片段信息
读取片段信息
curl -si -r 1000-1999 https://download.example.com/f.bin | head -8
# HTTP/1.1 206 Partial Content
# content-range: bytes 1000-1999/1048576
curl -si -r 99999999- https://download.example.com/f.bin | head -5
# HTTP/1.1 416 Range Not Satisfiable
# content-range: bytes */1048576两种出现场景
| 状态码 | Content-Range 形态 | 读法 |
|---|---|---|
| 206 | bytes 0-999/1048576 | 本片段占 0 到 999 字节,资源共 1048576 字节 |
| 416 | bytes */1048576 | 请求范围不可满足,此处给出实际总长 |
| 200 | 通常不出现 | 服务端未按范围响应,返回了完整内容 |
典型使用场景
- 断点续传:用上一次拿到的偏移量与总长决定本次请求的 Range
- 多线程下载:各线程按片段写入同一文件的对应偏移,靠本头对齐
- 大文件校验:用总长与最终文件大小比对,判断是否拼接完整
- 限速与分片下载工具排障:确认服务端究竟返回了片段还是整份内容
- 排查总长变化:说明资源在传输期间被替换,需要重新下载
如果请求了 Range 却收到 200 和完整内容,说明服务端不支持范围请求或忽略了该头,此时不会出现 Content-Range。多线程下载器若不检查这一点,会拼出损坏文件——所以要么确认服务端支持,要么改用单线程下载。还要注意它只是响应里的描述信息,服务端不会依据它做任何校验,因此不能当作完整性校验或安全控制来用;文件是否完整仍需用哈希比对确认。