在HTTP协议中,206 Partial Content 是一种成功状态码,用于表示服务器仅返回了请求资源的“部分内容”,而非完整资源。它通常与“断点续传”“分片下载”等场景密切相关,是实现大文件分块传输、断点恢复下载的核心技术支撑。
一、206状态码的核心作用
当客户端(如浏览器、下载工具)需要获取资源的特定片段(而非全部)时,会在请求头中指定范围,服务器验证范围有效后,就会返回206状态码,并携带对应片段的内容。常见应用场景包括:
- 视频/音频的“拖动播放”(如拉到视频中间位置,仅加载该时段的内容);
- 大文件下载的“断点续传”(下载中断后,重新请求未完成的部分,而非从头下载);
- 多线程分片下载(将文件拆分为多个片段,多线程并行下载,最后合并)。
二、206状态码的触发条件(请求-响应流程)
206的返回并非随机,需满足“客户端主动指定范围”和“服务器支持范围请求”两个核心条件,具体流程如下:
1. 客户端发起“范围请求”(关键请求头)
客户端需在HTTP请求头中添加 Range 字段,明确指定需要获取的资源片段范围。格式分为两种:
- 字节范围(最常用):以字节为单位,格式为
Range: bytes=start-end(start是起始字节索引,end是结束字节索引,索引从0开始)。- 示例1:
Range: bytes=0-499→ 请求资源的前500个字节(0到499,共500字节); - 示例2:
Range: bytes=500-→ 请求从第500字节开始到资源末尾的所有内容; - 示例3:
Range: bytes=-100→ 请求资源的最后100个字节。
- 示例1:
- 其他范围:如视频的“时间范围”(需服务器支持,格式如
Range: time=10-30,表示请求10秒到30秒的视频内容)。
2. 服务器验证并返回206响应(关键响应头)
服务器收到范围请求后,会先验证 Range 字段的合法性(如范围是否超出资源总大小):
- 若范围有效:返回 206 Partial Content 状态码,并通过以下响应头补充信息;
- 若范围无效(如
start大于资源总大小):返回 416 Requested Range Not Satisfiable(请求范围不合法)。
206响应中必须包含的核心头字段:
| 响应头字段 | 作用说明 | 示例 |
|---|---|---|
Content-Range | 告知客户端当前返回的片段在完整资源中的位置及资源总大小(格式:bytes start-end/总大小) | Content-Range: bytes 0-499/1000(总大小1000字节,当前返回0-499字节) |
Content-Length | 当前返回的“部分内容”的字节数(而非完整资源大小) | Content-Length: 500(对应上述示例,返回500字节) |
Accept-Ranges | 服务器声明支持范围请求(通常为 bytes,表示支持字节范围) | Accept-Ranges: bytes |
三、典型场景示例:视频拖动播放
当你在视频网站拖动进度条到“1分30秒”时,背后的HTTP交互如下:
- 客户端请求:浏览器检测到进度条位置,计算该位置对应的视频字节范围(假设视频总大小为10MB,1分30秒对应字节范围为
2097152-4194303),并发送请求:GET /video/movie.mp4 HTTP/1.1 Host: example.com Range: bytes=2097152-4194303 # 请求2MB-4MB的视频片段 - 服务器响应:服务器验证范围有效,返回206状态码及对应片段:
HTTP/1.1 206 Partial Content Content-Range: bytes 2097152-4194303/10485760 # 片段范围/总大小(10MB) Content-Length: 2097152 # 片段大小(2MB) Content-Type: video/mp4 Accept-Ranges: bytes # 声明支持字节范围请求 [2MB-4MB的视频字节数据] - 客户端渲染:浏览器接收片段数据,解码后立即播放该部分内容,实现“拖动即播”。
四、与200状态码的区别
206和200均为“成功状态码”,但核心差异在于返回内容的完整性:
| 状态码 | 含义 | 适用场景 | 关键特征 |
|---|---|---|---|
| 200 | OK(完整内容) | 请求完整资源(如打开网页、下载小文件) | 返回资源全部内容,无 Content-Range 头 |
| 206 | Partial Content(部分内容) | 请求资源片段(如视频拖动、断点续传) | 返回部分内容,必须包含 Content-Range 头 |
五、常见问题与注意事项
- 服务器不支持范围请求:若服务器不支持
Range请求,会直接返回200+完整资源,此时客户端无法实现断点续传或分片下载(需服务器配置支持,如Nginx、Apache默认开启范围请求)。 - 范围请求无效:若客户端指定的范围超出资源总大小(如
Range: bytes=2000-但资源仅1000字节),服务器会返回 416 Requested Range Not Satisfiable,并在响应头中通过Content-Range: bytes */1000告知资源总大小。 - 多范围请求:客户端可通过
Range: bytes=0-99,200-299同时请求多个不连续片段,服务器会返回206+multipart/byteranges格式的响应,将多个片段打包返回(较少见,主要用于特殊场景)。
综上,206状态码是HTTP协议中针对“部分资源请求”的核心设计,它通过“范围请求-部分响应”的机制,大幅优化了大文件传输和媒体播放的用户体验。