HTTP断点续传

发布于:2025-05-13 ⋅ 阅读:(9) ⋅ 点赞:(0)

​1. 核心机制:HTTP 头部字段​
Range 请求头

客户端在请求中通过 Range 头指定需要下载的字节范围,例如:

GET /file.zip HTTP/1.1
Host: example.com
Range: bytes=0-499  # 请求前500字节

支持多个范围(如 bytes=0-499,1000-1499),但实际应用中较少使用。

Content-Range 响应头

服务器返回部分内容时,状态码为 206 Partial Content,并通过 Content-Range 指明返回数据的范围及文件总大小:

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-499/2000  # 当前返回0-499字节,文件总大小2000字节
Content-Length: 500

Accept-Ranges 响应头

服务器通过此头声明是否支持范围请求,例如:

Accept-Ranges: bytes  # 支持字节范围请求
Accept-Ranges: none   # 不支持

​2. 实现步骤​

  1. 客户端检查服务器支持性
    • 发送 HEAD 请求 或普通请求,检查响应头中是否包含 Accept-Ranges: bytes

    • 若支持,客户端记录文件总大小(通过 Content-Length)。

  2. 中断后恢复下载
    • 客户端读取本地已下载的字节数(例如已下载500字节)。

    • 发起新请求,通过 Range 头指定从第500字节开始:

    Range: bytes=500-

    • 服务器返回后续数据,客户端将新数据追加到本地文件。

  3. 上传恢复(较复杂)
    • 客户端通过 PUTPOST 上传时,可能发送 Content-Range 头:

    Content-Range: bytes 500-999/2000  # 上传500-999字节,总大小2000

    • 服务器需支持合并分片上传的数据(如通过临时文件或云存储接口)。


​3. 关键技术点​
• 进度记录

客户端需持久化存储已传输的字节位置(如数据库或临时文件)。

• 文件一致性校验

通过 ETagLast-Modified 头验证文件未修改,避免续传后数据不一致。

• 多线程/分块下载

客户端可并发多个范围请求(如分块下载),最后合并文件。


​4. 服务器与客户端的责任​

角色 责任
服务器 1. 支持 RangeContent-Range 头部。
2. 返回 206 状态码及部分内容。
客户端 1. 记录传输进度。
2. 处理中断并重新发起范围请求。

​5. 应用场景​
• 大文件下载(如视频、软件安装包)。

• 网络不稳定环境下的传输恢复。

• 云存储服务(如分片上传至对象存储)。


​示例流程​

  1. 首次下载请求

    GET /largefile.mp4 HTTP/1.1
    Host: example.com

    响应:

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Content-Length: 1000000
  2. 中断后恢复

    GET /largefile.mp4 HTTP/1.1
    Host: example.com
    Range: bytes=500000-

    响应:

    HTTP/1.1 206 Partial Content
    Content-Range: bytes 500000-999999/1000000
    Content-Length: 500000


网站公告

今日签到

点亮在社区的每一天
去签到