DNS 查询原理详解

千-赢-国-际-手-机-登-录-网-址 www.harvardbrian.org 作者: 阮一峰

日期: 2022年8月 2日

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

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

一、DNS 服务器

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

qy88千-赢-国-际-网-页-手-机-登-录输入域名,浏览器就会在后台,自动向 DNS 服务器发出请求,获取对应的 IP 地址。这就是 DNS 查询。

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

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

二、dig 命令

命令行工具 dig 可以跟 DNS 服务器互动,qy88千-赢-国-际-网-页-手-机-登-录就用它演示 DNS 查询。如果你还没有安装,可以搜一下安装方法,在 Linux 系统下是非常容易的。

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


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

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


$ dig @1.1.1.1 es6.www.harvardbrian.org

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

在其中找到 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)一级域名

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

(4)二级域名

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

四、域名的逐级查询

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

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

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

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

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

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

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

五、根域名服务器

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

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

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


$ dig @192.33.4.12 es6.www.harvardbrian.org

上面示例中,qy88千-赢-国-际-网-页-手-机-登-录选择192.33.4.12,向它发出查询,询问es6.www.harvardbrian.org的 TLD 服务器的 IP 地址。

dig 命令的输出结果如下。

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

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

六、TLD 服务器

有了 TLD 服务器的 IP 地址以后,qy88千-赢-国-际-网-页-手-机-登-录再选一台接着查询。


$ dig @192.41.162.30 es6.www.harvardbrian.org

上面示例中,192.41.162.30 是随便选的一台 .com 的 TLD 服务器,qy88千-赢-国-际-网-页-手-机-登-录向它询问 es6.www.harvardbrian.org 的 IP 地址。

返回结果如下。

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

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

七、一级域名的 DNS 服务器

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


$ dig @172.64.32.123 es6.www.harvardbrian.org

返回结果如下。

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

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

八、DNS 服务器的种类

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

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

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

8.1 递归 DNS 服务器

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

qy88千-赢-国-际-网-页-手-机-登-录平常说的 DNS 服务器,一般都是指递归 DNS 服务器。它把 DNS 查询自动化了,只要向它查询就可以了。

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

8.2 权威 DNS 服务器

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

"权威"的意思是域名的 IP 地址由它给定,不像递归服务器自己做不了主。qy88千-赢-国-际-网-页-手-机-登-录购买域名后,设置 DNS 服务器就是在设置该域名的权威服务器。

8.3 四种 DNS 服务器

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

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

它们的关系如下图。

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

九、参考网址

(完)

广告(购买广告位)

留言(21条)

干货

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

dig +trace es6.www.harvardbrian.org

@Hayashikawa:

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

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

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

1. 顶级域名就是一级域名,所以 www.harvardbrian.org 应该是二级域名
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

我要发表看法

«-必填

«-必填,不公开

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