移动体验 / 方法解读

移动端视频播放器请求多段数据为何返回 206 状态码

当移动端视频播放器请求多个不连续的数据片段时,服务器会返回 206 Partial Content 状态码。

简约风格的视频播放器界面设计图
主题资料配图,非新闻现场照片 · 配图:wise video player(视频播放器)

检查服务器是否支持多段范围请求

服务器必须支持多段范围请求才能返回 206 状态码。如果服务器不支持,它会忽略 Range 头部并返回 200 OK 状态码和完整资源内容。要验证服务器是否支持,可以使用 curl 工具发送包含多个范围的请求。例如,执行命令 curl http://www.example.com -i -H 'Range: bytes=0-50, 100-150'。如果服务器支持,它会返回 206 Partial Content 状态码。如果返回 200 OK,则说明服务器不支持多段范围请求。

在移动端视频播放场景中,如果服务器不支持多段范围请求,播放器将无法合并多个数据块,导致播放中断或错误。确保服务器正确处理多范围请求,并按照 multipart/byteranges 格式返回数据,是视频播放功能正常工作的关键。检查响应头中的 Content-Type 是否包含 multipart/byteranges,可以进一步确认服务器是否支持该功能。

分析 multipart/byteranges 响应格式

服务器返回 206 状态码时,响应体通常采用 multipart/byteranges 格式。这种响应包含一个边界字符串,用于分隔不同的数据部分。每个部分都有独立的 Content-Type 和 Content-Range 头部。例如,HTTP/1.1 206 Partial Content Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5。响应体中包含以边界字符串分隔的数据块,每个块对应一个请求的范围。

如果服务器返回的 Content-Type 不是 multipart/byteranges,或者边界字符串格式不正确,客户端可能无法正确解析响应。这会导致视频播放器无法合并多个数据块,从而出现播放中断或错误。确保服务器正确处理多范围请求,并按照 multipart/byteranges 格式返回数据,是断点续传功能正常工作的关键。

确认 If-Range 条件请求是否生效

在恢复请求更多资源部分时,需要保证存储的资源在接收到最后一个片段后未被修改。If-Range HTTP 请求头使范围请求变为条件请求:如果条件满足,服务器发送 206 Partial Content 响应;如果不满足,服务器返回 200 OK 和完整资源。该头部可以与 Last-Modified 验证器或 ETag 一起使用,但不能同时使用两者。

检查 If-Range 头部的值是否与服务器返回的 Last-Modified 或 ETag 匹配。如果服务器返回了新的 Last-Modified 时间,但客户端仍使用旧的时间戳,服务器会认为资源已修改,从而返回完整内容。这会导致客户端重新下载整个文件,浪费带宽和时间。确保客户端正确维护资源的校验值,是断点续传成功的重要保障。

验证请求范围是否超出资源边界

当请求的范围超出资源范围时,服务器会返回 416 Requested Range Not Satisfiable 状态码。这意味着请求的范围值与资源的范围没有重叠。例如,请求的第一个字节位置可能大于资源的长度。如果服务器不支持范围请求,它会忽略 Range 头部,返回 200 OK 状态码和完整的资源内容。

在移动端视频播放场景中,如果用户拖动进度条到超出视频总长度,客户端发送的 Range 请求会超出资源边界。服务器返回 416 状态码,告知客户端请求的范围无效。如果服务器不支持范围请求,它会返回 200 OK 和完整内容,导致客户端无法正确解析已下载的部分,从而无法实现断点续传。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. HTTP range requests - HTTP | MDN ↗
  2. 配图:wise video player(视频播放器) ↗
← 更多移动体验文章返回顶部 ↑