世界最大的分布式系统:DNS

2025-11-18 pv

“13.215.239.219”。

他不假思索地报出这样一段数字。

周围的人一头雾水,他究竟想表达什么?

他有点着急,“个人网站呀,他新开发的,去浏览器里输入就能看到”。

无人为之所动。

他有些泄气,“plantree.me,同样可以访问”。

将人类的语言世界,与计算机网络世界连接的底层奥秘,就在于 DNS (Domain Name System)

1. DNS 的诞生

互联网基于 HTTP 协议,这是一个应用层协议,更底层的传输协议栈是 TCP/IP。

在 TCP/IP 中,找到网络上的一台机器,依靠 IP 地址,目前有 IPv4 和 IPv6 两个版本。

其中 IPv4 大致如此:127.255.255.255,而 IPv6 则是:2001:db8:2de:0:0:0:0:e13

这是一种计算机容易理解的形式,人类则不然。

很难想象,当你想要访问某个网站的时候,要输入 IPv4 那一段夹杂数字和.的字符串。

输入 plantree.me 远比13.215.239.219 简单,而且容易理解。

域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

用户输入域名后,DNS 将其翻译为对应的 IP 地址,请求被发送给相应的网络服务。

整个过程对使用者完全透明。

DNS 最早是 1983 年由保罗·莫卡派乔斯(Paul Mockapetris)发明,原始的技术规范发布在 RFC 882。

目前已经稳定运行了超过 40 年!

另外,根据 Cloudflare 的官方 文档🔗1.1.1.1 解析器平均每天处理 约 1.9 万亿 次查询,而该解析器,还只是众多 DNS 解析器中的一个。

毫无疑问,DNS 几乎是互联网诞生以来存在时间最久、流量最多,也是规模最大的一个分布式系统,是互联网的重要基建。

使用起来却如此简单,几乎感受不到它的存在。

这样一个设计精妙的系统,背后一定做对了什么。

2. 使用指南

对于普通用户,使用 DNS 是一件和呼吸一样轻松的事情。

因为 DNS 解析的方式内置在操作系统里,像 Windows 和 Linux,都提供了类似 gethostbyname() 的系统调用接口,同时有用于加速查找的缓存设计。

浏览器这一类上层应用,会在适当的时候调用,将域名转换为正确的 IP 地址。

对于网站发布者,通常需要配置 DNS 记录,帮助 DNS 系统将 IP 地址与该域关联。

常见的记录类型有:

  • A 记录:保存域的 IP 地址的记录
  • AAAA 记录:包含域的 IPv6 地址的记录
  • CNAME 记录:将一个域或子域转发到另一个域,不提供 IP 地址
  • NS 记录:存储 DNS 条目的名称服务器
  • MX 记录:将邮件定向到电子邮件服务器
  • TXT 记录:可让管理员在记录中存储文本注释

我自己比较常用的是 A 记录和 CNAME 记录,前者负责将主域与服务器 IP 绑定,后者将子域转发到类似 Netlify 这样的服务托管商。

3. 架构

一次完整的 DNS 查询过程大致如此:

当你访问 www.example.com 时,

  1. 客户端向本地 DNS(递归解析器)发起查询

    承担所有后续工作的是递归解析器(resolver),通常是运营商或公共 DNS(如 1.1.1.1)。

  2. 如果没有缓存,递归解析器询问根服务器

    根服务器不会告诉你 IP,而是指向 .com TLD 服务器。

  3. 向 TLD 服务器询问

    TLD 返回 example.com 的权威 DNS 地址。

  4. 向权威 DNS 询问

    最终得到 example.com 的 IP。

  5. 结果缓存,并返回客户端

    后续一段时间内再次查询,无需重复整个流程。

由此可见,DNS 的整体架构,很像是一棵树。

树的顶层,是一组根服务器(根域),目前有 13 个,并通过 Anycast 技术架设镜像,减少单点故障。

根域下一层,是 TLD 服务器(顶级域),例如 com 是网址 example.com 的顶级域。

顶级域下一层,是权威服务器(权威域),权威服务器包含特定于其服务域名的信息(例如,example.com)。这里通常也是域名查找的最后一步。

层次关系非常清楚。

所有域名和 IP 地址的关联都存储在这棵树上。

每一层都只掌握下一层的信息,关系简单。

每一层都有冗余(Anycast 技术)和缓存(Cache/TTL),容错的同时,减少查询延时。

每一层之间的数据通信,可以通过 UDP/TCP/HTTP 等多种纯文本协议,结构清晰,易于迭代。另外,一种新的技术方案,DNSSEC,通过加密签名验证记录真实性,可防止污染与劫持。

4. 总结

DNS 已经稳定运行了几十年,面对无数次流量攻击后依然可以正常工作。

我认为背后的原因主要有两个:简单但结构清晰的设计,不断迭代

DNS 整个系统看似复杂,抽象到最后,只有一棵树,节点无状态,多副本,层次明了,通过文本协议通信。

去中心化、无状态、冗余备份、缓存,这些分布式系统设计中的常见理念,在 DNS 中都有着一一对应。

从看到到看懂,这个过程也许漫长,但异常精彩

(完)

参考

  1. 域名系统 - 维基百科,自由的百科全书🔗
  2. IPv4 - 维基百科,自由的百科全书🔗
  3. IPv6 - 维基百科,自由的百科全书🔗
  4. gethostbyname(3) - Linux manual page🔗
  5. 什么是 DNS 记录? | Cloudflare🔗
  6. 根域名伺服器 - 维基百科,自由的百科全书🔗
  7. 頂級域 - 维基百科,自由的百科全书🔗
  8. DNS 服务器类型 | Cloudflare🔗
  9. 什么是 Anycast?| Anycast 如何工作? | Cloudflare🔗
  10. 域名系统安全扩展 - 维基百科,自由的百科全书🔗
在 GitHub 上编辑本页面

最后更新于: 2025-11-18T07:13:30+08:00