http1.0 特性
- 无状态:服务器不跟踪不记录请求过的状态
- 无连接:浏览器每次请求都需要建立 tcp 连接
无状态
对于无状态的特性可以借助 cookie/session 机制来做身份认证和状态记录
无连接
无连接导致的性能缺陷有两种:
1. 无法复用连接
每次发送请求,都需要进行一次 tcp 连接(即 3 次握手 4 次挥手),使得网络的利用率非常低
2. 队头阻塞
http1.0 规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的
http1.1 特性
为了解决 http1.0 的性能缺陷,http1.1 出现了
http1.1 特性:
- 长连接:新增 Connection 字段,可以设置 keep-alive 值保持连接不断开
- 管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回
- 缓存处理:新增字段 cache-control
- 断点传输
长连接
http1.1 默认保持长连接,数据传输完成保持 tcp 连接不断开, 继续用这个通道传输数据
管道化
基于长连接的基础,我们先看没有管道化请求响应:
tcp 没有断开,用的同一个通道
请求 1 > 响应 1 --> 请求 2 > 响应 2 --> 请求 3 > 响应 3
管道化的请求响应:
请求 1 --> 请求 2 --> 请求 3 > 响应 1 --> 响应 2 --> 响应 3
即使服务器先准备好响应 2, 也是按照请求顺序先返回响应 1
虽然管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题
缓存处理
当浏览器请求资源时,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求
通过设置字段 cache-control 来控制
断点传输
在上传 / 下载资源时,如果资源过大,将其分割为多个部分,分别上传 / 下载,如果遇到网络故障,可以从已经上传 / 下载好的地方继续请求,不用从头开始,提高效率
在 Header 里两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的是 Content-Range
http2.0 特性
- 二进制分帧
- 多路复用:在共享 TCP 链接的基础上同时发送请求和响应
- 头部压缩
- 服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求
二进制分帧
将所有传输的信息分割为更小的消息和帧, 并对它们采用二进制格式的编码
多路复用
基于二进制分帧,在同一域名下所有访问都是从同一个 tcp 连接中走,http 消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来
区别
- http1.0 到 http1.1 的主要区别,就是从无连接到长连接
- http2.0 对比 1.X 版本主要区别就是多路复用