元数据
| id | curl-resume-break | 收录 | 2026-08-29 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 网络与镜像 |
| 适用工具 | curl · 外部工具 | ||
症状
下载大文件(模型、镜像、数据集)中断后想续传:
```
$ curl -C - -o model.bin https://example.com/model.bin
** Resuming transfer from byte position 10485760
curl: (33) HTTP server does not seem to support byte ranges. Cannot resume.
```
特征:`curl -C -` 从已下载位置续传,但服务器不支持 `Range` 请求(或忽略 Range 返回 200 全量);
报错 33 后 curl 退出,文件保持部分状态;换 wget `-c` 同样失败。
原因
HTTP 断点续传依赖 `Range` 头:客户端发 `Range: bytes=N-`,服务器返回 `206 Partial Content` + `Content-Range`。
若服务器不支持(返回 200 全量或 416),curl 无法拼接,只能报 33 放弃。
常见于:小型自建服务器/内网下载站、python3 -m http.server(3.14 实测不支持 Range)、某些网盘直链。
注意:python 的 `http.server` 在新版本里已不支持 Range——本地调试断点续传时别用它。
解法
1. **先探测服务器是否支持 Range**:`curl -sI -H "Range: bytes=0-99" URL` ——返回 `206` 支持,返回 `200` 不支持。
2. **支持就续传**:`curl -C - -o 文件 URL`(自动从已有文件大小继续);wget 用 `wget -c URL`。
3. **不支持 Range 的源**:换支持 Range 的下载源(CDN/对象存储/官方镜像站);
或换 aria2c(`aria2c -c URL`,多线程分段下载,对源要求更高);
或直接整包重下(部分文件删掉,避免误用不完整文件)。
4. **下载工具/脚本里**:先检查 `-C -` 返回码,33 时告警而不是静默当成功;
续传完成后务必校验哈希(`md5sum -c` / sha256),部分文件拼接错位很隐蔽。
5. **本地测试断点续传**:用 nginx(默认支持 Range)或自写 206 服务器;别用 python3 -m http.server。
验证证据
- 本地实测(2026-08-29,WSL Ubuntu,curl 8.x,50MB 随机文件,纯本地):
- 成功链路:自写支持 Range 的服务器(206 + Content-Range)→ `timeout 0.3 curl -o part.bin` 中断得 15.5MB 部分文件 →
`curl -C - -o part.bin` 续传 exit 0,md5 与源文件一致(4211ba8d);
- 失败链路:不支持 Range 的服务器(忽略 Range 恒返回 200 全量)→ 部分文件 10MB 续传 →
`curl: (33) HTTP server does not seem to support byte ranges. Cannot resume.`(exit 33),与 packer#136 同款;
- 冷知识对照:`python3 -m http.server`(3.14.4)对 `-C -` 同样报 33——新版本 http.server 不支持 Range,本地调试别用;
- 探测法验证:`curl -sI -H "Range: bytes=0-99"` 对自写服务器返回 206,对 norange/http.server 返回 200。
- 实测复现日志(2026-08-29)
来源与证据
素材来源:https://github.com/keenerd/packer/issues/136
验证证据:Evidence details kept locally (2026-08-29)