DNS解析过程详解
转载
先说⼀下DNS的⼏个基本概念:
⼀.根域
就是所谓的“.”,其实我们的⽹址在配置当中应该是.(最后有⼀点),⼀般我们在浏览器⾥输⼊时会省略后
⾯的点,⽽这也已经成为了习惯。
根域服务器我们知道有13台,但是这是错误的观点。
根域服务器只是具有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了的技术,所以我们可以在全球设⽴这些IP的镜像站点,你
访问到的这个IP并不是唯⼀的那台主机。
具体的镜像分布可以参考。这些主机的内容都是⼀样的
⼆.域的划分
根域下来就是顶级域或者叫⼀级域,
有两种划分⽅式,⼀种互联⽹刚兴起时的按照⾏业性质划分的com.,net.等,⼀种是按国家划分的如cn.,jp.,等。
具体多少你可以⾃⼰去查,我们这⾥不关⼼。
每个域都会有域名服务器,也叫权威域名服务器。
就是⼀个顶级域名,⽽却不是顶级域名,他是在这个域⾥的⼀叫做www的主机。
⼀级域之后还有⼆级域,三级域,只要我买了⼀个顶级域,并且我搭建了⾃⼰BIND服务器(或者其他软件搭建的)注册到互联⽹中,那么
我就可以随意在前⾯多加⼏个域了(当然长度是有限制的)。
⽐如,在这个⽹址中,变成了⼀个⼆级域⽽不是⼀台主机,主机名是a。
三.域名服务器
能提供域名解析的服务器,上⾯的记录类型可以是A(address)记录,NS记录(namerver),MX(mail),CNAME等。
(详解参见博客:)
A记录是什么意思呢,就是记录⼀个IP地址和⼀个主机名字,⽐如我这个域名服务器所在的域,我们知道这是⼀个⼆级的域
名,然后我在⾥⾯有⼀条A记录,记录了主机为a的IP,查到了就返回给你了。
如果我现在要想这个域名服务器查询,那么这个顶级域名服务器就会发现你请求的这个⽹址在这
个域中,我这⾥记录了这个⼆级域的域名服务器的NS的IP。我返回给你这个地址你再去查主机为a的主机把。
这些域内的域名服务器都称为权威服务器,直接提供DNS查询服务。(这些服务器可不会做递归哦)
四.解析过程
那么我们的DNS是怎么解析⼀个域名的呢?
1.现在我有⼀台计算机,通过ISP接⼊了互联⽹,那么ISP就会给我分配⼀个DNS服务器,这个DNS服务器不是权威服务器,⽽是相当于⼀
个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。
2.现在的我计算机要向这台ISPDNS发起请求查询这个域名了,(经⽹友提醒:这⾥其实准确来说不是ISPDNS,⽽应该是⽤
户⾃⼰电脑⽹络设置⾥的DNS,并不⼀定是ISPDNS。⽐如也有可能你⼿⼯设置了8.8.8.8)
拿到请求后,先检查⼀下⾃⼰的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为⾮权威服务器
的应答。
4.如果缓存中没有的话,ISPDNS会从配置⽂件⾥⾯读取13个根域名服务器的地址(这些地址是不变的,直接在BIND的配置⽂件中),
5.然后像其中⼀台发起请求。
6.根服务器拿到这个请求后,知道他是com.这个顶级域名下的,所以就会返回com域中的NS记录,⼀般来说是13台主机名和IP。
7.然后ISPDNS向其中⼀台再次发起请求,com域的服务器发现你这请求是这个域的,我⼀查发现了这个域的NS,那我就返回给
你,你再去查。
(⽬前百度有4台的顶级域名服务器)。
不厌其烦的再次向这个域的权威服务器发起请求,收到之后,查了下有www的这台主机,就把这个IP返回给
你了,
9.然后ISPDNS拿到了之后,将其返回给了客户端,并且把这个保存在⾼速缓存中。
下⾯我们来⽤nslookup这个⼯具详细来说⼀下解析步骤:
从上图我们可以看到:
第⼀⾏Server是:DNS服务器的主机名--210.32.32.1
第⼆⾏Address是:它的IP地址--210.32.32.1#53
下⾯的Name是:解析的
Address是:解析出来的IP--112.121.162.168
但是也有像百度这样的DNS⽐较复杂的解析:
你会发现百度有⼀个cname=的别名。
这是怎么⼀个过程呢?
我们⽤dig⼯具来跟踪⼀下把(linux系统⾃带有)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------
Dig⼯具会在本地计算机做迭代,然后记录查询的过程。
第⼀步是向我这台机器的ISPDNS获取到根域服务区的13个IP和主机名[b-j]..。
第⼆步是向其中的⼀台根域服务器(Servername就是末⾏⼩括号⾥⾯的)发送的查询请求,他返回了com.顶级域的服务器
IP(未显⽰)和名称,
第三步,便向com.域的⼀台服务器192.33.4.12请求,,他返回了域的服务器IP(未显⽰)和名称,百度有四台顶
级域的服务器
【此处可以⽤dig@查看返回的百度顶级域名服务器IP地址】。
第四步呢,向百度的顶级域服务器(202.108.22.220)请求,他发现这个www有个别名,⽽不是⼀台主机,别名是
。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------
按照⼀般的逻辑,当dns请求到别名的时候,查询会终⽌,⽽是重新发起查询别名的请求,所以此处应该返回的是⽽已。
但是为什么返回的这个域的NS呢?
我们可以尝试下⾯的这个命令:dig+看看有什么结果。。。。。。。。
你会发现第三步时这个顶级域的域名服务器和这个域的域名服务器是同⼀台主机(即:)!
当我拿到的别名的时候,我本来需要重新到com域查找域的NS,但是因为这两个域在同⼀台
NS上,所以直接向本机发起了,
域发现请求的是属于这个域的,
于是就把的这个NS和IP返回,让我到这个域的域名服务器上查询。
于是我便从中⼀台拿到了⼀条A记录,最终的最终也便是的IP地址了.【此处也可以⽤dig+trace
】跟踪⼀下
⽤⼀个图来说明⼀下(图中第三步的全世界只有13台是错误的)
以下内容为在虚拟机中搭建localdns服务器得到的实验数据,纠正上述结论
在上⾯的分析中,我们⽤dig⼯具进⾏了追踪,但是dig没有继续追踪当我们从拿到cname和的IP之后的事情。
我们就所以然的下结论认为localdns会向请求。
其实这个想法是错误,在⾃⼰的本地搭建⼀个localdns,抓取整个解析过程中是所有包,看看就明⽩拉。
实际的结果是虽然返回了域的服务器地址和IP,
但是localdns并不是直接向上述返回的IP请求,⽽是再⼀次去请求com域,得到域的服务器(也就是
的那四台),
然后⼜请求,返回的域的服务器,最后才是去请求,
虽然上⾯已经返回了IP,但是实验的结果就是再⾛⼀遍域的查询。
上图就是localdns在解析的抓包全过程。蓝⾊那条就是在收到cname和响应的的域名服务器IP地址之后,继续
向com域请求。
这个图充分说明了返回cname的同时也返回了的IP。
因此总结⼀下便是
①本机向localdns请求
②localdns向根域请求,根域返回com.域的服务器IP
③向com.域请求,com.域返回域的服务器IP
④向请求,返回和域的服务器IP
⑤向root域请求
⑥向com.域请求
⑦向请求
⑧向域请求
⑨拿到的IP
⑩localdns返回本机以及的IP
本文发布于:2022-12-27 04:07:57,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/38007.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |