HTTP1.1
缺陷
- 高延迟 — 队头阻塞(Head-Of-Line Blocking)
- 无状态特性 — 阻碍交互
- 明文传输 — 不安全性
- 不支持服务端推送
队头阻塞
队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。 解决方案:
- 将同一页面的资源分散到不同域名下,提升连接上限。虽然能公用一个 TCP 管道,但是在一个管道中同一时刻只能处理一个请求,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。
- 减少请求数量
- 内联一些资源:css、base64 图片等
- 合并小文件减少资源数
无状态特性
无状态是指协议对于连接状态没有记忆能力。纯净的 HTTP 是没有 cookie 等机制的,每一个连接都是一个新的连接。上一次请求验证了用户名密码,而下一次请求服务器并不知道它与上一条请求有何关联,换句话说就是掉登录态。
不安全性
传输内容没有加密,中途可能被篡改和劫持。
SPDY 协议

- 多路复用 — 解决队头阻塞。允许在一个连接上无限制并发流,在一个channel中,TCP的效率更高,有更好的流量控制以及拥塞控制。
- 头部压缩 — 解决巨大的 HTTP 头部。使用专门的 HPACK 算法,每次请求和响应只发送差异头部。
- 请求优先级 — 先获取重要数据。网络通道被堵塞时,高优先级的请求会被优先处理。
- 服务端推送 — 填补空缺。服务端可以主动向客户端推送资源
- 提高安全性。支持https加密传输
HTTP2
基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接。
新增特性:
- 二进制分帧 - HTTP2 性能增强的核心
- 多路复用 - 解决串行的文件传输和连接数过多
二进制分帧
首先,HTTP2 没有改变 HTTP1 的语义,只是在应用层使用二进制分帧方式传输。因此,也引入了新的通信单位:帧、消息、流。 分帧有什么好处?服务器单位时间接收到的请求数变多,可以提高并发数。最重要的是,为多路复用提供了底层支持。
多路复用
一个域名对应一个连接,一个流代表了一个完整的请求-响应过程。帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。多路复用,就是在一个 TCP 连接中可以存在多个流。demo
HTTP2的缺陷
- TCP 以及 TCP+TLS 建立连接的延时:三次握手
- TCP 的队头阻塞并没有彻底解决:TCP的重传机制导致丢包时,会导致该连接中的所有请求。
- 多路复用导致服务器压力上升:没有限制同时请求次数,实际可能有流量的短暂爆发,QPS激增。
- 多路复用容易 Timeout:大量的请求同时发送,加上网络以及服务端的处理可能导致大面积的超时情况。
QUIC
基于 UDP 协议的 QUIC 协议。而这个就是 HTTP3。它真正“完美”地解决了“队头阻塞”问题。

特点:
- 改进的拥塞控制、可靠传输
- 快速握手
- 集成了 TLS 1.3 加密
- 多路复用
- 连接迁移