下载几GB文件时,代理连接中途断开,如果客户端重新从0开始,不但浪费时间和流量,也容易在多次重试后得到一个无法校验的文件。可靠的断点续传需要源站支持字节范围请求,客户端确认文件版本没有变化,并在完成后做完整性校验。
代理不能凭空为不支持Range的源站创造安全续传能力,缓存或内容转换还可能让结果更复杂。
一、HTTP断点续传依赖哪些头
| 字段 | 作用 |
|---|---|
| Accept-Ranges: bytes | 源站表明支持字节范围请求的线索 |
| Range: bytes=N- | 客户端请求从指定偏移继续 |
| 206 Partial Content | 服务器返回部分内容 |
| Content-Range | 说明本次返回范围和完整大小 |
| ETag | 标识资源版本,具体强弱语义要注意 |
| Last-Modified | 资源修改时间线索 |
| If-Range | 版本未变时返回范围,否则返回完整资源 |
二、为什么只看到Accept-Ranges还不够
服务器可能不发送该字段却仍处理Range,也可能发送后因动态内容、权限或网关限制不能稳定续传。真正验证要发出范围请求,检查是否返回206、正确的Content-Range和预期字节数。
若请求Range后返回200,客户端必须把响应当作完整文件处理,不能直接追加到已有部分,否则文件会损坏。
三、文件变化为什么会让续传出错
如果下载期间源文件被替换,旧文件前半段和新文件后半段拼在一起不会形成有效内容。客户端应保存ETag或Last-Modified,并使用If-Range或重新验证资源版本。
下载地址相同不代表内容永远相同。软件镜像、备份文件和动态导出尤其需要版本标识。
四、代理会怎样影响Range请求
- 代理可能原样转发Range并返回206;
- 缓存代理可能从已有完整对象切出部分响应;
- 某些中间层可能忽略Range或回源获取完整文件;
- 内容压缩会让字节范围与解压后偏移难以对应;
- 认证会话过期后,续传请求可能返回登录页或407;
- 节点切换可能访问到不同版本的镜像后端。
因此续传前要检查Content-Type、状态码和Content-Range,不能看到请求成功就直接写入。
五、curl续传的安全验证思路
curl常用 -C - 从现有文件大小继续,但实际使用前应查看文档,并确认服务器返回正确范围。结构示意:
curl --fail --location --continue-at - --output package.bin https://download.example/package.bin不要把带代理密码的完整URL写进命令历史。代理凭据保护可参考curl代理密码安全使用。
六、重试应该针对哪些错误
连接重置、短暂超时和部分5xx可能适合有限重试;403、407、404、校验失败和版本变化需要先解决根因。重试使用指数退避、最大次数和总时长,避免服务异常时持续占用带宽。
代理502、503、504的含义与处理见HTTP错误码分层排查。
七、多线程分片一定更快吗
不一定。分片会增加连接数,可能触发源站、代理或套餐的并发限制,也会让缓存命中和错误恢复更复杂。磁盘、服务端限速和单连接拥塞都可能是瓶颈。
只有在源站允许、代理容量明确、文件固定且客户端能正确合并校验时,才评估并行范围下载。不要用增加分片绕过目标方限速。
八、完成后必须做完整性校验
优先使用发布方通过可信渠道提供的SHA-256或其他现代哈希,并核对文件大小。校验值应来自与下载文件相互独立的可信页面、签名或发布清单;如果文件和哈希来自同一个被篡改的位置,校验意义有限。
软件发布若提供数字签名,还应验证签名和证书链,而不是只算哈希。
九、下载日志最少记录什么
- 资源URL的脱敏标识与版本;
- ETag、Last-Modified和预期大小;
- 每次Range起止、状态码和Content-Range;
- 代理节点ID、错误类型和重试次数;
- 最终文件大小、哈希和签名验证结果;
- 客户端下载器版本和时间。
URL查询参数可能含令牌,日志中必须脱敏。
十、常见失败怎么处理
| 现象 | 处理 |
|---|---|
| 续传返回200 | 不要追加;确认是否重新完整下载 |
| 返回416 | 核对本地大小与服务端完整大小 |
| 每次固定位置断开 | 查代理/网关超时、源文件和网络路径 |
| 下载完成哈希不符 | 停止使用,删除或隔离文件并重新核验来源 |
| 切节点后文件变化 | 核对ETag和镜像版本,必要时从头下载 |
大文件下载的正确目标不是“无论如何接着写”,而是在连接可恢复的同时,确保得到的仍是同一个完整、可信文件。






