基本介绍
最简单的HTTP通信过程是发生在客户端与服务端之间的。
客户端发送请求,而服务端响应请求,如上图所示。
而客户端发送请求的最重要目的是为了获取服务端上的资源。然而客户端为了获取自己想要的资源就必须告诉服务端资源的位置(URI)。只有告诉服务端资源的位置服务端才能返回给客户端其想要的资源。
所以,客户端不是发送一个请求就可以获取到资源,在发送请求的时候,请求要携带一些数据,例如资源的位置URI,请求服务端的位置等等。
而这些数据就是报文。
报文是客户端和服务端进行数据交互的数据载体
报文的数据结构
用于HTTP协议交互的信息被称为HTTP报文
HTTP报文本身是由多行数据构成的字符串文本
而HTTP报文可以分为两个部分
- 报文首部
- 报文主体
而在这里,根据HTTP报文的使用目的可以分为以下两种
- 请求报文(客户端发送请求的HTTP报文)
- 响应报文(服务端响应请求的HTTP报文)
请求报文的结构如下图所示
而响应报文的结构如下图所示
注:
首部字段:包含表示请求和响应的各种条件和数学的各类首部。
一般有4种首部:
1. 通用首部
2. 请求首部
3. 响应首部
4. 实体首部
传输过程
HTTP的通信过程中,为了提高传输过程中传输的稳定性和高效性,有以下两种手段来实现传输速度的提升
-
压缩传输(内容编码)
压缩传输是指将传输内容进行压缩,降低内容的字节大小,从而实现传输速率的提升 由发送方将内容进行编码压缩,然后由接收端根据发送方发送报文的请求头对内容进行解码 常见的压缩方法如下 1. gzip 2. compress 3. deflate 4. identity
-
分块压缩传输
分块压缩传输是指发送方将要传输的内容进行分块,然后每一块进行压缩,然后一块一块发送给接收端。 接收端根据发送方发过来的HTTP报文判断该块是属于整体内容的哪一部分,并且判断此时发送方所要发送的内容是否已经结束。 接收端在介绍块数据的同时,会同时将块数据进行解码,无需等到发送方将数据全部发送过来再解码
HTTP的通信传输内容的不同可以分为以下两种
- 简单的字符串传输(文本传输)
- 多部分对象传输(传输内容含有文件,图片,音频等二进制数据;文本传输+二进制传输)
简单的文本传输只需要将内容变成字符串(或许会添加内容压缩操作)放在HTTP报文中。
而文本传输+二进制传输则需要特殊的实体类型来进行传输
在这里要提一下实体主体和报文主体的区别:
报文:是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP进行传输
实体:作为请求或者响应的有效载荷数据被传输,其内容由实体首部和实体主体组成
HTTP报文的主体用于传输请求或响应的实体主体
而为了能进行文本传输+二进制传输,HTTP根据MINE机制实现了以下多部分对象
- multipart/form-data(在web表单文件上传时使用,在web开发中这个比较常用)
- multipart/byteranges(状态码206响应报文包含多个范围的内容使用)
在HTTP的通信过程中,可以通过3种机制来决定服务端所要返回的内容
这三种机制分别如下
- 服务端驱动协商
服务端根据请求报文的报文头相关字段来判断应该返回给什么类型的资源
相关首部字段如下
1. Accept
2. Accept-Charset
3. Accept-Encoding
4. Accept-Language
5. Content-Language
- 客户端驱动协商
在客户端由客户选择自己所想要的资源
例如,在一个网站中,是想要英文版本的还是要中文版本的,则由用户手动切换语言,
然后通过JavaScript将用户所做出的选择发送给服务端,服务端根据请求报文返回相应资源。
然后客户端将收到的内容重新在客户端那边显示
- 透明协商
服务端驱动协商 + 客户端驱动协商