QUIC的全称是Quick UDP Internet Connections,中文译作快速UDP互联网连接。它最初诞生于谷歌内部的网络加速项目。2013年前后,谷歌工程师在优化Chrome浏览器与谷歌自有服务之间的通信时发现,传统基于TCP的HTTPS建连路径存在结构性时延:一次全新的HTTPS会话必须先完成TCP三次握手,再完成TLS握手,两套握手叠加导致用户在点击链接之后要等待数百毫秒才能真正开始接收数据。为了绕开这一瓶颈,谷歌在UDP数据报之上自行实现了一套集可靠传输、加密与多路复用于一体的私有协议,即gQUIC。由于该协议把此前分散在TCP、TLS与应用层多路复用框架中的职责整合进单一协议,并且完全运行在用户空间,谷歌得以绕开操作系统内核的升级周期,以极高的频率迭代拥塞控制与丢包恢复算法。
gQUIC在生产环境中的出色表现引起了互联网工程任务组IETF的注意。2016年,谷歌将协议草案提交IETF标准化,经过工作组数年的讨论与多轮迭代,2021年5月,IETF正式发布RFC 9000,标题为QUIC: A UDP-Based Multiplexed and Secure Transport,即基于UDP的多路复用安全传输协议。与之配套发布的还有RFC 9001与RFC 9002,前者规定QUIC如何集成TLS 1.3加密,后者规定丢包检测与拥塞控制算法。IETF版本与谷歌早期私有版本在报文格式、加密方案与编号方式上均有差异,业界通常将IETF版本称为QUIC v1。2022年6月,IETF又发布RFC 9114,正式确立HTTP/3以QUIC作为传输载体。至此,QUIC完成了从实验性加速协议到Web基础传输协议的完整跃迁。软考网络规划设计师考纲自2021年起收录QUIC考点,2021年下半年上午综合知识真题第29题即直接考查QUIC协议的优势特性,这也是该知识点首次登上高级资格考试试卷。
这里需要回答一个关键问题:QUIC为什么选择UDP作为底座,而不是直接定义一个全新的IP协议?原因在于部署现实。互联网中的网络地址转换设备、防火墙与负载均衡器经过数十年演进,只对TCP与UDP两种协议号放行,任何新定义的IP协议号都会在中间设备上被无声丢弃。UDP是唯一一个既被全网中间设备通行、又不含任何强制语义的协议,恰好可以充当新传输协议的可部署载体。谷歌在UDP之上实现QUIC,本质上是借助UDP这个已被广泛接受的信封,把新的传输语义装进去,从而在不改造任何网络中间设备的前提下完成协议升级。这一部署逻辑本身就是常考点。
理解QUIC的层次归属,是掌握该协议的第一道门槛。按照OSI参考模型与TCP/IP体系结构的划分,QUIC属于传输层协议,与TCP、UDP处于同一层次。但QUIC的特殊之处在于,它不是直接构建在IP之上,而是构建在UDP之上。UDP本身只提供无连接、不可靠的数据报投递,QUIC则在这一薄薄的底座上自行实现了连接管理、可靠重传、流量控制与拥塞控制,等于在用户空间重新造出了一个具备TCP能力的传输层。因此标准文档在表述QUIC时,始终使用基于UDP的多路复用安全传输协议这一完整定语,意在强调QUIC与UDP的关系是承载与被承载的关系,而非替代关系。
从层次内部看,QUIC做了精细的职责分工:传输职责由QUIC核心机制承担,包括连接建立、流管理、丢包恢复与拥塞控制;安全职责由内嵌的TLS 1.3承担,QUIC将TLS握手报文作为自身承载的密码学帧在连接中传输;多路复用职责由流机制承担,一条QUIC连接中可以并发承载数十乃至上百条相互独立的数据流。这种一体化设计带来一个直接后果:过去需要TCP加TLS加HTTP/2三层协议协同才能完成的可靠加密传输,如今由QUIC单一协议加应用层协议两层即可完成。与TCP相比,QUIC把连接管理与加密握手从两套独立的握手压缩为一套,把字节流模型升级为流模型,把连接身份从四元组解耦为连接ID,这三点革新构成了QUIC全部技术价值的起点。考生需要牢记这个层次结论:QUIC是传输层协议,HTTP/3是应用层协议,HTTP/3运行在QUIC之上,二者不可混为一谈。
QUIC最引人注目的性能优势来自握手设计。传统HTTPS建连流程中,TCP三次握手消耗一个往返时间,TLS握手再消耗一到两个往返时间,全新连接总计需要两到三个RTT才能发出第一条业务数据。QUIC把传输握手与加密握手合并成一次握手:客户端发出的首个Initial包中直接携带TLS 1.3的ClientHello,服务器在回包中一次性返回ServerHello、证书链与Finished,客户端收到后即可发送业务数据,全新连接仅需一个RTT。对于曾经连接过的服务器,客户端本地缓存了对方传输参数与TLS会话票据,重连时可以在首个报文中直接携带加密的早期数据,即所谓0-RTT握手,将建连时延压缩到理论上的零往返。
这一设计得以成立的基础是密钥分层机制。QUIC连接的不同阶段使用不同等级的密钥:Initial包使用由协议版本与目的连接ID公开派生的初始密钥,Handshake阶段使用握手密钥,业务数据使用1-RTT密钥。每一级密钥只保护本级报文,上一级密钥协商完成后立即弃用下一级,从而在保证安全性的同时允许Initial包携带明文可解析的连接标识,让服务器在完成密钥协商之前就能识别连接、发送重试令牌。考生需要特别注意,Initial包的加密并非机密保护,而是防篡改保护,因为其密钥派生规则是公开固定的。
握手过程中还有两个不可忽视的安全机制。其一是Retry重试机制,服务器在收到首个Initial包后,如果怀疑客户端源地址被伪造,会回复一个Retry包,要求客户端携带服务器签发的令牌重新发送Initial,只有验证通过才继续握手。这一机制配合服务器在地址验证前最多发送三倍于收到字节数的限制,共同构成了抗放大攻击防线,防止QUIC服务器被恶意利用为反射放大攻击的跳板。其二是版本协商机制,客户端在Initial包中声明自己支持的协议版本,服务器若不支持,则回复Version Negotiation包列出自身版本清单,双方据此达成一致,QUIC v1的版本号为整数一。这两个机制确保了握手过程既不会被滥用,也能在异构部署中平滑推进。
队头阻塞是QUIC要解决的核心痛点。TCP是严格的字节流协议,接收方必须按序交付数据,一旦某个报文段丢失,其后所有已经到达的数据都要在缓冲区中等待,直到丢失的报文段重传成功。HTTP/2虽然在同一TCP连接上实现了多路复用,但底层仍然是一条TCP流,任何一个流的丢包都会阻塞整条连接上所有流的交付,这就是HTTP/2饱受诟病的队头阻塞问题。
QUIC的解法是把流的概念下沉到传输层。一条QUIC连接内部可以并发多条双向流或单向流,每条流拥有独立的流编号、独立的发送与接收窗口、独立的乱序缓冲区。某个报文丢失时,只有该报文所属的流需要等待重传,其他流的数据照常交付。换言之,QUIC把可靠传输的粒度从连接级细化到了流级,从结构上消除了应用层多路复用中的队头阻塞。流编号的分配规则也值得记忆:客户端发起的流编号为偶数,服务器发起的流编号为奇数,编号次低位区分双向流与单向流,客户端发起的首个双向流编号为零。
流机制之上还叠加了双层流量控制与显式中止语义。流量控制分为流级与连接级两层:流级窗口由接收方通过MAX_STREAM_DATA帧通告,限制单条流的最大接收偏移量;连接级窗口由MAX_DATA帧通告,限制整条连接所有流的数据总量,两层窗口共同防止发送方压垮接收方资源。与TCP的静默流控不同,QUIC的流可以显式中止:发送方不再需要某条流时发送RESET_STREAM帧通知对端丢弃该流未发送的数据,接收方无力继续接收时发送STOP_SENDING帧请求对端停止发送,双方都能主动终止一条流而不影响连接上的其他流。这种细粒度的资源控制能力,是字节流模型无法提供的。
传统TCP连接的身份由源IP、源端口、目的IP、目的端口四元组唯一确定,任何一个要素变化都意味着连接中断。QUIC引入了连接ID机制,每个连接拥有一组由对端分配、本地使用的连接标识,报文携带目的连接ID用于对端路由、携带源连接ID用于对端回包。只要连接ID不变,即使底层网络路径完全改变,连接依然成立。智能手机在无线局域网与蜂窝网络之间切换、网络地址转换设备重新绑定端口、负载均衡设备调度流量,这些在TCP下必然导致连接重建的场景,在QUIC下连接都可以无缝延续,这就是连接迁移。
迁移并非无条件自动生效。收到来自新地址的报文后,对端会发起路径验证,发送PATH_CHALLENGE帧并等待PATH_RESPONSE帧,确认新地址真实可达后才正式迁移数据路径,以防攻击者伪造源地址劫持连接。从触发方式看,连接迁移分为两类:一类是网络地址转换设备重新绑定端口导致的被动迁移,客户端身份不变而出口地址变化;另一类是客户端主动切换网络接口触发的主动迁移,服务器可以通过传输参数向客户端通告首选地址,引导客户端优先迁移到该地址。对于大型服务而言,连接迁移与负载均衡的配合还意味着连接调度不再依赖五元组哈希,调度粒度可以细化到连接ID级别。连接ID本身还附带一项隐私设计:连接ID需要定期轮换,旧连接ID由本地发送RETIRE_CONNECTION_ID帧显式注销,防止长时间使用同一标识被第三方追踪。连接迁移是QUIC区别于一切传统传输协议的标志性能力,也是命题人最偏爱的考点之一。
可靠传输协议普遍面临一个棘手问题:发送方发出数据包后启动定时器,超时重传,此时收到确认报文,无法判断
本篇完!