TCP/IP协议之常见的应用层协议——DNS域名系统

DNS域名系统概述

域名系统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)。


DNS域名系统的工作原理

当一个计算机应用进程需要把主机名解析为IP地址时:

  1. 调用解析程序,将带解析的域名放入DNS请求报文中。
  2. 以UDP的方式发送报文给本地域名服务器。
  3. 本地域名服务器在查找到域名后,就将其对应的ip地址放在回复报文中返回
  4. 应用程序通过回复报文获得目的主机的ip地址。

疑问点&解析

根据上面流程我们提出几个问题并解析:

1.解析程序是什么?它在哪儿?

书上网上并没有查到专门描述这个解析程序的内容。但是我们可以推测,这个解析程序就是一个能够发起DNS请求报文并能够接收DNS报文的一个内嵌在我们所使用程序上的一个进程。我们通常使用浏览器去访问某个网址,因此,在我们的浏览器中应当会运行一个DNS域名解析进程,通过这个进程与本地域名服务器进行域名解析来为浏览器提供域名解析服务。

2.为什么使用UDP的方式发送报问,而不是使用可靠的TCP?

因为UDP消耗的资源比较少。同时,由于域名解析服务只需要经历一个RTT时间(数据往返时间),并不存在多余的其他信息交互。因此,即便只使用UDP也可以保证数据的交付结果(进程一旦发现超时就可以认为报文丢失,可以再次发送,知道获得回复报文),并且如果使用TCP连接反而需要数倍的资源损耗(因为在交互前后需要三次握手+四次挥手)。

3.什么是本地域名服务器?它在哪?

本地域名服务器就是域名服务器。本地域名服务器非常重要,我们的计算机需要解析域名时,首先就需要发送解析请求给本地域名服务器。至于存在“本地”的前缀是因为它通常距离用户比较近,一般不超过几个路由器的距离。

该问题的具体描述我们放在后面的域名服务器这一部分进行详细的解答。

域名

在介绍具体介绍域名服务器之前我们需要先了解互联网的域名结构。

互联网采用了层次树状结构的命名方式。任何一个链接在互联网上的主机或路由器,都有一个唯一的层次结构名字,即域名。在这里,是名字空间里一个可被管理的划分。域还可以不断划分出子域。

从语法上,每个域名都由标号序列组成,而各标号之间用点隔开。比如下面的域名。
在这里插入图片描述
上面是中央电视台用于收发电子邮件的计算机的域名,它由三个标号组成,其中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。它是最重要的域名服务器,因为当我们的域名服务器无法解析域名时,就首先求助于根域名服务器。
  • 顶级域名服务器:这类服务器负责管理所有在该顶级域名服务器上注册的所有二级域名服务器。当收到DNS查询时,就给出相应回答。
  • 权限域名服务器:该服务器在前面已经有过解释。当一个权限域名服务器不能给出查询回复时,就会告诉发出查询请求的DNS客户,下一步应当找那个权限域名服务器。
  • 本地域名服务器:本地域名服务器并不属于常规的域名服务器层次结构。但是它 非常重要。当一台主机发出DNS查询请求,这个请求报文就会发给本地域名服务器。正常来说,每一个大学、本地ISP服务提供商都会拥有一个本地域名服务器。我们个人的电脑通常可以通过查看我们系统上的“网络和Internet” → “网络和共享中心” → “查看网络信息并设置连接” → “网络连接” → “属性” → “Internet协议版本4” → “属性”就可以看到我们的DNS服务器的信息,但是通常是自动获取的。这里的DNS服务器指的就是本地域名服务器。当所要查询的主机也属于同一个本地ISP,该本地域名服务器就能直接将其映射为对应的ip地址,而不需要询问其他域名服务器。

域名的解析过程

域名的查询方式通常分为以下两种:

  • 递归查询:主机向本地域名服务器通常采用的查询方式
  • 迭代查询:本地域名服务器向根域名服务器采用的查询方式

递归查询

所谓递归查询就是指:如果主机所询问的本地域名服务器并不知道被查询域名的ip地址,那么本地域名服务器就将向其他根域名服务器继续发出查询请求报文(即提该主机继续查询),而不是让该主机自己进行下一步查询。因此,递归查询的结果要么是要查询的ip地址,要么就是报错,查不到地址。

迭代查询

所谓迭代查询是指:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪个域名服务器进行查询,然后由本地域名服务器进行后续的查询。根域名服务器通常是将自己知道的对应的顶级根域名服务器的ip告诉本地域名服务器,然后让它再向顶级域名服务器发起请求。当顶级域名服务器收到请求后,要么给出要查询的ip,要么告诉本地域名服务区下一步向哪个权限域名服务器继续请求。通过这样的迭代,最后获取到ip或是报错,将结果返回给发起查询的主机。

当然,本地域名服务器也可以是由递归查询方式,这取决于最初的查询请求报文设置的是哪一种查询方式
下面的图说明了两种查询的区别:
在这里插入图片描述

补充

下面是一些DNS为应当一些问题所采取的一些方法:

  • DNS在域名服务器中采用高速缓存来减少查询压力,服务器会临时存放最近的一些查询记录。
  • DNS采用分布式存储增加可靠性。只由主DNS域名服务器修改并定期同步数据到次DNS域名服务器来保证数据一致性
  • 为了减轻本地域名服务器的压力,许多计算机会在启动时就从本地域名服务器中下载所有域名库。能查到的记录就不会依赖于本地域名服务器。同时,为了数据一致性,本地主机也会定期检查本地域名服务器的信息更新情况。
  • 为了减轻根域名服务器的压力,以及提升根域名服务器的可靠性。通过一个根域名服务器会在许多地方拥有多个镜像根域名服务器,以防止服务器崩溃的时候导致网络的DNS系统无法工作。

猜你喜欢

转载自blog.csdn.net/qq_33905217/article/details/114212054