DNS
什么是 DNS
DNS 即域名系统,全称是 Domain Name System。对于浏览器来说,DNS 的作用就是将主机名转换成 IP 地址。
DNS 是:
- 一个由分层的 DNS 服务器实现的分布式数据库
- 一个使得主机能够查询分布式数据库的应用层协议
DNS 的查询过程,说白了,就是去向这些 DNS 服务器询问,你知道这个主机名的 IP 是多少吗,不知道?那你知道去哪台 DNS 服务器上可以查到吗?直到查到我想要的 IP 为止。
DNS 服务器有 3 种类型:根 DNS 服务器、顶级域(Top-Level Domain, TLD)DNS 服务器和权威 DNS 服务器。它们的层次结构如下图所示:
DNS 缓存
- 本地DNS缓存
- DNS服务器缓存
DNS 缓存的原理非常简单,在一个 DNS 查询的过程中,当某一台 DNS 服务器接收到一个 DNS 应答(例如,包含某主机名到 IP 地址的映射)时,它就能够将映射缓存到本地,下次查询就可以直接用缓存里的内容。
本地 DNS 服务器
严格来说,本地 DNS 服务器并不属于 DNS 的层次结构,但它对 DNS 层次结构是至关重要的。那什么是本地 DNS 服务器呢?
DNS解析
在浏览器输入域名的时候,DNS是怎样解析的呢?分以下几步:
- 本地DNS缓存
- 浏览器会从自身的DNS缓存中去查找(chrome://net-internals/#dns),如果没有则进行下一步
- 本地计算机hosts文件
- 本地DNS服务器缓存
- 请求本地域名服务器,如果该服务器有缓存,则直接返回,若没有,则下一步。。。一般80%到这里就可以了(比如你申请一个域名,去阿里云,那么你肯定会写上域名所指向的IP啊)。
- DNS服务器递归迭代查找:
准备:
-
首先需要知道的是,根域名服务器和顶级域名服务器全世界大概有十几台,是最顶尖的了,大概知道就行。
-
其次,实际上我们的网址应该为 test.baidu.com . ,注意看后面有的 点 ,只不过浏览器为了方便用户都给省略了。
比如解析test.baidu.com. ,是具体怎么解析成IP地址的呢?可以形容为,从右向左
. -> .com -> baidu.com. -> test.baidu.com
(1)请求根域名服务器,带着 test.baidu.com. ,根域名服务器发现是 .com 结尾,然后告诉你,我只知道 com顶级域名服务器 的IP地址,你去问问它试试
(2)然后浏览器就向 com顶级域名服务器 请求,带着 test.baidu.com. ,com顶级域名服务器 只知道 baidu.com. 所在的服务器地址,并不知道 test. 是啥(因为test.这二级域名,只有百度自己知道啊,因为是百度自己设定的,就像crm.credit.cn,是不是只有公司才知道crm是个啥?)。。。所以 com顶级域名服务器 会告诉你,我只知道baidu.com. 所在的IP地址,你去问问它把(百度公司的web服务器)
(3)然后就向 "百度公司域名服务器" 请求,带着 test.baidu.com. ,百度公司自己肯定知道 test 是个啥,所以百度公司,就把最后真正的IP地址,返回给浏览器,到此,迭代查询完成了
思考:为什么需要迭代查询呢?
如果没有分层,那全世界所有的域名都交由根服务器管理?那不是很乱吗?
所以对域名进行分层次的架构,方便管理