985的女实习生,将 DNS工作原理分析得太透彻了!

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

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

一、什么是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工作过程中,会经历 4种 DNS服务器,整个请求过程如下图:

1.DNS解析器

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

2.根域名服务器

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

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

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是一个分布式系统,内部的域名服务器以及其保存的域名是一个树状结构,如下图:

5.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工作原理讲解时,我们提到了 DNS查询类型,那么 DNS查询类型有哪些呢?

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

1.递归查询

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

2.迭代查询

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

3.非递归查询

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

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

四、DNS查询实例演示 

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

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

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

1.dig

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

dig的基本语法:

dig [@server] [name] [type]

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

2.使用示例

(1) 查询记录

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 
dig @1.1.1.1 yuanjava.com #指定 cloudflare公共的 1.1.1.1

(2) 结果返回

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

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

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

3.使用指定的DNS服务器

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

dig @198.41.0.4 yuanjava.com

指令执行如下图:

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

dig @192.41.162.30 yuanjava.com

指令执行如下图:

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

dig @120.76.107.44 yuanjava.com

指令执行如下图:

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

4.使用公开的DNS服务器

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

dig @1.1.1.1 yuanjava.com
dig @8.8.8.8 yuanjava.com

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

5.使用运营商的DNS服务器

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

五、DNS缓存 

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

1.浏览器的DNS缓存

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

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

2.操作系统的DNS缓存

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

  • 检查本地缓存,如果本地缓存有结果,则返回;否则,向 DNS解析器发送查询。
  • DNS解析器检查本地缓存,如果缓存有结果,则返回
  • 如果没有A记录,但有NS记录,直接查询权威名称服务器
  • 如果没有 NS记录,查询 TLD服务器
  • 如果没有指向 TLD服务器的记录,查询根服务器
责任编辑:赵宁宁 来源: 猿java
相关推荐

2020-07-27 08:26:03

数据库 SQL索引

2012-11-19 13:53:42

职场Google实习生

2013-02-20 10:40:21

实习生科技公司谷歌

2013-06-07 09:59:40

Google实习面试

2010-10-12 11:06:07

招聘

2014-01-07 09:23:41

项目管理

2009-09-17 09:35:17

微软实习生

2021-04-08 19:20:58

循环链表模拟

2013-11-26 14:15:43

2012-11-07 17:05:41

Google实习生

2020-02-03 09:10:23

数据库删库删库跑路

2009-03-13 08:58:04

AOL裁员实习

2024-07-29 09:35:33

2021-05-20 19:56:08

泄露密码数据泄露网络攻击

2024-01-09 15:51:56

Rust开发Trait

2015-04-14 15:05:35

Web前端开发腾讯暑期实习生

2011-12-07 20:37:42

iOSAndroid谷歌

2021-03-01 20:10:23

密码网络攻击网络安全

2017-06-29 07:51:06

实习转正公司

2019-08-07 11:02:28

Python 开发编程语言
点赞
收藏

51CTO技术栈公众号