DNS查询原理

简介: 我们访问网站、域名、调用接口,服务器或自己的电脑机器、浏览器都是先通过DNS查询,得到对应的IP地址,才能访问网站的,那DNS到底是怎样查询到真实网站接口的IP地址呢?一、DNS 服务器域名对应的 IP 地址,都保存在 DNS 服务器。我们输入域名,浏览器就会在后台,自动向 DNS 服务器发出请求,获取对应的 IP 地址。这就是 DNS 查询。举例来说,我输入 saas.koubei.com 这个

我们访问网站、域名、调用接口,服务器或自己的电脑机器、浏览器都是先通过DNS查询,得到对应的IP地址,才能访问网站的,那DNS到底是怎样查询到真实网站接口的IP地址呢?

一、DNS 服务器

域名对应的 IP 地址,都保存在 DNS 服务器。

我们输入域名,浏览器就会在后台,自动向 DNS 服务器发出请求,获取对应的 IP 地址。这就是 DNS 查询。

举例来说,我输入 saas.koubei.com 这个域名,浏览器就要向 DNS 服务器查询,它的 IP 地址是什么,然后向该 IP 发出访问请求。

网上有很多公用的 DNS 服务器,比如Cloudflare的1.1.1.1,谷歌的8.8.8.8,我们选择阿里提供的223.5.5.5 演示。

https://alidns.com/

二、dig 命令

命令行工具 dig 可以跟 DNS 服务器互动,我们就用它演示 DNS 查询。如果你还没有安装,可以搜一下安装方法,在 Linux、Macos系统下是非常容易的。

它的查询语法如下(美元符号$是命令行提示符)。

$ dig @[DNS 服务器] [域名]

向 223.5.5.5 查询域名,就执行下面的命令。

$ dig @223.5.5.5 saas.koubei.com

正常情况下,它会输出一大堆内容。

在其中找到 ANSWER SECTION 这个部分,它给出了查询的答案,

域名对应的 IP 地址是  203.119.169.43,当然这不是我们最终后端服务的ip,这里可以看到是CNAME解析到了统一接入层。

三、域名的树状结构

你可能会问,难道 DNS 服务器(比如 1.1.1.1)保存了世界上所有域名(包括二级域名、三级域名)的 IP 地址?

当然不是。DNS 是一个分布式系统,1.1.1.1 只是用户查询入口,它也需要再向其他 DNS 服务器查询,才能获得最终的 IP 地址。

要说清楚 DNS 完整的查询过程,就必须了解 域名是一个树状结构。

最顶层的域名是根域名(root),然后是顶级域名(top-level domain,简写 TLD),再是一级域名、二级域名、三级域名。

(1)根域名

所有域名的起点都是根域名,它写作一个点.,放在域名的结尾。因为这部分对于所有域名都是相同的,所以就省略不写了,比如example.com等同于example.com.(结尾多一个点)。

可以试试,任何一个域名结尾加一个点,浏览器都可以正常解读。

(2)顶级域名

根域名的下一级是顶级域名。它分成两种:通用顶级域名(gTLD,比如 .com 和 .net)和国别顶级域名(ccTLD,比如 .cn 和 .us)。

顶级域名由国际域名管理机构 ICANN 控制,它委托商业公司管理 gTLD,委托各国管理自己的国别域名。

(3)一级域名

一级域名就是你在某个顶级域名下面,自己注册的域名。比如,koubei.com就是在顶级域名.com下面注册的。

(4)二级域名

二级域名是一级域名的子域名,是域名拥有者自行设置的,不用得到许可。比如,saas 就是 koubei.com 的二级域名。

四、域名的逐级查询

这种树状结构的意义在于,只有上级域名,才知道下一级域名的 IP 地址,需要逐级查询。

每一级域名都有自己的 DNS 服务器,存放下级域名的 IP 地址。

所以,如果想要查询二级域名 saas.koubei.com 的 IP 地址,需要三个步骤。

  • 第一步,查询根域名服务器,获得顶级域名服务器 .com(又称 TLD 服务器)的 IP 地址。

  • 第二步,查询 TLD 服务器  .com,获得一级域名服务器  koubei.com 的 IP 地址。

  • 第三步,查询一级域名服务器  koubei.com,获得二级域名 saas 的 IP 地址。

下面依次演示这三个步骤。

五、根域名服务器

根域名服务器全世界一共有13台(都是服务器集群)。它们的域名和 IP 地址如下。

 

根域名服务器的 IP 地址是不变的,集成在操作系统里面。

操作系统会选其中一台,查询 TLD 服务器的 IP 地址。

$ dig @192.33.4.12 saas.koubei.com

上面示例中,我们选择192.33.4.12,向它发出查询,询问saas.koubei.com的 TLD 服务器的 IP 地址。

dig 命令的输出结果如下。


; <<>> DiG 9.10.6 <<>> @192.33.4.12 saas.koubei.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46420
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;saas.koubei.com.		IN	A

;; AUTHORITY SECTION:
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.

;; ADDITIONAL SECTION:
m.gtld-servers.net.	172800	IN	A	192.55.83.30
l.gtld-servers.net.	172800	IN	A	192.41.162.30
k.gtld-servers.net.	172800	IN	A	192.52.178.30
j.gtld-servers.net.	172800	IN	A	192.48.79.30
i.gtld-servers.net.	172800	IN	A	192.43.172.30
h.gtld-servers.net.	172800	IN	A	192.54.112.30
g.gtld-servers.net.	172800	IN	A	192.42.93.30
f.gtld-servers.net.	172800	IN	A	192.35.51.30
e.gtld-servers.net.	172800	IN	A	192.12.94.30
d.gtld-servers.net.	172800	IN	A	192.31.80.30
c.gtld-servers.net.	172800	IN	A	192.26.92.30
b.gtld-servers.net.	172800	IN	A	192.33.14.30
a.gtld-servers.net.	172800	IN	A	192.5.6.30
m.gtld-servers.net.	172800	IN	AAAA	2001:501:b1f9::30
l.gtld-servers.net.	172800	IN	AAAA	2001:500:d937::30
k.gtld-servers.net.	172800	IN	AAAA	2001:503:d2d::30
j.gtld-servers.net.	172800	IN	AAAA	2001:502:7094::30
i.gtld-servers.net.	172800	IN	AAAA	2001:503:39c1::30
h.gtld-servers.net.	172800	IN	AAAA	2001:502:8cc::30
g.gtld-servers.net.	172800	IN	AAAA	2001:503:eea3::30
f.gtld-servers.net.	172800	IN	AAAA	2001:503:d414::30
e.gtld-servers.net.	172800	IN	AAAA	2001:502:1ca1::30
d.gtld-servers.net.	172800	IN	AAAA	2001:500:856e::30
c.gtld-servers.net.	172800	IN	AAAA	2001:503:83eb::30
b.gtld-servers.net.	172800	IN	AAAA	2001:503:231d::2:30
a.gtld-servers.net.	172800	IN	AAAA	2001:503:a83e::2:30

;; Query time: 214 msec
;; SERVER: 192.33.4.12#53(192.33.4.12)
;; WHEN: Fri Aug 26 15:34:19 CST 2022
;; MSG SIZE  rcvd: 843

因为它给不了 saas.koubei.com 的 IP 地址,所以输出结果中没有 ANSWER SECTION,只有一个 AUTHORITY SECTION,给出了com.的13台 TLD 服务器的域名。

下面还有一个 ADDITIONAL SECTION,给出了这13台 TLD 服务器的 IP 地址(包含 IPv4 和 IPv6 两个地址)。

六、TLD 服务器

有了 TLD 服务器的 IP 地址以后,我们再选一台接着查询。

$ dig @192.41.162.30 saas.koubei.com

上面示例中,192.41.162.30 是随便选的一台 .com 的 TLD 服务器,我们向它询问 saas.koubei.com 的 IP 地址。

返回结果如下。


; <<>> DiG 9.10.6 <<>> @192.41.162.30 saas.koubei.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25411
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 13
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;saas.koubei.com.		IN	A

;; AUTHORITY SECTION:
koubei.com.		172800	IN	NS	ns4.taobao.com.
koubei.com.		172800	IN	NS	ns5.taobao.com.
koubei.com.		172800	IN	NS	ns6.taobao.com.
koubei.com.		172800	IN	NS	ns7.taobao.com.

;; ADDITIONAL SECTION:
ns4.taobao.com.		172800	IN	AAAA	2401:b180:4100::4
ns4.taobao.com.		172800	IN	A	47.88.74.33
ns4.taobao.com.		172800	IN	A	47.88.74.35
ns5.taobao.com.		172800	IN	A	140.205.122.33
ns5.taobao.com.		172800	IN	A	140.205.122.34
ns5.taobao.com.		172800	IN	AAAA	2401:b180:4100::5
ns6.taobao.com.		172800	IN	A	140.205.122.35
ns6.taobao.com.		172800	IN	A	140.205.122.36
ns6.taobao.com.		172800	IN	AAAA	2401:b180:4100::6
ns7.taobao.com.		172800	IN	A	106.11.35.25
ns7.taobao.com.		172800	IN	A	106.11.35.26
ns7.taobao.com.		172800	IN	AAAA	2401:b180:4100::7

;; Query time: 211 msec
;; SERVER: 192.41.162.30#53(192.41.162.30)
;; WHEN: Fri Aug 26 15:37:42 CST 2022
;; MSG SIZE  rcvd: 363

它依然没有 ANSWER SECTION 的部分,只有 AUTHORITY SECTION,给出了一级域名 koubei.com 的4台 DNS 服务器。

下面的 ADDITIONAL SECTION 就是这4台 DNS 服务器对应的 IP 地址。

七、一级域名的 DNS 服务器

第三步,再向一级域名的 DNS 服务器查询二级域名的 IP 地址。

$ dig @47.88.74.33 saas.koubei.com

返回结果如下。


; <<>> DiG 9.10.6 <<>> @47.88.74.33 saas.koubei.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14919
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;saas.koubei.com.		IN	A

;; ANSWER SECTION:
saas.koubei.com.	300	IN	CNAME	secgw-na61-na62.wagbridge.alibaba.tanx.com.

;; Query time: 198 msec
;; SERVER: 47.88.74.33#53(47.88.74.33)
;; WHEN: Fri Aug 26 15:40:17 CST 2022
;; MSG SIZE  rcvd: 100

这次终于有了 ANSWER SECTION,得到了最终的二级域名的地址,这里是做了CNAME解析到统一接入层。

至此,三个步骤的 DNS 查询全部完成。

八、DNS 服务器的种类

总结一下,上面一共提到了四种服务器。

  • 223.5.5.5
  • 根域名服务器
  • TLD 服务器
  • 一级域名服务器

它们都属于 DNS 服务器,都用来接受 DNS 查询。但是作用不一样,属于不同的类别。

8.1 递归 DNS 服务器

后三种服务器只用来查询下一级域名的 IP 地址,而 223.5.5.5 则把分步骤的查询过程自动化,方便用户一次性得到结果,所以它称为递归 DNS 服务器(recursive DNS server),即可以自动递归查询。

我们平常说的 DNS 服务器,一般都是指递归 DNS 服务器。它把 DNS 查询自动化了,只要向它查询就可以了。

它内部有缓存,可以保存以前查询的结果,下次再有人查询,就直接返回缓存里面的结果。所以它能加快查询,减轻源头 DNS 服务器的负担。

8.2 权威 DNS 服务器

一级域名服务器的正式名称叫做权威域名服务器(Authoritative Name Server)。

"权威"的意思是域名的 IP 地址由它给定,不像递归服务器自己做不了主。我们购买域名后,设置 DNS 服务器就是在设置该域名的权威服务器。

8.3 四种 DNS 服务器

综上所述,DNS 服务器可以分成四种:

  • 根域名服务器
  • TLD 服务器
  • 权威域名服务器
  • 递归域名服务器

它们的关系如下图。

 

知道了 DNS 查询的原理,完全可以自己写一个 DNS 的递归服务器,这是不难的。网上有很多参考资料,有兴趣的话,大家可以试试看。


内容做了修改,原文:https://www.ruanyifeng.com/blog/2022/08/dns-query.html

相关文章
|
1天前
|
Web App开发 开发框架 前端开发
Open UI5 前端开发框架配套的 Mock Server 工作原理解析
Open UI5 前端开发框架配套的 Mock Server 工作原理解析
10 0
|
1天前
|
存储 Java Go
Go 语言切片如何扩容?(全面解析原理和过程)
Go 语言切片如何扩容?(全面解析原理和过程)
12 2
|
1天前
|
图形学
R语言其他相关函数(各函数解析含实例,可供查询)
R语言其他相关函数(各函数解析含实例,可供查询)
3 0
|
1天前
|
机器学习/深度学习 存储 算法
卷积神经网络(CNN)的数学原理解析
卷积神经网络(CNN)的数学原理解析
33 1
卷积神经网络(CNN)的数学原理解析
|
1天前
|
传感器 数据采集 存储
岩土工程监测仪器之一:振弦采集仪的工作原理解析
岩土工程监测仪器之一:振弦采集仪的工作原理解析
岩土工程监测仪器之一:振弦采集仪的工作原理解析
|
1天前
|
XML JavaScript 数据格式
Beautiful Soup 库的工作原理基于解析器和 DOM(文档对象模型)树的概念
【5月更文挑战第10天】Beautiful Soup 使用解析器(如 html.parser, lxml, html5lib)解析HTML/XML文档,构建DOM树。它提供方法查询和操作DOM,如find(), find_all()查找元素,get_text(), get()提取信息。还能修改DOM,添加、修改或删除元素,并通过prettify()输出格式化字符串。它是处理网页数据的利器,尤其在处理不规则结构时。
37 2
|
1天前
|
机器学习/深度学习 人工智能 数据可视化
号称能打败MLP的KAN到底行不行?数学核心原理全面解析
Kolmogorov-Arnold Networks (KANs) 是一种新型神经网络架构,挑战了多层感知器(mlp)的基础,通过在权重而非节点上使用可学习的激活函数(如b样条),提高了准确性和可解释性。KANs利用Kolmogorov-Arnold表示定理,将复杂函数分解为简单函数的组合,简化了神经网络的近似过程。与mlp相比,KAN在参数量较少的情况下能达到类似或更好的性能,并能直观地可视化,增强了模型的可解释性。尽管仍需更多研究验证其优势,KAN为深度学习领域带来了新的思路。
109 5
|
1天前
|
敏捷开发 测试技术 持续交付
极限编程(XP)原理与技巧:深入解析与实践
【5月更文挑战第8天】极限编程(XP)是一种敏捷开发方法,注重快速反馈、迭代开发和简单设计,以提高软件质量和项目灵活性。关键原则包括客户合作、集体代码所有权、持续集成等。实践中,使用故事卡片描述需求,遵循编程约定,实行TDD,持续重构,结对编程,并定期举行迭代会议。通过理解和应用XP,团队能提升效率,应对变化。
|
1天前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
168479 0
|
1天前
|
存储 芯片
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)

相关产品

  • 云解析DNS
  • 推荐镜像

    更多