DNS解析过程

1. 根域

就是所谓的“.”,其实任何网址(比如www.baidu.com)的完整形式最后都有一个点,即www.baidu.com.。一般我们在浏览器里输入时会省略后面的点,而这也已经成为了习惯。
域名是分级的,域名解析也是分级的,当本地DNS服务器没有存储我们要查找域名的IP地址时,之后解析的第一步就是向根域名(.)DNS服务器发出域名解析请求。
那根域名DNS服务器到底有哪些呢?我们可以输入dig命令查找根域名服务器信息:

 $ dig

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22847
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       194909  IN      NS      g.root-servers.net.
.                       194909  IN      NS      b.root-servers.net.
.                       194909  IN      NS      d.root-servers.net.
.                       194909  IN      NS      f.root-servers.net.
.                       194909  IN      NS      j.root-servers.net.
.                       194909  IN      NS      h.root-servers.net.
.                       194909  IN      NS      l.root-servers.net.
.                       194909  IN      NS      e.root-servers.net.
.                       194909  IN      NS      i.root-servers.net.
.                       194909  IN      NS      k.root-servers.net.
.                       194909  IN      NS      a.root-servers.net.
.                       194909  IN      NS      m.root-servers.net.
.                       194909  IN      NS      c.root-servers.net.

;; Query time: 69 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Mon May 23 20:26:02 EDT 2016
;; MSG SIZE  rcvd: 239

从中可以得知根域名服务器共用13个DNS服务器(a-m.root-servers.net.),这些根DNS服务器的IP地址存储在每一个DNS服务器的磁盘中。比如向本地DNS服务器发送查询www.baidu.com的IP地址的查询请求时,当本地DNS服务器发现它没有存储该域名的信息时,就会向这其中任意一个顶级域名的DNS服务器的发送查询请求,该服务器会返回它下一级域名即com域的DNS服务器的域名和IP地址,依次类推,最终获得baidu.com域的DNS服务器的IP地址,而该DNS服务器存储了它所在域所有主机的IP地址,而www.baidu.com就是处于域baidu.com且主机名叫wwww的一台机器,所以这时只需要向该域名服务器发送查询请求就可以了。
注意:根域服务器的IP地址我们知道有13个,但不代表全球只有13台根域名服务器。因为这些IP地址借助了任播的技术,所以我们可以在全球设立这些IP的镜像站点,你访问到的这个IP并不是唯一的那台主机。
具体的镜像分布可以参考维基百科,这些主机的内容都是一样的。
从上面我们知道:每个DNS服务器都需要知道顶级域名DNS服务器的IP地址,当你需要架设DNS服务器时,一定要在本地存储它们的IP地址。存储这些信息的最新文件位于:ftp://ftp.internic.net/domain/named.root

2. 域名服务器存储的的资源记录

域名服务器的主要作用就是存储了从属于该域名(比如baidu.com.)的主机名(比如www ftp)和其IP地址的对应信息。这种记录类型叫A类型。如果它对应的域名下面还有更底层的域名,比如com.下面的baidu.com.,那么它就需要存储它下级域名的域名服务器的IP地址。这种记录类型叫NS类型。当然域名服务器存储的信息不止这些。感兴趣可以查看http://blog.csdn.net/crazw/article/details/8986581

3. 域名查询跟踪

下面结合dig命令再详细讲述当我在浏览器输入www.baidu.com这个域名时,究竟是如何查到它的IP地址的:
(1)现在我有一台计算机,该主机所在局域网有自己的DNS服务器,那么需要在/etc/resolv.conf写明该域名DNS服务器的IP地址。之后应用程序调用gethostbyname查询域名对应的IP地址时,解析程序会先读取/etc/resolv.conf获得本地DNS服务器的IP地址,然后向该服务器查询是否有该域名的IP地址,如果有直接返回,如果没有,该服务器就读取顶级域名DNS服务器的IP地址,然后向该服务器发送查询请求。主要我所在的局域网么有假设DNS服务器,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。现在假设我所在的局域网没有架设DNS服务器:
(2)现在的我计算机要向这台ISPDNS发起请求查询www.baidu.com这个域名了,(经网友提醒:这里其实准确来说不是ISPDNS,而应该是用户自己电脑网络设置里的DNS,并不一定是ISPDNS。比如也有可能你手工设置了8.8.8.8)
(3)ISPDNS拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为非权威服务器的应答。
(4)如果缓存中没有的话,ISPDNS会从配置文件里面读取13个根域名服务器的地址(这些地址是不变的,直接在BIND的配置文件中)
(5)然后像其中一台发起请求。
(6)根服务器拿到这个请求后,知道他是com.这个顶级域名下的,所以就会返回com域中的NS记录,一般来说是13台主机名和IP。
(7)然后ISPDNS向其中一台再次发起请求,com域的服务器发现你这请求是baidu.com这个域的,我一查发现了这个域的NS,那我就返回给你,你再去查。
(目前百度有4台baidu.com的顶级域名服务器)。
(8)ISPDNS不厌其烦的再次向baidu.com这个域的权威服务器发起请求,baidu.com收到之后,查了下有www的这台主机,就把这个IP返回给你了,
(9)然后ISPDNS拿到了之后,将其返回给了客户端,并且把这个保存在高速缓存中。
运行dig命令可以对dns查询进行跟踪。比如下面命令是跟踪如何查询www.baidu.com的IP的
运行命令dig www.baidu.com +trace

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> www.baidu.com +trace
;; global options: +cmd
;第一步是向我这台机器的ISPDNS获取到根域服务区的13个IP
.                       10103   IN      NS      i.root-servers.net.
.                       10103   IN      NS      j.root-servers.net.
.                       10103   IN      NS      m.root-servers.net.
.                       10103   IN      NS      b.root-servers.net.
.                       10103   IN      NS      l.root-servers.net.
.                       10103   IN      NS      f.root-servers.net.
.                       10103   IN      NS      h.root-servers.net.
.                       10103   IN      NS      d.root-servers.net.
.                       10103   IN      NS      g.root-servers.net.
.                       10103   IN      NS      a.root-servers.net.
.                       10103   IN      NS      c.root-servers.net.
.                       10103   IN      NS      k.root-servers.net.
.                       10103   IN      NS      e.root-servers.net.

;; Received 397 bytes from 192.168.1.1#53(192.168.1.1) in 192 ms
;第二步是向其中的一台根域服务器(这里为f.root-servers.net)发送www.baidu.com的查询请求,他返回了com.顶级域的服务器IP(未显示)和名称
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.

;; Received 737 bytes from 192.5.5.241#53(f.root-servers.net) in 465 ms
;第三步,便向com.域的一台DNS服务器(这里为h.gtld-servers.net)请求www.baidu.com,他返回了baidu.com域的服务器IP(未显示)和名称,从下面可知百度有四台二级域的DNS服务器
baidu.com.              172800  IN      NS      dns.baidu.com.
baidu.com.              172800  IN      NS      ns2.baidu.com.
baidu.com.              172800  IN      NS      ns3.baidu.com.
baidu.com.              172800  IN      NS      ns4.baidu.com.
baidu.com.              172800  IN      NS      ns7.baidu.com.

;; Received 697 bytes from 192.54.112.30#53(h.gtld-servers.net) in 350 ms
;第四步呢,向百度的二级域名服务器(ns7.baidu.com)请求www.baidu.com,发现这个www有个别名(见CNAME类型记录),而不是一台主机,别名是www.a.shifen.com。
www.baidu.com.          1200    IN      CNAME   www.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns4.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns5.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns1.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns2.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns3.a.shifen.com.
;; Received 239 bytes from 119.75.219.82#53(ns7.baidu.com) in 187 ms

而别名www.a.shifen.com所在的域名为a.shifen.com.,它所在的DNS服务器应该存储了www.a.shifen.com(即www.baidu.com)的IP地址。
这里我们再次用dig命令向a.shifen.com域的一台域名服务器ns4.a.shifen.com.发送域名查询请求。

 dig www.a.shifen.com. @ns2.a.shifen.com.

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> www.a.shifen.com. @ns2.a.shifen.com.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50936
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 5, ADDITIONAL: 5
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.a.shifen.com.              IN      A

;获取了www.baidu.com的IP地址
;; ANSWER SECTION:
www.a.shifen.com.       300     IN      A       112.80.248.74
www.a.shifen.com.       300     IN      A       112.80.248.73

;; AUTHORITY SECTION:
a.shifen.com.           1200    IN      NS      ns2.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns3.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns4.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns5.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns1.a.shifen.com.

;; ADDITIONAL SECTION:
ns1.a.shifen.com.       600     IN      A       61.135.165.224
ns2.a.shifen.com.       600     IN      A       180.149.133.241
ns3.a.shifen.com.       600     IN      A       61.135.162.215
ns4.a.shifen.com.       600     IN      A       115.239.210.176
ns5.a.shifen.com.       600     IN      A       119.75.222.17

;; Query time: 48 msec
;; SERVER: 180.149.133.241#53(180.149.133.241)
;; WHEN: Mon May 23 22:14:35 EDT 2016
;; MSG SIZE  rcvd: 236

其中

;; ANSWER SECTION:
www.a.shifen.com.       300     IN      A       112.80.248.74
www.a.shifen.com.       300     IN      A       112.80.248.73

就是获取的www.baidu.com的IP地址
至于如何从上述DNS跟踪的第四部获取最终www.baidu.com的IP地址可以参考DNS解析过程详解

4. 参考

[1]DNS解析过程详解
[2]DNS基础及使用BIND搭建域名服务器
[3]根域名服务器IP地址文件
[4]linux命令行学习-dig(DNS查询器)
[5]Named服务配置
架设DNS服务器的时候可以参考[5],写得不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值