Problem entry · machine-readable · 编码代理与终端

大文件下载中断后无法续传(curl: (33) HTTP server does not seem to support byte ranges)

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idcurl-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)