HTTP1、2、3
HTTP/1.1
HTTP的工作流程
- 浏览器与服务器建立TCP连接,即三次握手
- TCP连接成功,浏览器发送HTTP请求命令
- 服务器接收到请求并返回HTTP响应
- 服务器关闭连接,即四次挥手
- 浏览器解析请求的资源
Connection:keep-alive可以让TCP连接保持打开,浏览器可继续通过相同的连接发送请求。HTTP1.1所有的请求都是默认保持持续连接的
缺陷
高延迟,队头阻塞,贷款无法充分利用
队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也都会被阻塞,会导致客户端迟迟收不到数据。
无状态特性带来的巨大的头部
- 携带过多的header信息,如user-agent,cookie,accept等
- 请求报文有过多的重复字段,浪费资源
明文传输的不安全性
不支持服务推送
HTTP/2
SPDY协议
HTTP/2是HTTP/1.x的代替,但不是重写,HTTP方法/状态码/语义都和HTTP/1.x一样。HTTP/2基于SPDY,专注于性能。
二进制传输
HTTP/2将请求和响应数据分割为更小的帧,并且采用的是二进制编码
它把TCP协议的部分特性挪到了应用层,把原来的“Header+Body”的消息“打散”为数个小片的二进制“帧”,用”HEADERS”帧存放头数据、”DATA”帧存放实体数据。HTP/2数据分帧后”Header+Body”的报文结构就完全消失了,协议看见的只是一个个的”碎片”。
HTTP/2中,同域名下的所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由有一个或多个帧组成。多个帧之间可以乱序发送,根据首部的流标识可以重新组装。
Header压缩
采用HPACK算法压缩头部,压缩率为50%-90%
同时,同一个域名下的两个请求,只会发送差异数据,减少冗余的数据传输,降低开销
多路复用
- 同一个域名下的所有通信都在单个连接上完成
- 单个连接可以承载任意数量的双向数据流
- 数据流以消息的形式发送,而消息由一个或多个帧组成,可以乱序发送,因为根据帧首部的流标识可以重新组装
好处:
- 同一个页面,只需要一个TCP慢连接的过程
- 可以并行交错的发送请求且互不影响
服务端推送
服务端新建”流”主动向客户端发送消息,提前推送客户端需要的静态资源,减少等待的延迟
提高安全性
HTTP2支持使用https进行加密传输
缺陷
TCP+TLS建立连接的时间是主要瓶颈
没有从根本上解决头阻塞问题,一旦丢包,TCP协议还是会重新发送数据。
HTTP2出现丢包时,整个TCP都要等待重传,那么就会阻塞该TCPO连接中的所有请求。
多路复用导致服务器压力上升
多路复用没有限制同时请求数,请求的平均数量与往常相同,但实际上会有许多请求的短暂爆发
多路复用容易Timeout
大批量的请求同时发送,由于HTTP2连接内存在多个并行的流,而网络带宽和服务器资源有限,每个流的资源会被稀释虽然它们开始时间相差更短,但都有可能超时。
HTTP/3
QUIC
基于UDP协议,真正完美解决了队头堵塞的问题
主要特点
改进了拥塞控制,可靠传输
快速握手
由于QUIC是基于UDP的,因此QUIC可以实现0-RTT或者1-RTT来建立连接,可以大大提升首次打开页面的速度
集成了TLS1.3加密
多路复用
连接迁移
