报文组成
HTTP 报文组成大致如下:
- 报文首部 - 请求或响应的内容及属性
- 空行(CR+LF)- 回车符和换行符组成的空行;
- 报文主体 - 应被发送的数据
报文首部通常包括:
- 请求行/状态行
- 请求行信息包括:请求方法、URI、HTTP 版本
- 状态行信息包括:HTTP 版本、状态码、原因短语
- 首部字段
- 包括:通用首部、请求首部、响应首部、实体首部
- 其他未在 RFC 定义的首部。
编码
可以通过编码提升传输速率,响应的也会增加 CPU 资源的消耗。
通常,报文主体等于实体主体,只有当传输中进行编码操作时,实体主体的内容发生变化。
HTTP 协议中可以通过 内容编码 来对实体进行编码,通常以 gzip 进行编码。
而在大容量数据需要进行内容分割时,会采用 分块传输编码(Chunked Transfer Coding) 。它会将实体主体分成多个部分,每一块都用十六进制来标记块的大小。最后一块会使用 "0(CR+LF)"
进行标记。
HTTP/1.1 中的 传输编码(Transfer Coding) 可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
发送多种数据类型
MIME - Multipurpose Internet Mail Extensions 多用途因特网邮件扩展。
MIME 会使用 多部分对象集合(Multipart) 来容纳多份不同类型的数据。
- multipart/form-data - 在 Web 表单文件上传时使用;
- multipart/byteranges - 状态码为 206 ,响应报文包含了多个范围的内容时使用。
对内容的范围请求
如果在下载网络资源时出现中断,可以通过 范围请求 从中断处恢复下载。
Range: bytes=5001-10000 // 5001 至 10000 的内容
Range: bytes=5001- // 5001 及往后的内容
Range: bytes=0-3000, 5000-7000 // 多个范围内容
内容协商
内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。
- Accept
- Accept-Charset - 字符集
- Accept-Encoding - 编码
- Accept-Language - 语言
- Content-Language
协商方式:
- 服务端驱动协商 - 由服务端根据请求首部字段来进行内容协商。
- 客户端驱动协商 - 根据用户的选择、浏览器选项、操作系统类型等进行内容协商。
- 透明协商 - 服务端和客户端均进行各自的内容协商工作(用代理服务器进行缓存协助)。