DNS服务器原理解析

1.引言

  我们在日常生活中经常浏览各种各样的网页,大多数时候我们是通过类似于www.baidu.com这样的域名来访问的,那么对计算机有一点了解的人可能会知道其实每个网址最后还是会被解析成ip地址去请求页面,由域名到ip这个过程就是DNS干的事情。

2.DNS是什么

  DNS,Domain Name System,其实是一个域名系统,自发明以来,一直是Internet的关键组成部分。DNS的本质是发明了一种层次的,基于域的命名方案,并且用一个分布式的数据库系统加以实现。他的主要用途是将主机名映射成IP地址,但是也可用作其他用途。
  简要的说,当我们输入一个网址并敲下回车后,应用程序调用了一个名为解析器的库程序,并且将名字作为参数传给此程序。解析器向本地DNS服务器发送一个包含该名字的请求报文,本地DNS查询该名字,并且返回该名字对应的IP地址的响应报文给解析器,然后解析器再返回IP地址给调用方。查询报文和响应报文都作为UDP数据包发送。有了IP地址以后,应用程序就可以与目标主机建立一个TCP连接,或者给他发送UDP数据包。这样,DNS就把一个域名映射成了一个IP地址。在介绍更多的细节之前,我们先来了解一下域名。

域名

  一个常见的域名由几个部分构成,例如最常见的 www.baidu.com
在这里插入图片描述
  其实他最末尾应该还有一个 . ,不过我们平时一般把它省略,他被称作为根域名,是最高一级的域名结点,后面依次是顶级域名,二级域名,三级域名。每个域都可被进一步划分成子域,这些子域也可被再次划分,以此推类。所有这些域可以表示为一棵树:
在这里插入图片描述
  其中顶级域名由一个专门的组织进行管理,而二级域名由顶级域名管理公司委托的注册机构来管理,这样一层层持续的将管理权限下放。
  好了,我们下面正式开始介绍有关DNS的更多细节。

3.域名资源记录

  无论是只有一台主机的域还是顶级域,每个域都有一组与他相关联的资源记录。这些记录就组成了DNS的数据库。对于一台主机来说,最常见的资源记录就是他的IP地址,但此外还存着许多其他种类的资源记录。当解析器把一个域名传递给DNS时,它获得的DNS返回结果就是与该域名有关的资源记录。因此,DNS的基本功能是将域名映射到资源记录。
  而一条资源记录用一个五元组记录,每一条记录占一行:
在这里插入图片描述
从左到右依次为:
  Domain_name(域名)指出了这条记录适用于哪个域。通常每个域都有多条记录,并且数据库的每份副本保存了多个域的相关信息。因此Domain_name是匹配查询条件的主要搜索关键字。
  Time_to(生存期)指的是该条记录的稳定程度。极为稳定的信息会被分配一个很大的值;而非常不稳定的信息则会被分配一个较小的值。这个字段与DNS的缓存机制相关。
  Class(类别)。对于Internet信息,它总是IN。对于非Internet信息,则可以使用其他的代码,但实际上很少见。
  Type(种类)字段指出了这是什么类型的数据。DNS记录有许多类型,下面的表格给出了一些比较重要的类型:

类型 含义
SOA 授权开始 本区域的参数
A 主机的IPv4地址 32位整数
AAAA 主机的IPv6地址 128位整数
MX 邮件交换 优先级,愿意接受邮件的域
NS 域名服务器 本域的服务器名字
CNAME 规范名 域名
PTR 指针 IP地址的别名
SRF 发送者的政策框架 邮件发送政策的文本编码
SRV 服务 提供服务的主机
TXT 文本 说明的ASCII文本

  如果对这些字段感兴趣,可以去查询相关的资料多了解一些东西。
  Value(值)。最后,资源记录还包括Value字段,该字段的值可以是一个数字,一个域名或者一个ASCII字符串,其语义取决于记录的类型,上面的表格中给出了每种主要记录类型的Value字段的简短描述。

4.域名服务器

  理论上来说,一台服务器就可以包含整个DNS数据库,但是这台服务器会因为负载过重而垮掉。为了避免单个信息源带来的各种问题,DNS名字空间被划分成一些不重叠的区域。对于下图,每个圈起来的区域包含了域名树的一部分,他们由一台DNS服务器负责。
在这里插入图片描述
  这些服务器是持有该区域数据库的主机。通常情况下,为了避免服务器负载过大,一个区域有一个主域名服务器和多个辅域名服务器。主服务器从自己磁盘的一个文件读入有关域名的信息,辅域名服务器从主域名服务器获取域名信息。
  而查询一个地址对于IP的过程被称为域名解析。当解析器把请求报文发送给DNS服务器以后。如果需要查询的域刚好是在该服务器的管辖之下,比如top.cs.vn.nl在cs.vn.nl的管辖下。那么该服务器会返回一个权威资源记录。权威资源记录指的是存储了该条记录的服务器提供的信息,因此他总是正确的。与之相对应的是缓存记录,很显然,缓存的记录很有可能是过时的信息,会导致错误。
  另外一种情况就是该服务器中没有所查询的域的信息,查询过程可以简单用下面这张图表示:
在这里插入图片描述
  首先发送方发送了一个请求报文给本地DNS服务器,但是本地没有相关域的缓存信息。所以本地DNS服务器会发送一个请求报文给根域名服务器。根域名服务器中肯定没有该域名的信息,但是他知道顶级域名服务器的地址,也就是说如果我们查询的顶级域名是 .edu,根域名服务器会返回一个edu的地址,告诉本地DNS服务器去它那找。DNS接受到这个消息之后会继续发送请求,一层层往下找,直到找到自己想要的答案,然后返回给发送方。如果最后还是什么都没有找到,则返回错误信息。
  最后,整个过程中还有几个值得注意的地方。
  一是发送方发送一个请求给本地DNS服务器之后,他就什么也不干了,后续的工作都交给了本地DNS服务器完成,这个机制被成为递归查询。但是本地DNS服务器发送请求给根域名服务器之后,后续工作并不是由根域名服务器来完成。根域名服务器只是返回了一个地址,本地服务器解析报文之后再次发送一个查询报文,这个机制被称为迭代查询。这是很显然的,因为如果后续工作都交给了根域名服务器来完成,那么它很快就会因为负载过重而停止工作。
  同时,所有的查询答案都会被DNS服务器缓存,这样两个相同的请求只需要查询一次,下一次直接从缓存中抓取数据就行了,节省了大量时间。实际上,我们上图中的查询流程是没有任何缓存的情况下,所以他才需要一级一级的查。虽然缓存可以节省时间,它的坏处也是很显然的,缓存是有可能过时的。所以,我们在之前介绍DNS的缓存记录时,有一个值叫做Time_to_live。它告诉远程域名服务器这条记录可以保持多久。如果某台服务器已经多年使用相同的ip地址,将他的缓存信息保存为一天是安全的。但是如果地址经常改变,几秒钟或者几分钟后清除掉缓存的做法可能更加可靠。
  最后,DNS查询和响应使用的传输层协议是UDP。DNS消息通过UDP数据包发送。如果在短时间内没有返回,DNS客户端必须重复查询请求。如果重复了一定次数还是没有得到响应,那么将会尝试另一台域名服务器。这样做的目的是为了应付出现服务器关闭已经响应包丢失的情况。每个查询报文中还包含一个16位的标识符,这个标识符会被复制到响应包中,以便服务器在发送了多个请求包之后可以分辨出不同的查询结果。

5.结语

  关于DNS的介绍大概就是这些内容,文中部分内容参考了严伟和潘爱民翻译的计算机网络第五版。原作者是Andrew S. Tanenbaum和David J. Wetherall。

发布了24 篇原创文章 · 获赞 46 · 访问量 5146

猜你喜欢

转载自blog.csdn.net/qq_38164763/article/details/92180410