huaweiyun
摘要:DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络。

本文分享自华为云社区《DNS那些事——从浏览器输入域名开始分析DNS解析过程》,作者: 砖业洋__ 。

我们就从在浏览器输入域名开始分析。

1. DNS服务器有哪些?

  • 递归DNS服务器:

也称为DNS解析器。这种服务器是 DNS 查询的起点,它负责从根 DNS 服务器开始解析域名,一步步查询到目标域名所在的 DNS 服务器,并将解析结果返回给用户设备。递归 DNS 服务器通常由网络服务提供商(ISP)或公司网络管理员管理。

  • 根域名服务器:

这些服务器负责管理域名系统的根区域,它们存储着所有*域名(如.com、.org、.cn等)的 DNS 记录。根 DNS 服务器分为13个,分布在全球不同地点,由不同组织管理,以保证 DNS 的高可靠性和稳定性。根域名服务器由一家名为 Internet 名称与数字地址分配机构(ICANN) 的非营利组织进行监督。

根域名服务器由13组集群服务器构成(并不是只有13台服务器),每组集群服务器中包含多台服务器,共同承担服务。这些服务器被部署在全球各地的数据中心中,以确保根域名服务器的高可用性和容错能力,每个集群中都有多台服务器进行冗余备份,它们的备份和副本分布在世界各地的不同地方。

举个例子,13个根域名服务器的IP地址可能是这样

a.root-servers.net (198.41.0.4)
b.root-servers.net (199.9.14.201)
c.root-servers.net (192.33.4.12)
d.root-servers.net (199.7.91.13)
e.root-servers.net (192.203.230.10)
f.root-servers.net (192.5.5.241)
g.root-servers.net (192.112.36.4)
h.root-servers.net (198.97.190.53)
i.root-servers.net (192.36.148.17)
j.root-servers.net (192.58.128.30)
k.root-servers.net (193.0.14.129)
l.root-servers.net (199.7.83.42)
m.root-servers.net (202.12.27.33)
  • *域名服务器:

TLD(Top Level Domain)服务器负责管理*域名(如.com、.org、.net、.cn等)的 DNS 记录。当用户访问一个域名时,递归 DNS 服务器首先会向根 DNS 服务器查询*域名的DNS 服务器地址,然后再向相应的 TLD 服务器查询该域名的DNS服务器地址。一旦找到权威 DNS 服务器,递归 DNS 服务器就会向其查询域名的 IP 地址,最终返回给用户设备。

TLD 域名服务器的管理由 Internet 编号分配机构(IANA) 处理,其为 ICANN 的一个分支机构,IANA 将 TLD 服务器分为几组:

  1. 通用*域:这些是非特定国家/地区的域,一些最知名的通用 TLD 包括 .com(商业企业) .org .net .edu .gov(美国*实体),IANA 过去曾严格限制新通用*域(gTLD)的创建,但在 2010 年这些限制有所放松。现在有数百个不太知名的 gTLD,例如“.top”、“.xyz”和“.loan”。
  2. 国家/地区代码*域:这些包括特定于某个国家/地区或州的任何域。例如,.cn、.uk、.us、.ru 和 .jp 等。
  3. 赞助的*域:这些 TLD 通常代表专业、种族或地理社区。每个赞助 TLD 都有一个代表该社区的授权赞助商。例如,“.app”是针对开发者社区的 TLD,由 Google 赞助。同样,“.gov”旨在供美国*使用,由总务管理局赞助。
  4. 基础设施性*域:此类别仅包含一个 TLD:“.arpa”。“.arpa”以帮助开创现代互联网的美国军事研究组织 DARPA 命名,是有史以来创建的第一个 TLD,现在保留用于基础设施职责,例如促进反向 DNS 查找。
  5. 保留的*域:一些 TLD 位于保留列表中,这意味着它们永远无法使用。例如,“.localhost”保留用于本地计算机环境,“.example”保留用于示例演示。
  • 权威性域名服务器:

当递归解析器收到来自 TLD 域名服务器的响应时,该响应会将解析器定向到权威性域名服务器。权威性域名服务器通常是解析器查找 IP 地址过程中的最后一步。

2. 从浏览器输入

https://abc13.ban2.lcy0000.top/,DNS如何解析?

放一张cloudflare的图更方便理解输入网址后请求的过程。

假设我们要访问 abc13.ban2.lcy0000.top(假设存在该网站),当浏览器输入这个网址后,查询流程如下

1.本地 hosts 文件

本地计算机会首先检查本地 hosts 文件是否包含 abc13.ban2.lcy0000.top 的 IP 地址映射。如果存在,则直接返回该 IP 地址,否则继续进行 DNS 查询。

2.本地 DNS 缓存

本地计算机会检查本地 DNS 缓存是否包含 abc13.ban2.lcy0000.top 的 IP 地址。如果存在,则直接返回该 IP 地址,否则继续进行 DNS 查询。

3.ISP的递归 DNS 服务器(图中的DNS Resolver)

本地计算机会向 ISP 的DNS 服务器发起 DNS 查询请求,询问 abc13.ban2.lcy0000.top 的 IP 地址。(图中的连线1)

ISP是互联网服务提供商,简单理解为就是移动、联通、电信。

4.根 DNS 服务器(图中的Root Server)

ISP 的 DNS 服务器会向根 DNS 服务器查询 .top *域名的 DNS 服务器的 IP 地址,根 DNS 服务器会返回 .top *域名的 DNS 服务器的 IP 地址。(图中的2、3连线代表查询和返回)

5.*域名服务器(图中的TLD Server)

ISP的 DNS 服务器会向该 DNS 服务器查询 lcy0000.top 二级域名的 DNS 服务器的 IP 地址。(图中的4、5连线代表查询和返回)

6.权威 DNS 服务器

ISP的 DNS 服务器会向lcy0000.top 二级域名的 DNS 服务器查询 ban2.lcy0000.top的DNS服务器的 IP 地址。(图中的连线6)

7.权威 DNS 服务器

ban2.lcy0000.top 的 DNS 服务器查询 abc13.ban2.lcy0000.top 的 IP 地址,abc13.ban2.lcy0000.top 的 IP 地址被返回。权威服务器之间的查询过程不需要ISP的递归服务器参与,ISP的DNS只需要查询一次权威服务器即可(图中的连线7)

8.ISP的递归 DNS 服务器(图中的DNS Resolver)

ISP的 DNS 服务器会将查询结果返回给本地计算机。操作系统将使用该IP地址来访问对应的网站,并将该IP地址添加到本地DNS缓存中,以便下次访问同一网站时更快地获取IP地址。(图中的连线8)

9.本地计算机

本地计算机将使用该 IP 地址与 abc13.ban2.lcy0000.top 进行通信,浏览器使用该IP地址向 abc13.ban2.lcy0000.top 的服务器发起HTTP请求,获取相应的网页内容。(图中的9、10连线代表查询和返回)

从图上可以看到,从浏览器到ISP的递归DNS服务器的这个步骤是递归查询(Recursive Query),从递归DNS服务器到根、*、权威域名服务器这个过程是迭代查询(Iteractive Query)

3. hosts文件是什么?为什么访问网站会先查找hosts文件?

hosts文件中存放着IP地址和对域名,可以手动配置,作用是为了将特定的域名映射到特定的IP地址上,从而在访问这些域名时不需要进行DNS解析,直接使用hosts文件中的IP地址进行访问。如果访问的域名不在hosts文件中,则会查找DNS缓存或者从DNS服务器获取对应的IP地址并进行访问。如果你在hosts文件配置错了IP,那这个网站将无法访问。因为后面不会再去查找本地DNS缓存和DNS服务器解析,就根据hosts文件中的IP去访问。

相对于本地DNS缓存,hosts文件的优势在于它可以直接控制特定域名的解析结果。当你在hosts文件中手动添加了一个IP地址和域名的对应关系后,这个映射关系将会一直生效,不受DNS缓存的影响。而本地DNS缓存是由操作系统自动维护的,它会根据DNS服务器返回的TTL值来判断缓存是否过期,当缓存过期后需要重新进行DNS解析,如果DNS服务器返回了不同的IP地址,则会更新缓存中的记录。

hosts文件通常位于操作系统中的一个特定目录下,比如在Windows系统中,hosts文件通常位于C:\Windows\System32\drivers\etc目录下,它是一个以文本形式存储的文件,可以使用任何文本编辑器进行编辑。在mac中,位于/etc/目录下。

4. 如何查看本地DNS服务器缓存的域名对应的IP?

windows可以用下面命令

ipconfig /displaydns

mac可以用下面命令

// 这个是刷新本地 DNS 缓存,并清除所有缓存记录
sudo killall -HUP mDNSResponder
// 这个是显示本地 DNS 服务器缓存的所有域名和对应的 IP 地址
dscacheutil -cachedump -entries Host

执行了这个命令却没看到我刚访问的域名对应的ip,这是没缓存吗?

如果执行了 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 命令,但是没有看到刚访问的域名对应的 IP 地址,可能有以下几种情况:

  • 本地 DNS 服务器没有缓存该域名的 IP 地址。如果你第一次访问一个域名,本地 DNS 服务器很可能没有缓存该域名的 IP 地址。在这种情况下,执行 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 命令时,看不到该域名的缓存记录。
  • 本地 DNS 服务器缓存的 TTL 时间已经过期。当你访问一个域名时,本地 DNS 服务器会将该域名的 IP 地址缓存一段时间,这个时间就是 TTL(Time To Live)时间。如果 TTL 时间已经过期,本地 DNS 服务器就会从权威 DNS 服务器重新获取该域名的 IP 地址。在这种情况下,执行 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 命令时,可能看不到该域名的缓存记录。
  • 你的电脑可能使用了其他 DNS 服务器或者代理服务器。如果你的电脑使用了其他 DNS 服务器或者代理服务器,那么执行 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 命令时,缓存记录可能来自其他 DNS 服务器或者代理服务器,而不是本地 DNS 服务器。

5. DNS A记录/AAAA记录/CNAME记录

  • A 记录

A 记录是 DNS 中最基本的一种记录类型,用于将一个域名(例如 http://www.example.com)映射到一个 IPv4 地址(例如 192.168.0.1)。具体来说,A 记录将一个域名与一个 IP 地址建立映射关系。当用户输入一个域名时,DNS 服务器会返回与之对应的 IP 地址,从而使用户能够访问该域名对应的网站或服务。

举个例子,假设我们有一个网站 http://www.example.com,它的 IP 地址是 192.168.0.1。我们可以在 DNS 中添加一个 A 记录,将 http://www.example.com 指向 192.168.0.1。这样,当用户输入 http://www.example.com 时,DNS 服务器会返回 IP 地址 192.168.0.1,从而使用户能够访问我们的网站。

如下这是我买的域名配置的图:

  • AAAA 记录

AAAA 记录是 A 记录的扩展,用于将一个域名(例如 http://www.example.com)映射到一个 IPv6 地址。具体来说,AAAA 记录将一个域名与一个 IPv6 地址建立映射关系。当用户输入一个域名时,DNS 服务器会返回与之对应的 IPv6 地址,从而使用户能够访问该域名对应的网站或服务。

举个例子,假设我们有一个网站 http://www.example.com,它的 IPv6 地址是 2001:0db8:85a3:0000:0000:8a2e:0370,我们访问 http://www.example.com 时,DNS 解析过程中就会查询该 AAAA 记录,返回 IPv6 地址。

图就不放了,和上面类似。

  • CNAME 记录

CNAME 记录将一个域名(例如 http://www.example.com)指向另一个域名(例如 http://example.com)。这个过程类似于重定向,方便用户快速访问该域名。CNAME 记录通常用于将某个子域名指向其父域名,或将一个域名指向另一个域名(例如将 http://www.example.com 指向 http://example.com)。

举个例子,假设我们有一个网站 http://www.example.com,它的 IP 地址是 192.168.0.1,同时我们还希望用户能够通过 http://example.com 访问该网站。我们可以在 DNS 中添加一个 CNAME 记录,将 http://example.com 指向 http://www.example.com。这样,当用户输入 http://example.com 时,DNS 服务器会返回 http://www.example.com 的 IP 地址 192.168.0.1,从而使用户能够访问我们的网站。

在DNS解析过程中,如果输入的域名没有CNAME记录,DNS权威服务器会查找该域名对应的IP地址并返回。但是如果该域名有CNAME记录,DNS权威服务器会先将域名重定向到CNAME指向的域名,然后继续解析该域名的IP地址。这个过程也被称为“CNAME链”。

因此,添加了www的CNAME记录会将没有www前缀的域名重定向到添加了www前缀的域名,这样访问者就可以通过www前缀来访问网站了。

6. 为什么输入baijiahao.baidu.com可以访问,加上www.之后变成www.baijiahao.baidu.com就无法访问?

一般来说,两个域名的DNS解析的结果可能不同,指向的是不同的服务器。当访问"baijiahao.baidu.com"时,域名对应的IP可以被解析出来。但是在URL中加上"www."之后,请求的域名变为"www.baijiahao.baidu.com",这个域名的DNS解析结果可能不同于"baijiahao.baidu.com",如果该域名未被配置,则无法访问该站点。

玩过云服务器配置过域名解析的就会知道,从请求的结果来看,就是www.baijiahao.baidu.com没配置对应IP

这个配置需要在域名所有权者的DNS解析控制面板中进行。具体的配置方式可能会因不同的DNS服务提供商而有所不同,但通常可以通过添加DNS记录来配置子域名。

在这个例子中,百度作为域名所有者,他们可能会在他们的DNS解析控制面板中添加一个名为"www"CNAME记录,将其指向"baijiahao.baidu.com",类似于重定向,这样当用户在浏览器中输入"www.baijiahao.baidu.com"时,DNS服务器就会返回指向"baijiahao.baidu.com"IP地址,从而使用户能够访问该网站。或者添加一个名为"www.baijiahao.baidu.com""A"记录,然后IP配置的和"baijiahao.baidu.com"IP地址一样,这样不管访问"www.baijiahao.baidu.com"还是"baijiahao.baidu.com"都解析为同一个IP

各位可以在命令行ping www.baidu.comping baidu.com,会发现IP不一样,也许就是配置了两个不同的A记录。

7. 在浏览器输入abc.coc这种不符合规范的域名后,执行过程是怎样的?

假设输入的域名是abc.coc,这个域名显然不符合域名规范,应该是  或  等等。

首先,本地和递归DNS服务器会检查DNS缓存是否存在该域名的解析记录,由于这是一个不存在的域名,本地和递归DNS服务器缓存中肯定没有相关记录,因此会向根域名服务器发送查询请求。

根域名服务器无法解析该域名,因为 .coc 不是一个合法的*域名,因此根域名服务器会返回一个“域名不存在”的错误信息给递归DNS服务器。

递归DNS服务器收到根域名服务器的响应后,会将“域名不存在”的错误信息返回给客户端,客户端显示无法解析该域名。

需要注意的是,由于 abc.coc 不符合域名规范,大部分浏览器或操作系统会在输入时就进行格式校验,当输入的字符串无法被识别为域名,就会变成搜索操作。

8. DNS解析是TCP还是UDP?

DNS解析使用的是UDP协议,因为DNS查询通常只需要发送小量的数据,而UDP协议是无连接、不可靠的,但是比TCP更快速和轻量级。当然,对于一些特殊情况下的DNS解析,也可能使用TCP协议,比如DNS数据包超过了UDP报文最大长度时,会使用TCP进行分片传输。如果 DNS 查询包的大小超过 512 字节,或者查询返回的响应包的大小超过 512 字节,则必须使用 TCP 协议。

9. 权威域名服务器中的循环DNS

为了提高服务的可靠性和可用性,通常会部署多台相同配置的 DNS 服务器,提供相同的 DNS 解析服务,通过将这些服务器添加到一个逻辑组中,可以实现循环 DNS 技术,从而实现负载均衡和高可用性(所以这个负载均衡并不是靠专门的硬件,有缺点)。

通过将多个相同的 DNS 权威服务器添加到一个逻辑组中,以均衡 DNS 解析请求的负载。假设有六台服务器(A、B、C、D、E、F),它们都在循环 DNS 配置中。当客户端发起 DNS 查询请求时,循环 DNS 服务器会从该组中选择一个服务器,并将请求发送到该服务器。循环 DNS 服务器选择服务器 A 处理该请求。如果服务器 A 无法响应请求,则循环 DNS 服务器会将请求发送到 B 服务器。如果 B 服务器也无法响应请求,则循环 DNS 服务器会将请求发送到 C 服务器,以此类推。每次查询 DNS 服务器时,它都会以循环方式将最近响应的 IP 地址发送到队列后面。

但是缺点很明显,越往后因为拒绝服务导致重试的次数越多,请求变慢。

超过了设定的超时时间,客户端就会认为该DNS服务器未能响应。超时时间的长度是可以设置的,通常在几秒钟到几十秒钟之间。如果在超时时间内未能获得响应,客户端就会尝试向下一个DNS服务器发起请求。如果所有的DNS服务器都未能响应,就会返回一个错误信息给用户。

在这种情况下,如果客户端的 DNS 解析超时并向另一个 DNS 服务器发出请求,则浏览器的 network 中可能会出现两个 HTTP 请求记录。第一个记录是 DNS 解析无响应的请求,第二个记录是重试能成功的 HTTP 请求。如果 DNS 解析超时并且没有重试,则只会显示一个请求记录,即 DNS 解析请求。

10. 解决循环DNS的缺点——DNS负载均衡技术

  • DNS负载均衡技术

可以用负载均衡来分配 DNS 查询请求到不同的 DNS 服务器上,以实现负载均衡。这些 DNS 服务器可以根据请求的源 IP 地址、地理位置或者其他特定条件来分配权重,进行筛选最优的服务器,从而避免单个权威 DNS 服务器承受过多的请求压力。如果其中一台DNS服务器出现问题,系统会自动将它从轮询列表中删除,从而确保之后客户端的请求不会被发送到不可用的DNS服务器上。

  • Anycast DNS技术

可以根据地理位置将 DNS 查询发送到最近的 DNS 服务器,是因为它利用了网络路由中的机制。在互联网中,路由器将数据包转发到下一跳时,通常会选择距离最短的路径。这个距离可以通过测量网络的物理距离、延迟等指标来计算。Anycast DNS 利用了这个机制,在不同的地理位置部署多个 DNS 权威服务器,从而实现了就近访问。

假设有一个名为 http://www.example.com 的域名,该域名有三个 DNS 权威服务器,分别位于深圳、上海和北京。这三个 DNS 服务器根据域名能解析出同一个 IP 地址。现在,一个位于深圳的客户端发起 DNS 查询请求。路由器会将该请求发送到距离最近的 DNS 服务器,也就是深圳的那个 DNS 服务器。如果这个 DNS 服务器无法响应,那么路由器会将请求发送到次近的 DNS 服务器,也就是上海的那个 DNS 服务器。以此类推,直到找到可响应请求的 DNS 服务器为止。

上面说的是DNS权威服务器之间的的负载均衡,应用基于DNS的负载均衡又是怎样的呢?

假设有一个域名 http://example.com,它对应着多个应用服务器的 IP地址,为了实现负载均衡,可以在同一个权威域名服务器的 DNS 记录中配置多个 A 记录,每个 A记录对应一个应用服务器的 IP地址,权威域名服务器会将A记录中的多个IP地址返回给DNS递归服务器,由递归服务器根据一定的负载均衡策略选择其中一个IP地址返回给客户端。这样就实现了应用基于DNS的负载均衡。
递归服务器的负载均衡策略通常会根据一定的算法从多个IP地址中选择一个来返回给客户端,这个算法通常是根据IP地址的性能、可用性、距离等因素来进行选择。以下是一些常见的负载均衡算法:

  • 轮询算法:递归服务器按照固定的顺序依次轮询选择IP地址返回给客户端,确保每个IP地址都能够得到平均的请求量。比如:第一次返回 IP1,第二次返回 IP2,第三次返回 IP3,第四次返回 IP1,以此类推。
  • 随机算法:递归服务器随机选择一个IP地址返回给客户端,确保每个IP地址都有一定的机会被选择到。
  • 带权重的轮询算法:为了解决某些IP地址性能更高或者负载更轻的问题,递归服务器会给每个IP地址分配一个权重,轮询时会优先选择权重高的IP地址。比如:IP1的权重为3,IP2的权重为2,IP3的权重为1,则轮询顺序为 IP1、IP1、IP1、IP2、IP2、IP3。
  • 最少连接数算法:递归服务器会记录每个IP地址当前的连接数,优先选择连接数最少的IP地址返回给客户端。这种算法适用于负载均衡服务器的场景。
  • IP地址哈希算法:递归服务器会根据客户端IP地址的哈希值选择一个IP地址返回给客户端。这种算法适用于需要固定客户端访问同一个服务器的场景。

以上是一些常见的递归服务器的负载均衡算法,实际应用中可以根据具体的情况选择不同的算法。

11. DNS 预解析(DNS prefetching)技术

现代浏览器还引入了 DNS 预解析(DNS prefetching)技术,可以在页面加载时自动解析该页面中可能需要的 DNS 记录,以便在用户点击链接时可以更快地打开页面。这种技术可以有效地减少 DNS 查询时间。

具体来说,当浏览器遇到页面中的链接或资源(如图片、样式表、脚本等)时,会自动进行DNS预解析。这样,在用户点击链接或浏览到相关资源时,域名已经被解析,可以更快地获取到数据,提升用户体验。

DNS预解析的原理是通过浏览器的解析器在后台进行DNS查询并缓存结果,以减少DNS查询的延迟。当浏览器发现一个可能需要进行DNS查询的链接或资源时,它会自动在后台发起DNS查询并缓存结果。如果用户后续访问同一域名下的其他资源,浏览器就可以直接使用缓存的DNS结果,而无需再次进行DNS查询。

例如,当浏览器遇到以下HTML代码时(<a>标签默认开启DNS预解析):

<a href="https://www.example.com">Example</a>

浏览器就会自动进行DNS预解析,向DNS服务器查询http://www.example.com的IP地址,并将结果缓存下来。当用户点击链接后,浏览器就可以直接使用缓存的DNS结果,而无需再次进行DNS查询。

需要注意的是,DNS预解析虽然可以提高页面加载速度和性能,但也会增加网络负载和DNS服务器的负担。考虑到实际需求,一般都不会去禁止DNS预解析,也不会出现很多需要预解析多个域名的情况。

 

点击关注,第一时间了解华为云新鲜技术~

相关文章: