HTTP:Range 和 Content-Range

Range 和 Content-Range

HTTP1.1 协议(RFC2616)中新增的header字段 Range 和 Content-Range 可以支持获取文件的部分内容,这为断点续传和并行下载提供了技术支持。

Range

客户端进行请求时,通过header中配置 Range参数 可以 指定请求数据的 第一个字节的位置和最后一个字节的位置,格式为:

Range:(unit=first byte pos)-[last byte pos]

如:

Range: bytes=0-499  	// 第 0-499 字节的内容 
Range: bytes=500-999 	// 第 500-999 字节的内容 
Range: bytes=-500 		// 最后 500 字节的内容 
Range: bytes=500- 		// 第 500 字节开始到文件结束的内容 
Range: bytes=0-0,-1 	//第一个 和 最后一个字节 的内容 
Range: bytes=500-600,601-999 // 同时指定多个范围

Content-Range

服务端响应请求时,通过header中返回 Content-Range参数表示当前发送数据的范围和文件总大小,格式为:

Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]

如:

Content-Range: bytes 0-499/22400 // 0-499 为当前发送数据的范围, 22400 为文件总大小

状态码

HTTP/1.1 200 Ok(不使用断点续传方式)
HTTP/1.1 206 Partial Content(使用断点续传方式)

If-Range

服务端响应请求时,通过header中返回If-Range判断实体是否发生改变。如果实体未改变,则服务器继续发送客户端丢失部分,否则发送整个实体,格式为:

If-Range: Etag | HTTP-Date

If-Range 的值为 Etag 或者 Last-Modified 且优先使用ETag,当没有 ETage 却有 Last-modified 时,则使用 Last-modified 作为 If-Range 字段的值。

如:

If-Range: “627-4d648041f6b80” 
If-Range: Fri, 22 Feb 2013 03:45:02 GMT

If-Range 必须与 Range 配套使用。
如果请求header中没有 Range,那么 If-Range 就会被忽略。
如果服务器不支持 If-Range,那么 Range 就会被忽略。

如果请求header中的 Etag 与服务器目标内容的 Etag 相同,则响应状态码为 206。
如果服务器目标内容发生了变化,那么应答报文的状态码为 200。

你可能感兴趣的:(计算机网络)