dns服务器的主要功能是什么域名服务器的主要功能是实现什么的转换


DNS是域名系统(DomainNameSystem)的缩写,是互联网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

生成HTTP消息之后,接下来我们需要委托操作系统将消息发送给Web服务器。尽管浏览器能够解析网址并生成HTTP消息,但它本身并不具备将消息发送到网络中的功能(浏览器本身也是借用本地操作系统来发送请求),因此这一功能需要委托操作系统来实现。在进行这一操作时,我们还有一个工作需要完成,那就是查询网址中服务器域名对应的IP地址。在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP地址。因此,在生成HTTP消息之后,下一个步骤就是根据域名查询IP地址。

查询IP地址的方法非常简单,就是调用本地的Socket库,只要询问最近的DNS服务器“的IP地址是什么”就可以了,DNS服务器会回答说“该服务器的IP地址为xxx.xxx.xxx.xxx”。这一步非常简单,很多读者也都很熟悉,那么浏览器是如何向DNS服务器发出查询的呢?让我们把向Web服务器发送请求消息的事情放一放,先来探索一下DNS。向DNS服务器发出查询,也就是向DNS服务器发送查询消息,并接收服务器返回的响应消息。换句话说,对于DNS服务器,我们的计算机上一定有相应的DNS客户端,而相当于DNS客户端的部分称为DNS解析器,或者简称解析器。通过DNS查询IP地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)了。

解析器实际上是一段程序,它包含在操作系统的Socket库中,在介绍解析器之前,我们先来简单了解一下Socket库。首先,库到底是什么东西呢?库就是一堆通用程序组件的集合,其他的应用程序都需要使用其中的组件。库有很多好处。首先,使用现成的组件搭建应用程序可以节省编程工作量;其次,多个程序使用相同的组件可以实现程序的标准化。除此之外还有很多其他的好处,因此使用库来进行软件开发的思路已经非常普及,库的种类和数量也非常之多。

Socket库中包含很多发送或接受数据的程序组件,但是在说这些组件之前,我们先说一下解析器。

解析器的用法非常简单。Socket库中的程序都是标准组件,只要从应用程序中进行调用就可以了。具体来说,在编写浏览器等应用程序的时候,只要像图中这样写上解析器的程序名称“gethostbyname”以及Web服务器的域名“”就可以了,这样就完成了对解析器的调用(有过编程经验的读者应该知道这是对方法的调用)。

在应用程序中编写上图中的一行代码后就能够调用解析器完成向DNS服务器查询IP地址的操作。调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息。响应消息中包含查询到的IP地址,解析器会取出IP地址,并将其写入浏览器指定的内存地址中。只要运行图的这一行程序,就可以完成前面所有这些工作,我们也就完成了IP地址的查询。接下来,浏览器在向Web服务器发送消息时,只要从该内存地址取出IP地址,并将它与HTTP请求消息一起交给操作系统就可以了。

当DNS服务器收到查询消息后,它会根据消息中的查询内容进行查询。这个查询的过程有点复杂,我们稍后会进行讲解,这里先不关心具体的方法。总之,如果要访问的Web服务器已经在DNS服务器上注册,那么这条记录就能够被找到,然后其IP地址会被写入响应消息并返回给客户端。接下来,消息经过网络到达客户端,再经过协议栈被传递给解析器,然后解析器读取出消息取出IP地址,并将IP地址传递给应用程序。实际上,解析器会将取出的IP地址写入应用程序指定的内存地址中,上图用“”来表示,在实际的程序代码中应该写的是代表这一内存地址的名称。到这里,解析器的工作就完成了,控制流程重新回到应用程序(浏览器)。现在应用程序已经能够从内存中取出IP地址了,所以说IP地址是用这种方式传递给应用程序的。计算机的内部结构就是这样一层一层的。也就是说,很多程序组成不同的层次,彼此之间分工协作。当接到上层委派的操作时,本层的程序并不会完成所有的工作,而是会完成一部分工作,再将剩下的部分委派到下层来完成。

向DNS服务器发送消息时,我们当然也需要知道DNS服务器的IP地址。只不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的,不需要再去查询了。不同的操作系统中TCP/IP的设置方法也有差异,Windows中的设置如图所示,解析器会根据这里设置的DNS服务器IP地址来发送消息。

前文介绍了解析器与DNS服务器之间的交互过程,下面来了解一下DNS服务器的工作。DNS服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。其中,来自客户端的查询消息包含以下3种信息。

在最早设计DNS方案时,DNS在互联网以外的其他网络中的应用也被考虑到了,而Class就是用来识别网络的信息。不过,如今除了互联网并没有其他的网络了,因此Class的值永远是代表互联网的IN

表示域名对应何种类型的记录。例如,当类型为A时,表示域名对应的是IP地址;当类型为MX时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同。

DNS服务器上事先保存有前面这3种信息对应的记录数据,如图所示。DNS服务器就是根据这些记录查找符合查询请求的内容并对客户端作出响应的。

例如,如果要查询这个域名对应的IP地址,客户端会向DNS服务器发送包含以下信息的查询消息。

然后,DNS服务器会从已有的记录中查找域名、Class和记录类型全部匹配的记录。假如DNS服务器中的记录如上图所示,那么第一行记录与查询消息中的3个项目完全一致。于是,DNS服务器会将记录中的192.0.2.226这个值返回给客户端。然而,Web服务器的域名有很多都是像这样以www开头的,但这并不是一定之规,只是因为最早设计Web的时候,很多Web服务器都采用了www这样的命名,后来就形成了一个惯例而已。因此,无论是WebServer1也好,MySrv也好,只要是作为A记录在DNS服务器上注册的,都可以作为Web服务器的域名。

A是Address的缩写。不仅是Web服务器,像邮件服务器、数据库服务器等,无论任何服务器,只要注册了A类型的记录,都可以作为服务器的域名来使用。准确来说,A类型的记录表示与IP地址所对应的域名,因此与其说是某个服务器的域名,不如说是被分配了某个IP地址的某台具体设备的域名。在查询IP地址时我们使用A这个记录类型,而查询邮件服务器时则要使用MX47类型。这是因为在DNS服务器上,IP地址是保存在A记录中的,而邮件服务器则是保存在MX记录中的。

查询消息的内容如下。MX:MaileXchange,邮件交换。对于一个邮件地址tone@,当需要知道这个地址对应的邮件服务器时,我们需要提供@后面的那一串名称。

DNS服务器会返回10和这两条信息。当记录类型为MX时,DNS服务器会在记录中保存两种信息,分别是邮件服务器的域名和优先级(当一个邮件地址对应多个邮件服务器时,需要根据优先级来判断哪个邮件服务器是优先的。优先级数值较小的邮件服务器代表更优先。)。此外,MX记录的返回消息还包括邮件服务器的IP地址。上表的第三行就是的IP地址,因此只要用的域名就可以找到这条记录。在这个例子中,我们得到的IP地址是192.0.2.227。

综上所述,DNS服务器的基本工作就是根据需要查询的域名和记录类型查找相关的记录,并向客户端返回响应消息。DNS服务器会从域名与IP地址的对照表中查找相应的记录,并返回IP地址

前面只介绍了A和MX这两个记录类型,实际上还有很多其他的类型。例如根据IP地址反查域名的PTR类型,查询域名相关别名的CNAME类型,查询DNS服务器IP地址的NS类型,以及查询域名属性信息的SOA类型等。尽管DNS服务器的工作原理很简单,不过是根据查询消息中的域名和记录类型来进行查找并返回响应的信息而已,但通过组合使用不同的记录类型,就可以处理各种各样的信息。此外,虽然上图展示的是表格形式,但实际上这些信息是保存在配置文件中的,表格中的一行信息被称为一条资源记录。

前文中,我们假设要查询的信息已经保存在DNS服务器内部的记录中了。如果是在像公司内部网络这样Web和邮件服务器数量有限的环境中,所有的信息都可以保存在一台DNS服务器中,其工作方式也就完全符合我们前面讲解的内容。

然而,互联网中存在着不计其数的服务器,将这些服务器的信息全部保存在一台DNS服务器中是不可能的,因此一定会出现在DNS服务器中找不到要查询的信息的情况。下面来看一看此时DNS服务器是如何工作的。直接说答案的话很简单,就是将信息分布保存在多台DNS服务器中,这些DNS服务器相互接力配合,从而查找出要查询的信息。不过,这个机制其实有点复杂,因此我们先来看一看信息是如何在DNS服务器上注册并保存的。

首先,DNS服务器中的所有信息都是按照域名以分层次的结构来保存的。层次结构这个词听起来可能有点不容易懂,其实就类似于公司中的事业集团、部门、科室这样的结构。层次结构能够帮助我们更好地管理大量的信息。DNS中的域名都是用句点来分隔的,比如,这里的句点代表了不同层次之间的界限,就相当于公司里面的组织结构不用部、科之类的名称来划分,只是用句点来分隔而已。在域名中,越靠右的位置表示其层级越高,比如这个域名如果按照公司里的组织结构来说,大概就是