DNS查询原理

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 我们访问网站、域名、调用接口,服务器或自己的电脑机器、浏览器都是先通过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

相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
46 3
|
2月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
2月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
28天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
40 1
|
8天前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
37 0
|
2月前
|
数据采集 存储 编解码
一份简明的 Base64 原理解析
Base64 编码器的原理,其实很简单,花一点点时间学会它,你就又消除了一个知识盲点。
73 3
|
14天前
|
API 持续交付 网络架构
深入解析微服务架构:原理、优势与实践
深入解析微服务架构:原理、优势与实践
17 0
|
15天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
15天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
24 0
|
2月前
|
前端开发 Java 应用服务中间件
21张图解析Tomcat运行原理与架构全貌
【10月更文挑战第2天】本文通过21张图详细解析了Tomcat的运行原理与架构。Tomcat作为Java Web开发中最流行的Web服务器之一,其架构设计精妙。文章首先介绍了Tomcat的基本组件:Connector(连接器)负责网络通信,Container(容器)处理业务逻辑。连接器内部包括EndPoint、Processor和Adapter等组件,分别处理通信、协议解析和请求封装。容器采用多级结构(Engine、Host、Context、Wrapper),并通过Mapper组件进行请求路由。文章还探讨了Tomcat的生命周期管理、启动与停止机制,并通过源码分析展示了请求处理流程。

相关产品

  • 云解析DNS