1.1相比于1.0
- 使用了长连接改善了短链接的性能开销
- 支持管道网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
1.1缺点
- 请求响应头没有压缩
- 发送冗长的头部
- 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
- 没有请求优先级
- 请求只能从客户端开始
2
- 2是基于https,安全性高
2改进
- 头部压缩,消除多个请求的重复头部
- 报文采用二进制格式,统称位帧
- 在 HTTP/2 中每个请求或响应的所有数据包,称为一个数据流(
Stream),不同 Stream 的帧是可以乱序发送的, - 客户端可以指定数据流优先级
- HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。
-服务器可以主动向客户端发送消息。
2缺点
HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。
http3
- HTTP/1.1 中的管道( pipeline)虽然解决了请求的队头阻塞,但是没有解决响应的队头阻塞,因为服务端需要按顺序响应收到的请求,如果服务端处理某个请求消耗的时间比较长,那么只能等相应完这个请求后, 才能处理下一个请求,这属于 HTTP 层队头阻塞。
- HTTP/2 虽然通过多个请求复用一个 TCP 连接解决了 HTTP 的队头阻塞 ,但是一旦发生丢包,就会阻塞住所有的 HTTP 请求,这属于 TCP 层队头阻塞。
- 所以http3把http的tcp协议改成了udp
- udp发送不管顺序不管丢包,所以不会出现对头堵塞,但他是不可靠传输,所以加了一个QUIC协议实现可靠性
QUIC
- 无对头堵塞:当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题。
- QUIC 内部包含了 TLS1.3,因此仅需 1 个 RTT 就可以「同时」完成建立连接与密钥协商,
- QUIC 协议没有用四元组的方式来“绑定”连接,而是通过连接 ID来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。
- (基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接,那么当移动设备的网络从 4G 切换到 WIFI 时,意味着 IP 地址变化了,那么就必须要断开连接,然后重新建立连接)