Range和Content-Range是 HTTP/1.1中新增的HTTP头字段,它用于从服务器中获取一个大文件的某一部分内容,很适合下载软件进行多线程下载和断点续传。
Range字段的作用是支持http协议的范围请求,而范围请求的用途多用于客户端多线程请求服务端某一资源,实现高效并发。
在http请求头中,Range字段代表请求内容的起始位置,以字节计数,序号从零开始。
在http响应头中,Content-Range:bytes 0-1538/1539代表返回数据内容的起始位置,及整个需要请求的内容的长度。
对含“Range”字段的HTTP数据,其响应码并非通常的200等,而是206和416。
206的含义是“Partial Content”,即服务器发回的是请求的那一部分内容。
416的含义是“Range Not Satisfiable”,表明客户端请求的数据范围不合法。
HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件,或者与文件下载的断点续传功能搭配使用时非常有用。
检测服务器端是否支持范围请求
假如在响应中存在 Accept-Ranges
首部(并且它的值不为 “none”),那么表示该服务器支持范围请求。例如,你可以使用 cURL 发送一个 HEAD
请求来进行检测。
Content-Length
:表示请求图片的完整大小
Accept-Ran
ges
: bytes
表示界定范围的单位是 bytes
-H" 选项可以在请求中追加一个首部行
-i: Include protocol response headers in the output 在输出中包含协议响应头
多重范围
Range头部也支持一次请求文档的多个部分。请求范围用一个逗号分隔开。
curl http://www.example.com -i -H "Range: bytes=0-50, 100-150"
服务器返回206 Partial Content状态码和Content-Type:multipart/byteranges; boundary=3d6b6a416f9b5头部,Content-Type:multipart/byteranges表示这个响应有多个byterange。每一部分byterange都有他自己的Centen-type头部和Content-Range,并且使用boundary参数对body进行划分。
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 282
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 0-50/1270
<!doctype html>
<html>
<head>
<title>Example Do
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-150/1270
eta http-equiv="Content-type" content="text/html; c
--3d6b6a416f9b5--
范围请求的响应
与范围请求相关的有三种状态:
- 在请求成功的情况下,服务器会返回
206
Partial Content
状态码。 - 在请求的范围越界的情况下(范围值超过了资源的大小),服务器会返回
416
Requested Range Not Satisfiable
(请求的范围无法满足) 状态码。 - 在不支持范围请求的情况下,服务器会返回
200
OK
状态码。