http的演变过程为1.0 → 1.1 → 2.0 → 3.0。每个版本其实都是为了解决上一个版本的缺陷,在不断的改进和完善。
从http1.0到http1.1
Http1.0
最大的问题,非长连接!(Connection: close)
Http1.1
支持长连接。(Connection: keep-alive)
为什么需要长连接?
省去三次握手和四次挥手!

有了长连接,很自然的,我可以一次连接同时发送多个http请求,即管线化技术。

综上:http1.1比http1.0最重大的改进就是支持了长连接和管线化。
从http1.1到http2.0
解决管线化的缺点:http队头阻塞 (响应的时候必须按照发送的顺序接收,上图的1收不到会阻塞2和3)。(方法:报文拆分成帧,添加流标识符 )
引入HPACK算法压缩头部
支持服务器推送数据
从http2.0到http3.0
从tcp下手了,tcp和操作系统绑定,不好优化,所以使用udp+quic完成,可以说是tcp2.0。
解决了tcp队头阻塞 。以上管线化的示例图中,在http2.0中,http请求123不会阻塞了,但是单个请求内部的tcp序列还是存在队头阻塞的。即请求1内的1.1,1.2,1.3还是要按顺序接收的。(方法,QUIC帧,加流标识符)
整合了tcp三次握手和TLS,使连接更快。
TLS1.3版本更新,更加安全。
网络连接状态变化时,无需重连(不依赖ip地址,加了连接ID)。
传输层与连接机制
| 版本 | 传输层协议 | 连接管理 | 并发能力 |
|---|---|---|---|
| HTTP/1.1 | TCP | 持久连接(Keep-Alive),单连接串行请求 | 同一域名最多6~8个TCP连接并行,资源分片缓解阻塞 |
| HTTP/2 | TCP | 单TCP连接上多路复用(Multiplexing) | 多个请求/响应帧交错传输,无序交付,解决HTTP层队头阻塞 |
| HTTP/3 | QUIC(基于UDP) | 连接建立融合TLS 1.3,0-RTT/1-RTT快速握手 | 流级独立拥塞控制与重传,单流丢包不影响其他流 |
核心性能优化机制
| 机制 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 头部压缩 | 无 | HPACK(差分编码,压缩率50%~90%) | QPACK(基于HPACK,支持动态表同步) |
| 队头阻塞 | 严重:请求必须按序响应 | 部分解决:仅消除HTTP层阻塞,TCP层丢包仍阻塞所有流 | 彻底解决:每个流独立,丢包仅影响本流 |
| 服务器推送 | 不支持 | 支持(可被客户端禁用) | 支持(通过QPACK流实现) |
| 加密 | 可选(HTTPS为扩展) | 通常强制使用TLS | 强制使用TLS 1.3,加密内建于QUIC |