什么是QUIC和HTTP/3?
快速UDP互联网连接(QUIC)是一种通用传输层协议,旨在凭借灵活性、内置安全机制、更少的性能问题和更快的普及速度取代传输控制协议(TCP)。QUIC最初由Google开发,使用用户数据报协议(UDP)作为底层传输机制,在客户端与服务器之间传输数据包。值得注意的是,QUIC还将传输层安全协议(TLS)作为不可或缺的组成部分,而不是像HTTP/1.1和HTTP/2那样将其作为附加层。
基于QUIC的HTTP/3是超文本传输协议(HTTP)的第三个主要版本,并于2022年被采纳为IETF标准。QUIC+HTTP/3旨在解决TCP固有的局限性,这些局限性会制约性能和用户体验。
API如何工作?
API是应用程序的“公开界面”,用于展示应用程序可执行的功能和可提供的信息,并定义正确的请求格式。开发人员为应用程序创建并公开API后,其他应用程序便可与该应用程序通信。
在许多情况下,API可提供随时可用的常用功能,从而为开发人员节省宝贵时间。开发人员无需重复开发现有应用的功能,只需调用其API,即可将这些功能集成到自己的应用中。

HTTP传输栈概览
QUIC+HTTP/3 基础知识
QUIC旨在为HTTP/3提供高性能、高可靠性和高安全性的传输协议(但QUIC也适用于非HTTP流量)。
如果您对QUIC完全不了解,建议观看下方的入门视频。
UDP、TCP和TLS
UDP是一种简单的轻量级协议,建立初始连接时不需要像TCP那样进行复杂的三次握手。这种简洁性使UDP速度快且无需建立连接,但也意味着与TCP相比,它缺少实现可靠、安全通信所必需的功能。
QUIC的独特之处在于融合了UDP和TCP协议的优势。它在底层传输中采用无连接的UDP协议,以减少连接和传输延迟;同时,通过重新实现TCP的连接建立和丢包检测功能,在更高层面向连接,从而保证数据包送达。QUIC可识别丢失的数据并完成重传,确保流畅的用户体验。
QUIC还将TLS作为不可或缺的组成部分,而不是像HTTP/1.1和HTTP/2那样将其作为附加层。这种集成方式可确保消息默认加密。
QUIC网络概述
下图展示了QUIC网络的基本结构。如图所示,承载HTTP/3请求、响应或任何应用数据的逻辑对象是QUIC流。为了在网络端点之间传输,QUIC流会封装在多个逻辑层中。

QUIC流剖析
从外到内,逻辑层和对象依次为:
- UDP数据报:包含一个用于指定源端口和目标端口(以及长度和校验和数据)的标头,后跟一个或多个QUIC数据包。数据报是通过网络从客户端传输到服务器的信息单元。
- QUIC数据包:包含一个QUIC标头和一个或多个QUIC帧。
- QUIC标头:包含有关数据包的元数据。标头分为两种类型:
- 长标头,用于建立连接。
- 短标头,在连接建立后使用。它包含连接ID、数据包编号和密钥阶段等数据(密钥阶段用于跟踪加密数据包所使用的密钥,以支持密钥轮换)。对于特定的连接和密钥阶段,数据包编号是唯一的,并且始终递增。
- 帧:包含类型、流ID、偏移量和流数据。流数据分布在多个帧中,但可以使用连接ID、流ID和偏移量进行组装,并按正确顺序排列各数据块。
- 流:单个QUIC连接内的单向或双向数据流。每个QUIC连接可支持多个相互独立的流,每个流都有自己的流ID。如果包含部分流的QUIC数据包丢失,不会影响未包含在该丢失数据包中的其他流继续传输(这对于避免HTTP/2中出现的队头阻塞至关重要)。流可以是双向的,并且可由任一端点创建。
QUIC 如何与 TLS 握手协同工作
TLS握手可在客户端与服务器之间建立安全连接。QUIC提供的加密功能需要TLS v1.3。如下图所示,QUIC保留了用于提供加密密钥的TLS“内容层”,但使用自身的传输机制取代了“记录层”。
QUIC还依赖TLS进行身份验证,并协商对安全性和性能至关重要的参数。这两种协议并非采用严格的分层结构,而是相互协作:QUIC使用TLS握手建立安全连接,而TLS则利用QUIC提供的可靠性、有序交付和记录层。
从整体来看,TLS与QUIC组件之间主要有两种交互:
- TLS组件通过QUIC组件发送和接收消息,QUIC为TLS提供可靠的流抽象。
- TLS组件向QUIC组件提供一系列更新,包括:(a)要安装的新数据包保护密钥;(b)状态变更,例如握手完成、服务器证书等。
QUIC TLS 的 HTTP/3 支持选项
QUIC TLS是专为QUIC协议设计的一种TLS变体。目前,需要在QUIC TLS中获得HTTP/3支持的用户有两种选择:
- OpenSSL QUIC实现,OpenSSL目前正在自行实现完整的QUIC协议栈。该开发项目会将所有QUIC功能封装在实现中,让HTTP/3用户能够更轻松地使用OpenSSL TLS API,而无需考虑QUIC特有的功能。
- 支持BoringSSL QUIC API的库:BoringSSL、quicTLS和LibreSSL(最初是OpenSSL的一个分支)等多种SSL库现已通过实现BoringSSL QUIC API来提供QUIC TLS功能。由于OpenSSL QUIC TLS实现尚未就绪,目前这是希望使用HTTP/3的用户唯一可选的方案。
QUIC+HTTP/3 的优势
QUIC+HTTP/3旨在通过降低延迟并改善不可靠网络中的数据传输,提升Web应用性能。其优势包括:
- 降低延迟:TCP等传统协议的连接建立过程会产生延迟。QUIC+HTTP/3的多路复用功能可提高连接建立效率,从而降低连接建立和数据传输的延迟。
- 更快建立连接:QUIC+HTTP/3将TLS握手和加密设置合并为一个步骤,从而减少建立安全连接所需的往返次数。
- 多路复用:QUIC+HTTP/3可在单个连接中处理多个数据流,从而更高效地利用网络资源,并有助于避免队头阻塞问题。在传统TCP连接中,一个速度较慢的数据流可能会延迟其他数据流。
- 改进的纠错机制:QUIC采用前向纠错技术,无需重传即可帮助恢复丢失的数据包,从而降低丢包对性能的影响。
- 降低数据包丢失的影响:UDP是无连接协议,无需像TCP那样进行严格的错误检查,因此传输速度更快。这在网络状况不太稳定的场景中尤其有利。
- 自适应拥塞控制:与TCP拥塞控制相比,QUIC+HTTP/3旨在提高效率和响应速度,从而在不断变化的网络环境中实现更好的性能。
- 迁移支持:QUIC+HTTP/3可在不同网络连接之间无缝切换(例如,从Wi-Fi切换到蜂窝网络),且不会影响应用性能。
- 增强安全性:QUIC+HTTP/3默认集成加密,可提升数据传输的安全性和隐私保护。此加密可防止传输中的数据遭到窃听和篡改。
- NAT穿越:QUIC+HTTP/3使用UDP,有助于实现网络地址转换(NAT)穿越,从而在传统TCP连接可能遇到问题的场景中更轻松地建立连接。
- 持续演进:QUIC+HTTP/3采用软件实现和更新,无需更改底层网络基础设施,因此可以更快地更新和改进,以适应不断变化的网络状况和安全问题。

