最快的DNS

普通用户通常测量的是明文 DNS 的 IP 的 ping 相应速度,但这很难保证是否是真正到达对应服务器的速度。现代 DNS 至少需要使用加密 DNS 才能确保服务未被劫持。

从客户端到终端通常会经过 5 到 8 个网络设备,在其中任意一个设备上都可以劫持 UDP:53 请求,这种劫持命令非常简单。因此,不要对明文 DNS 抱有任何侥幸的期待,特别是企业用户,基本上都会遭遇劫持。

以下是劫持命令示例: sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 1.1.1.1:53

设置劫持非常简单,许多企业内网用户的 DNS 速度都在个位数毫秒范围内,而在家庭网络中通常小于 1 毫秒。无论配置什么明文 DNS,最终都是自建的 DNS 服务在响应。

接下来讨论加密 DNS 的速度。在讨论之前,先介绍三种常见的加密 DNS 协议:DNS over TLS (DoT)、DNS over HTTP (DoH) 和 DNS over QUIC (DoQ)。

理论上,三种加密协议和未加密 DNS 的简化实现方式:

  • 最快的是 DoQ。QUIC 基于 UDP,建立连接需要一次往返,DNS 请求只需一次往返。
  • DoT 建立连接, tls1.2 需要至少四次往返, tls1.3 需要三次往返,略慢于 DoQ,DNS 请求一次往返。
  • DoH 基于 HTTPS,建立连接需要至少四次往返, 由于 HTTP 协议较重, 导致服务会略慢于 DoT。
  • 传统的 UDP:53 不需要建立连接,只有一次往返。

也就是说,从零开始的 DNS 请求,加密 DNS 的耗时是未加密 DNS 的 2~4 倍左右,但在建立连接后,耗时与未加密 DNS 相同(未考虑连接强制关闭的情况)。

考虑到实际网络情况,运营商在流量繁忙时会随机丢弃 UDP 报文。由于 TCP 有重传机制,丢弃后会再次传输,无法通过丢弃 TCP 来减轻网络负担,因此运营商较少丢弃 TCP 报文。因此,TCP 的 DNS 请求速度会更稳定,特别是在晚间网络高峰时段。

此外,仅关注连接时间不会显著提升上网体验。DNS 协议中包含许多可设置的参数,其中一些参数的合理配置比选择一个服务器更能提升上网体验。

阅读本文的读者可能已经了解,上网大致分为两步:首先请求域名的 IP 地址,然后将实际请求发送到 IP 地址。实际上,这里并不一定是向 DNS 服务器请求 IP 地址,更多的是在本地 DNS 缓存中查询是否已有解析。如果本地没有缓存解析,则需要询问 DNS;有缓存时优先使用缓存,而查询本地缓存的时间只有几纳秒,耗时可以忽略不计。通过设置 DNS 请求响应的 TTL(Time to Live)值,可以控制请求结果的缓存时间。例如,TTL 设置为 600,则 10 分钟内 DNS 响应结果都有效,系统不会再次查询相同域名。许多企业将这个值设置为 10,即 10 秒内不必再查。

如果您有自己的 DNS 服务器,可以自行修改这个值。在www.adguardprivate.com上可以自建一个 DNS 服务,延长 TTL 值,减少 DNS 请求次数,提升上网体验。

除了速度以外,DNS 服务还有许多特性影响上网体验, 这里只讨论了连接速度, 其它特性暂不讨论。