DNS 查询原理详解

作者: 阮一峰

日期: 2022年8月 2日

通过 DNS 查询,得到域名的 IP 地址,才能访问网站。

那么,DNS 查询到底是怎么完成的?本文通过实例,详细介绍背后的步骤。

一、DNS 服务器

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

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

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

网上有很多公用的 DNS 服务器,这篇文章选择 Cloudflare 公司提供的 1.1.1.1 进行演示。

二、dig 命令

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

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


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

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


$ dig @1.1.1.1 es6.ruanyifeng.com

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

在其中找到 ANSWER SECTION 这个部分,它给出了查询的答案,域名对应的 IP 地址是 104.198.14.52。

三、域名的树状结构

你可能会问,难道 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)一级域名

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

(4)二级域名

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

四、域名的逐级查询

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

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

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

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

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

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

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

五、根域名服务器

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

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

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


$ dig @192.33.4.12 es6.ruanyifeng.com

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

dig 命令的输出结果如下。

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

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

六、TLD 服务器

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


$ dig @192.41.162.30 es6.ruanyifeng.com

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

返回结果如下。

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

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

七、一级域名的 DNS 服务器

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


$ dig @172.64.32.123 es6.ruanyifeng.com

返回结果如下。

这次终于有了 ANSWER SECTION,得到了最终的二级域名的 IP 地址。

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

八、DNS 服务器的种类

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

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

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

8.1 递归 DNS 服务器

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

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

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

8.2 权威 DNS 服务器

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

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

8.3 四种 DNS 服务器

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

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

它们的关系如下图。

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

九、参考网址

(完)

留言(29条)

干货

dig命令中不使用ADDITIONAL SECTION给出的IP地址,而是使用AUTHORITY SECTION给出的服务器域名,会出现什么情况?会是直接报错吗?
非IT相关行业,但喜欢看您的文章,但没有操作环境????。

dig +trace es6.ruanyifeng.com

@Hayashikawa:

和使用IP地址一样的效果。

还有一种说法:顶级域名就是一级域名,参见百度百科词条“顶级域名”下的专业定义部分:
https://baike.baidu.com/item/%E9%A1%B6%E7%BA%A7%E5%9F%9F%E5%90%8D/2152551

浏览器输入网址要先查询本地的缓存,处理计算机会有缓存,浏览器好像也会有缓存 如果没有查到,才会向dns服务器发起请求查询

1. 顶级域名就是一级域名,所以 ruanyifeng.com 应该是二级域名
2. baidu.com 可以访问 baidu.com. 无法访问

有用,帮助大大的。原来存个解析这么简单。还收那么多费用。

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

好像并不能正常解读...

baidu.com 可以访问 baidu.com. 无法访问

这个如何解释?

引用A.L的发言:

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

好像并不能正常解读...

百度什么的应该是做了限制,找一些没做限制的网站确实是正常访问的。
我访问自己的网站,确实是可以访问的。和协议没啥关系

突然想到一个问题,域名为什么写成baidu.com,为什么最初的设计者不把域名设计为com.baidu这样的格式?写成这样就很容易分辨顶级域名、一级域名、二级域名了。

引用ww的发言:

突然想到一个问题,域名为什么写成baidu.com,为什么最初的设计者不把域名设计为com.baidu这样的格式?写成这样就很容易分辨顶级域名、一级域名、二级域名了。

大概是因为美国人的姓在名后吧

引用lsj的发言:

baidu.com 可以访问 baidu.com. 无法访问

这个如何解释?

baidu.com. 返回405。证明域名已经成功解析。

引用lsj的发言:

baidu.com 可以访问 baidu.com. 无法访问

这个如何解释?

百度报错 是405 很明显是百度做了限制,并不是不能访问。

DNS以前也大概知道的,一直以为买了域名就能用,最近才知道还需要备案。

如果有缓存,那如果域名的ip发生变化,如何知道缓存是过时的呢??

一直不太明白 输入ip地址之后的这个DNS查询,现在明白了,非常感谢阮老师❤️

引用胡的发言:

DNS以前也大概知道的,一直以为买了域名就能用,最近才知道还需要备案。

服务器如果不在大陆是不需要备案的,比如香港,大陆服务器一定要备案。

ENS呢?

引用vino的发言:

大概是因为美国人的姓在名后吧

但是开发的包里com又在前面233

引用liam的发言:

但是开发的包里com又在前面233

如果com在后,就无法维护包结构,因为是目录结构

引用liam的发言:

但是开发的包里com又在前面233

所以这个还专门出了个名词叫反域名结构

“你可以试试,任何一个域名结尾加一个点,浏览器都可以正常解读。” 这句话的迷惑性在于“浏览器都可以正常解读”,所以很多人就直接baidu.com.来测试,发现并没有被“解读”。
正确的描述应该是“dns都能被正确解析”

我记得之前访问过http://ai. 的一个网站,也想整一个根域名

两种说法:
1.国内习惯将xx.yy.zz叫二级域名,顶级域名和一级域名不是一个
2.也有将xx.yy.zz叫三级域名的,顶级和一级域名指的同一个(.com是一级或顶级,baidu.com是二级,zhidao.baidu.com是三级)

引用曹熙程的发言:

百度什么的应该是做了限制,找一些没做限制的网站确实是正常访问的。
我访问自己的网站,确实是可以访问的。和协议没啥关系

百度的确实不行,不知道为啥

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

有个疑问:这里的二级域名是"es6"呢?还是"es6.ruanyifeng.com"呢?

引用ww的发言:

突然想到一个问题,域名为什么写成baidu.com,为什么最初的设计者不把域名设计为com.baidu这样的格式?写成这样就很容易分辨顶级域名、一级域名、二级域名了。

因为一个域名最重要的属性是被用户记住,而不是方便解析,否则直接写ip了。
对于用户来说,只需要记住关键部分。比如阮一峰老师写了a和b两本书
a.ruanyifeng.com和b.ruanyifeng.com一眼就能看出区别

写成com.ruanyifeng.a和com.ruanyifeng.b 不仅区别不明显
浏览器做智能提示还得等你写一大堆大家都一样的顶级域名

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接