前情提要: https://tanronggui.xyz/t/699027
上次发现 iOS14 会查询域名的 HTTPS 记录(TYPE65,以前叫 HTTPSSVC)后,本以为只是个试探性功能没多大用,结果今天看到 cloudflare 的贴文,已经完全实用化了。
简单来说,使用 CF 的域名已增加 HTTPS 记录,记录里罗列服务器支持的协议类型(如 HTTP/3,HTTP/2 ),同时提供 IPv4 和 v6 地址,免去查询 A 和 AAAA 记录的必要,使得客户端可以直接用合适的协议连接,不需要先 HTTP 再 fallback 。
原文: https://blog.cloudflare.com/speeding-up-https-and-http-3-negotiation-with-dns/
不罗嗦,下面是网关上的抓包分析,以 iOS14 设备连接 V2EX 为例( Safari 要先开启 HTTP/3 支持):
1 、包 497-499:客户端发出 HTTPS(65),A,AAAA 三种类型的 DNS 查询
2 、包 500:HTTPS 结果返回,由于 wireshark 不支持 decode 65 记录,翻译如下,data 部分共 96 字节:
0000 00 01 00 00 01 00 15 05 68 33 2d 32 39 05 68 33 ........h3-29.h3
0010 2d 32 38 05 68 33 2d 32 37 02 68 32 00 04 00 0c -28.h3-27.h2....
0020 68 14 09 da 68 14 0a da ac 43 03 bc 00 06 00 30 h..Úh..Ú¬C.¼...0
0030 26 06 47 00 00 10 00 00 00 00 00 00 68 14 09 da &.G.........h..Ú
0040 26 06 47 00 00 10 00 00 00 00 00 00 68 14 0a da &.G.........h..Ú
0050 26 06 47 00 00 10 00 00 00 00 00 00 ac 43 03 bc &.G.........¬C.¼
跳过前三字节,此后每条记录有 4 字节 header,2 字节 key 和 2 字节 length 。
记录 1:00010015,0001 是 alpn,15 是长度,内容是支持的协议:h3-29,h3-28,h3-27,h2 四种,由于 http/3 还在 draft,后面带的是草案版本
记录 2:0004000c,0004 是 ipv4hint,就是 ipv4 地址,省得你去查 A 记录,值当然就是 ip 地址
记录 3:00060030,0006 是 ipv6hint,内容正好是最后 3 行,从 hex 就看得出是三条 v6 地址,2606:4700 开头
3 、包 501,504:Safari 发出 HTTP/3 请求和服务端应答,可以看到是 UDP(QUIC),没有进一步研究
4 、包 502-503:A 和 AAAA 的应答,在这里已经没用了
另外,目前 Google 、CF DNS 都可以正常返回 HTTPS 记录,dnspod 和 alidns 不支持,114 和百度支持但非常缓慢,可用dig type65 example.com
测试。小白注意,HTTPS 记录和 DOH 没有任何关系。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.