本文共享自华为云社区《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
服务器分为几组:
- 通用尖端域:这些对错特定国家/区域的域,一些最闻名的通用
TLD
包括.com(商业企业) .org .net .edu .gov(美国政府实体)
,IANA
过去曾严格约束新通用尖端域(gTLD
)的创建,但在2010
年这些约束有所放松。现在稀有百个不太闻名的gTLD
,例如“.top
”、“.xyz
”和“.loan
”。 - 国家/区域代码尖端域:这些包括特定于某个国家/区域或州的任何域。例如,
.cn
、.uk
、.us
、.ru
和.jp
等。 - 资助的尖端域:这些
TLD
一般代表专业、种族或地理社区。每个资助TLD
都有一个代表该社区的授权资助商。例如,“.app
”是针对开发者社区的TLD
,由Google
资助。相同,“.gov
”旨在供美国政府运用,由总务办理局资助。 - 基础设施性尖端域:此类别仅包括一个
TLD
:“.arpa
”。“.arpa
”以协助创始现代互联网的美国军事研究安排DARPA
命名,是有史以来创建的第一个TLD
,现在保存用于基础设施责任,例如促进反向DNS
查找。 - 保存的尖端域:一些
TLD
坐落保存列表中,这意味着它们永远无法运用。例如,“.localhost
”保存用于本地核算机环境,“.example
”保存用于示例演示。
- 威望性域名服务器:
当递归解析器收到来自 TLD
域名服务器的呼应时,该呼应会将解析器定向到威望性域名服务器。威望性域名服务器一般是解析器查找 IP
地址进程中的最后一步。
2. 从阅读器输入abc13.ban2.lcy0000.top/,DNS怎么解析?
放一张cloudflare
的图更便利理解输入网址后恳求的进程。
假定咱们要拜访 abc13.ban2.lcy0000.top
(假定存在该网站),当阅读器输入这个网址后,查询流程如下
本地 hosts
文件
本地核算时机首要查看本地 hosts
文件是否包括 abc13.ban2.lcy0000.top
的 IP
地址映射。假如存在,则直接回来该 IP
地址,不然持续进行 DNS
查询。
本地 DNS
缓存
本地核算时机查看本地 DNS
缓存是否包括 abc13.ban2.lcy0000.top
的 IP
地址。假如存在,则直接回来该 IP
地址,不然持续进行 DNS
查询。
ISP
的递归 DNS
服务器(图中的DNS Resolver
)
本地核算时机向 ISP
的DNS
服务器建议 DNS
查询恳求,询问 abc13.ban2.lcy0000.top
的 IP
地址。(图中的连线1
)
ISP
是互联网服务供给商,简略理解为便是移动、联通、电信。
根 DNS
服务器(图中的Root Server
)
ISP
的 DNS
服务器会向根 DNS
服务器查询 .top
尖端域名的 DNS
服务器的 IP
地址,根 DNS
服务器会回来 .top
尖端域名的 DNS
服务器的 IP
地址。(图中的2、3
连线代表查询和回来)
尖端域名服务器(图中的TLD Server
)
ISP
的 DNS
服务器会向该 DNS
服务器查询 lcy0000.top
二级域名的 DNS
服务器的 IP
地址。(图中的4、5
连线代表查询和回来)
威望 DNS
服务器
ISP
的 DNS
服务器会向lcy0000.top
二级域名的 DNS
服务器查询 ban2.lcy0000.top
的DNS
服务器的 IP
地址。(图中的连线6
)
威望 DNS
服务器
ban2.lcy0000.top
的 DNS
服务器查询 abc13.ban2.lcy0000.top
的 IP
地址,abc13.ban2.lcy0000.top
的 IP
地址被回来。威望服务器之间的查询进程不需求ISP
的递归服务器参加,ISP
的DNS
只需求查询一次威望服务器即可(图中的连线7
)
ISP
的递归 DNS
服务器(图中的DNS Resolver
)
ISP
的 DNS
服务器会将查询成果回来给本地核算机。操作体系将运用该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
地址,则会更新缓存中的记载。
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
中最根本的一种记载类型,用于将一个域名(例如 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
,然后运用户能够拜访咱们的网站。
如下这是我买的域名装备的图:
-
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.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.com
和ping baidu.com
,会发现IP
不一样,也许便是装备了两个不同的A
记载。
7. 在阅读器输入abc.coc这种不符合标准的域名后,履行进程是怎样的?
假定输入的域名是abc.coc
,这个域名明显不符合域名标准,应该是 abc.com
或 abc.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.com
的IP
地址,并将成果缓存下来。当用户点击链接后,阅读器就能够直接运用缓存的DNS
成果,而无需再次进行DNS
查询。
需求留意的是,DNS
预解析尽管能够进步页面加载速度和功能,但也会添加网络负载和DNS
服务器的担负。考虑到实践需求,一般都不会去禁止DNS
预解析,也不会呈现很多需求预解析多个域名的状况。
点击关注,第一时刻了解华为云新鲜技能~