HTTP3
HTTP/1.1 和 HTTP/2 使用 TCP 传输协议,HTTP/3 使用 QUIC (Quick UDP Internet Connections) 传输层协议,其是由 Google 开发的一种基于 UDP 的传输协议。之所以用 QUIC 协议的最主要原因,是为了彻底解决队头阻塞问题。
QUIC
TCP 队头阻塞
HTTP/2 解决了 HTTP 的队头拥塞(head of line blocking)问题,客户端无须等待一个请求完成才能发送下一个请求,但它解决的只是 HTTP 的队头阻塞问题。
如果 HTTP/2 连接双方的网络中有一个数据包丢失,或者任何一方的网络出现中断,整个TCP连接就会暂停,丢失的数据包需要被重新传输。因为TCP是一个按序传输的链条,因此如果其中一个点丢失了,链路上之后的内容就都需要等待。
这种单个数据包造成的阻塞,就是 TCP 上的队头阻塞(head of line blocking)。
安全性
QUIC 始终保证安全性。QUIC 协议没有明文的版本,所以想要建立一个 QUIC 连接,就必须通过 TLS 1.3 来安全地建立一个加密连接。QUIC 只在加密协议协商时会发送几个明文传送的初始握手报文。
减少延迟
TCP 需要 3 次握手,QUIC 提供了 0-RTT 和 1-RTT 握手,减少了协商和建立连接所需要的时间。
HTTP3 协议特点
协议栈
可靠性
虽然 UDP 不提供可靠的传输,但 QUIC 在基于 UDP 之时增加了一层带来可靠性的层。它提供了数据包重传、拥塞控制、调整传输节奏(pacing)以及其他一些TCP中存在的特性。
只要连接没有中断,从QUIC一端传输的数据迟早会出现在另一端。
数据流
QUIC在同一物理连接上可以有多个独立的逻辑数据流。这些数据流并行在同一个连接上传输,不影响其他流。在已建立的连接上,双方均可以建立传输给对方的数据流。单一数据流的传输是可靠、有序的,但不同的数据流间可能无序传送。QUIC可对连接和数据流分别进行流量控制(flow control)。
快速握手
QUIC提供0-RTT和1-RTT的连接建立,这意味着QUIC在最佳情况下不需要任何的额外往返时间便可建立新连接。其中更快的0-RTT仅在两个主机之间建立过连接且缓存了该连接的“秘密”(secret)时可以使用。
TLS 1.3
握手所花费的往返次数更低,从而能降低协议的延迟。
HTTP/2 vs HTTP/3
- HTTP/3面向QUIC设计,QUIC是一个自己处理数据流的传输层协议。
- HTTP/2面向TCP设计,因此数据流在HTTP层处理。
相似之处
这两个协议为客户端提供了几乎相同的功能集。
- 两者都提供数据流
- 两者都提供服务器推送
- 两者都有头部压缩,QPACK与HPACK的设计非常类似
- 两者都通过单一连接上的数据流提供复用
- 两者都提供数据流的优先度设置
不同之处
- 两个协议的主要不同点在于细节,不同之处主要由HTTP/3使用的QUIC带来。
- 得益于QUIC的0-RTT握手,HTTP/3可以提供更好的早期数据支持,而TCP快速打开和TLS通常只能传输更少的数据,且经常存在问题。
- 得益于QUIC,HTTP/3的握手速度比TCP+TLS快得多。
- HTTP/3不存在明文的不安全版本。尽管在互联网上很少见,HTTP/2还是可以不配合HTTPS来实现和使用。
- 通过ALPN拓展,HTTP/2可以直接在TLS握手时进行协商。HTTP/3基于QUIC,所以需要凭借响应中的
Alt-Svc:
头部来向客户端宣告。