DNS原理

DNS全称Domain  Name Service:域名服务,它是用来将域名解析成ip地址的一种服务。

DNS的诞生

        我们知道,主机与主机之间的通信是靠ip来进行的,在互联网初期时,纯粹的使用ip来进行通信是没有问题的,但随着互联网发展越来越大,ip地址越来越多,这么多的ip地址,如果要想相互通信,那么必须要把他们的ip地址全部记下来才行。我们知道一个ip分为四段,每一段的数字不能超过256,所以说,基本上ip地址有很多相似的地方,容易记混淆。所以为了方便人们的记忆,干脆直接使用一段字符串来代替ip地址好了,人们只要在浏览器上面输入这段字符串就可以进行上网了。相比较数字而言,字符串更容易人们记忆。就像人的名字一样,你只需要记住这个人的姓名,不需要去记住这个人的***号码一样,这样就方便人们来记忆了。但是,大家再想一想,主机与主机之间的通信是靠ip地址来进行的,而我们常常在浏览器上面输入的并不是ip,而是一段字符串,那他们又是如何工作的呢?其实他们正是借助DNS服务来工作的,DNS服务可以将这段字符串来转换成相应的ip,这样当主机获得了目标主机的ip后,就可以进行通信了。由此,DNS服务就在这样的环境中诞生了。

而这段字符串就是主机名而已

 

什么是域?

域是一个范围,是一个抽象的事务,域主要有这些:

域分为根域、一级域、二级域...等等。

根域就是'.',不过根域我们可以不写,但是它是存在的哦。

注意:任何域名都是根域的子域,也就是说任何域名是从跟域开始的。记住,很重要的哦!

一级域:常见有.com,.org,.net,.edu,.cn等等

二级域:常见就是各大网站的了,例如.qq,.sina,.baidu等等

例如:以www.baidu.com,其实正确的写法应该是这样子的,www.baidu.com.后面的'.'就表示的是根域,只不过大多数情况下,我们省略了而已;.com就是一级域,或者叫做顶级域也行;.baidu就是敢说的二级域;那么www是什么呢?很多人通常认为www也是域名,其实这是一个错误的理解,www表示的其实是一台主机,这个主机位于.baidu.com.这个域内。因为通信肯定是主机与主机之间才可以相互通信的,一个主机怎么可能会与一个范围进行通信了。是吧,所以说www.baidu.com.其实就是一个主机的名字或者叫做FQDN(Full Qualified Domain Name, 完全限定域名),他不是域名。记住了,下次别搞错了。

 

名称解析的平台或者架构

dns作为一个名称解析服务,那么它到底是怎么进行解析的呢?

        dns是一种服务,这种服务的完成需要在某个平台上面来实现的,这个平台或者架构就是nsswitch,nsswitch就是实现名称解析的一个平台,其实名称解析有多个,并不一定指的就是域名到ip的解析,Username到User_ID也是一种解析,这些解析所依赖的平台就是nsswitch。对于DNS来说,dns在nsswitch上完成解析时,还需要调用两个函数库文件,分别是libnsswitchdns和libnsswitchfile文件。这样才DNS才可以发挥作用,那么DNS是如何将一个主机域名解析成一个ip的呢?这就需要DNS的数据库文件了,这个数据库文件里面的就包含了域名和ip的映射关系,DNS在解析时,会出查找这个文件中该域名所对应的ip,然后再将ip返回给客户端,这样就完成解析了。

说明:关于DNS数据库文件后续将会详解。这里只是略微介绍一下。

 

DNS的解析原理

www.xsl.com访问www.baidu.com为例,来讲述DNS工作原理

linux学习之路之DNS原理详解_DNS原理   迭代查询 &n

1、当www.xsl.com这台主机要想访问www.baidu.com这个主机时,这台主机首先会在本地缓存中查找

       是否是否有该主机名的映射关系,如果有,则直接返回给客户端;如果没有,则进行第2步。

2、查找/etc/hosts文件,如果这个文件里面有,则直接将这个主机名所对应的ip返回给客户端;如果没

        有 则进行第三步。

3、将域名请求发给本地域名服务器,这个服务器就是/etc/resove.conf中定义的服务器地址。在window

      上面就是TCP/IP协议栈中设定的地址就是本地DNS服务器。本地DNS服务器首先会在数据库文件

      中查找是否有该主机名的映射关系;如果有则直接返回给客户端;如果没有,就会将该请求发给根

      域。对于下级子域来说,它们是不知道上级域的,但是上级域是知道下级域的。这点很重要,并且

      对于所有的服务器来说,它们都知道根域在哪里(需要要配置的哦),这样当本地的服务器解析不

      了的话,就会去找根域去解析,根域一看,就说www.baidu.com是由.com这个域来来负责管理的,

       在这里,可能会发生种查询请求:

                    一是根域直接将这个请求发给.com这个域的DNS服务器,然后.com这个域的DNS服务器一看,发现www.baidu.com是由.baidu这个域来管理的,因此就将该请求直接发给.baidu这个域的DNS服务器,.baidu这个域的DNS服务器一看,www这台主机确实有,然后再将该主机所对应的ip返回给.com域的DNS服务器,.com域的DNS服务器在返回给根域DNS服务器,根域DNS服务器在返回给本地DNS服务器,最后在返回给客户端。

                    另一种查询是根域直接将.com内的DNS服务器IP地址返回给本地DNS服务器,本地DNS服务器然后再将该请求发给.com域的DNS服务器,.com域内的DNS服务器然后再去查询,发现www.baidu.com是有.baidu这个域来负责的,因此将.baidu这个域内的DNS服务器ip地址发给本地DNS服务器,本地DNS服务器收到该ip后,会将该请求直接发给.baidu域内的DNS服务器,.baidu域内的DNS服务器一看,www这台数据确实是是由我来解析的,因此查询后将www.baidu.com这个主机的ip地址就返回给本地DNS服务器,本地DNS服务就返回给客户端。这样就完成了这个解析过程。

                    上面的第一种查询,本地DNS服务器只需要发出一次请求就可以获得该主机所对应的ip,这种查询方式叫做递归查询。

                    上面的第二章查询,本地DNS服务器需要发出多种请求才可以获得该主句所对应的ip,而这种查询方式叫做迭代查询。

                     一般说来,根域内的DNS服务器是不会进行递归查询的,原因是每天上网的人那么多,如果都要根域来完成解析的话,那么根域DNS服务器岂不累死。

                    一般说来,客户端进行递归查询,本地DNS服务器进行迭代查询,对于外部客户端来说,只允许进行递归查询,不允许进行迭代查询。

                    这里的DNS服务器就是某个域内的DNS服务器,我们说过域是一个范围,而DNS服务器就是这个范围内的负责人,所有发往这个域内的请求都是有这个DNS服务器来完成的。这样懂了吧!

                    由于常常在DNS解析完成后会出现权威答案和不权威答案,那么什么是权威答案,怎么是不权威答案呢 ?

                    所谓权威答案就是要解析的这个主机名是有这个域内的DNS服务器直接返回的,自己域内的DNS在本地数据库中查询的结果当然是权威的啦。例如刚刚说过的www.baidu.com,如果.baidu这个域的DNS服务器为ns.baidu.com的话,那么第一次发起的请求如果是由ns.baidu.com来负责解析的话,那么返回的答案就是权威答案。

                    不权威答案就是请求的这个主机名并不是由这个主机名所在的DNS服务器直接返回的答案,而是由其他DNS服务器来返回的。例如www.xsl.com中的本地DNS服务器为ns.xsl.com,由于之前已经解析过www.baidu.com,所以本地DNS服务器ns.xsl.com很可能缓存了www.baidu.com的映射关系,所以当下次发起www.baidu.com域名解析时,由于本地缓存含有该映射关系,因此本地DNS服务器ns.xsl.com会将之前缓存的结果直接返回给客户端。这样返回的答案就是不权威答案。所以有时候权威答案不一定正确。而且缓存也有缓存时间的。

 

 DNS服务器类型

试想一下,如果某个域内,只有一台DNS服务器,那么当这台DNS服务器出现宕机时,那么这个域内的所有客户都无法上网了,所以一般建议在某个域内可以部署多个DNS服务器。如果部署多个DNS服务器,那么问题又来了?那么客户发送的DNS请求服务,到底由谁哪个DNS服务器来解析呢?因此,为了便于管理整个域内的DNS服务请求,一般会在该域内指定一台为主DNS服务器,其他的为辅助DNS服务器。

主DNS服务器:负责解析发送的DNS服务请求

那么辅助DNS服务器的作用是干什么的呢?

            有人会说就是当主DNS服务器挂掉后,充当主DNS服务器的角色开负责域名解析的任务。其实当主DNS服务器挂掉后,辅助DNS服务器是不会工作的,因此它也不会来响应DNS服务请求的。一般在某个域内架设辅助DNS服务器是用来实现DNS负载均衡的,来减轻每个DNS服务器的压力。这样一来,辅助DNS服务器上面的数据库也要和主DNS服务器上面的数据库一样才行,否则,会出现解析不一致的现象。一般的,我们只能在主DNS服务器上面修改数据,辅助DNS服务器是不能修改数据的。

那么辅助DNS的服务器到底该如何建立的呢?有两种方式:

            一是:直接将主DNS服务器上面的数据库完全复制给辅助DNS服务器,一般用作刚建立辅助DNS服务器的时候。而这种传送方式叫做完全区域传送(axfr)

            二是:将部分数据直接复制给辅助DNS服务器,一般该辅助DNS服务器存有数据库文件,而可能主DNS服务器上面的数据更新完毕后,辅助DNS服务器的数据库还不是最新的。因此,需要将部分数据复制给辅助DNS服务器。这种传送方式叫做增量区域传送(ixfr)

因此,辅助DNS服务器想要更新自己的数据库文件,必须向主DNS服务器发起数据同步请求。在同步请求过程中,涉及到的字段有:

             serial number:服务器的版本号或者序列号,辅助DNS服务器就是靠序列号是否和主DNS服务器序列号一致来分析主DNS服务器的数据库是否更新;主DNS更新数据库后,序列号会发生改变

             refresh:辅助DNS服务器请求周期

             retry:请求失败后,辅助DNS服务器等待多长时间后重新发起请求,该时间一定小于refresh

             expire:请求的最长时间,该时间过后,就认为主DNS服务器挂了

            nagative  answer TTL:否定缓存回答时长,主DNS服务器挂了之后,可能会将否定回答的信息

                                                    缓存下来,这里只是设置否定缓存的时间是多少。

在这里说明一下,辅助DNS服务器如果在刚发送完请求后,也已经响应,过一会,主DNS服务器的数据库更新了,此时主DNS服务器和辅助DNS服务器的数据库不一致,这样会造成解析不正确。因此,为了防止这种错误,一旦主DNS服务器数据库更新,立马将更新的数据传输给复制DNS服务器。传送的方式就是刚刚说的两种。而这些过程就是DNS的主从复制。

总结:

主DNS服务器:提供域名解析服务

辅助DNS服务器:请求数据同步,向主DNS服务器发送请求。

缓存DNS服务器 :不提供任何权威答案,只是将之前缓存下来的信息保存下来,下次请求时,直接返

                                 回,这样可以节省带宽。

 转发器:不缓存,只将请求转发给某个DNS服务器。