3. QUIC协议栈结构:它在OSI模型中的位置、与UDP的关系、与TLS1.3的集成

聊QUIC之前,咱们得先搞清楚它到底“长”在哪。很多初学者一上来就抓包,看到一堆UDP报文就懵了——这玩意儿不是HTTP吗?怎么跑UDP上了?

我个人习惯,讲任何协议都先画个OSI模型定位图。这样你心里就有谱了。

核心结论:QUIC在OSI模型中横跨传输层和应用层,但它的“地基”是UDP。

3.1 QUIC在OSI模型中的位置

传统的HTTP/1.1和HTTP/2跑在TCP上,TCP在传输层,HTTP在应用层。中间还有TLS这个“夹层”。

QUIC不一样。它把传输层的部分功能(可靠传输、拥塞控制)和应用层的部分功能(HTTP语义、帧处理)揉在了一起。所以严格来说:

  • 传输层部分:QUIC实现了类似TCP的可靠传输、流量控制、拥塞控制
  • 应用层部分:QUIC承载HTTP/3的帧、流、优先级等语义
  • 安全层:QUIC内置TLS 1.3,握手就在传输层完成

你想想看,TCP+TLS+HTTP是三个独立的层,每层都有自己的握手。QUIC把这三层合并成一次握手。这就是它快的原因之一。

我在项目中遇到过不少同事问:“QUIC到底算传输层还是应用层?”我的回答是——它是个“混合体”,但底层必须依赖UDP才能穿透中间设备。

QUIC在OSI模型中的位置 传统模型 (HTTP/1.1, HTTP/2) 应用层:HTTP 安全层:TLS 传输层:TCP 网络层:IP QUIC模型 (HTTP/3) 应用层:HTTP/3 QUIC传输层 (可靠传输 + 拥塞控制 + 流) TLS 1.3 (内置) UDP (传输层) 网络层:IP 💡 QUIC将HTTP语义、传输层功能、TLS安全合并为一次握手, 底层依赖UDP实现快速部署和NAT穿透。 传统模型:3次TCP握手 + TLS握手 + HTTP数据 = 至少2~3 RTT QUIC模型:1次UDP传输 + 1次QUIC+TLS握手 = 通常1 RTT OSI模型分层对比:传统 vs QUIC

3.2 QUIC与UDP的关系

说白了,QUIC选择UDP作为底层传输,是“不得已而为之”的聪明选择。

为什么不用TCP?因为TCP在内核里,改不了。你想给TCP加个新特性(比如0-RTT、多路复用),得等操作系统升级,等中间设备(防火墙、NAT)支持,周期太长。UDP在用户态,想怎么改都行。

我记得有一次在客户现场排查问题,他们的防火墙把非80/443的UDP端口全封了。QUIC虽然跑在UDP上,但端口还是443。嗯,这里要注意:QUIC默认使用UDP 443端口,就是为了兼容现有防火墙策略。

特性 TCP UDP QUIC (基于UDP)
传输层位置 内核态 内核态 用户态 (基于UDP)
可靠性 内置 无 QUIC自己实现
拥塞控制 内核实现 无 QUIC自己实现
多路复用 无 (HTTP/2有) 无 原生支持
0-RTT 不支持 不支持 支持
升级难度 需更新内核/设备 需更新内核/设备 仅需更新客户端/服务端

避坑指南:我曾经在抓包时发现QUIC连接建立失败,排查了半天,结果是中间防火墙把UDP 443的包给丢了。很多企业网络默认对UDP不友好,会限速或丢包。所以部署QUIC时,一定要先确认网络路径上的设备是否支持UDP 443的稳定传输。

3.3 QUIC与TLS 1.3的集成

这是QUIC最巧妙的设计之一。它不是“先建立连接,再加密”,而是“连接建立的过程就是加密握手的过程”。

你想想看,TCP+TLS的流程是:先三次握手建立TCP连接,然后再TLS握手协商密钥。这至少需要2个RTT。QUIC把这两步合并了——第一个包发出去,既是在建立连接,也是在交换密钥。

具体怎么做的?

  • QUIC的初始包(Initial Packet):包含TLS 1.3的ClientHello
  • 服务端回复(Handshake Packet):包含TLS 1.3的ServerHello + 证书
  • 后续包(Protected Packet):所有数据都是加密的

我在做性能测试时对比过:传统HTTPS首次连接需要2~3个RTT,QUIC首次连接只需要1个RTT。如果是重复连接(0-RTT),甚至不需要等待——直接发加密数据。

关键点:QUIC强制使用TLS 1.3,不支持旧版本。这意味着所有QUIC流量都是加密的。你在Wireshark里看到的QUIC包,除了初始握手阶段的部分字段,其他全是密文。

嗯,这里要注意:虽然QUIC集成了TLS 1.3,但它的握手过程并不是简单地把TLS包塞进UDP里。QUIC对TLS握手消息做了自己的帧封装,并且加入了传输参数(Transport Parameters)的协商。比如:

  • 最大流数量
  • 初始流量控制窗口
  • 连接ID长度

这些参数是在TLS握手的同时交换的,不需要额外RTT。

抓包时的坑:因为QUIC强制加密,如果你没有提前配置SSLKEYLOGFILE,Wireshark里看到的QUIC包全是“Protected Payload”。我曾经在排查一个线上问题时,忘了导出密钥,结果抓了半小时的包全是密文,完全没法分析。所以,抓QUIC包之前,一定要先设置好环境变量SSLKEYLOGFILE,或者用Wireshark的“TLS”密钥配置功能。

3.4 小结:QUIC协议栈的“三层一体”

咱们把今天的内容串一下:

  1. OSI位置:QUIC横跨传输层和应用层,但底层是UDP
  2. 与UDP的关系:UDP只是“管道”,QUIC自己实现了可靠传输和拥塞控制
  3. 与TLS 1.3的集成:握手即加密,一次RTT完成连接建立和安全协商