http 实体首部
Table of Contents
- Encoding
- 控制传输编码
- 分块编码
- 范围
- 差异编码
Content-Type 类型 Content-Length 长度 Content-Encoding 编码方式 Content-Language 最相配的人类语言 Content-Location 备用位置, 请求时通过他可以获得对象 Content-Range 部分实体, 说明他是整体的哪个部分 Content-MD5 实体主体内容的 md5 校验和 Last-Modified Server 上最后的修改日期时间 Expires 将要失效的日期 Allow Server 允许的方法 ETag 文档的唯一验证码 Cache-Control 如何缓存该文档
Encoding
gzip deflate compress identity 不使用编码 client 没有指定 Accept-Encoding 相当于指定 Accept-Encoding: * (允许任何编码方式) server 的响应首部是 content-encoding
优先级
Accept-Encoding: compress;q=1.0, identity;q=0.5, *;q=0 优先级级别 1.0 最高
控制传输编码
Transfer-Encoding: 响应首部, 告知 Client 为了可靠地传输报文, 已经进行了什么编码
TE: 请求首部, 告知 Server 可以使用哪些传输编码扩展 (可以理解 Accept-Transfer-Encoding)
分块编码
chunked encoding, 没有 content-length
不是持久连接的时候: Client 不需要知道 Server 发送的报文长度, 只要读到服务器关闭主机连接为止
持久连接的时候: Client 需要知道 Server 发送的报文长度 Content-Length
为了解决持久连接需要 Content-Length 的问题, 就有了分块传输. 以大小为 0 的块作为主体表示结束
HTTP/1.1 200 OK<CR><LF> Content-type: text/plain<CR><LF> Transfer-encoding: chunked<CR><LF> <== 分块编码 Trailer: Content-MD5<CR><LF> <== 见下面
27<CR><LF> ................. <== 27 个字符 5<CR><LF> ...... <== 5 个字符 0<CR><LF> <== 传输结束 Content-MD5: xxxxxxxxx <== 仅当首部中有 Trailer 首部才出现
Trailer 首部: 列出了跟在分块报文之后的首部列表 (部分应用程序可能不理解这个首部)
Trailer 不能包括 Transfer-Encoding, Content-Length, Trailer
范围
请求首部
必须包含 Range 头信息来指示客户端希望得到的内容范围, 并且可能包含 If-Range 来作为请求条件
Range: bytes=5001-10000 从 5001 到 10000 Range: bytes=5001- 从 5001 到之后 Range: bytes=-3000, 5000-7000 从一开始到 3000 字节 和 5000-7000
用处: 断线重启, 多线程下载文件
响应首部:
Content-Range 用以指示本次响应中返回的内容的范围, 表示方法和 Range 一样
如果是 Content-Type 为 multipart/byteranges 的 多段下载,
则每一 multipart 段中都应包含 Content-Range 域用以指示本段的内容范围
假如响应中包含 Content-Length, 那么它的数值必须匹配它返回的内容范围的真实字节数
GET /bigfile.html HTTP/1.1 Range: bytes=20224- HTTP/1.1 206 partial Content-Range: bytes=20224- Accept-ranges: bytes
差异编码
Client 接收 Server 端页面发生改变的部分而不是全部
A-IM 首部, Accept-Instance-Manipulation (接受实例操控)
如果成功, Server 端会响应一个特殊的头部 – 226 IM Used 告诉客户端它正在发送的是所请求对象的实例操控
GET /bigfile.html HTTP/1.1 If-None-Match: xxxxxxx1 <== Etag A-IM: diffe HTTP/1.1 226 IM Used IM: diffe Etag: xxxxxxx2 <== 新的 Etag Delta-base: xxxxxxx1 <== 原先的 Etag
IM 的算法类型
vcdiff diffe <== Unix diff-e 命令 gdiff gzip <== 对差异部分进行压缩, 用法如下 deflate <== 对差异部分进行压缩, 用法如下 range <== 表示差异部分的范围 identity
IM: vcdiff, gzip