DNS如何左右实际效果:路径、调度与TTL

list 文章目录

提起DNS,多数人的理解就是“把域名变成IP地址”。这么说没错,却容易让人以为DNS只是查一次就完事的简单映射,后续全看网络路径。

一边是不限流量的自由,一边是看得见的保护。全程加密与零日志策略同时生效,专线节点只负责转发,不负责记录。

但在真实工程环境里,DNS干的事远不止翻译。你最终连到哪个IP由它决定,而不同IP背后可能会是完全不同的物理服务主机、不同的网络路径,甚至不同的大洲。对依靠节点中继的加速服务平台而言,解析发生在哪里、返回什么结果、又被谁缓存——这些变量直接框定了实际效果的上限。

有一种反直觉的情况反复出现:用户启用加速服务平台后延迟反而升高,逐项核对了网络路径、节点选择、协议配置都没异常,最终发现是DNS在解析目标域名时返回了一个地理位置更远的IP。加速器把这条“错路”走得很好,但它终究是一条错路。

DNS的解析拓扑:谁在问,在哪里问

DNS的解析拓扑

DNS查询不是从用户设备直接发送到域名的权威服务主机的。中间经过递归解析器,而递归解析器的位置决定了权威服务主机看到的“客户端IP”。

当一个域名使用了CDN或Anycast时,权威服务主机会根据请求来源的IP地址返回最近的节点IP。这个“最近”的判断依据不是用户的真实IP,而是递归解析器的IP。

一旦用户的递归解析器就在本地ISP的网络内,那么权威服务主机看到的IP地理位置往往与用户相近,返回的IP也相对合理。但一旦用户人工配置了第三方递归解析器(8.8.8.8、1.1.1.1等),情况会发生变化。权威服务主机看到的是这个公共解析器的IP,而不是用户的IP。

这里需先引入EDNS Client Subnet(ECS)。这是一个DNS扩展,允许递归解析器在向上游查询时附带用户IP的子网前缀,这样权威服务主机就能看到用户的真实网络位置。但并非所有递归解析器都支持ECS,也并非所有权威服务主机都会使用ECS信息做调度决策。

在工程实践中,公共DNS的ECS支持是不一致的。某些公共解析器在特定域名的查询中发送ECS,在其他域名中不发送。这种不一致性导致同一个用户、同一个递归解析器,对不同域名的解析结果可能会基于不同的地理位置信息——一个准确,一个不准确。这本身就是一种难以逐项核对的延迟来源。

CDN调度的地理偏差

当加速服务平台或网络优化服务以代理模式运行时,DNS解析发生在代理节点上,而不是用户的设备上。

用户设备发出请求到加速入口节点,入口节点需先解析目标域名的IP才能建立到目标服务主机的连接。这个DNS查询从入口节点发出,入口节点的递归解析器(或其自身)向权威服务主机发起查询。权威服务主机看到的是入口节点的IP,返回离入口节点最近的目标服务主机IP。

专线通道全程加密,数据包在中转节点上不留可读内容,使用行为也不写入任何日志,用完即散,没有可供回溯的记录。

设想这样一条路径:入口节点落在东京,人坐在北京,而目标服务的 CDN 在北京同样有节点。直连的时候,本机 DNS 会给出北京那个节点的地址,延迟很低;经由加速器之后,解析交给东京的入口节点,CDN 权威服务器也就返回了东京附近的节点。数据的往返因此被排成:北京用户 → 东京入口 → 东京 CDN → 再回到北京用户。原本 10ms 的短路径,被抻成了横跨日本海的一个来回。

这就是“加速器反而让延迟变高”的一种典型场景:目标服务本身就部署了完善的CDN,直连时用户已经被调度到就近节点,加速器的介入打乱了调度逻辑。

另一种相反的场景则成立:一旦目标服务的CDN覆盖不足(比如亚洲只有一个节点在新加坡),而用户直连时起因是DNS调度异常被分配到了欧洲节点,那么通过加速器——入口节点在亚洲、通道出口节点也在亚洲——可能会迫使DNS从亚洲入口节点发出查询,获得亚洲CDN节点的IP,从而迎来好转延迟。

这两种场景看起来矛盾,但逻辑一致:加速器改变了DNS查询的源地址,从而改变了CDN的调度决策。结果取决于目标CDN的部署密度和用户的原始调度质量。一旦原调度已经接近最优,加速器可能会产生负面效果。一旦原调度很差,加速器可能会无意中修复了它。

TTL与缓存:过时IP的代价

DNS记录有一个TTL值,告诉递归解析器和客户端这条记录得以缓存多久。TTL的设置是一个权衡:设置项太短会增加DNS查询负载和解析延迟,设置项太长会导致在服务主机IP变更时客户端继续使用过时的地址。

TTL 在这里埋了一条不易察觉的连接。入口节点为了性能会缓存解析结果,若某域名的 TTL 为 300 秒,这 5 分钟内它对外给出的都是同一个答案。偏偏这段时间里,目标地址可能已经变更——CDN 调度调整、故障切换、扩容缩容都可能触发——而节点仍拿着旧地址去建连,轻则延迟抬高,重则连接直接失败。

更不容易察觉的是动态应答:部分 CDN 的权威服务器会按当前负载调整返回的地址,同一个递归解析器在 TTL 到期后的两次查询之间完全可能拿到不同结果。于是入口节点若把低峰时段问到的地址留着复用,到了高峰期很可能撞上一个已经拥堵的节点;可若完全不缓存、每次连接都重新问一次,又要在握手之前额外付一次 DNS 查询的时间。

bash
# 观察一个域名的DNS解析结果是否随时间变化
# 一连串查询,对比返回的IP列表
for i in $(seq 1 20); do
  dig +short 目标域名 A
  sleep 5
done

返回的IP一旦每次相同,说明CDN调度在这个时间窗口内是稳定的。一旦频繁变化,意味着加速节点的DNS缓存连接规则可能会成为变量。

加速器如何利用DNS

加速器如何利用DNS

还有一些加速服务选择把这一环握到自己手里:客户端绕开系统配置的递归解析器,改用服务自建的 DNS,或者干脆把 DNS 查询和数据流量一起送进入口节点处理。

加速不该以隐私为代价。狗急加速器在加密通道里传输全部流量,也不对访问内容做留存,同时提供不限流量、不限带宽的使用方式。

这种设计的意图不是“提供更快的DNS”,而是让DNS解析的源地址与数据流的通道出口地址对齐。用户的数据吞吐从哪个通道出口节点发出,DNS查询就从同一个位置发出,CDN权威服务主机返回的IP就匹配数据流的实际路径。这避免了“DNS在本地解析得到一个北京IP,但数据流通过东京通道出口节点发出”的地理错配。

但这个设计有一个前提:用户的数据吞吐确实应该从那个通道出口节点发出。一旦加速服务的通道出口选择连接规则本身不理想——比如某个请求本应走香港通道出口以获得更好的CDN调度,却被分配到了新加坡通道出口——DNS调度对齐反而把异常固化了。

在此之上还能做预解析:客户端趁用户尚未点击、或页面正在加载时,先把可能用到的域名查一遍并缓存起来,真正发起请求时那段等待已经付过了。这种做法在网页加速中很常见,但收益要看 DNS 在总耗时里的占比——整段 RTT 200ms 的情形下,把 DNS 那 20ms 全部抹平,体感也不会有质变。只有当 DNS 自身成为短板(递归解析器慢、查询链路长)时,预解析才更值得做。

误判:DNS慢 vs. 后续连接慢

很多网络诊断服务平台会把DNS解析时间和TCP连接时间分开报告。当用户看到一个请求的“延迟”很长时,容易把DNS解析时间当成罪魁祸首。

另外要留意浏览器开发者工具里那个’DNS Lookup‘读数:当记录缺失或已过期,递归解析器需要从根域逐级往下问,几百毫秒是真的可能发生的。但更常见的却是另一种情况——DNS 只花 5ms,时间大头在随后的 TCP 建连与 TLS 握手上。用户看到的’慢‘并非 DNS 所致,只因为它排在瀑布图第一格,最容易被当成原因。

第二类误读出现在切换 DNS 的场景。开启加速工具后网页明显变快,网络面板显示 DNS 时间从 50ms 降到 5ms,人们于是把它归因为’加速器优化了 DNS‘。实际上工具多半只是把查询换到一个响应更快的递归解析器(从本地运营商那条慢 DNS 换成公共 DNS),真正的提速来自后续的 TCP 分段处理。DNS 数字变小是附带结果,而非主要收益。

想把两种解释分清,做个对照即可:在系统设置里把 DNS 手动改成 1.1.1.1 或 8.8.8.8,接着在不启用加速工具的情况下访问同一目标。若 DNS 时间同样下降而总加载时长几乎没变,说明此前的收益主要来自传输层;若 DNS 时间没有变化、加载时间却在启用工具后明显缩短,结论也一样——主因并不在 DNS。

系统边界:DNS能决定什么,不能决定什么

DNS在加速网络中的角色得以被概括为:它决定了连接的起点看到的目标IP。这个IP决定了初始数据流的方向,以及目标服务端看到的源地址。

反过来看 DNS 够不着的那一截:地址一旦选定,数据包到底沿着什么路径走,由 BGP 与各自治系统内部的路由策略决定。一个挑得’正确‘的 IP——位置近、调度合理——也可能因为运营商出口排队而表现很糟;一个看似’错误‘的 IP——位置偏僻——只要恰好落在一条通畅线路上,表现反而可能更好。

这种“IP正确但路径差”的情况,在工程上比人们想象的更常见。它导致一个现象:使用加速服务平台后,用户看到目标IP变成了一个更远的地址,但延迟反而回落。直觉上这说不通——更远的IP应该更慢。放到实例里,新IP所在的网段可能会绕开了某个拥塞的对等互联点,物理距离远但路径通畅。

把 DNS 放在加速链路里看,目的从来不是给出’重要‘或者’不重要‘这种二选一的判断。它是链条上的一个变量,与出口的选择、CDN 的调度、缓存的策略彼此牵连。你调整 DNS 配置、或者把解析挪到别的地方去,后续的连锁反应朝哪边倾斜,取决于目标服务的部署结构与用户网络的拓扑特征,而不是 DNS 自身的优劣。

作者

狗急加速器技术团队

顺手把隐私也补上

DNS 不仅影响能不能打开网页,它本身也会暴露你访问了哪些域名。用不加密的解析,等于把浏览轨迹交给第三方。

狗急加速器把解析纳入加密通道一并处理,既解决解析绕路,也不再让查询过程留在外面。对在意隐私的人,这一步其实比改几个参数更有意义。

给在意隐私的人的建议

DNS 查询通常在网络里是明文传输的,这意味着途经的每一跳都能看到你在访问哪些域名。很多人重视 HTTPS,却忽略了这一层。

如果你在意这一点,优先选择把解析纳入加密通道的方案,而不是单纯换一个公共 DNS 地址——那只是换了一个能看到你记录的主体。

另外可以留意:是否支持加密 DNS、是否有明确的日志政策。这两项能回答的问题,比任何宣传口径都实在。