你的DNS解析器是不是在白忙活?重复查询的隐藏代价
DNS 重复查询:那个没人买单的隐形账单
你听过"公地悲剧"吗?经济学里讲的是一片公共草地,谁都可以随便放牧,结果大家拼命往死里用,最后草地毁了。在 DNS 这个圈子里,情况其实一模一样。
免费的东西,谁不想要?
DNS 查询对递归解析器来说,基本就是免费的。打个比方,就像快餐店的自助纸巾——反正不要钱,拿一把再说。
但有意思的地方在这儿:你的递归解析器哐哐往外发重复查询的时候,掏钱买单的却是别人。权威 nameserver 得老老实实处理每一条查询,生成响应、消耗带宽,而递归解析器呢?一点代价都不用付。
那为什么会过度查询呢?逻辑很简单:UDP 包丢了就丢了,何必傻等超时?不如马上再发一条。两个都成功了?无所谓,把第二个扔掉就行。第一个失败了?第二个可能就成功了,节省了好几毫秒。
听起来挺聪明对吧?就是不怎么厚道。
数据不说谎
来看点真实的数字。APNIC Labs 2026年6月的测量数据显示,不同地区的查询重复率差异大得吓人:
| 地区 | 查询重复率 | |------|------------| | 南亚次大陆 | 61% | | 中国大陆/香港 | 47% | | 全球平均 | 38% | | 北美 | 28% | | 欧洲 | 27% |
这数字看着挺扎心的。全球平均每10个查询里差不多有4个是重复的,南亚次大陆更夸张,超过6成都是多余的。更夸张的是,有些查询能被重复发5次、10次、甚至20次——解析器才肯放弃。
这事儿跟你有关系吗?
我们在 NameOcean 管理着几千个域名的 DNS,这可不是什么学术问题。跑权威 nameserver 跑出规模来,你就知道查询重复有多头疼了。
你想啊,每一个重复查询都是浪费——浪费算力、浪费带宽、还给所有人增加了延迟。你要是创业做应用,依赖快速稳定的 DNS 解析,那这种低效率直接就砸你用户体验的招牌。
做高性能系统的开发者,搞清楚 DNS 的脾性真的很重要。要是你的应用反复查同一个域名,不光是你自己的资源在烧,还可能给被查询的权威服务器添堵。
怎么办?
DNS 圈子早就注意到这个问题了,相关的改进也在推进。DoH 和 DoT 给 DNS 加了加密,能解决一部分效率问题。ECS 扩展能帮助解析器更好地缓存响应。
但最根本的"查询不要钱"这个问题,目前还是没什么好办法。只要递归解析器不用为查询行为付出代价,这种夸张的重复率就会一直存在。
现阶段最实在的建议就是:心里有数。
如果你做的系统高度依赖 DNS 查询,想办法做好缓存策略。用 dig 这样的工具看看你的查询到底在干嘛。要是你是 NameOcean 的客户,放心,我们的 infrastructure 就是专门设计来处理这些现实世界里的乱象的。
公地悲剧还在上演——但至少现在你搞明白了是怎么回事。