你好,我是猿java。
不论你是否从事IT行业,和网络打交道是在所难免,比如,微信,抖音,网购比比皆是,当我们在浏览器里面输入一个域名,浏览器是如何定位到远程的服务器?其中会经历哪些过程?今天我们就来聊一聊其背后的原理?
什么是DNS? {#什么是DNS?}
其实,当用户在浏览器输入"example.com"进行访问时,浏览器会自动向 DNS服务器发送请求,DNS解析器将域名转换为IP地址,然后将 IP返回给浏览器,浏览器再访问该 IP,因此,整个过程中用户无需知道网站的 IP地址,却可轻松访问网站。如下图:
在上述描述中,有一个核心点是 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服务器 {#DNS服务器}
在整个 DNS工作过程中,会经历 4种 DNS服务器,整个请求过程如下图:
1.DNS解析器 {#1-DNS解析器}
DNS解析器是一种服务器,负责整个域名转IP的过程,当收到客户端 DNS查询请求时,DNS解析器会根据"DNS查询类型"来查询对应的 IP地址。因此,递归 DNS解析器是域名转IP的总负责人
。
2.根域名服务器 {#2-根域名服务器}
根域名服务器是将人类可读的域名转换为 IP地址的第一步,它管理着根域名,根域名用一个点(.)表示,因此,可以把根域名服务器理解成一个索引
。
全球共有 13组根域名服务器,它们以英文字母"A到M"依序命名,网域名称格式为"A~M.root-servers.net",具体信息如下表:
3.顶级域名服务器 {#3-顶级域名服务器}
顶级域名服务器(top-level domain,简写 TLD),托管着一些顶级域名(比如 .com,.io, .net),它是域名转IP的第二步,可以把顶级域名服务器理解成一个二级索引
。
4.权威性域名服务器 {#4-权威性域名服务器}
权威性域名服务器(Authoritative nameserver),它是真实存储具体域名的服务器,比如(example.com,redis.io)等,它是域名转IP的最后一步,如果权威性域名服务器能查询记录,则返回 IP地址,否则做以下处理:
- 如果权威域名服务器确认域名不存在,则返回一个 NXDOMAIN(Non-Existent Domain)响应
- 如果权威域名服务器由于某些原因无法处理查询请求,它可能返回一个SERVFAIL(Server Failure)响应,这表示服务器遇到了无法解决的问题,但并不意味域名不存在
因此,可以把权威性域名理解成一个数据行
。
需要注意:在某些情况下,主域名的权威名称服务器可能并不直接存储子域名的记录,而是委托给另一个专门管理子域名的名称服务器。 比如,CNAME记录,子域名的记录指向另一个域名,因此,CNAME记录需要额外的查询步骤,以找到实际的 IP地址或进一步的 DNS记录。
DNS是一个分布式系统,内部的域名服务器以及其保存的域名是一个树状结构,如下图:
DNS查找过程 {#DNS查找过程}
DNS 查找主要有以下 8个步骤:
- 用户在 Web浏览器中输入"yuanjava.com"地址时,查询会传输到 Internet中,并被 DNS解析器接收
- DNS解析器收到请求后,向根域名服务器发出查询请求
- 根域名服务器收到请求后,发现后缀是 .com,表明"yuanjava.com"这个域名是由 .com区域管理,然后返回顶级 DNS的地址
- DNS解析器拿到了根域名服务器的响应后,向 .com顶级域名服务器发出请求
- 顶级域名服务器收到请求后,响应其权威 DNS服务器地址
- DNS解析器拿到了顶级域名服务器的响应后,随后向权威域名服务器进行请求
- 权威域名服务器收到请求后,使用"yuanjava.com"查询到对应的 IP地址并进行响应
- 最后,DNS解析器使用 IP地址响应 Web浏览器
上述 8个 DNS查找步骤可以返回"yuanjava.com"的 IP地址后,最后,浏览器使用该 IP地址向服务器发出 HTTP请求,获取对应的数据显示在网页中。
整个过程如下图:
DNS 查询类型 {#dns-select-type}
在上述 DNS工作原理讲解时,我们提到了 DNS查询类型,那么 DNS查询类型有哪些呢?
通常来说,DNS查询类型有 3种:
递归查询 {#递归查询}
在递归查询中,DNS客户端要求 DNS服务器(通常是递归解析器)返回请求的资源记录或错误消息。如果递归解析器找不到记录,就会返回一个错误。
迭代查询 {#迭代查询}
在迭代查询中,DNS客户端允许 DNS服务器返回它能提供的最佳答案。如果查询的 DNS服务器没有匹配的记录,它会返回一个指向更低层域名空间的 DNS服务器的引用,客户端再向引用地址发出查询。这个过程会继续,直到找到结果或出现错误或超时。
非递归查询 {#非递归查询}
非递归查询通常发生在 DNS解析器客户端查询 DNS服务器时,DNS服务器时能直接查到记录,要么因为它是该记录的权威服务器,要么因为该记录存在于它的缓存中。通常,DNS服务器会缓存 DNS记录以减少带宽消耗和上游服务器的负载。
DNS解析器通过组合上述 3种查询方式,可以优化 DNS解析过程和缩短传输距离。在理想情况下,可以使用缓存的记录数据,从而使 DNS 域名服务器能够返回非递归查询。
DNS查询实例演示 {#DNS查询实例演示}
为了更好的演示域名的整个 DNS查询过程,本文通过对我的技术博客www.yuanjava.com
这个域名进行 DNS解析,使用到的工具有dig
命令,然后使用 3种方式进行解析:
- 使用指定的 DNS服务器
- 使用公开的 DNS服务器
- 使用运营商默认的 DNS服务器
在进入正式的解析之前,我们先来了解下 dig指令。
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服务器 {#使用指定的DNS服务器}
首先,使用 13台根域名服务器的任意一台进行解析,这里以"198.41.0.4"为例,指令如下:
|-----------|--------------------------------------|
| 1
| dig @198.41.0.4 yuanjava.com
|
指令执行如下图:
因为根域名服务器给不了"yuanjava.com"的 IP地址,所以执行结果中没有 ANSWER SECTION,但是返回了.com对应的顶级域名服务器的 IPv4和 IPv6,选择第一台顶级域名服务器的IPv4,继续解析,指令如下:
|-----------|-----------------------------------------|
| 1
| dig @192.41.162.30 yuanjava.com
|
指令执行如下图:
顶级域名服务器也给不了"yuanjava.com"的 IP地址,但返回了权威服务器的 IP地址,选择第一台权威域名服务器的 IP,继续解析,指令如下:
|-----------|-----------------------------------------|
| 1
| dig @120.76.107.44 yuanjava.com
|
指令执行如下图:
最后,权威域名服务器查到了域名对应的 IP,到此,DNS域名解析的整个过程我们就通过手动的方法进行了演示。
使用公开的DNS服务器 {#使用公开的DNS服务器}
使用公开的 DNS服务器,会屏蔽内部域名服务器查询过程,最终给出 IP地址,分别执行下面 2个指令:
|-------------|-------------------------------------------------------------|
| 1 2
| dig @1.1.1.1 yuanjava.com dig @8.8.8.8 yuanjava.com
|
指令执行结果截图如下(截图中没有 Additional部分):
使用运营商的DNS服务器 {#使用运营商的DNS服务器}
除了上述两种方式,我们还可以使用运营商自动配置的 DNS服务器,比如下面为家庭 wifi网络的示例截图:
DNS缓存 {#DNS缓存}
因为一个域名对应的 IP地址变动的频率很低,所以,可以将域名和 IP的映射关系缓存起来并且设置一定的失效时间,从而提高数据请求的性能和可靠性。那么,DNS缓存有哪些呢?
浏览器的DNS缓存 {#浏览器的DNS缓存}
现代 Web浏览器的设计,默认会将 DNS记录缓存一段时间,当发出对 DNS记录的请求时,能从浏览器缓存拿到记录,大大加速了 DNS解析过程。
在 Chrome浏览器中,可以通过chrome://net-internals/#dns
查看 DNS缓存的状态,如下图:
操作系统的DNS缓存 {#操作系统的DNS缓存}
除了浏览器会设置 DNS缓存外,在每一层的域名服务器也会设计对应的 DNS缓存,缓存查询的过程如下:
- 检查本地缓存,如果本地缓存有结果,则返回;否则,向 DNS解析器发送查询。
- DNS解析器检查本地缓存,如果缓存有结果,则返回
- 如果没有A记录,但有NS记录,直接查询权威名称服务器
- 如果没有 NS记录,查询 TLD服务器
- 如果没有指向 TLD服务器的记录,查询根服务器
总结 {#总结}
本文通过在浏览器里面输入一个域名为例,详细地分析了 DNS的工作原理,另外,为了更好地理解 DNS域名解析过程,我们通过 3种方式来手动演示整个过程。
最后,归纳一下,通过本文你可以学到什么:
- 什么是DNS?
- DNS工作原理
2.1. DNS服务器
2.2. DNS查找过程 - DNS 查询类型
3.1. 递归查询
3.2. 迭代查询
3.3. 非递归查询 - DNS查询实例演示
4.1. dig
4.2. 使用指定的DNS服务器
4.3. 使用公开的DNS服务器
4.4. 使用运营商的DNS服务器 - DNS缓存
5.1. 浏览器的DNS缓存
5.2. 操作系统的DNS缓存