Guanran928 的博客

不同版本的 HTTP 协议的区别

| 2 分钟 | 741 字
#笔记 #网络

# 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

# QPACK

HTTP3 从 HPACK 切换到了 QPACK (RFC9204),QPACK 基本与 HPACK 相同,但是经过了重新设计,以支持 QUIC 的乱序传递。