电脑指南
第二套高阶模板 · 更大气的阅读体验

客户端请求能不能断点续传?这事儿得看协议和工具

发布时间:2026-04-06 07:31:04 阅读:9 次

下载一个2GB的安装包,进度到95%时突然断网——你是不是立刻点重试,结果又从头开始?别急着骂软件,先搞清楚:客户端发起的请求,到底能不能断点续传?

不是所有请求都支持“接着下”

HTTP 协议本身是无状态的,一次 GET 请求默认就是“全量拉取”。但自 HTTP/1.1 起,服务器可以通过响应头 Accept-Ranges: bytes 表明它支持按字节范围(range)读取;客户端再发请求时带上 Range: bytes=1024000-,就能从指定位置继续拿数据。这就是断点续传的技术基础。

浏览器下载基本都行,但要看服务器配不配合

Chrome、Edge、Firefox 在下载大文件时,只要目标服务器返回了 Accept-Ranges: bytes,且没加防盗链或动态生成的临时链接(比如带一次性 token 的 URL),断网后重新点击下载,大概率会自动续传。你可以用开发者工具 → Network 面板,点开某个下载请求,查看 Response Headers 里有没有那一行。

自己写的代码呢?得手动加 Range 头

比如用 JavaScript 的 fetch 下载大文件:

const resumePosition = 1024000; // 已下载字节数
fetch(url, {
headers: { 'Range': `bytes=${resumePosition}-` }
})
.then(res => {
if (res.status === 206) { // HTTP 206 Partial Content
return res.arrayBuffer();
}
});

注意:服务端必须返回 206 状态码,且响应头含 Content-Range,否则就是普通 200 响应,等于白搭。

命令行工具更靠谱

wget -ccurl -C - 这类参数,本质就是自动检测本地文件大小,然后带上合适的 Range 头重发请求。实测过某开源镜像站的 ISO 文件,断掉三次,加 -c 后每次都能接上,比很多国产下载器还稳。

哪些情况注定没法续传?

• 后端用 PHP/Node.js 动态输出文件,但没处理 Range 请求;
• 文件托管在对象存储(如阿里云 OSS)但没开启“静态网站托管”或未配置 CORS+Range 支持;
• URL 带了时间戳或签名,过期就失效,续传时链接已作废;
• 使用 WebSocket 或自定义 TCP 协议传输,压根没设计断点逻辑。

说白了:客户端能不能断点续传,不取决于你用什么浏览器或工具,而在于“请求能不能被服务端识别为‘续传’”,以及“服务端愿不愿意配合”。下次再遇到卡在99%重下,先抓个包看看 Response Headers —— 有时候问题不在你电脑,而在对面那台服务器没配对。