DNS运行机制

全文参考《DNS与BIND》(第五版)

首先你要知道域名系统基本上是一个关于主机信息的数据库。

一、域命令空间

  DNS的分布式数据库通过域名来进行索引。每个域名本质上就是一棵大型逆向树的一条路径,而这棵逆向树又被称作域命名空间。这棵树的层次结构和UNIX文件系统的结构类似。这个棵树的顶端有唯一的根。对应UNIX文件系统中的根目录,在DNS中它被称为“root”。

1. 域名

  树中的任何一个节点的完整域名是从该节点到 root的路径上所有标签的顺序组合。域名的通常读法是∶从节点本身开始,沿着路径一直读到 root(向上读),并用点号".“来分隔路径上出现的各个标签。
  如果root节点的标签出现在一个节点的域名中,那么这个域名看上去就像以点号”.“结束,比如 “www.oreilly.com.”(事实上,它是以"."和一个空的标签结束的)。当root节点的标签单独出现时,为了方便,它被写成一个单独的”."。结尾带有".""的域名解释为绝对域名。绝对域名也被称作完全限定域名(fully qualified domain name),通常被简写为 FQDN,绝对域名和相对域名参看文件的绝对路径和相对路径。与文件系统一样,DNS要求同一父节点下的子节点,即兄弟节点要有不同的标签。

2. 域

  一个域(domain)就是域命名空间的一棵子树,一个域的名称也就是该域最顶端节点的域名。一个域可能会拥有多棵子树,这些子树被称为子域(subdomain)。判断一个域是否是另一个域的子域,最简单的方法是比较两个域的域名。一个子域的域名会以其父域的域名结尾。例如,域la.tyrell.com 一定是域 trell.com 的子域。这是因为 la.tyrell.com 以trell.com结尾。与此同时,域trell.com 又是域com的子域。 域也可以用级别来表示。在邮件列表和 Usenet
  在新闻组中,可能会不停地看到顶级域和二级域这些术语。这些术语直接地指出了一个域在域命名空间中的位置。

  • 顶级域是 root 的子域。
  • 一级域也是 root 的子域(一级域和顶级域是同一概念)。
  • 二级域是一级域的子域,依次类推。

3. 顶级域

  原始的顶级域将Internet域命名空间在组织层面上分成了7个域。分别是:com、edu、gov、mil、net、org、int。现在又新加入了很多顶级域,自行了解即可。

二、授权

  设计域名系统的一个主要目的就是分散管理,这是通过授权来实现的。对域的授权很像工作中对任务的派遣。管理者可以将一个大项目分解成更小的任务,然后将这些任务交给不同的员工负责。
  同样,管理域的组织可以将域进一步划分成子域。每个子域都可以被授权给其他组织来管理,这意味着这些被授权的组织得负责维护子域中所有的数据。他们可以自由地改变域中的数据,其至将子域进一步戈分成更多的子域,然后再授权给其他组织管理。父域仅仅保留指向子域数据来源的指针,这样父域便可将查询者引到该处。

三、名称服务器和区域

  存储域命名空间信息的程序被称作名称服务器 (nameserver)。 名称服务器通常只拥有域命名空间某一部分的完整信息,这一部分我们称作区域(zone),区域的内容是从文件或另一个名称服务器加载而来。 加载过后,这个名称服务器便可宣称对该区域具有权威(authority)一个名称服务器可以同时对多个区域具有权威。
  区域和域的区别很重要,但也很微妙。所有的顶级域以及许多二级域和更低级别的域,通过授权被划分成了更小更好管理的单元,这些单元被称作授权子域。

1. 授权子域

  简而言之,授权就是将一部分域的责任分派给另一个组织,而实际的工作就是将一部分域的权威分配给不同的名称服务器。
  将子域授权出去之后,该名称服务器将不再包含已被授权子域的信息,而是包含一些指针,这些指针指向那些已被授权子域的权威名称服务器。现在如果向该名称服务器询问子域中的数据, 那么它就能够回答正确的名称服务器列表。

2. 名称服务器的类型

  • primary master
    区域的primary master 服务器从本地的文件中读取区域数据。
  • secondary master(slave)
    区域的secondary master服务器从该区域的权威名称服务器上读取区域数据。
  • 一台主机可以同时是一个域的primary,也是另一个域的slave。

3. 区域数据文件

  primary master 名称服务器从本地主机中加载区域数据的文件被称为区域数据文件(zone datafile),也常常被称之为数据文件(datafile)。slave 名称服务器也可以从数据文件中加载区域数据。slave名称服务器通常被配置为,将从 master 名称服务器传输过来的区域数据备份到数据文件中。当 slave名称服务器死机或者重新启动时,它会先读取之前备份的数据文件,然后检查它的区域数据是否最新。这样做既避免了传送未更改的区域数据, 又在master 名称服务器宕机时提供了数据来源。
  数据文件中包含了描述区域的资源记录。资源记录描述了区域内所有的主机,并标记了子域的授权情况。BIND还允许使用特殊的指令来将其他数据文件引入到一个区域数据文件中,就像 C语言编程中使用的#include 语句。

四、解析

  名称服务器不仅能提供以自已为权威的区域的数据,还能在域命名空间中搜索找到不以自己为权威的区域的数据,这个过程被称为名称解析
  因为命名空间的结构如同一个倒置的树,所以名称服务器只需要知道一条信息就能找到树中的任一节点,这条信息就是 root 名称服务器的域名和地址。一个名称服务器可以向 root 名称服务器查询域命名空间中的任何域名,然后 root 名称服务器会以自己的方式代为解析域名

1. 解析服务器

解析器的功能:

  • 查询名称服务器
  • 解释响应信息(资源记录或者错误码)
  • 将信息返回给查询它的程序

  在 BIND中,解析器是连结到诸如 ssh和 ftp 等程序的一组库例程(library routine),它甚至不是一个独立的进程。解析器几乎完全依赖于名称服务器它收集查询命令,向名称服务器发送查询并等待应答,如果没有应答就再次发送查询,为查询寻找答案的大部分工作都是由名称服务器来完成的。 在 DNS 规范中把这种类型的解析器称作 stub 解析器(stub resolver)。

2. root名称服务器

  root名称服务器时全球网络的根服务器,它记录了每一个定居权威服务器的地址。理论通过它就可以找到全球任何一台主机,但是并不是所有的查询请求都会走到root服务器,不然他的负载也太大了,DNS的缓存机制可以帮助根服务器减轻负载。

3. 递归解析

  递归解析的流程是,解析器将请求发送给本地名称服务器,本地名称服务器将一步一步从上至下的发送请求,获取指引,直到得到最终的结果返回给解析器,可以参考下图的流程。
在这里插入图片描述

4. 迭代解析

  迭代解析过程中,名称服务器不会代其接续查询,只会返回指引或者结果,由查询者自己再决定向谁继续查询。

5. RTT

  我们知道一个区域的权威服务器不止一个,那么再收到递归查询的名称服务器是如何在区域上选择合适的权威服务器的呢?这就要提到RTT了(往返时间)。

  BIND 名称服务器使用一种称为往返时间(round trip time,RTT)的度量方式来对同一区域中的名称服务器进行选择。往返时间指的是远程名称服务器回应查询要求所花费的时间。每当 BIND 名称服务器向远程名称服务器发送查询请求时,内部的计时器就会被启动。当它收到响应时就停止计时,以此记录下远程名称服务器应答所花费的时间。当名称服务器必须从一组权威名称服务器中挑出一个进行查询时,它会直接选择往返时间最少的那一个。
  在 BIND 名称服务器查询某个名称服务器之前,它会随机设定一个该名称服务器的往返时间,当然该值比任何实际的往返时间都要小。这样做保证了 BIND 名称服务器在得到真实往返时间之前,会以随机的顺序查询某个特定区域里的所有权威名称服务器。 总的来看,这个简单但实用的算法让
  BIND 名称服务器能够迅速"锁定"最近的名称服务器,而又没有带外(out-of-band)机制测量性能所带来的开销。

6. 名称解析完整过程

在这里插入图片描述

7. 地址到名称的映射

  域名可以映射地址,那么地址该如何映射域名呢?
  其实在Internet中有一个in-addr.arpa域,这个域中的节点都是以数字来做标签的,并且采用点分字节来表示IP地址。
  由此可知,in-addr.arpa域中最多可以有256个子域,那每一个子域自己又可以划分256个子域,最终在第四级域中,与最后一个字节相关联的资源记录会提供该IP地址所对应的主机完整域名。
在这里插入图片描述

五、缓存

  对于习惯用主机表进行搜索的人来说,整个解析过程看起来似乎非常复杂和烦琐。然而实际上,它通常是相当快的,其中一个主要原因就是缓存机制。
  名称服务器在处理递归查询时可能需要发送多次查询才能找到答案。然而,在此过程中,它会发现许多与域命名空间有关的信息。每当它被指引到一组名称服务器时,它便能学习到这些名称服务器是哪些区域的权威,以及这些名称服务器的地址。在解析过程的最后,名称服务器最终找到了原先所要查询的数据,它可以将该数据存储起来,以备后用。BIND 名称服务器甚至实现了否定缓存如果某个权威名称服务器返回的结果是所查询的域名或数据类型不存在,则本地名称服务器也会将该信息暂时放入缓存中。
  名称服务器将所获得的数据放入缓存,是为了加快以后查询的速度。下次,当解析器询问本地名称服务器关干某个它户知的域名数据时,解析的过程将大幅统缩知。无论是肯定的还是否定的答案,名称服务器只要缓存了该答案,就可以直接将答案传给解析器。即使本地名称服务器没有缓存该答案,也应该会学到被查询域名所在区域的权威名称服务器的标识,然后直接向它查询。
  例如,假设名称服务器已经查询过 eecs.berkeley.edu 的地址。在查询过程中,它会把 eecs.berkeley.edu 以及 berkeleyedu 名称服务器的名称和地址(包括 eecs.berkeley.edu 的IP 地址)加入缓存。 现在如果某个解析器向该名称服务器询问 baobab.cs.berkeleyedu的地址,则该名称服务器将跳过查询 root 名称服务器这一步。该名称服务器认为 berkeley.edu 是它所知道的最接近baobab.cs.berkeley.edu 的祖先,于是便会直接询问 berkeleyedu 的名称服务器,如图 所示。另一方面,如果该名称服务器发现 eecs.berkeley.edu 的地址并不存在,那么当它下次再接收到该地址的查询请求时,便可直接根据缓存的信息做出恰当的回答。
在这里插入图片描述
  除了能加快解析速度,缓存机制还可以避免每当名称服务器自己无法回答时,就要询问 root 名称服务器的困扰。这意味着,我们不用总是依赖 root 名称服务器,而 root 名称服务器也不用总是被查询了,这样 root 名称服务器就减轻了负载。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值