5月29日 22:48
DNS 为什么用 UDP 又用 TCP?各自什么场景?
标准查询用 UDP 53(快、无连接、适合小报文),区域传送(zone transfer)和超过 512 字节的响应用 TCP 53(可靠、支持大报文)。EDNS0 扩展后 UDP 响应可达 4096 字节,超过仍切 TCP。UDP 无需握手一个包搞定查询延迟最低;TCP 需要三次握手,适合需要可靠传输的场景。
追问
为什么不全部用 TCP?
TCP 三次握手增加延迟——DNS 查询通常一个 UDP 包就够,用 TCP 慢 2-3 倍。DNS 查询量巨大,TCP 的连接开销对 DNS 服务器是灾难。
UDP 丢包了怎么办?
客户端设超时重试(2-5 秒),换个解析器再查。DNS 设计上幂等——重复查询结果一样,丢包重试即可。
什么情况响应会超过 512 字节?
大量 CNAME 链、DNSSEC 签名记录(很大)、大量 MX 记录。DNSSEC 几乎总是触发 TCP fallback。
区域传送为什么必须 TCP?
区域传送同步整个 zone 数据可能几百 KB,必须可靠完整。TCP 的有序可靠传输正好满足。
DoH/DoT 对 UDP/TCP 的影响?
DoH 和 DoT 都用 TCP/TLS 加密。HTTP/3 用 QUIC(基于 UDP),又回到 UDP 但加了加密和可靠传输。传统 DNS 用 UDP 求快,安全场景用 TCP 加密求稳。