我们先来了解一下DNS的一些基本概念:
1. 根区
就是所谓的“。”,其实我们的URL应该配置成.(末尾带个点),一般我们在浏览器中输入的时候都会省略末尾的点,这已经成为习惯了。
我们知道根域服务器有13个,但是这是一个错误的观点。
根域服务器只有13个IP地址,但是机器数量却不只有13台,因为这些IP地址使用了技术,所以我们可以在世界各地建立这些IP的镜像站点,你访问的IP并不是唯一的主机。
详细的镜像分布可以参考,这些主机的内容都是一样的。
2. 领域划分
根域名下面是顶级域名或一级域名。
分类方式有两种,一种是按照互联网刚出现时的行业性质来划分,比如com.,net.等;另一种是按照国家来划分,比如cn.,jp.等。
您可以自己查看具体金额,我们不关心。
每个域都有一个域名服务器,也叫权威域名服务器。
是顶级域名,但不是顶级域名,是这个域名下有一个名为www的主机。
一级域名之后还有二级域名和三级域名,只要我购买一个顶级域名并搭建自己的BIND服务器(或者其他软件)在网上注册,就可以在它前面添加任意多个域名(当然长度是有限制的)。
例如,此 URL 中的 a. 将成为二级域而不是主机,主机名为 a。
3.域名服务器
能够提供域名解析的服务器,以上记录类型可以是A()记录、NS记录(名称)、MX(邮件)、CNAME等。
(详细解释请参考博客:域名解析中A记录、CNAME记录、MX记录、NS记录的区别和联系)
A记录是什么意思呢?它记录了一个IP地址和一个主机名。比如我的域名服务器所在的域名,我们知道这是一个二级域名,那么我里面就有一个A记录,里面记录了主机a的IP地址。一旦找到它,就会返回给你。
如果我现在要查询这个域名服务器,那么顶级域名服务器就会发现你请求的URL是在这个域内的,而这个二级域的域名服务器的NS IP我都记录下来了,我把这个地址返回给你,你就可以用主机a去查主机了。
这些域中的域名服务器称为权威服务器,它们直接提供 DNS 查询服务。(这些服务器不做递归)
4. 分析过程
那么我们的DNS是如何解析域名的呢?
1、现在我有一台电脑,通过ISP上网,那么ISP会给我分配一个DNS服务器,这个DNS服务器并不是权威服务器,而是相当于一个代理DNS解析服务器,它会帮你迭代权威服务器返回的响应,然后把最终的IP返回给你。
2.现在我的电脑就会向这台电脑发送请求,查询这个域名。
3.收到请求后,首先检查你的缓存中是否有这个地址,如果有,则直接返回。此时获取到的IP地址会被标记为非权威服务器的响应。
4、如果该地址不在缓存中,就会从配置文件中读取13个根域名服务器的地址(这些地址是不变的,直接在BIND配置文件中)。
5.然后向其中一个人提出请求。
6.根服务器收到这个请求之后,知道自己在顶级域名com.下,所以会返回com域中的NS记录,一般是13位主机名和IP地址。
7.然后重新给其中一个发请求,com域的服务器发现你的请求是这个域的,我查了一下,找到这个域的NS,然后就返回给你,你再查一下就可以了。
(目前百度有4个顶级域名服务器)。
8.再向这个域名的权威服务器发出一个请求,收到之后用www查主机,然后返回IP给你。
9.获取到之后返回给客户端,并且保存到缓存中。
我们来用这个工具详细讲解一下解析步骤:
从上图我们可以看出:
第一行是:DNS服务器主机名-210.32.32.1
第二行是:它的 IP 地址 - 210.32.32.1#53
以下名称为:解析后的 URL--
是:解析的IP是112.121.162.168
但也有更复杂的DNS解析,如百度:
你会发现百度有一个cname=的别名。
这个过程是怎样的?
让我们使用 dig 工具来跟踪它(它是 Linux 系统自带的)
————————————————————————————————————————————————————————
Dig工具会在本地计算机进行迭代,并记录查询过程。
第一步从我的机器上获取根域服务区内的13个IP和主机名[bj]。
第二步,向其中一个根域服务器(最后一行括号中的服务器)发送查询请求,该服务器返回 com. 顶级域的服务器 IP(未显示)和名称。
第三步,请求com.域中的服务器,192.33.4.12。它返回域的服务器IP(未显示)和名称。百度有四个顶级域服务器。
【这里可以使用dig@192.33.4.12查看返回的百度顶级域名服务器IP地址】
第四步,请求百度的顶级域名服务器(202.108.22.220)。他发现这个www有一个别名,而不是主机。别名就是。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
按照一般的逻辑,当DNS请求一个别名的时候,查询就会终止,并发起一个新的查询该别名的请求,所以这里应该返回的是。
但是为什么返回的是这个域名的NS呢?
我们可以尝试以下命令:dig +trace看看结果是什么。。。。。。。。
你会发现在第三步,这个顶级域名的域名服务器和本域的域名服务器是同一个主机(即:)!
当我拿到别名之后,需要再到com域中搜索该域的NS,但是因为两个域在同一个NS上,所以我直接发送到本地机器。
域发现请求属于此域。
所以它返回NS和IP,允许我查询该域的域名服务器。
于是我从 ns X 获得了一条 A 记录。最终结果就是 IP 地址。[您也可以在这里使用 dig +trace] 来跟踪它
我用一张图来解释一下(图中第三步显示全世界只有13个,这是错的)
以下内容是在虚拟机中搭建本地dns服务器得到的实验数据,修正以上结论
在上面的分析中,我们使用了dig工具进行追踪,但是在我们拿到cname和IP之后dig并没有继续追踪发生了什么。
我们得出结论,本地 DNS 将发出请求。
其实这个想法是错误的,你可以在本地搭建一个本地DNS,把整个解析过程的数据包全部抓取下来,看一看就明白了。
实际结果是,虽然返回了域名的服务器地址和IP,
但是本地DNS并不直接请求上面返回的IP,而是再次请求com域,获取该域的服务器(也就是那四台服务器)。
然后再次请求,返回域服务器,最后再次请求,
虽然上面已经返回了IP,但是实验的结果还是需要再次查询域名。
上图是解析过程中抓包的整个过程,蓝线是收到响应的cname和域名服务器IP地址后,继续请求com域名。
这个图充分说明了IP和cname同时返回。
总结一下,
①本机请求本地dns
②本地DNS请求根域,根域返回com.域的服务器IP
③ 向com.发出请求,com.返回该域名的服务器IP
④ 返回请求的cname和的服务器IP
⑤向根域的请求
⑥ 向com.域的请求
⑦请求
⑧ 向域发出请求
⑨ 获取IP
⑩返回本地的cname和IP
扫一扫在手机端查看
-
Tags : shifen
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。