416 是什么
416 Range Not Satisfiable 表示请求的字节区间无法满足:区间起点超出资源当前长度、区间语法非法,或资源被替换后长度发生变化(RFC 9110 §15.5.17)。按规范,服务器在拒绝时应返回 Content-Range: bytes */总长度,把资源真实大小告诉客户端,让下载器重新对齐区间后继续。
基本信息
| 名称 | 416 Range Not Satisfiable |
|---|---|
| 类别 | 4xx(客户端请求的区间有问题) |
| 规范 | RFC 9110 §15.5.17 |
| 关键响应头 | Content-Range: bytes */<总长度> |
| 常见触发 | 断点续传时文件被替换、截断或内容长度变化 |
| 相关头部 | Range、Accept-Ranges、Content-Range、ETag、If-Range |
典型使用场景
- 断点续传失败排查:下载器按旧长度继续请求,而源文件已更新
- 静态文件服务(Nginx/Apache)配置核查:确认是否返回 Content-Range 让客户端自我修正
- CDN 回源与分片缓存:不同节点持有的资源版本不一致导致区间越界
- 视频拖动进度条异常:播放器请求的字节位置超出媒体实际长度
- 大文件下载稳定性优化:用 If-Range 加 ETag 保证续传对象没被换过
- 自动化测试:构造越界 Range 验证服务端是否按规范响应
复现与续传
复现与续传
# 请求远超文件长度的区间 → 416
curl -si -r 99999999- https://download.example.com/file.iso
# HTTP/1.1 416 Range Not Satisfiable
# Content-Range: bytes */1073741824 # 资源真实长度,客户端据此重算区间
# 带条件的续传:资源若被换过就不做部分下载
curl -si -r 52428800- -H 'If-Range: "a1b2c3"' -o part2.bin https://download.example.com/file.isoRange 相关头部
| 头部 | 方向 | 读法 |
|---|---|---|
| Range | 请求 | 要哪一段,如 bytes=0-1023 |
| Accept-Ranges | 响应 | 是否支持区间请求,值为 bytes 表示支持 |
| Content-Range | 响应 | 206 给区间与总长,416 只给总长 |
| If-Range | 请求 | 带 ETag 或时间:未变返回 206,变了整包返回 200 |
416 是「重新协商」信号而不是硬失败:客户端拿到总长度后从有效区间重试,通常就能继续下载。
416 响应不应携带实体内容;把总长度放在 Content-Range 里,是让客户端自我修正的关键,缺了它就只剩整包重下一条路。
CDN 分片缓存下不同节点可能持有不同版本,出现间歇性 416 时先清缓存再复现,避免把缓存不一致误判为源站问题。