1. HTTP 范围请求 Range/Accept-Ranges/Content-Range 与 206、416 状态码的语义如何在断点续传与视频切片中落地?
HTTP 范围请求中 Range、Accept-Ranges、Content-Range 三个头部以及 206 Partial Content、416 Range Not Satisfiable 状态码的语义分别是什么?它们在断点续传与视频切片场景中是如何落地的?
- Range/Accept-Ranges/Content-Range 的字段格式与语义
- 206、416 状态码的触发条件与组合使用
- 断点续传与视频 seek 的工程实现要点
范围请求让客户端只请求资源的字节子集。客户端用 Range: bytes=start-end(或 start- 表示从 start 到结尾、-suffix 表示末尾 N 字节)声明所需范围;服务端支持时在响应头返回 Accept-Ranges: bytes,对合法范围以 206 Partial Content 返回,并用 Content-Range: bytes start-end/total 说明本次返回区间与资源总大小。若范围非法(start 大于 end、起点超出总长等),服务端返回 416 Range Not Satisfiable,并可用 Content-Range: bytes */total 告知客户端真实总大小供其纠正偏移。
断点续传时,客户端持久化已下载偏移量,失败后用 Range: bytes=N- 从断点继续,避免重传已收数据;视频播放器在 seek 时用 Range: bytes=start-end 只拉取目标时间附近的切片,实现秒级拖动而无需全量下载。工程上服务端还应支持多段 Range: bytes=a-b,c-d 并返回 multipart/byteranges,对不带 Range 的普通请求回退为 200 全量响应,同时注意 Range 与缓存、ETag/If-Range 配合,防止内容更新后错位拼接。
回答要先讲清三个头部与两个状态码的职责边界:Range 是请求、Accept-Ranges 是能力声明、Content-Range 是响应描述,206 表达"部分成功"、416 表达"范围不可满足"。随后落到断点续传与视频 seek 两个典型场景,体现从协议语义到工程落地的完整链路。能提到 If-Range 条件请求与多段 multipart 属于加分项。
# 客户端断点续传请求
GET /movie.mp4 HTTP/1.1
Range: bytes=5242880-
# 服务端响应
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 5242880-10485759/104857600
Content-Length: 5242880