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. 实现步骤
客户端检查服务器支持性
• 发送HEAD
请求 或普通请求,检查响应头中是否包含Accept-Ranges: bytes
。• 若支持,客户端记录文件总大小(通过
Content-Length
)。中断后恢复下载
• 客户端读取本地已下载的字节数(例如已下载500字节)。• 发起新请求,通过
Range
头指定从第500字节开始:Range: bytes=500-
• 服务器返回后续数据,客户端将新数据追加到本地文件。
上传恢复(较复杂)
• 客户端通过PUT
或POST
上传时,可能发送Content-Range
头:Content-Range: bytes 500-999/2000 # 上传500-999字节,总大小2000
• 服务器需支持合并分片上传的数据(如通过临时文件或云存储接口)。
3. 关键技术点
• 进度记录
客户端需持久化存储已传输的字节位置(如数据库或临时文件)。
• 文件一致性校验
通过 ETag
或 Last-Modified
头验证文件未修改,避免续传后数据不一致。
• 多线程/分块下载
客户端可并发多个范围请求(如分块下载),最后合并文件。
4. 服务器与客户端的责任
角色 | 责任 |
---|---|
服务器 | 1. 支持 Range 和 Content-Range 头部。2. 返回 206 状态码及部分内容。 |
客户端 | 1. 记录传输进度。 2. 处理中断并重新发起范围请求。 |
5. 应用场景
• 大文件下载(如视频、软件安装包)。
• 网络不稳定环境下的传输恢复。
• 云存储服务(如分片上传至对象存储)。
示例流程
首次下载请求
GET /largefile.mp4 HTTP/1.1 Host: example.com
响应:
HTTP/1.1 200 OK Accept-Ranges: bytes Content-Length: 1000000
中断后恢复
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