标题: Network系列(5)--QUIC协议科普 创建: 2025-08-01 13:16 更新: 2025-08-04 09:39 链接: https://scz.617.cn/network/202508011316.txt -------------------------------------------------------------------------- 目录: ☆ QUIC协议基本概念 ☆ 测试QUIC协议 1) quic.nginx.org 2) Chrome使用QUIC的大致流程 3) 若干支持QUIC的测试站点 ☆ 检查DNS HTTPS RR 1) dig 2) nslookup 3) dns.google ☆ 检查目标服务器是否支持QUIC 1) http3check.net 2) domsignal.com ☆ 浏览器对QUIC的支持 1) Firefox 2) Chrome 2.1) Chrome的ZeroOmega扩展不能代理QUIC流量 3) Edge ☆ QUIC代理 ☆ 从沿线设备看QUIC -------------------------------------------------------------------------- ☆ QUIC协议基本概念 QUIC是"Quick UDP Internet Connections"的缩写。QUIC协议最初由Google开发,后 由IETF于2021年5月标准化为RFC 9000。参看: -------------------------------------------------------------------------- QUIC A UDP-Based Multiplexed and Secure Transport https://www.rfc-editor.org/rfc/rfc9000 https://datatracker.ietf.org/doc/html/rfc9000 Using TLS to Secure QUIC https://www.rfc-editor.org/rfc/rfc9001 -------------------------------------------------------------------------- QUIC地位类似于TLS,但QUIC的下层协议是UDP,相比之下TLS的下层协议是TCP。QUIC 主要用于支持HTTP/3。 QUIC在高延迟或丢包的网络中表现更好,但某些网络设备会阻止UDP流量,导致QUIC 不可用。若使用代理,因大多数代理不支持UDP,QUIC将不可用。 ☆ 测试QUIC协议 1) quic.nginx.org 用浏览器访问如下URL,并点击Run https://quic.nginx.org/quic.html 会图形化显示测试结果。缺省同时测试HTTP、QUIC,可以只测QUIC。 用浏览器以无痕模式访问如下URL https://quic.nginx.org/ 提前打开F12 Network面板,启用Protocol列,该列默认未启用。可同步Wireshark抓 包,过滤规则"udp port 443"。 在F12 Network中看到,浏览器先用HTTP/2发起请求,响应报文中有 alt-svc: h3=":443"; ma=86400 h3表示HTTP/3,443是QUIC服务运行的端口,ma=86400表示该声明的有效期为86400秒 (1天)。浏览器收到此头部后,会尝试使用QUIC连接指定端口。 在Network中看到,前面几个请求Protocol列都是h2,后面开始出现h3。Wireshark中 已抓到443/UDP报文。 2) Chrome使用QUIC的大致流程 现在Chrome支持并默认启用QUIC。 当Chrome访问目标网站时,检查DNS HTTPS RR或响应报文Alt-Svc头部判断服务器是 否支持QUIC。若服务器未明确声明支持QUIC,Chrome将使用TLS。若服务器声明支持 QUIC,Chrome后续会尝试QUIC,同时尝试TLS。若QUIC连接更快且稳定,Chrome优先 使用QUIC(HTTP/3)。若TLS连接更快或QUIC连接失败,Chrome回退到HTTP/2或1.1。 Chrome会基于Alt-Svc头部的有效期缓存服务器的QUIC支持信息。若之前成功使用 QUIC连接到目标服务器,Chrome在后续请求中优先尝试QUIC。若QUIC连接多次失败, Chrome暂时判定目标服务器不支持QUIC。 3) 若干支持QUIC的测试站点 www.google.com quic.nginx.org cloudflare-quic.com http3.is geekflare.com www.letras.mus.br ☆ 检查DNS HTTPS RR 以www.google.com为目标FQDN 1) dig $ dig @8.8.8.8 www.google.com HTTPS +short 1 . alpn="h2,h3" $ dig @1.1.1.1 www.google.com HTTPS +noall +answer www.google.com. 9240 IN HTTPS 1 . alpn="h2,h3" alpn="h2,h3"表示服务器支持TLS(HTTP/2)和QUIC(HTTP/3)。若后面有"port=443", 表示TLS在443/TCP、QUIC在443/UDP,这是默认值。 2) nslookup $ nslookup -type=HTTPS www.google.com 8.8.8.8 | grep alpn www.google.com rdata_65 = 1 . alpn="h2,h3" rdata_65表示DNS HTTPS RR,其DNS RR Type是65。 3) dns.google https://dns.google/ https://dns.google/query?name=www.google.com&rr_type=HTTPS https://dns.google/resolve?name=www.google.com&type=HTTPS 能看到"alpn=h2,h3" ☆ 检查目标服务器是否支持QUIC 可在F12 Network中查看Protocol列,可查询DNS HTTPS RR,可用Wireshark抓443/ UDP的包,还可用一些在线网站检查目标服务器是否支持QUIC。 1) http3check.net https://http3check.net/ https://http3check.net/?host=www.google.com 若目标服务器支持QUIC,会看到绿色字体显示: QUIC is supported HTTP/3 is supported HTTP Header中有: alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 2) domsignal.com https://domsignal.com/http3-test 输入目标FQDN,点击"Check HTTP/3"。若目标服务器支持QUIC,会看到 HTTP/3 is enabled. It supports the following protocol version. domsignal.com判定quic.nginx.org不支持QUIC,而http3check.net能正确判定 quic.nginx.org。鉴于此,应优先使用http3check.net。 ☆ 浏览器对QUIC的支持 1) Firefox about:config network.http.http3.enabled 2) Chrome -------------------------------------------------------------------------- chrome://flags/ Experimental QUIC protocol Default Enabled Disabled 或 chrome://flags/#enable-quic -------------------------------------------------------------------------- 此处说明如下 Enable experimental QUIC protocol support. - Mac, Windows, Linux, ChromeOS, Android 默认相当于启用状态 2.1) Chrome的ZeroOmega扩展不能代理QUIC流量 Chrome的ZeroOmega扩展不能代理QUIC流量,它不支持UDP,只支持TCP,只支持HTTP、 SOCKS。 启用ZeroOmega扩展,访问quic.nginx.org,F12 Network Protocol只看到h2,再无 h3;尽管第一个响应报文中有Alt-Svc头部,Chrome后续并未尝试h3。Wireshark同步 抓取443/UDP,无QUIC通信发生。初步判断,启用ZeroOmega扩展后,Chrome不存在 QUIC流量泄露,相当于强制TLS。 3) Edge -------------------------------------------------------------------------- edge://flags/ Experimental QUIC protocol Default Enabled Disabled 或 edge://flags/#enable-quic -------------------------------------------------------------------------- 此处说明如下 Enable experimental QUIC protocol support. – Mac, Windows, Linux, Android 默认相当于启用状态 ☆ QUIC代理 -------------------------------------------------------------------------- A http/https proxy using QUIC as transport layer https://github.com/liudanking/quic-proxy Quic to TCP proxy and vice versa. or Websocket to TCP proxy and vice versa https://github.com/atoonk/tcp-to-quic-proxy -------------------------------------------------------------------------- ☆ 从沿线设备看QUIC 发往443/UDP的QUIC Client Initial包,大致包裹结构如下 IP UDP QUIC TLS Client Hello 明文SNI (比如google.com) 虽然QUIC数据包从一开始就被加密,但尚未完成密钥交换,初始数据包使用从目标连 接ID(DCID)和特定版本的salt派生出的密钥加密。这两个字段都以明文形式出现在 QUIC Client Initial数据包中,使得沿线设备能够解密其载荷。这种加密并不能提 供机密性,实际算是混淆。 沿线设备可通过解密看到明文SNI,据此进行某些动作。有些人迷信QUIC,若遭遇强 大的沿线设备,存在信息泄露风险。 以前发过《某DNS污染机制存在内存信息泄露》,平台放行22小时后被404。当时,评 论区有一条,印象深刻,TA是这么说的,“群众里面有坏人啊”。 听话听音、锣鼓听声,人艰不拆。