HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回 客户端的响应。本章就让我们来了解一下请求和响应是怎样运作的。
Http报文
本质: HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本;
结构: HTTP 报文大致可分为报文首部(header)和报文主体(body)两块。两者由最初出现的空行(CR+LF)来划分。并不一定要有报文主体。
CR: 回车 \r
LF: 换行 \n
接下来,看一对儿请求报文&返回报文实例。
请求行: 包含用于请求的方法,请求 URI 和 HTTP 版本。
状态行: 包含表明响应结果的状态码,原因短语和 HTTP 版本。
首部字段:
包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。
编码
目的:
提升传输效率以及安全性。节约网络带宽。
报文主体与实体主体:
HTTP报文主要用于传输实体主体。通常情况下,报文实体等于实体主体,当传输中进行编码操作时,实体主体会发生变化,会有所差异。
报文:
由8位字节流组成。
实体:
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
压缩传输的 「内容编码」
内容编码指明应用在实体内容上的编码格式。编码的是实体主体。
常用的内容编码:gzip、compress、deflate、identify
分割发送的 「分块传输编码」
在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之前, 浏览器无法显示请求页面。在传输大容量数时数据通过把数据分割成多块,能够让浏览器逐步显示页面。
分块传输编码会将实体主体分成多个部分(块),每一块都会用十六 进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
分割关键:(实体主体分割)
- 报文序号;
- 报文大小,16进制;
- 端口号
实体类型(多部分对象集合)
数据类型
MIME把数据分为8大类,每个大类下再细分为多个子类。清晰传输数据的格式。
多部分对象集合的每个部分类型中,都可以含有首部字段。另外,可 以在某个部分中嵌套使用多部分对象集合。
multipart/form-data
web表单文件上传时使用,其中boundary是指定后端拆包分割标识。
指定标识: boundaray=xxxxxx分段标识: --xxxxx结束标识: --xxxxx--
form-data报文实例如下:
multipart/byteranges
状态码 206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
报文实例如下:
获取部分内容的 「范围请求」
Req
GET Range: bytes=5001-10000
Res
Content-Range: bytes 5001-10000/10000
Content-Length: 5000
Content-Type: image/jpg
请求参数解释:
- Range:bytes属性指定资源的比特范围
【指定比特区间】bytes=5001-10000
【指定某比特值之后全部】bytes=5001-
【指定某比特值之前全部】bytes=-3000
【指定多重比特范围】bytes=-3000,5000-10000
针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。
「内容协商」返回最适合的内容
- Accept
- content-Type
- Accept-Charset
- Accept-Encoding
- Content-Encoding
- Accept-Language
- Content-Language