DNS域名系统如何工作?这篇文章帮你讲透!

你好,我是猿java。

不论你是否从事IT行业,和网络打交道是在所难免,比如,微信,抖音,网购比比皆是,当我们在浏览器里面输入一个域名,浏览器是如何定位到远程的服务器?其中会经历哪些过程?今天我们就来聊一聊其背后的原理?

什么是DNS?

其实,当用户在浏览器输入“example.com”进行访问时,浏览器会自动向 DNS服务器发送请求,DNS解析器将域名转换为IP地址,然后将 IP返回给浏览器,浏览器再访问该 IP,因此,整个过程中用户无需知道网站的 IP地址,却可轻松访问网站。如下图:

img.png

在上述描述中,有一个核心点是 DNS,那么,DNS是什么呢?

DNS是 Domain Name System的首字母缩写,翻译为域名系统,域名和IP地址的映射关系都保存在 DNS服务器上,因此,DNS是互联网的电话簿。

网上有很多公用的 DNS服务器,比如 Google的“8.8.8.8”,Cloudflare 公司的“1.1.1.1”等。

DNS工作原理

要了解 DNS的工作原理,需要从 DNS服务器和 DNS查询过程两个主要点来进行讲解。

DNS服务器

在整个 DNS工作过程中,会经历 4种 DNS服务器,整个请求过程如下图:

img.png

1.DNS解析器

DNS解析器是一种服务器,负责整个域名转IP的过程,当收到客户端 DNS查询请求时,DNS解析器会根据“DNS查询类型”来查询对应的 IP地址。因此,递归 DNS解析器是域名转IP的总负责人

2.根域名服务器

根域名服务器是将人类可读的域名转换为 IP地址的第一步,它管理着根域名,根域名用一个点(.)表示,因此,可以把根域名服务器理解成一个索引

全球共有 13组根域名服务器,它们以英文字母“A到M”依序命名,网域名称格式为“A~M.root-servers.net”,具体信息如下表:
img.png

3.顶级域名服务器

顶级域名服务器(top-level domain,简写 TLD),托管着一些顶级域名(比如 .com,.io, .net),它是域名转IP的第二步,可以把顶级域名服务器理解成一个二级索引

4.权威性域名服务器

权威性域名服务器(Authoritative nameserver),它是真实存储具体域名的服务器,比如(example.com,redis.io)等,它是域名转IP的最后一步,如果权威性域名服务器能查询记录,则返回 IP地址,否则做以下处理:

  • 如果权威域名服务器确认域名不存在,则返回一个 NXDOMAIN(Non-Existent Domain)响应
  • 如果权威域名服务器由于某些原因无法处理查询请求,它可能返回一个SERVFAIL(Server Failure)响应,这表示服务器遇到了无法解决的问题,但并不意味域名不存在

因此,可以把权威性域名理解成一个数据行

需要注意:在某些情况下,主域名的权威名称服务器可能并不直接存储子域名的记录,而是委托给另一个专门管理子域名的名称服务器。 比如,CNAME记录,子域名的记录指向另一个域名,因此,CNAME记录需要额外的查询步骤,以找到实际的 IP地址或进一步的 DNS记录。

DNS是一个分布式系统,内部的域名服务器以及其保存的域名是一个树状结构,如下图:

img.png

DNS查找过程

DNS 查找主要有以下 8个步骤:

  1. 用户在 Web浏览器中输入“yuanjava.com”地址时,查询会传输到 Internet中,并被 DNS解析器接收
  2. DNS解析器收到请求后,向根域名服务器发出查询请求
  3. 根域名服务器收到请求后,发现后缀是 .com,表明”yuanjava.com”这个域名是由 .com区域管理,然后返回顶级 DNS的地址
  4. DNS解析器拿到了根域名服务器的响应后,向 .com顶级域名服务器发出请求
  5. 顶级域名服务器收到请求后,响应其权威 DNS服务器地址
  6. DNS解析器拿到了顶级域名服务器的响应后,随后向权威域名服务器进行请求
  7. 权威域名服务器收到请求后,使用“yuanjava.com”查询到对应的 IP地址并进行响应
  8. 最后,DNS解析器使用 IP地址响应 Web浏览器

上述 8个 DNS查找步骤可以返回“yuanjava.com”的 IP地址后,最后,浏览器使用该 IP地址向服务器发出 HTTP请求,获取对应的数据显示在网页中。

整个过程如下图:
img.png

DNS 查询类型

在上述 DNS工作原理讲解时,我们提到了 DNS查询类型,那么 DNS查询类型有哪些呢?

通常来说,DNS查询类型有 3种:

递归查询

在递归查询中,DNS客户端要求 DNS服务器(通常是递归解析器)返回请求的资源记录或错误消息。如果递归解析器找不到记录,就会返回一个错误。

迭代查询

在迭代查询中,DNS客户端允许 DNS服务器返回它能提供的最佳答案。如果查询的 DNS服务器没有匹配的记录,它会返回一个指向更低层域名空间的 DNS服务器的引用,客户端再向引用地址发出查询。这个过程会继续,直到找到结果或出现错误或超时。

非递归查询

非递归查询通常发生在 DNS解析器客户端查询 DNS服务器时,DNS服务器时能直接查到记录,要么因为它是该记录的权威服务器,要么因为该记录存在于它的缓存中。通常,DNS服务器会缓存 DNS记录以减少带宽消耗和上游服务器的负载。

DNS解析器通过组合上述 3种查询方式,可以优化 DNS解析过程和缩短传输距离。在理想情况下,可以使用缓存的记录数据,从而使 DNS 域名服务器能够返回非递归查询。

DNS查询实例演示

为了更好的演示域名的整个 DNS查询过程,本文通过对我的技术博客www.yuanjava.com这个域名进行 DNS解析,使用到的工具有dig命令,然后使用 3种方式进行解析:

  • 使用指定的 DNS服务器
  • 使用公开的 DNS服务器
  • 使用运营商默认的 DNS服务器

在进入正式的解析之前,我们先来了解下 dig指令。

dig

dig(Domain Information Groper,域名信息搜索器)是一个用于查询 DNS信息的命令,dig可以执行各种类型的 DNS查询,并显示详细的响应信息,包括查询的解析过程、响应时间、返回的记录等。

dig的基本语法

1
dig [@server] [name] [type] 
  • @server:指定要查询的 DNS服务器,如果省略,默认使用系统配置的 DNS服务器
  • name:需要查询的域名
  • type:查询的记录类型(如A、AAAA、MX、TXT等,如果省略,默认查询A记录

使用示例

1.查询记录

1
2
3
4
5
dig yuanjava.com A        # 返回 yuanjava.com的 IPv4地址记录
dig yuanjava.com AAAA # 返回 yuanjava.com的IPv6地址记录
dig yuanjava.com MX # 返回 yuanjava.com的邮件交换记录
dig @8.8.8.8 yuanjava.com #指定 Google公共的 8.8.8.8 DNS服务器查询 yuanjava.com
dig @1.1.1.1 yuanjava.com #指定 cloudflare公共的 1.1.1.1 DNS服务器查询 yuanjava.com

2.结果返回

dig的输出通常包含以下 6个部分:

  • Header部分:显示 dig命令的版本和查询的基本信息
  • Question部分:显示查询的详细信息,包括操作码(opcode)、状态码(status)、标志位(flags)等
  • Answer部分:显示查询结果,包括域名、TTL(生存时间)、记录类型和记录值
  • Authority部分:显示权威名称服务器的信息
  • Additional部分:显示与查询相关的其他信息(如果有)
  • Query time和服务器信息:显示查询时间、使用的DNS服务器、查询的时间戳和返回消息的大小

讲解完 dig指令后,我们正式进入 DNS解析的实战演习:

使用指定的DNS服务器

首先,使用 13台根域名服务器的任意一台进行解析,这里以”198.41.0.4”为例,指令如下:

1
dig @198.41.0.4 yuanjava.com

指令执行如下图:
img.png

因为根域名服务器给不了”yuanjava.com”的 IP地址,所以执行结果中没有 ANSWER SECTION,但是返回了.com对应的顶级域名服务器的 IPv4和 IPv6,选择第一台顶级域名服务器的IPv4,继续解析,指令如下:

1
dig @192.41.162.30 yuanjava.com

指令执行如下图:
img.png

顶级域名服务器也给不了”yuanjava.com”的 IP地址,但返回了权威服务器的 IP地址,选择第一台权威域名服务器的 IP,继续解析,指令如下:

1
dig @120.76.107.44 yuanjava.com

指令执行如下图:
img.png

最后,权威域名服务器查到了域名对应的 IP,到此,DNS域名解析的整个过程我们就通过手动的方法进行了演示。

使用公开的DNS服务器

使用公开的 DNS服务器,会屏蔽内部域名服务器查询过程,最终给出 IP地址,分别执行下面 2个指令:

1
2
dig @1.1.1.1 yuanjava.com
dig @8.8.8.8 yuanjava.com

指令执行结果截图如下(截图中没有 Additional部分):
img.png

使用运营商的DNS服务器

除了上述两种方式,我们还可以使用运营商自动配置的 DNS服务器,比如下面为家庭 wifi网络的示例截图:
img.png
img.png

DNS缓存

因为一个域名对应的 IP地址变动的频率很低,所以,可以将域名和 IP的映射关系缓存起来并且设置一定的失效时间,从而提高数据请求的性能和可靠性。那么,DNS缓存有哪些呢?

浏览器的DNS缓存

现代 Web浏览器的设计,默认会将 DNS记录缓存一段时间,当发出对 DNS记录的请求时,能从浏览器缓存拿到记录,大大加速了 DNS解析过程。

在 Chrome浏览器中,可以通过chrome://net-internals/#dns 查看 DNS缓存的状态,如下图:

img.png

操作系统的DNS缓存

除了浏览器会设置 DNS缓存外,在每一层的域名服务器也会设计对应的 DNS缓存,缓存查询的过程如下:

  • 检查本地缓存,如果本地缓存有结果,则返回;否则,向 DNS解析器发送查询。
  • DNS解析器检查本地缓存,如果缓存有结果,则返回
  • 如果没有A记录,但有NS记录,直接查询权威名称服务器
  • 如果没有 NS记录,查询 TLD服务器
  • 如果没有指向 TLD服务器的记录,查询根服务器

总结

本文通过在浏览器里面输入一个域名为例,详细地分析了 DNS的工作原理,另外,为了更好地理解 DNS域名解析过程,我们通过 3种方式来手动演示整个过程。

最后,归纳一下,通过本文你可以学到什么:

  1. 什么是DNS?
  2. DNS工作原理
    2.1. DNS服务器
    2.2. DNS查找过程
  3. DNS 查询类型
    3.1. 递归查询
    3.2. 迭代查询
    3.3. 非递归查询
  4. DNS查询实例演示
    4.1. dig
    4.2. 使用指定的DNS服务器
    4.3. 使用公开的DNS服务器
    4.4. 使用运营商的DNS服务器
  5. DNS缓存
    5.1. 浏览器的DNS缓存
    5.2. 操作系统的DNS缓存

参考资料

What is DNS?
Building a Recursive DNS Resolver

学习交流

如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。

drawing