DNS原理、架构和配置详解

题目起得有点大,其实都是一些基础知识。工作、生活中经常被问到DNS的工作原理,这里把相关的知识点总结一下。DNS作为域名解析的规范,本身是相当简单的,但是因为我们日常工作中很难接触到,因此对其工作原理、架构和配置等就显得非常陌生。在分布式系统中,DNS更是扮演着重要的角色。名字空间和网域的划分都要依赖他。

一、我们日常网络活动能感受的域名解析服务

首先从我们日常生活中能看到的DNS模型说起,一般而言我们都知道DNS是做什么的:将容易记住的网址转换成网站的IP地址(网站,确切的说是提供web服务的主机的IP地址)。那么这一过程是如何发生的呢?下面的流程图给出了这一过程。偷点懒,图片没有自己画,都是在网络上面找来的(Google图片搜索-DNS查询)。

DNS查询示意图

 

图中给出了网络上的三台终端,其中左下角的是我们日常使用的电脑,右下角的是位于远端甚至国外的网站服务器,这里以debian.linuxsir.org网站为例,上方的是dns服务器。当我们在自己的电脑上面打开浏览器并键入网址:http://debian.linuxsir.org 时,浏览器和电脑自己是不知道该到网络上面的哪台服务器上去获取数据的,但是可以到远端的dns服务器上面去查询该网址所在WEB服务器的IP地址。那么浏览器又是怎么知道dns服务器的地址的呢,一般来说,网络提供商(电信、移动和联通等)在给我们架设宽带或者开通GPRS时会把我们的电脑连接到一个带有dhcp功能的网络中,我们的电脑、手机只要打开了dhcp客户端服务就可以获取到正确的IP地址,DNS服务器地址。这样浏览器就可以将域名发给dns服务器,dns服务器查询出相应的IP地址。返回给浏览器。然后浏览器再向具体的网站的IP地址发出HTTP请求。

如图:①表示电脑向DNS服务器查询http://debian.linuxsir.org 。②表示DNS服务器向电脑返回IP地址,在本例中,该IP地址为:211.93.98.20。③电脑向网站211.93.98.20(http://debian.linuxsir.org)发起http请求,并得到网页数据。最终网页内容呈现在浏览器上面。DNS查询通常使用的是UDP协议,http请求是走的是TCP协议。有时候我们如果知道某个网站的IP地址,那么可以直接在地址栏中键入该地址访问网站,而不必借助于DNS解析域名。这也是通常我们发现有一些网络工具,如QQ可以使用,而浏览器打不开网页的原因。

二、互联网中域名的组织结构

上面是我们首先能感受到的DNS的服务过程,网络上面的网址多得不计其数,如果整个互联网上的电脑都向一个DNS服务器请求域名解析,那么这个服务器肯定连崩溃都来不及。那么DNS是如何利用架构来解决这一问题的呢?这里就要来了解DNS的树状结构了:

树状域名服务器组织结构

上图中的每一个方框都是域名中的一个词段,国际组织对于每一个段,整个域名的长度,以及能支持的字符集都有明确的规定。但是现在好像有很多网络并没有严格遵守这一规范。

域名在拼装时,是沿着这棵树的最底下的叶子节点往树根上走的,如:www.sina.com.cn,其实该域名的完整写法应该是:www.sina.com.cn. 注意这最后的一个“.”,图中右边的黑体字给出了每一层的含义。

在这棵树上面,挂有互联网上面的所有域名。如果域名不在这棵树上面,那么网站就不能被互联网上面的终端访问。

每一个方框是一个词段,其实还可以把每一个方框看成是一个域名解析服务器。他负责了他所有子树的解析。

三、完整的域名查询过程

我们的电脑又是如何利用这棵“域名树”来作域名查询的呢?

这里假设一个设备需要访问这棵树进行域名解析,如:查询www.edu.cn.,那么他会首先将域名发给根域,根域名服务器会告诉查询者cn顶级域所在的服务器的地址,根域的回答可能是这样的“我这里没有你要的完整域名的地址,但是我可以告诉你cn这一层的域名在哪查询”。这样请求者虽然没有拿到最终的IP地址,但是也找到了下一个可以问的地方。于是他再次将www.edu.cn.完整的发给cn域的服务器,cn域服务器一看,自己也不能给出整个地址的IP地址,于是又告诉查询者到edu域去查询。以此类推,最终访问到了www这一层,终于如愿以偿地拿到了域名的IP地址。

如果每一个需要上网的终端都去向根域名服务器查询域名,那么这个访问量也是非常庞大的,似乎这棵树也没有解决问题。既然每一个人都要去做这个查询的过程,那么为什么不把这个繁重而又枯燥的过程交给一个固定的终端去做呢?

是的,我们的终端并不是去访问根域名服务器,而是去访问一个本地的另一台域名服务器。这台服务器专门做向“域名树”查询和记录的工作。由于有了一台专门的服务器,并且他是共享给很多终端使用的,那么就可以在其上面做一些必要的缓存,这样的服务器可以根据需要任意设置,不受地域网络状况的限制。这也就是前文中提到的网络服务提供商分配给我们的域名服务器地址。他会检查每一次查询,如果该查询已经有人查过了,那么他会从缓存中给出结果直接返回。那缓存的实效性是怎么控制的呢?协议中对这个有规定,由查询服务提供者在查询结果中给出域名地址的有效时间。如果过期了,则需要再次到服务器中去查询。这台专门用于查询域名的服务器接受网络上面的终端的查询,同时又向“域名树”查询,并对最终的客户负责,返回最终得到的IP地址,并将本次过程中查询到的所有结果、中间结果进行缓存,以便下一次查询同样的域名时访问。

下图给出了完整的浏览器到最终的网站的访问的全流程:

完整的域名查询过程

从上面的说明中,可以总结出以下几个概念:

1、客户端:互联网上提出域名查询请求的终端。
2、根域名服务器:在“域名树”的顶端,一次完整的域名查询请求的入口。
3、子域:域名树的上下层级关系,下级是上一级的子域。如:www.sina.com.cn. 是sina.com.cn. 的子域。
4、子域授权:上一级域名将子域的解析授予固定的服务器,这一过程为子域授权。
5、权威域名服务器:“域名树”中的每一级域名解析服务器都是权威域名服务器。这个概念是相对于本地域名解析服务器的。 当权威域名服务器能直接给出网址的IP地址时,可以直接充当本地域名解析服务器。
6、本地域名解析服务器:用于向网络客户端提供域名查询服务的域名服务器。该域名服务器接受网络客户端的查询,并向全球域名系统查询结果和缓存结果。
7、递归查询:客户端向本地域名解析服务器查询域名。
8、迭代查询:本地域名解析服务器向“域名树”通过多次查询得到正确的网址的地址。

具体的准确的解释可以参见维基词条:域名系统

四、多级域名配置如何实现

上面都是站在使用者的角度来说明域名的工作过程的,作为一个网站的开发者,我们需要做的是提供我们的网址的IP地址与域名对应关系。

一般而言,我们需要实现的位于“域名树”最下层或者最下的两层的域名的权威域名解析服务。从上面的查询过程可以看出,对于简单权威域名解析服务器,只会做两件事情:1、如果该域名在本服务器上面能查到最终的IP地址,那么直接回应IP地址的查询结果给客户;2、如果不能查询到最终的地址,那么返回下一级域名的域名解析服务器的地址给客户。

多级域名的配置也就比较清晰了。这里以my.domain 和blog.my.domain 为例说明上下级域名配置的过程:

用的是nsd来做的服务器。

主域名:my.domain 域名解析服务器172.16.128.80
子域名:blog.my.domain 域名解析服务器 172.16.128.96

主域名的conf文件和zonefile:
zone:
        name: "my.domain"
        zonefile: "/tools/dns/zonefiles/my.domain.zone"

zonefile:
@  IN  SOA  test. hostmaster.my.domain. (
                                        2003080800 ; sn = serial number
                                        172800     ; ref = refresh = 2d
                                        900        ; ret = update retry = 15m
                                        1209600    ; ex = expiry = 2w
                                        30         ; min = minimum = 1h
                                        )
                                        IN    A   100.100.0.176
blog      IN    NS  ns.blog
ns.blog   IN    A   172.16.128.96
www       IN    A   100.100.0.176

子域名服务器的配置:
zone:
        name: "blog.my.domain"
        zonefile: "/tools/dns/zonefiles/blog.my.domain.zone"

zonefile:
@  IN  SOA  test. hostmaster.blog.my.domain. (
                                        2003080800 ; sn = serial number
                                        172800     ; ref = refresh = 2d
                                        900        ; ret = update retry = 15m
                                        1209600    ; ex = expiry = 2w
                                        30         ; min = minimum = 1h
                                        )
                                IN    A   100.100.0.176
www                             IN    A   100.100.0.172

 

 

域名请求验证:

1、在主域名服务器上面查询www.my.domain

dig @172.16.128.80 www.my.domain

根据上面的主域名服务器的配置,www.my.domain直接解析出100.100.0.176这个地址,TTL值(允许缓存时间)为3600秒。下面的查询结果正确。

; <<>> DiG 9.5.0b2 <<>> @172.16.128.80 www.my.domain
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6301
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.my.domain.                 IN      A

;; ANSWER SECTION:
www.my.domain.          3600    IN      A       100.100.0.176

;; Query time: 6 msec
;; SERVER: 172.16.128.80#53(172.16.128.80)
;; WHEN: Sun Nov 20 19:19:37 2011
;; MSG SIZE  rcvd: 47
2、在子域名服务器上面查询:www.blog.my.domain, 

根据子域名服务器的配置,可以解析出该域名,对应的IP地址为100.100.0.172,下面是查询结果:

; <<>> DiG 9.5.0b2 <<>> @172.16.128.96 www.blog.my.domain
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14554
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.blog.my.domain.            IN      A

;; ANSWER SECTION:
www.blog.my.domain.     3600    IN      A       100.100.0.172

;; Query time: 5 msec
;; SERVER: 172.16.128.96#53(172.16.128.96)
;; WHEN: Sun Nov 20 19:20:05 2011
;; MSG SIZE  rcvd: 52
从这里也可以看出,最底层的权威域名服务器可以直接作为本地域名解析服务器。
3、到主域名服务器上面查询:www.blog.my.domain地址,由于主域名服务器已经将blog子域授权给字域名服务器,因此预期无法得到具体的网址的IP地址,但是能查询到子域名解析服务器的地址,查询结果符合预期:
; <<>> DiG 9.5.0b2 <<>> @172.16.128.80 www.blog.my.domain
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26575
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.blog.my.domain.            IN      A

;; AUTHORITY SECTION:
blog.my.domain.         3600    IN      NS      ns.blog.my.domain.

;; ADDITIONAL SECTION:
ns.blog.my.domain.      3600    IN      A       172.16.128.96

;; Query time: 5 msec
;; SERVER: 172.16.128.80#53(172.16.128.80)
;; WHEN: Sun Nov 20 19:20:26 2011
;; MSG SIZE  rcvd: 69

 

再来看一下我们在域名服务提供商那里申请域名的过程,其实申请过程就是将我们需要的域名注册到顶级域名服务器上面去,或者是二级域名服务器上面。如:我们向sina.com.cn申请一个二级域名:abc.sina.com.cn,也就是将这个子域注册到sina域名解析服务器上面去。由于域名服务器需要维护费用,因此域名不是免费的。申请域名一般需要一定的花费。

 

点赞