# HTTP 1.1
HTTP 1.1 是第一个正式的 HTTP 协议,于 1997 被创建,至今仍被广泛使用。
# HTTP/2 (RFC9113)
在 2009,谷歌的工程师开始开发了一款叫做 SPDY (读为 speedy) 的协议,SPDY 之后演化为 HTTP/2,于 2015 年正式被采用。
# 多路复用
在 HTTP 1.1 的时代,对于一台服务器,浏览器只能同时对一台服务器发起 6 个 TCP 连接。开发者用了一种叫做 “sharding” 的方法线过了这个限制,将网页上的资源分布到多个域名上。
H2 解决这个问题的方法是多路复用 (multiplexing),多个 HTTP 请求可以共享同一个 TCP 连接,避免了多次重复的 TCP 握手,并显著提高了同一页面上多个资源的并发下载速度。
# 请求头压缩
H2 增加了 HPACK (RFC7541),可以在 HTTP 请求中压缩请求的 header,减小流量消耗。
HPACK 有两种压缩方式:动态与静态。
HPACK 有 61 个固定的静态的 header 关键词,每个关键词在加密或解密时会被翻译为固定的编码。
除了这 61 个关键词,重复的 header 会被 encoder 定义为动态的关键词并被翻译为固定的编码。
# 优先级
HTTP/2 支持定义每个请求的优先级,能够更快速的下载更重要的页面请求。网页的重要页面资源会被优先下载,而次要的资源(如媒体文件)会在稍后被传输。
# HTTP/3 (RFC9114)
H2 在经过大规模的部署后很快体现出一个问题:
H2 解决了 HTTP 的 head-of-line blocking,但是没有解决 TCP 的 head-of-line blocking。由于多路复用,如果在这时出现了丢包,整个 TCP 连接在被丢弃的 packet 重新发送之前就会暂停。这就导致了即使在信号正常的移动网络上,HTTP/2 的表现也会吃大亏。
HTTP/3 解决 TCP 的 head-of-line blocking 的方法也十分简单粗暴,直接从使用 TCP 转到了使用基于 UDP 的 QUIC 协议。
# QUIC
- QUIC 提供了 O-RTT 握手,实现了更低的握手时间。
- QUIC 在握手中内置了 TLS1.3,同时不像 H2 保留了明文版本(h2c)一样,强制进行 TLS 加密。
# QPACK
HTTP3 从 HPACK 切换到了 QPACK (RFC9204),QPACK 基本与 HPACK 相同,但是经过了重新设计,以支持 QUIC 的乱序传递。