域名系统DNS(Domain Name System)是互联网使用的命名系统,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的系统,搭载域名系统的机器称之为域名服务器,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址数串。
那为什么不叫名字而是叫域名呢?因为在这种命名系统中使用了许多的“域”(域名(英语:Domain Name),简称域名、网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置))。
例如,www.baidu.com是一个域名,和IP地址180.76.76.76相对应。DNS就像是一个自动的电话号码簿,我们可以直接拨打baidu的名字来代替电话号码(IP地址)。我们直接调用网站的名字以后,DNS就会将便于人类使用的名字(如www.baidu.com)转化成便于机器识别的IP地址(如180.76.76.76)。
当一个计算机应用进程需要把主机名解析为IP地址时:
根据上面流程我们提出几个问题并解析:
书上网上并没有查到专门描述这个解析程序的内容。但是我们可以推测,这个解析程序就是一个能够发起DNS请求报文并能够接收DNS报文的一个内嵌在我们所使用程序上的一个进程。我们通常使用浏览器去访问某个网址,因此,在我们的浏览器中应当会运行一个DNS域名解析进程,通过这个进程与本地域名服务器进行域名解析来为浏览器提供域名解析服务。
因为UDP消耗的资源比较少。同时,由于域名解析服务只需要经历一个RTT时间(数据往返时间),并不存在多余的其他信息交互。因此,即便只使用UDP也可以保证数据的交付结果(进程一旦发现超时就可以认为报文丢失,可以再次发送,知道获得回复报文),并且如果使用TCP连接反而需要数倍的资源损耗(因为在交互前后需要三次握手+四次挥手)。
本地域名服务器就是域名服务器。本地域名服务器非常重要,我们的计算机需要解析域名时,首先就需要发送解析请求给本地域名服务器。至于存在“本地”的前缀是因为它通常距离用户比较近,一般不超过几个路由器的距离。
该问题的具体描述我们放在后面的域名服务器这一部分进行详细的解答。
在介绍具体介绍域名服务器之前我们需要先了解互联网的域名结构。
互联网采用了层次树状结构的命名方式。任何一个链接在互联网上的主机或路由器,都有一个唯一的层次结构名字,即域名。在这里,域是名字空间里一个可被管理的划分。域还可以不断划分出子域。
从语法上,每个域名都由标号序列组成,而各标号之间用点隔开。比如下面的域名。
上面是中央电视台用于收发电子邮件的计算机的域名,它由三个标号组成,其中com是顶级域名,cctv是二级域名,mail则是三级域名。
DNS并不限定一个域名包含多少个下级域名。但是各级的域名需要由上一级的域名管理机构管理,而顶级域名则由ICANN统一进行管理,这样就可以保证全球范围内域名的唯一性。换句话说,现在中央电视台向com的域名管理机构申请了cctv这个二级域名,当电视台获得这个域名时,它自己就可以决定是否要进一步划分其下属的子域,并且不必由上级机构批准。
注意:域名的层级结构与物理的网络无关,与IP地址中的子网也没有关系。它是按照机构的组织来划分的。
域名服务器就是一个提供DNS域名解析服务的一个计算机服务进程。
前面我们讲述了域名的层次结构体系,它组成了一棵巨大的域名树,但是,这棵树是抽象存在的。具体的域名系统是通过分布在各地的域名服务器来实现的。换句话说,域名服务器是一个提供域名查询的分布式域名数据库。
理论上来说,可以让每一级的每个节点域名都由一个相对应的域名服务器,使所有的域名服务器构成一个与域名树对应的域名服务器树。但是这样只会使得域名服务器数量太多,从而降低这些服务器的使用率并造成没必要的使用成本。因此我们需要一种方式,既可以在一个域名服务器上管理多个域名,又可以并不因为一台计算机上的域名过多造成DNS域名服务器的负担。在这个问题的基础上,DNS采用划分区的方式来解决这个问题。
我们将区定义为一个域名服务器所负责管辖的范围。但是这个范围不会大于域。理论上,如果有需要,我们可以在一个域内设立多个区,由多个DNS域名服务器去负责则自区内计算机的域名和映射服务。同时,我们将每一个区所对应的服务器被称为权限域名服务器,用来保存其所负责范围内所有主机的域名到IP地址的映射。
注意,由于区的划分是在一个域的基础之上进行的。因此,如果我们需要划分区,那我们首先就需要申请一个域名,但是再根据实际的需要进行划分,甚至不划分。但是,既是不划分,我们就默认将整个域看作一个区,并且需要为这个区(域)建立一个对应的DNS域名服务器。
举个例子,现在abc公司申请了一个abc.com的域名,并且abc公司现在有x和y两个服务部门,部门x下面又分三个部门u,v和w,而y下面还有其他下属部门t。假设abc公司现在只设置一个区,那么区abc.com和域abc.com指的就是同一件事。但是如果该公司规模很大,需要划分多个区,因此它可能会根据部门将域划分成两个区,并都设置了相应的权限域名服务器。两种划分方式如下图所示:
每个服务器都能够进行部分域名到IP地址的映射。当某个DNS服务器不能进行域名到IP地址的转换时,它就设法找互联网上别的域名服务器进行解析。
从上图看出,互联网上的DNS域名服务器也是按照层次安排的。每一个域名服务器都只对域名体系中的一部分进行管辖。根据域名服务器起到的作用,可以将域名服务器分为以下四种类型:
域名的查询方式通常分为以下两种:
所谓递归查询就是指:如果主机所询问的本地域名服务器并不知道被查询域名的ip地址,那么本地域名服务器就将向其他根域名服务器继续发出查询请求报文(即提该主机继续查询),而不是让该主机自己进行下一步查询。因此,递归查询的结果要么是要查询的ip地址,要么就是报错,查不到地址。
所谓迭代查询是指:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪个域名服务器进行查询,然后由本地域名服务器进行后续的查询。根域名服务器通常是将自己知道的对应的顶级根域名服务器的ip告诉本地域名服务器,然后让它再向顶级域名服务器发起请求。当顶级域名服务器收到请求后,要么给出要查询的ip,要么告诉本地域名服务区下一步向哪个权限域名服务器继续请求。通过这样的迭代,最后获取到ip或是报错,将结果返回给发起查询的主机。
当然,本地域名服务器也可以是由递归查询方式,这取决于最初的查询请求报文设置的是哪一种查询方式
下面的图说明了两种查询的区别:
下面是一些DNS为应当一些问题所采取的一些方法: