本文共享自华为云社区《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 的一个分支组织,IANATLD 服务器分为几组:

  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. 从阅读器输入abc13.ban2.lcy0000.top/,DNS怎么解析?

放一张cloudflare的图更便利理解输入网址后恳求的进程。

从浏览器输入域名开始分析DNS解析过程

假定咱们要拜访 abc13.ban2.lcy0000.top(假定存在该网站),当阅读器输入这个网址后,查询流程如下

本地 hosts 文件

本地核算时机首要查看本地 hosts 文件是否包括 abc13.ban2.lcy0000.topIP 地址映射。假如存在,则直接回来该 IP 地址,不然持续进行 DNS 查询。

本地 DNS 缓存

本地核算时机查看本地 DNS 缓存是否包括 abc13.ban2.lcy0000.topIP 地址。假如存在,则直接回来该 IP 地址,不然持续进行 DNS 查询。

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

本地核算时机向 ISPDNS 服务器建议 DNS 查询恳求,询问 abc13.ban2.lcy0000.topIP 地址。(图中的连线1

ISP是互联网服务供给商,简略理解为便是移动、联通、电信。

DNS 服务器(图中的Root Server

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

尖端域名服务器(图中的TLD Server

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

威望 DNS 服务器

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

威望 DNS 服务器

ban2.lcy0000.topDNS 服务器查询 abc13.ban2.lcy0000.topIP 地址,abc13.ban2.lcy0000.topIP 地址被回来。威望服务器之间的查询进程不需求ISP的递归服务器参加,ISPDNS只需求查询一次威望服务器即可(图中的连线7

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

ISPDNS 服务器会将查询成果回来给本地核算机。操作体系将运用该IP地址来拜访对应的网站,并将该IP地址添加到本地DNS缓存中,以便下次拜访同一网站时更快地获取IP地址。(图中的连线8

本地核算机

本地核算机将运用该 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地址,则会更新缓存中的记载。

从浏览器输入域名开始分析DNS解析过程

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

从浏览器输入域名开始分析DNS解析过程

履行了这个指令却没看到我刚拜访的域名对应的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 中最根本的一种记载类型,用于将一个域名(例如 www.example.com)映射到一个 IPv4 地址(例如 192.168.0.1)。详细来说,A 记载将一个域名与一个 IP 地址建立映射联系。当用户输入一个域名时,DNS 服务器会回来与之对应的 IP 地址,然后运用户能够拜访该域名对应的网站或服务。

举个比方,假定咱们有一个网站 www.example.com,它的 IP 地址是 192.168.0.1。咱们能够在 DNS 中添加一个 A 记载,将 www.example.com 指向 192.168.0.1。这样,当用户输入 www.example.com 时,DNS 服务器会回来 IP 地址 192.168.0.1,然后运用户能够拜访咱们的网站。

如下这是我买的域名装备的图:

从浏览器输入域名开始分析DNS解析过程

  • AAAA 记载

AAAA 记载是 A 记载的扩展,用于将一个域名(例如 www.example.com)映射到一个 IPv6 地址。详细来说,AAAA 记载将一个域名与一个 IPv6 地址建立映射联系。当用户输入一个域名时,DNS 服务器会回来与之对应的 IPv6 地址,然后运用户能够拜访该域名对应的网站或服务。

举个比方,假定咱们有一个网站 www.example.com,它的 IPv6 地址是 2001:0db8:85a3:0000:0000:8a2e:0370,咱们拜访 www.example.com 时,DNS 解析进程中就会查询该 AAAA 记载,回来 IPv6 地址。

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

  • CNAME 记载

CNAME 记载将一个域名(例如 www.example.com)指向另一个域名(例如 example.com)。这个进程类似于重定向,便利用户快速拜访该域名。CNAME 记载一般用于将某个子域名指向其父域名,或将一个域名指向另一个域名(例如将 www.example.com 指向 example.com)。

举个比方,假定咱们有一个网站 www.example.com,它的 IP 地址是 192.168.0.1,同时咱们还期望用户能够经过 example.com 拜访该网站。咱们能够在 DNS 中添加一个 CNAME 记载,将 example.com 指向 www.example.com。这样,当用户输入 example.com 时,DNS 服务器会回来 www.example.comIP 地址 192.168.0.1,然后运用户能够拜访咱们的网站。

从浏览器输入域名开始分析DNS解析过程

DNS解析进程中,假如输入的域名没有CNAME记载,DNS威望服务器会查找该域名对应的IP地址并回来。可是假如该域名有CNAME记载,DNS威望服务器会先将域名重定向到CNAME指向的域名,然后持续解析该域名的IP地址。这个进程也被称为“CNAME链”。

因而,添加了wwwCNAME记载会将没有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记载。

从浏览器输入域名开始分析DNS解析过程

7. 在阅读器输入abc.coc这种不符合标准的域名后,履行进程是怎样的?

假定输入的域名是abc.coc,这个域名明显不符合域名标准,应该是 abc.comabc.cn 等等。

首要,本地和递归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 威望服务器,然后完成了就近拜访。

假定有一个名为 www.example.com 的域名,该域名有三个 DNS 威望服务器,别离坐落深圳、上海和北京。这三个 DNS 服务器依据域名能解分出同一个 IP 地址。现在,一个坐落深圳的客户端建议 DNS 查询恳求。路由器会将该恳求发送到间隔最近的 DNS 服务器,也便是深圳的那个 DNS 服务器。假如这个 DNS 服务器无法呼应,那么路由器会将恳求发送到次近的 DNS 服务器,也便是上海的那个 DNS 服务器。以此类推,直到找到可呼应恳求的 DNS 服务器停止。

上面说的是DNS威望服务器之间的的负载均衡,运用依据DNS的负载均衡又是怎样的呢?

假定有一个域名 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服务器查询www.example.comIP地址,并将成果缓存下来。当用户点击链接后,阅读器就能够直接运用缓存的DNS成果,而无需再次进行DNS查询。

需求留意的是,DNS预解析尽管能够进步页面加载速度和功能,但也会添加网络负载和DNS服务器的担负。考虑到实践需求,一般都不会去禁止DNS预解析,也不会呈现很多需求预解析多个域名的状况。

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