互联网基础服务之DNS—基础篇

1、前言


在当下互联网时代,我们日常生活和工作基本都离开不域名和 DNS ,如通过一个网址打开一个网站进行购物、使用百度/谷歌搜索信息及通过 APP 看游戏直播。随着移动互联网爆发,为提升用户使用网站或 APP 的体验,大多数企业都采购了 CDN 服务进行内容加速,而 CDN 服务的核心调度也离不开 DNS。可以说 DNS 和我们的生活工作息息相关,如果 DNS 发生故障,将会导致互联网服务大面积瘫痪,会给大部分互联网企业带来巨额损失。

那么我们的计算机是如何打开一个网站的呢?这与 DNS 有什么关系呢?为什么大多数应用服务都需要 DNS 来支撑呢?为什么人们需要 DNS 和域名?DNS 又是如何将域名解析成 IP 地址的呢?如果您对这些问题较感兴趣,那么我们一起来探讨下 DNS 的前世今生。

2、DNS 和域名的产生由来


                  (上图左为保罗·莫卡派乔斯 Paul Mockapetris) 

通常互联网计算机是通过 IP 地址进行标识和通信的,如 IP 地址 112.45.23.56 ,这样的 IP 地址人们不容易记忆,因此产生了域名这样的字符型标识。通过域名,我们可以更加方便的记忆一个计算机的地址,如通过 www.fastcp.cn 来记 42. 62.101.185 这个 IP 地址。 这有点像我们的身份证和姓名的关系,身份证号代表我们唯一的身份标识,但由于比较长难以记忆,固用姓名来代替身份证号码,但在现实生活中,身份证号才是我们办事的有效标识。通常我们打开的一个网址,都是由协议、域名、网站路径、文件名组成。因此当计算机浏览器需要打开一个网址的时候,必须先将网址中的域名解析成 IP 地址,再向这个 IP 地址请求网站内容,解析 IP 地址的过程中,就必须用到 DNS 这个分布式数据库。

在 DNS 产生之前,人们是通过 HOSTS.TXT 文件进行域名和 IP 地址之间的映射,但随着网络上主机爆炸性的增长,出现了域名冲突、一致性差、流量和负载过大等问题,无法及时的解析出需要的 IP 地址,1983 年由保罗·莫卡派乔斯(Paul Mockapetris)发明了 DNS 协议,于 1987 年正式发布至 RFC 1034 和 RFC 1035 ,有兴趣的同学可以去下载 RFC 英文版阅读。

DNS(Domain Name System)域名解析系统,是互联网基础资源的核心服务,主要用于承载 IP 地址和互联网域名之间的转换,通过 DNS 能够使人们更方便快捷的访问互联网。DNS 是一个域名分布式的数据库,同时数据库的各个部分可以进行本地控制和访问,如 CN 域名由 CNNIC (中国互联网络信息中心)在进行管理和控制。DNS的产生解决了流量负载大、域名冲突及一致性差等问题,直到当下,DNS 系统依然在各个行业、各种业务中发挥着巨大的作用。

If I can control your DNS, I control your world!

3、DNS 系统的组成


DNS 系统是为解析域名为 IP 地址而存在的,它是由 域名空间、资源记录、名称服务器、解析器组成。

  • 域名空间是包含一个树状结构,用于存储资源记录的空间。

  • 资源记录是与域名相关的数据,如 IP 和域名的对应关系等。

  • 名称服务器是用于存储 DNS 区(zone)域名空间数据,并处理由解析器发送过来的请求。

  • 解析器是用来发送域名解析请求并将结果返回给用户的程序。

当计算机需要解析域名时,计算机通过调用本地解析器进行 DNS 查询。解析器将 DNS 查询请求发送至名称服务器,名称服务器查询区中域名空间中数据,获得需要查询域名的资源记录,并返回给解析器,解析器将返回的结果反馈给计算机或浏览器。

4、DNS之域名空间


DNS 是以域名为索引的,域名是是由一串用“点”分隔的字符组成的Internet上某一台计算机或计算机组的名称,如下图所示,域名的结构为一颗倒立的树,每个域名就是图中的一个分支,这颗逆向树就称为域名空间。

(1)如逆向树所示,树中的每一个分支,都称为域,一个域名可以属于多个域,如域名 www.fastcp.cn 属于fastcp.cn 域的一部分,同时也是 cn 域的一部分。

(2)”.” 是最树状结构中最顶层的域名,统称为“根”,即每个域名都是由根开始索引的,所有域名都属于根。

(3)由根分支出的域名叫顶域域名(简称为 TLD ),一般分为国家地区顶级域名和通用顶级域名。

  • 国家顶级域名如我们了解的 cn、jp等。

  • 通用顶级域名如我们了解的 com、org、net、edu等,其中表示工商企业的是 .com;表示网络提供商的 .net,表示非盈利组织的 .org ;表示教育的 .edu 。

  • 通常我们只能注册二级域名,如果需要注册顶级域名,比如注册类似 .com 这样的域名,在国内需要联系 CNNIC ,由他们进行代理注册,通常价格不菲。大多数情况下,二级域名已经可以完全满足当下的业务需求。

(4)顶级域名下面的分支是二级域名,即我们平时通过万网或新网注册的域名,如 baidu.com 、fastcp.cn 、dianrong.com 等。

(5)二级域名下面的分支为三级域名,有时也可称为服务器名称,如 baidu下面 www 代表了百度的网站服务名称,music 代表了百度的音乐网站服务器名称。

(6)域名体系是通过倒着来叙述一个域名,如 www.fastcp.cn 是先写最下面的 www,在写中间的 fastcp ,接着写上面的 cn ,最后写 “.”

(7)由此我们看出,一个最完整的域名应该是 “ www.fastcp.cn. ” ,即在每个域名后面会有一个 “.” 来表示根,我们统称这种域名叫绝对域名“Fully Qualified Domain Name”(FQDN),相当于 Unix 系统中的文件绝对路径。可以通过在计算机中输入 “www.baidu.com.” 或 “www.dianrong.com.” 来确认是否可以打开网站。(通常我们不需要输入这个“.” ,因为计算机和浏览器默认已帮我们输入了这个点)

当然三级域名下还可以在分支四级域名出来,DNS 类似于 Unix 文件系统的结构,由根节点在上的反转树表示。最多分分支 127 层,每一层可以由最多 63 个字符组成,每层中间都以 “.” 进行分隔,类似 Unix 文件中以 “/” 分隔每一个目录。域名的总长度不可超过255个字符,仅可使用字符、数字和连字符,不区分大小写。

5、DNS 之名称服务器


DNS 名称服务器用于存储域名空间数据,并处理并处理由解析器发送过来的请求。域名空间数据一般以 zone 进行划分,不同的 zone 分布式存储于不同的名称服务器中。如 baidu.com 的域名相关数据存储在 baidu.com 的服务器中,dianrong.com 的域名相关数据存储在 dianrong.com 的服务器中。zone 是域名空间逆向树中的每一个点,也可以将一个域授权给其它组织进行管理,比如将 music.baidu.com 授权给其它组织进行存储和管理。

通常 DNS 名称服务器都是一个整体服务,即提供区数据管理,又提供解析处理。随着越来越多的互联网应用需要 DNS 解析,为解决互联网域名解析高并发和性能问题,一般将 DNS 服务器从功能上划分为三类:授权服务器、递归服务器、缓存服务器,分别承担不同的解析功能。

(1)授权服务器

DNS 授权也称 DNS 权威,即一个区域的 DNS 数据的维护者,如 www.baidu.com 的资源记录是由 baidu.com 的权威服务器 “ns2.baidu.com ” 来进行输入和维护的,只有 “ns2.baidu.com ” 相关服务器的管理者才可进行 www.baidu.com 域名记录的配置。一个授权服务器可管理多个区域 ,即管理多个 zone ,前提是将当前区已授权给当前授权服务器进行管理。

一般授权服务器又分为主名字服务器和辅名字服务器,主名称服务器主要进行对区文件管理,辅名字服务器是主名字服务器的备份,同时承载一部分解析负载。辅助服务器中的 zone 文件一般为只读,zone 文件通过特殊协议进行主辅同步。一般管理员只需要修改主名字服务器的 DNS 记录,即可全网生效。

我们大多数情况下听到的智能 DNS 平台,基本都属于 DNS 授权服务器的种类,如 DNSPOD、CLOUDXNS,或是万网(阿里云)的 DNS 解析平台、新网的 DNS 解析平台。也有很多大学或政府机构,通过搭建属于自己的 DNS 授权服务器进行区和域的管理。一般授权服务器均通过开源软件 BIND 搭建,详见:https://www.isc.org/downloads/bind/ 。(有关如何搭建 DNS 授权服务器和智能 DNS 的介绍将在后续文章中详细讲解,欢迎持续关注)

(2)递归服务器

递归服务器主要是用于接收并应答从 DNS 客户端或解析器发来的初始 DNS 查询,若本地没有查询的数据,则代替 DNS 客户端从根逐级发起迭代查询,直到请求到结果,并将结果返回给 DNS 客户端;同时对从其它权威服务器获取的域名 IP 地址信息进行缓存。一般递归服务器主要用于运营商或 Global DNS,大多数企业不需要搭建属于自己的递归服务器。

递归服务器一般称为 Local DNS ,如北京联通的 202.106.0.20 ,或者你拉带宽时,运营商的网络自动为您分配的 DNS 地址。Global DNS 一般指全球性的 Local DNS,如谷歌的 8.8.8.8 、CNNIC 的 1.2.4.8 及 114.114.114.114 等。(有关 Local DNS 的技术架构和搭建将在后续文章介绍)

(3)缓存服务器

缓存服务器是递归服务器的前置缓存部分,专门用来存储并缓存已请求过的请求数据,当用户查询相同的域名信息时,则使用缓存服务器中的数据直接应答,加快用户查询 DNS 请求的应答速度,提升用户打开网页的速度。

上文说的 8.8.8.8 一般为缓存服务器地址,真正的递归服务器地址,大多数都会隐藏在缓存服务器后面,通常DNS 服务器都是通过 AnyCast 的架构搭建集群,提升负载能力的同时,可分担 DDOS 攻击的流量等。缓存服务器的性能将随着缓存服务器的数量改变而改变。

6、DNS之资源记录


资源记录是每个域用来存放与域名相关的数据,每个域名通过 DNS 解析得到的结果都是由资源记录提供的。当一个解析器向 DNS 查询一个域名时,它得到的其实是和这个域名相关的资源记录,因此资源记录是域名解析的最根本数据。每条资源记录都包括一个五元组,分别是域名、TTL、信息类型、资源记录类型、值五项,如下图所示:

(1)域名

域名是查询的主关键字,即每一个绝对域名的值,一般是管理员需要增加的域名,如为 fastcp.cn 增加一条 www 的 A 记录,则域名为 “ www.fastcp.cn. ”。代表当用户查询 “ www.fastcp.cn. ” 时,则通过该当资源记录提供应答。

(2)TTL

TTL 即生存期,表示当前资源记录的生存周期为多长时间,一般指递归服务器从授权服务器拿到该条资源记录时的默认生存周期,如 TTL 为 600 ,则代表当前资源记录被缓存的时间为 600 秒,600 秒过后,缓存到期,必须重新到授权服务器进行请求。(一般运营商为了提高带宽用户体验,都会将这个 TTL 值修改为较大的数值,以提升递归服务器和缓存服务器的性能)

一般情况下比较稳定的资源记录,建议将 TTL 值设为较大的数值,而对于经常需要更改值的资源记录,建议可以设置较小的值,如 60 秒。

(3)信息类型

对于 Internet 信息,该项值总为IN ,其它类型信息很少见。

(4)资源类型

常用资源类型包括 SOA、A、AAAA、CNAME、MX、NS、PTR、TXT等。

(5)值

值可以是一个 IP 、域名、ASCII 串,值的定义与资源记录类型强关联。

(6)资源记录例子(仅作为参考)

7、DNS之解析器


DNS 解析器一般指 DNS 客户端,用于发送 DNS 请求,并将结果返回给用户。通常情况下指电脑、手机、终端设备、解析软件工具(如 dig 、nslookup 等)

8、DNS 工作原理


了解 DNS 系统的组成部分后,接下来看一下 DNS 是如何工作的,即 DNS 是如何将一个域名解析成一个 IP 地址的流程。如下图所示,是 DNS 一次完整的解析流程:

如上图所示,DNS 一次完整的域名解析流程如下:(DNS 解析器所在的计算机或浏览器自己有缓存的情况下,会先查询自己计算机和浏览器本地缓存,当本地没有缓存且 HOST 文件中没有域名记录的情况下,才会触发上图的流程)

(1)解析器向本地 Local DNS 发起 www.fastcp.cn 的域名递归解析请求;

(2)Local DNS 会先查询自己的本地缓存是否有该域名的 A 记录,如果有则直接返回结果给解析器;如果本地缓存中无该域名的 A 记录,则 Local DNS 会向根服务器发起查询该域名 IP 地址的迭代请求;

(3)根域名服务器向 Local DNS 返回 CN 域的授权服务器地址;

(4)Local DNS 向 CN 域的授权服务器请求该域名的 IP 地址的迭代请求;

(5)CN 域服务器向 Local DNS 返回 fastcp.cn 的授权服务器地址;

(6)Local DNS 向 fastcp.cn 域的授权服务器请求该域名的 IP 地址的迭代请求;

(7)fastcp.cn 域服务器向 Local DNS 返回 www.fastcp.cn 的 A 记录,告诉 Local DNS 该域名的 IP 地址是 192.168.1.2 。

(8)Local DNS 拿到该域名的 A 记录,缓存在自己的服务器中,并将结果返回给解析器。解析器返回给计算机或浏览器,则计算机通过 HTTP 协议拿到该域名的 IP 地址网址内容,并通过浏览器打开。

为看到实际效果,我在本地完整请求一次 www.fastcp.cn ,来看看是否按照这个流程来给出结果,如下图中使用 dig 工具的域名请求:

上图中的请求,我们可以看出,解析器先去请求 “.” 根服务器,然后再去的 cn 服务器,接下来解析器去请求了 fastcp.cn 的服务器,最终通过 lv3ns2.ffdns.net. 拿到了 42.62.101.185 这个 IP 地址。(有关 Dig 工具的使用方法可自行搜索)

9、DNS 缓存机制


通过上个章节讲的 DNS 请求过程,域名在解析的过程中,DNS 名称服务器,会将请求来的域名空间数据保存至缓存中。通过 DNS 缓存,可以加快 DNS 的解析速度,有点类似 CPU 和内存的关系。在每一次请求中,DNS 服务器都将先查询自己的缓存是否有需要查询的内容,若有则自动返回缓存中的内容,若没有则进行 DNS 递归或迭代查询。

DNS 的缓存无法永久存储,否则 DNS 的记录发生变化时,有可能无法及时更新,导致用户无法打开相应的域名地址。通常情况下 DNS 缓存是有生命周期的,简称 TTL 值,该 TTL 值是由每个域名的授权服务器管理员配置决定的,即我们前面章节讲到的资源记录的 TTL 值。默认情况下 Local DNS 服务器拿到的资源记录 TTL 值为授权服务器配置的。但各大运营商为了减轻递归服务器的压力,都会通过手段将大多数域名的 TTL 值改为较大的数值,以给用户带来更好的体验。

10、DNS 查询


DNS 域名解析的过程中,由 DNS 解析器和 DNS 服务器完成的整个解析过程。在所有的解析过程中,大概会发生递归查询、迭代查询、正向查询、反向查询等。

(1)递归查询是指 DNS 客户端或解析器向本地 Local DNS 发起的查询。

(2)迭代查询是指由本地 Local DNS 向授权服务器逐级发起的查询,即 Local DNS 向根、cn、com、baidu.com 等发起的查询。

(3)正向查询是指通过域名查询 IP 地址,即查询 A 或 AAAA 记录等。

(4)反向查询是指通过 IP 地址查询主机名。反向查询只由查询的名字服务器进行处理,即当收到请求后,查询本地数据库或缓存中有记录,则返回,若无记录,则直接放弃查询,不在进行迭代请求。

11、我该如何查询自己现在用的 Local DNS 地址呢?


(1)如果您是 Windows 用户,你可以打开命令提示符,输入 nslookup 或 ipconfig /all 命令,即可查看自己的 DNS 地址;

(2)如果您是 MAC/linux 用户,你可以通过终端,输入 cat /etc/resolv.conf 或 ifconfig ,即可查看自己的 DNS地址;

(3)如果您是手机用户,您可通过你已连接的 Wi-Fi 信息中的 IP 地址查看自己的 DNS 地址。

(4)当然您也可以对 DNS 进行修改,通常可以修改为 Global DNS 地址,如 114.114.114.114 。

DNS 一个隐藏在互联网身后的贤内助,几乎所有的互联网应用基本都需要 DNS 支撑或帮助,才可以达到最佳的通信效果。本篇是对 DNS 的基础探讨,接下来会基于 DNS 协议、DNS 架构、安全、搭建、运维、DNS 工具、智能 DNS、全球根节点、顶级域名及 CDN 相关周边话题进行探讨。