本篇文章基于《计算机网络》和《计算机网络:自顶向下方法》,为笔者的读书笔记,主要内容如下所示:
域名系统 DNS(Domain Name System) 提供的服务很简单,就是将便于人们使用的机器名字转换为IP地址。
我们都知道用户与互联网上的某台主机通信时必须知道对方的 IP 地址。相比于难以记忆的IP地址,用户更容易记住的是有具体含义的主机名字,例如我们访问百度的页面通常会选择输入www.baidu.com
而不是183.232.231.172
;但对于路由器来说,它更喜欢的则是定长的、有层次结构的 IP 地址。所以为了折衷这些不同的偏好,我们需要一种能进行主机名到 IP 地址转化的服务,域名系统 DNS 应运而生。
和 HTTP、FTP 和 SMTP 协议一样,DNS 协议是应用层协议,它同样是采用客户-服务端模式运行在通信的端系统之间。DNS 协议运行在 UDP 之上,采用的端口号是 53。在 Windows/Linux 的命令行窗口下,我们可以输入 dslookup 命令来查询域名对应的IP地址,如下所示:
这里我们以查询百度搜索域名的 IP 地址为例,可以看到返回的结果中显示 www.baidu.com
这个域名下对应两个 IP 地址,分别是183.232.231.172
和183.232.231.174
。
互联网采用的是层次树状结构的命名方法,任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。域还可以划分为子域,而子域还可继续划分为子域的子域,这样就形成了顶级域、二级域、三级域,等等。下面通过一个例子来说明:
上图是新浪邮件服务器的域名,从语法上将,每一个域名都由标号(label)序列组成,各个标号之间用点隔开。其中标号 com 是顶级域名,标号 sina 是二级域名,标号 mail 是三级域名。DNS 对标号有如下规定:
需要注意的是,域名中的点和IP地址中的点并无任何关系,域名只是一个便于人们使用和记忆的字符串,和IP地址存在映射关系。至于域名中的点所对应的顶级域名、二级域名等,和下面将要介绍的 DNS 的分布式和层次性设计有着很大的关系。
从理论上来说,整个互联网可以只使用一个 DNS 服务器,该服务器包含所有的映射,客户直接将所有查询发往一个 DNS 服务器,同时该 DNS 服务器直接对所有的查询客户做出响应。但是它并不适用于当今庞大的互联网,这种设计含有以下缺陷:
正是基于以上总总缺陷,DNS 的服务器不会被设计成这种集中式的结构,而是采用了一种分布式的设计方案。
分布式 DNS 服务器的设计思路如下图所示:
可以看到,DNS 除了是分布式的系统之外,它还是一个具有层次的层次性系统,这么做是基于可扩展性的考虑。这些 DNS 服务器分布在全球各地,没有一台 DNS 服务器拥有互联网上所有主机的映射,相反,该映射分布于所有的 DNS 服务器上。DNS 服务器可大致分为如下三类:
这三种类别的 DNS 服务器和上图的对应关系为:根 DNS 服务器位于最顶层;顶级域 DNS 服务器位于第二层,如 com DNS服务器、org DNS服务器等;而顶级域 DNS 服务器的下一层为权威 DNS 服务器,如 com DNS服务器下有 yahoo.com DNS服务器。
根、顶级域和权威 DNS 服务器都处在上图所示的 DNS 层次结构中,除此之外还有一类非常重要的 DNS,称为本地 DNS 服务器(local DNS server) 。一个本地 DNS 服务器严格来说并不属于该服务器的层次结构,但它对 DNS 层次结构是很重要的,因为当一台主机发出 DNS 查询请求时,这个请求的报文就发送给本地 DNS 服务器。每个 ISP(如一个大学或一家公司)都可以有一台本地 DNS 服务器(也叫默认 DNS 服务器)。本地 DNS服务器离用户较近,一般不超过几个路由器的距离。以笔者电脑为例,本地 DNS 服务器的设置如下所示:
上图中的首选 DNS 服务器和备用 DNS 服务器均表示本地 DNS 服务器的地址,这里笔者选择的是 Google 的公共 DNS 服务器进行域名解析。
而本地 DNS 服务器还有一个非常重要的功能是对局域网中的域名进行解析。例如一个大学的内部组建了一个只需要在校园网内互联的局域网时,由于局域网内部的域名并没有(也不需要)向公众公开,那么学校内部就需要维护一个本地 DNS 服务器,将学校内部的域名和对应的IP地址进行映射,从而实现校园网内部的域名解析。
那么这个学校自己维护的本地 DNS 服务器是否可以访问外网呢?答案是可以。每一个本地 DNS 服务器都会知道根服务器的 IP 地址,当本地 DNS 服务器中没有请求域名所对应的 IP 地址时,就会向根 DNS 服务器进行查询,有了根 DNS 服务器,就可以查到外网所对应的 IP 地址了,这在下面的篇幅会进行解释。
上面介绍完了DNS服务器的分布式和层次式结构之后,接下来我们来介绍 DNS 服务器的工作原理。
DNS 的查询采用递归和迭代查询两种形式,其中主机向本地 DNS 服务器查询发起的为递归查询,而本地 DNS 服务器后续的查询一般为迭代查询,如下图所示:
这里以查询 www.google.com 的IP地址为例:
以上所示查询中,后面的三个查询均为迭代查询,而主机向本地服务器发起的查询为递归查询,这种情况总共需要使用 8 个 UDP 数据报。当然,本地 DNS 服务器也可以采用递归查询的方式,这取决于最初的查询请求报文的设置具体要求使用哪一种查询,递归查询的方式如下所示:
可以看到使用递归查询的方式我们依旧要使用 8 个 UDP 报文,但这种处理方式相对于前面的递归+迭代查询的组合会加大根 DNS 服务器的负荷,所以在实践中,查询通常采用递归(主机到本地 DNS)+迭代(本地 DNS 后续的查询)的方式。
DNS 系统还有一个非常重要的特性:DNS缓存(DNS caching)。DNS缓存用来存放最近查询过的域名以及从何处会的域名映射信息的记录。DNS缓存的原理非常简单,在一个请求链中,当某 DNS 服务器接收一个 DNS 回答时,他能将该回答中的信息缓存在本地存储器中。例如上面查询 www.google.com 的 IP 地址的例子中,如果在不久前已经有用户查询过该域名了,那么本地 DNS 服务器就不必向根 DNS 服务器重新查询 www.google.com 的 IP 地址,而是直接把 DNS缓存中存放的上次查询结果(即 www.google.com 的IP地址)返回给用户。
通过这种方式,能够提高 DNS 查询效率并减轻根 DNS 服务器的符合和减少互联网上的 DNS 查询报文数量。但需要注意的是域名和 IP 地址的绑定并不是永久的(虽然并不经常改变),为了保持 DNS 缓存的正确性,DNS 服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。
所以维护一个本地 DNS 服务器还有一个好处就是能够提高 DNS 查询效率。例如在一个大学中,当很多的 DNS 查询都指向同一个域名时,可以加快查询效率以及减轻流量负担。
在分布式数据库结构中的所有 DNS 服务器里面存储的内容是资源记录(Resource Record,RR),RR 提供了主机名到 IP 地址的映射,它是一个包含下列字段的四元组:
(Name, Value, Type, TTL)
其中,TTL 表示该记录的生存时间,它决定了资源记录应但从缓存中删除的时间。Name 和 Value 的值取决于 Type,如下表所示:
Type | 含义 |
---|---|
A | Name为主机名,Value为该主机名对应的IP地址。该资源记录提供了标准的主机名到IP地址的映射 |
NS | Name为域,Value为知道如何获得该域IP地址的权威DNS服务器的主机名。该资源记录用于沿着查询链来路由DNS查询 |
CNAME | Name为别名,Value为规范主机名。该资源记录能够向查询的主机提供一个主机名对应的规范主机名 |
MX | Name为别名,Value为邮箱服务器的规范主机名。该资源记录允许邮件服务器主机名具有简单的别名 |
下面举几个例子来说明上述表格的类型,注意下列例子均忽略了四元组中的 TTL。
到目前为止,我们所介绍的都是如何向 DNS 服务器查询域名的 IP 地址,现在我们就来了解一下如何往 DNS 数据库中插入记录以便我们自己的域名能够被他人访问到。
例如我们现在要创建一个域名 marck.com。首先我们就要先向注册登记机构注册域名 marck.com。注册登记机构(registrar)是一个商业实体,它验证该域名的唯一性,将该域名输入 DNS 数据库,对提供的服务收取一定的费用。在互联网初期唯一的注册登记机构是 Network Solution,它独家经营对于 com、net 和 org 域名的注册。现如今注册登记机构已有多家,例如国内较为出名的腾讯、阿里等均有此项业务。
当我们向某注册登记机构注册域名 marck.com 时,需要向该机构提供基本和辅助权威 DNS 服务器的名字和 IP 地址。假定该名字和 IP 地址是 dns1.marck.com 和 dns2.marck.com 以及 222.222.222.1 和 222.222.222.2。该注册登记机构将确保这两个权威 DNS 服务器的一个类型 NS 和一个类型 A 的记录输入 TLD com 服务器。例如对于 dns1.marck.com 的基本权威服务器,该注册登记机构将下列两条资源记录插入该 DNS 系统中:
( marck.com, dns1.marck.com, NS )
( dns1.marck.com, 222.222.222.1, A )
注意上述的资源记录均忽略了 TTL。而在我们自己的权威 DNS 服务器中,里面记录的就是例如 www.marck.com 或 mail.marck.com 这些子域名所对应的 IP 地址,这些映射是由我们自己维护的。
在完成了上述步骤之后,人们就能够访问到我们的站点了。例如某人要访问 www.marck.com 这个Web站点,那么当他在浏览器输入URL之后,浏览器就会向本地 DNS 服务器发起查询请求,如果本地 DNS 没有缓存相关 IP 地址的话,就会向根 DNS 服务器发起查询,接着根 DNS 服务器就会告知本地 DNS 服务器应当向 TLD com 服务器查询。本地服务器接着联系 TLD com 服务器,TLD com 服务器包含前面列出的两条资源记录,因为注册登记机构已经将这些资源记录插入所有的 TLD com 服务器中了,于是 TLD com 服务器就会向本地 DNS 服务器告知接下来应该向 222.222.222.1 发送一个 DNS 查询,于是本地 DNS 服务器就能顺利地找到我们的权威 DNS 服务器了。
《计算机网络》
《计算机网络:自顶向下方法》
dns服务器理论基础知识