计算机网络-6-2-域名系统DNS

域名系统DNS

域名系统概述

域名系统DNS(Domain Name System)是互联网使用的命名系统,用来把便于人们使用的机器名字转化为IP地址,域名系统就是名字系统。
很多应用层的软件经常直接使用DNS。计算机用户只是间接而不是直接使用域名系统。DNS为互联网的各种网络提供了核心服务。

用户和主机通信的时候,通常是很难记住IP地址,但应用层为了便于用户记住各种网络应用,连接在互联网上的主机不仅有IP地址,还有便于记忆的主机名字。域名系统就是把互联网上的主机名字转化为IP地址

为什么主机在IP数据报的时候要使用IP地址而不是域名呢?这是因为IP地址的长度是固定的32位(IPV6是固定的128位),
而域名的长度并不是固定的,及其处理起来比较困难。

从理论上来讲,整个互联网可以只使用一个域名服务器,使它装入互联网上的所有主机名,并回答所有对IP地址的查询,但是这种做法简直太愚蠢,这样的域名服务器肯定会因为过负荷工作而无法正常工作,而且一旦这个域名服务器出现故障,
整个互联网就会瘫痪。因此早在1983年就开始采用层次树状结构的命名方法,并使用分布式的域名系统DNS。DNS互联网标准是RFC[1034],RFC[1035]。

互联网的DNS被设计为成为一个联机分布式数据库系统,并采用客户服务器方式。DNS使大多数名字都在本地进行解析(resolve),仅有少量解析在互联网上通信,因此DNS系统的效率很高,由于DNS是分布式系统,即使是单个计算机出现了故障,也不会妨碍整个DNS系统的正常运行。

域名到IP地址的解析过程是由分布式在互联网上的许多域名服务程序(域名服务器)共同完成的。域名服务程序在专设的结点上运行,而人们也常把运行域名服务器程序的机器称为域名服务器

域名到IP地址解析过程的要点如下:

当某一个应用进程需要把主机名解析为IP地址时,该应用进程就调用解析程序(resolver),并成为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据包方式发给本地域名服务器(使用UDP的好处是减少开销)。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用进程获取到目标主机的IP地址就可以进行通信。

若本地域名服务器不能回答该请求,则该域名服务器就暂时成为DNS中的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。至于查找过程,我们进一步讨论。

互联网的域名结构

早期的互联网使用了非等级的名字空间,其优点是名字简短。但当互联网上的用户数急剧增加时,用非等级的名字空间来管理一个很大的而且是经常变化的名字集合是非常困难的。因此,互联网后来就采用了层次树状结构的命名方法,就像全球邮政系统和电话系统那样。采用这种命名方法,任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。这里,“域”(domain)是名字空间中一个可被管理的划分。域还可以划分为子域,而子域还可继续划分为子域的子域,这样就形成了顶级域、二级域、三级域,等等。

从语法上讲,每一个域名都是由标号(label)序列组成,各标号之间使用.隔离开,例如:
image
就是中央电视台用于收发电子邮件的计算机(即邮件服务器)的域名,它由三个标号组成,其中标号com是顶级域名,标号cctv是二级域名,标号mail是三级域名。

一级域名又称顶级域名。从右往左依次增大。

DNS规定,域名中的符号,都是由英文字母和数字组成,每一个标号不能超过63个字符(为了记忆方便,不能超过12个字符)也不区分大小写(例如cctv和CCTY在域名中是等效的)。
标点符号只能使用英文.号。级别最低的域名写左边,级别最高的域名写右边,由多个标号组成的完整域名不超过255个字符。DNS既不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思。各级域名由上一级的域名管理机构管理,最高级的顶级域名则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是惟一的,并且也容易设计出一种查找域名的机制。

需要注意的是,域名只是个逻辑概念并不能代表计算机所在的物理地点,变长的域名和使用有助记忆的字符串,是为了便于人使用。而 IP 地址是定长的 32 位二进制数字则非常便于机器进行处理。这里需要注意,域名中的“点”和点分十进制 IP 地址中的“点”并无一一对应的关系。点分十进制 IP 地址中一定是包含三个“点”,但每一个域名中“点”的数目不一定刚好是3个。除此之外,互联网的名字空间是按照机构的组织来划分的,与物理的网络无关。

顶级域名共有三大类:

  • 国家顶级域名:cc(country code)国家代码。
  • 通用顶级域名
  • 基础结构域名:arpa(用于反向域名解析),又称之为反向域名

域名服务器

一个服务器所负责管辖的范围叫做区(zone)。各单位根据具体情况来划分自己管辖的范围的区。但在区中的所有节点都必须是能够连通的。每一个区设置相应的权限域名服务器(authoritative name server),用来保存该区中的所有主机的域名到IP地址的映射。总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。“区”是DNS服务器实际管辖的范围。

根据域名服务器的作用,可以把域名服务器划分为以下四种不同的类型:

  1. 根域名服务器(root name server):根域名服务器是最高层次的域名服务器,也是最重要的域名服务器,因为不管是哪一个本地域名服务器,若要对互联网上的任何一个域名进行解析(即转化为IP地址),只要自己无法解析,就首先要求助于根域名服务器,假如所有的根域名服务器都瘫痪了,那么整个互联网的DNS就瘫痪了。注意,根域名服务器采用的是 任播(anycast) 技术,因此当DNS客户向某个根域名服务器的IP地址发出查询报文的时候,互联网上得路由器就能找到离这个DNS客户最近的一个根域名服务器。这样做不仅加快了DNS的查询过程,也更加合理的利用了互联网的资源。此外,在许多情况下,根域名服务器并不直接把待查询的域名直接转换为IP地址(根域名服务器也没有存放这个信息),而是告诉本地域名服务器下一步应该找哪一个顶级域名服务器进行查询

  2. 顶级域名服务器(TLD服务器):这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询的请求的时候,就会给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的IP地址)。

  3. 权限域名服务器:负责一个区的域名服务器。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的DNS客户,下一步应当找哪一个权限域名服务器。

  4. 本地域名服务器(local name server):当一台主机发出DNS查询的时候,这个查询请求报文就发送给本地域名服务器,本地域名服务器距离用户比较近,一般不超过几个路由的距离。当所要查询的主机也属于同一个本地ISP时候,该本地域名服务器立即就能讲所查询的主机名转化为它的IP地址,而不再需要询问其他的域名服务器。

为了提高域名服务器的可靠性,DNS域名服务器把数据复制到几个域名服务器来保存,其中的一个是主域名服务器(master name server),其他的是辅助域名服务器(secondary name server)。当主域名服务器出现故障的时候,辅助域名服务器可以保证DNS查询工作不会瘫痪。主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行,这样就保证了数据的一致性

下面讨论一下域名的解析过程:

  1. 主机向本地域名服务器的查询一般采用的是递归查询(recursive query),所谓递归查询就是:如果主机所询问的本地域名服务器不知道被域名查询的IP地址,那么本地域名服务器就以DNS客户的身份向其他根域名服务器继续发出查询请求报文(替该主机继续查询),而不是让主机自己进行下一步查询,递归查询的结果就两种:
    • 查询成功,查询出IP地址。
    • 查询失败(报错),无法查询到。
  2. 本地域名服务器向根域名服务器查询采用的是迭代查询(iterative query):迭代查询的特点是这样的:当根域名服务器收到本地域名服务器发出的迭代请求报文时,要么给出要查询的IP地址,要么告诉本地域名服务器:"你下一步应该去哪一个域名服务器查询",然后让本地域名服务器进行后续的查询(而不是替本地域名服务器进行后续的查询)。根域名服务器通常是把自己知道的顶级域名服务器的 IP 地址告诉本地域名服务
    器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的 IP 地址,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询,本地域名服务器就这样进行迭代查询。最后,知道了所要解析的域名的 IP 地址,然后把这个结果返回给发起查询的主机。接着进行上面的操作,直至找到IP地址。

image

假定域名为 m.xyz.com的主机想知道另一台主机(域名为 y.abc.com)的IP 地址。例如,主机 m.xyz.com 打算发送邮件给主机 y.abc.com。这时就必须知道主机 y.abc.com 的 IP
地址。下面是图 6-5(a)的几个查询步骤:

  1. 主机m.xyz.com先向其本地域名服务器dns.xyz.com,进行递归查询。
  2. 本地域名服务器采用迭代查询,它先向一个根域名服务器进行查询。
  3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器dns.com的IP地址。
  4. 本地域名服务器向顶级域名服务器dns.com进行查询。
  5. 顶级域名服务器dns.com告诉本地域名服务器,下一次应查询的权限域名服务器dns.abc.com的IP地址。
  6. 本地域名服务器向权限域名服务器dns.abc.com进行查询。
  7. 权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
  8. 本地域名服务器最后把查询结果告诉主机m.xyz.com。

图 6-5(b)是本地域名服务器采用递归查询的情况。在这种情况下,本地域名服务器只需向根域名服务器查询一次,后面的几次查询都是在其他几个域名服务器之间进行的(步骤3至6)。只是在步骤7,本地域名服务器从根域名服务器得到了所需的 IP 地址。最后在步骤8,本地域名服务器把查询结果告诉主机 m.xyz.com。整个的查询也是使用8个UDP报文。

为了提高DNS查询速率,并减轻根域名服务器的负荷和减少互联网上的DNS查询报文数量,在域名服务器广泛使用高速缓存(高速缓存域名服务器),高速缓存用来存放最近查询过的域名以及从何处获取到该映射信息的记录。

例如,在图 6-5(a)的查询过程中,如果在不久前已经有用户查询过域名为 y.abc.com 的IP 地址,那么本地域名服务器就不必向根域名服务器重新查询 y.abc.com 的 IP 地址,而是直接把高速缓存中存放的上次查询结果(即 y.abc.com 的IP 地址)告诉用户。
假定本地域名服务器的缓存中并没有 y.abc.com 的 IP 地址,而是存放着顶级域名服务器dns.com 的 IP 地址,那么本地域名服务器也可以不向根域名服务器进行查询,而是直接向
com顶级域名服务器发送查询请求报文。这样不仅可以大大减轻根域名服务器的负荷,而且也能够使互联网上的 DNS 查询请求和回答报文的数量大为减少。

由于名字到地址的绑定并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如,每个项目只存放两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器获取绑定信息。当权限域名服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名转换的准确性。

不但在本地域名服务器中需要高速缓存,在主机中也很需要。许多主机在启动时从本地域名服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机自然应该定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删掉无效的项。由于域名改动并不频繁,大多数网点不需花太多精力就能维护数据库的一致性。

posted @ 2021-09-07 22:39  LilyFlower  阅读(646)  评论(0编辑  收藏  举报