HTTP 分段下载的 5 个坑:Range、断点续传、并发写同一个文件

发布时间:2026/10/29 11:00:02

HTTP 分段下载的 5 个坑:Range、断点续传、并发写同一个文件 最近在折腾分段下载把踩过的坑整理一下给后来的人省点时间。### 一、Range 不是所有服务器都认普通请求是整包给GET /file.zip HTTP/1.1Host: example.com要分段就得带 RangeGET /file.zip HTTP/1.1Host: example.comRange: bytes1048576-服务器支持的话返回 206 Partial Content并且带 Content-Range 告诉你这段在文件里的位置和总长Content-Range: bytes 1048576-10485759/10485760探测只需要一个字节bashcurl -sI -H Range: bytes0-1023 https://example.com/file.zip | head -3# 支持 → HTTP/1.1 206 Partial Content# 不支持 → HTTP/1.1 200 OK返回 200 的站只能整包下别浪费时间。### 二、别信 Content-Length遇到过一台服务器头部写 9.4MB实际只发 9.1MB 就关连接。程序认为下载完成实际文件是截断的。所以每个分片下完都要比对实际字节数少了就重试**这一片**而不是整包重下javascriptconst expect part.to - part.from 1 - part.got;if (buf.length ! expect) {if (buf.length 0) {await fh.write(buf, 0, buf.length, part.from part.got);part.got buf.length;}throw new Error(short: buf.length / expect);}上层捕获到 short: 就把这片放回队列其它错误才退避重试。### 三、分片数 ≠ 并发数一开始按 4MB 切片20G 的文件切成 5000 片然后想开 5000 并发。结果 IP 被限流比单线程还慢。正确的做法是片切细决定并行粒度worker 数量固定决定同时开几条连接javascriptasync function runPool(parts, workers, worker) {let cursor 0;const runners Array.from({ length: workers }, async () {while (cursor parts.length) {const part parts[cursor];if (part.got part.to - part.from 1) continue;try { await worker(part); }catch (e) {if (!/^short:/.test(e.message)) {parts.push(part);await new Promise((r) setTimeout(r, 500));}}}});await Promise.all(runners);}8~16 个 worker 一般比较稳再多容易触发单 IP 限制。### 四、并行写文件千万别用 append这是我犯过最蠢的错。多个分片并行下载用 appendFile 写等于按到达顺序拼接 —— **文件大小对字节顺序全乱**。校验能过打开报错。正解是打开一次文件句柄每片带 position 写javascriptconst fh await open(tmpPath, r); // r 不能是 ww 会清空已下的内容await fh.write(buf, 0, buf.length, offset);### 五、进度状态要原子落盘直接 writeFileSync 覆盖进度文件断电就得到半个 JSONJSON.parse 抛错续传全废。用「临时文件 rename」javascriptawait writeFile(tmp, JSON.stringify(state), utf8);await rename(tmp, path); // 同分区是原子操作还有一步不能省**恢复时比对 ETag**。存的 ETag 和重新探测的不一致说明服务器上文件换了必须丢弃全部进度重下否则会得到「前半段旧文件 后半段新文件」这种垃圾。### 六、几个真实的服务器行为| 现象 | 原因 | 处理 ||---|---|---|| 返回 206 但内容是整包 | 服务器忽略 Range 仍回 206 | 比对 Content-Range 起点 || 下到一半卡死不动 | 连接空闲超时不报错不断开 | 加读超时超时重连同一片 || 开 64 条被拒 | 单 IP 并发限制 | 降到 8失败指数退避 || 只有 md5 没有 sha256 | 站点只给 md5 | 校验层支持多种没值就比字节数 |---不知道有没有人也遇到过「206 但其实给了整包」这种情况我遇到两三个站是这样一直没搞清是 CDN 的锅还是源站配置问题。有知道的可以说说。------【上面这些坑都是我真实踩过的写法各有取舍按你的场景选就行。】有坑直接评论区说我一条条看。
延伸阅读

更多相关文章

2026/10/29 10:54:58

SpringBoot 统一返回结果封装 + 全局异常 + 参数校验

前言做SpringBoot后端接口开发,几乎每个项目都会遇到这几个痛点:Controller返回格式不统一,有的返回String、有的返回Map,前端对接成本高;异常直接抛出,错误堆栈信息返回前端,存在安全风险&…

2026/10/29 10:54:58

Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字

前言Java 面向对象面试有一套连环组合题:重载 & 重写、访问修饰符、static 关键字。不少人的误区:以为返回值不同就可以构成重载;以为静态方法可以重写;分不清 protected 在不同包子类的访问权限;搞混静态代码块、…

2026/10/29 12:20:29

ico小头像设置全攻略:从PNG到多尺寸ICO的转换、应用与避坑指南

简介:这份资源是一份关于ico小头像(favicon)设置的入门教程文档,主要面向需要为网站添加浏览器图标标识的站长、前端开发者和网站运营人员。文档从favicon的起源与作用讲起,说明其在品牌展示和用户体验中的价值&#x…

2026/10/29 12:20:29

前情笔记:用五字段模板解决追剧遗忘的认知断层问题

1. 为什么我要做一款叫“前情笔记”的东西先坦白一件事:我记性不算差,但也没好到哪儿去。尤其是追剧、看小说、玩剧情向游戏的时候,隔了几周再捡起来,脑子里只剩一个模糊的印象——“那个谁好像背叛了谁”“之前是不是有个伏笔来着…

2026/10/29 12:20:29

ponytail skill全解析:3D马尾建模与AI绘画提示词实战技巧

1. 先把“ponytail”放在对的地方:它是什么、要解决什么问题 “ponytail”这个词,放到角色设计与AIGC绘画的语境里,第一反应就是马尾辫。不过我这次聊的不是教你怎么扎一个日常发型,而是几个月来实际用下来的一套插件与技能组合&a…

2026/10/29 12:20:29

GKE上构建可注册可监控的AI技能单元(Skills)实战

1. 项目概述:当“skills”不再只是简历上的单词,而成为可执行、可编排、可演化的智能体能力单元最近在多个技术社区和开发者群聊里,“skills”这个词高频出现,但它的语义已经彻底脱离了传统HR文档里的“熟练掌握Python/熟悉Docker…

2026/10/29 12:15:25

高并发数字资产平台架构设计与优化实践

1. 项目背景与核心挑战 三年前我接手了一个智能数字资产流转平台的重构项目,当时平台日活用户刚突破10万,系统已经开始出现明显的性能瓶颈。转账延迟高达15秒,核心接口的500错误率突破3%,更棘手的是每次营销活动后服务器都会崩溃。…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑