DNS浅析

2,158 阅读20分钟

DNS是什么?

DNS,英文全称为Domain Name System。该系统能够提供将某个特定的域名解析为IP地址的互联网服务。它本质上是一个存储着从域名到IP地址映射关系的分布式数据库。它是当今互联网众多核心协议中的一员。

有一种观点是:从严格意义上来说,“互联网”并不等同于“因特网(Internet)”,详情可见吕述望的“中国没有互联网”相关论述报道。虽然本人也持同样的观点,但是鉴于普罗大众已经将两者等同起来了,而历史又是由伟大的人民所创造的,所以,本文中的阐述也会将两者等同起来,不加以区分。

DNS有什么用?

老子的《道德经》第四十二章节有云:“道生一,一生二,二生三,三生万物”。万物总是从相对的“无”慢慢地发展到相对的“有”。因此,我觉要想去了解一个事物的存在的意义,不妨从了解它是如何诞生这一步开始。那么下面,我们来了解一下DNS的简历。

DNS简史

稍微去了解一下,我们都会知道,要想聊DNS的诞生,我们肯定要聊IP地址的诞生;要聊IP地址的诞生,我们必须要聊计算机网络的诞生......

实际上,更加具体的诞生追溯链是这样的:

DNS -> IP地址 -> 计算机网络 -> 网络 -> (电子)计算机

关于人类的第一部电子计算机是由谁发明的这个问题的答案,一直都是众说纷纭。但是,比较公认的是:人类历史上第一台现代电子计算机是1946年在美国宾夕法尼亚大学诞生的ENIAC

好了,我们现在有了“现代”电子计算机后,那我们追溯一下,第一个计算机网络是什么时候,如何诞生的。

要聊第一个计算机网络,那肯定是离不开“ARPA”这个词。ARPA,全称是“Advanced Research Project Agency”。我们翻译过来“(美国国防)高级研究计划局”(有些人翻译为“(美国国防)高级研究计划署”,whatever),顾名思义,这是一个美国联邦政府管辖下的一个官方组织。我们话不多说,第一个计算机网络的诞生就是为了服务于ARPA,即所谓的“ARPANET”。我们的故事,就是从ARPANET说起。

创建一个用于连接计算机网络的这个想法是由J. C. R. Licklider提出的,然后由后来的ARPA信息处理技术办公室主任( Information Processing Techniques Office )Robert Taylor正式提出ARPANET项目。在Robert Taylor的邀请下,Larry Roberts 担任了这个项目的项目经理。Larry Roberts日后也就成为了大名鼎鼎的ARPANET之父。

1969年,ARPANET正式投入使用。在ARPANET之初,它只是使用NCP协议连接着少量的计算机网络而已。随着NCP协议的弃用,转而引入TCP/IP协议和计算机数量的不断增长,ARPANET的规模越来越大了。原本靠一个单层组织架构和中心化的HOSTS.TXT文件(该文件SRI管辖下的NIC((Network Information Center)来维护,该机构被并称为SRI-NIC)来记录网络中各个主机信息的方式已经是行不通了:

这样做会出现以下问题:

  1. 流量和负载问题。由于分发文件所引起的网络流量和分发主机的负载使得SRI-NIC的线路不堪重负。
  2. 名字冲突问题。HOSTS.TXT 文件必须要保持里面主机名字的唯一性,但是无法限制网络上的主机用了相同的名字,这就破坏了网络上的正常应用服务。
  3. 一致性问题。在不断扩张的网络上维持HOSTS.TXT 文件的一致性变得越来越困难。新的文件还没有到达ARPANET 的边缘时,另一端又添加了新的主机或是主机更改了地址。

为了让人能够通过名字来记住主机的同时提高系统架构的弹性,使得在扩展的时候去除不必要的限制,Paul Mockapetris绞尽了脑汁。在真正产出一份架构之前,他必须弄清楚如何组织域名的分配。功夫不负有心人,他终于在1983年发明了DNS。在1986年,IETF(Internet Engineering Task Force )创建之后,DNS成为了众多初始的Internet标准之一(RFC 882)。随后在1987年发布的第1034和1035号草案修正了DNS技术规范,并废除了之前的第882和883号草案。在此之后对Internet标准草案的修改基本上没有对DNS技术规范进行大的改动了。

早期的域名必须以.号结尾。例如,当用户访问www.wikipedia.org的HTTP服务时,我们必须在地址栏输入www.wikipedia.org.(注意,这里有个点),这样DNS才能对此域名进行解析。如今,DNS服务器已经可以自动补上结尾的英文句号了。

小结

一开始,我们是使用HOSTS.TXT文件来记录各个主机的信息的,以便于互联的计算机网络中的主机间通讯。主机名也只是由一个单词或者短语组成的简单名称

到了后来,我们使用了多层级的DNS来替代了HOSTS.TXT文件,域名也变得需要一定的格式和规则了。

从HOSTS.TXT文件到DNS来,自始至终,初衷是没有变的。那就是如何让人类通过一些语义化的名字来使用IP地址。这个问题的解决方案就是在人和机器之间添加一个媒介。这个媒介,以前是HOSTS.TXT文件,现在是DNS。

最后,回归到这个小节的主题:“DNS有什么用?”。答曰:“DNS通过保存域名与IP地址之间的映射关系,使得我们能够通过域名来在浩如星海的计算机网络中准确地访问到某个指定的主机”。

DNS运作原理

在了解DNS的具体解析流程之前,我们必须要先了解DNS的组织架构。

DNS系统架构

DNS系统架构是由两套并行的子系统来组成的。一套是用于商业运作的【组织机构系统】,另外一套是用于技术实现的【服务器分层系统】。顾名思义,组织机构系统是由不同的组织机构来组成的,而服务器分层系统则是由不同层级上的DNS服务器来组成的。两者存在某种程度上的对等关系,同时都是树状的分层结构。通过同时了解这两套系统,我们能够更加立体地,全方位地理解DNS。

组织机构系统

1. IANA 与 ICANN

IANA,全称Internet Assigned Numbers Authority。IANA无疑是组织机构系统这棵树上的根节点。它的工作职责就是确定将要使用哪些TLD(Top Level Domain,顶级域名),以及哪些组织机构能拥有这些TLD。一般而言,IANA会将这些顶级域名分配给组织,从政府到组织联盟再到非营利组织再到公司

当前全球有多少个顶级域名呢?300个,500个?No,是一千多个了。我们常见的“.com”,“.cn”,“.org”等等都是顶级域名。一个完整的TLD列表可以在这里查看。

提起IANA的同时,人们也经常提到ICANN(Internet Corporation for Assigned Names and Numbers ,互联网名称与数字地址分配机构)。“互联网名称与数字地址分配机构”中的“名字”主要指域名,“数字地址”当前主要指的是IPV4地址。IANA是ICANN主要的职能部门,也即是说ICANN管理着IANA。同时,ICANN也负责L-root这个DNS根服务器的运作。很多情况下,人们对这两者是不加以区分的,IANA也即ICANN,ICANN也即IANA

2. ISC

ISC, 全称“Internet Systems Consortium, Inc.”。它是一家在特拉华州注册的非盈利机构。该机构通过开发和维护一些企业级的软件来支持和发展通用的互联网技术,比如说,常用的BIND软件包就是ISC开发和维护的。当前,它运营着全球13个DNS根服务器之一的F-root服务器。

3. Verisign

威瑞信公司(Verisign Inc.)是一家美国公司,总部位于美国弗吉尼亚州雷斯顿,它运营着各种各样的网络基础架构,其中包括Internet的十三个根域名服务器中的两个(A-root和J-root).com.net.name通用的权威注册表。

4. CNNIC

CNNIC,全称“China Internet Network Information Center”,即中国互联网信息中心。CNNIC是在1997年6月3日成立的互联网管理和服务机构。一开始归中国科学院主管,后面改为中央网络安全和信息化委员会办公室主管。现在,它的总部在北京市中关村南四街4号中国科学院软件园1号楼:

百度百科上面说,CNNIC是我国域名注册管理机构和域名根服务器运行机构。 负责运行和管理国家顶级域名.cn、中文域名系统。

这是一种委婉的说法。实际上,CNNIC不但管理着.cn下面的所有域名,还管辖这所有的国内域名(国内域名是在中国大陆的域名注册商注册的域名)。它能够回收任何国内域名和备案政策的存在就是一个佐证。

类似与CNNIC这样的机构还有香港的HKIRC(Hong Kong Internet Registration Corporation Limited,香港互联网注册管理有限公司)和台湾的TWNIC(Taiwan Network Information Center,台湾网络信息中心)。HKIRC负责管理.hk域名,TWNIC负责管理.tw域名。

上面基本的组织机构介绍完成之后,那我们来看看他们在组织机构架构中的位置是如何的。

首先,IANA一旦决定加入某些顶级域名之后,它就会考虑将这些域名分配给各个不同的ORG(组织机构)。在这里,这个组织机构是一个泛义概念,包括有各国政府,组织联盟,非营利性组织和有顶级实力的大公司等等。但是IANA有一个规定,被分配得到顶级域名的这些ORG不得直接参与买卖域名,他们要么自己用,要么就按照拟定的合同直接外包下层的TLDM(Top Level Domain Manager,顶级域名运营商)。比如说,被分配到.com顶级域名的美国政府就是把它外包给了威瑞信公司,由威瑞信公司负责具体的二级域名的分配和.com这个顶级DNS服务器的维护工作。与此有同等身份的还有ISC。正如图中所说的,两个不同的ORG可以外包给同一个TLDM。TLDM拿到二级域名的分配权之后,它可以直接租(为了易于理解,下面用“卖”这个说法)给consumer(消费者),也可以把买卖域名的这个交易权交给底下的reseller(代理商/分销商),而reseller又可以找下一家reseller来代理自己的交易权.....如此类推。最后,reseller才会把域名卖给作为consumer的我们。当然,也有的TLDM直接包揽了域名买卖的商业行为。也就是说,consumer也可以直接跟TLDM打交道。

其实上面所说的ORG就是某个顶级域名的拥有者和管理者,国内称之为【域名注册管理机构】。而TLDM就是我们国内所说的【域名注册商/域名注册服务机构】(可以到这里查询国内当前的域名注册服务机构有哪些),而reseller就是就是国内所说的【域名代理/经销/分销商】。

拿实际情况举个例子。IANA把.cn的管理权交给了CNNIC。而CNNIC把.cn下面的二级域名的分配权交给了阿里云(以前是万网,现如今阿里云收购了万网),我们消费者既可以直接上阿里云去买一个域名,又可以通过阿里云的代理商来买域名,甚至你也可以向阿里云申请做它的代理商也行。当然,你也可以申请成为域名注册商,前提是你的资质得十分雄厚才行(比如说,你可以看看这个例子,看看人家是怎样申请成为威瑞信公司的域名注册商的)。在这里例子中,CNNIC就是架构图中ORG,阿里云就是TLDM,而阿里云旗下的代理商就是reseller,买域名的我们自然是consumer了

服务器分层系统

1. DNS客户端

DNS客户端,DNS client。它是内置在操作系统里面的一个服务组件。它主要是负责缓存DSN的解析结果,并注册当前计算机的计算机名。在window10里面,DNS客户端长这样:

2. 本地DNS服务器

本地DSN服务器,local DSN server,又常常称之为“recursive DNS server”,“recursive resolver”或者“DNS recursor”。本地DSN服务器就是负责响应DNS客户端的DNS查询请求,并在DNS分层系统中去从上到下(从root name server到权威DNS服务器)去获取某个具体域名的DNS record的服务器。一般而言,本地DNS服务器是由ISP来提供和维护的。本地DSN服务器处在DNS查找链的始端:

要是想对本地DNS服务器有个准确的概念,可以查看这篇博文

3. 权威DNS服务器

权威DNS服务器,authoritative DNS server。权威DNS服务器是指那个真正知道所访问域名的DNS record信息服务器(包括域名,TTL,记录类型和IP地址等)。它处在DNS查找链的末端:

4. NS服务器

NS服务器,全称name server。name serve根据它所在的层次,又可以分为root name server,TLD name server,二级name server等等。NS服务器就是服务器分层系统中除了本地DSN服务器和权威DNS服务器之外的DNS服务器。一般而言,它们不做DNS解析结果缓存,它们简单地保存和维护着一张NS记录类型的DNS record表。通过这张表, NS服务器能够知道下一层级别域名的NS服务器的IP地址是多少,并将结果告知本地DNS服务器。

值得强调的是,root-name-server,全球只有十三个,编号从A到M。在这十三个根域名服务器中,其中有一个是master服务器,其他是slave服务器。十三个根域名服务器具体的运营维护商列表可以到root-serveers.org查看。

5. ISP

ISP,全称“Internet Service Provider”,即互联网服务提供商。

中国十大ISP有:

  • 中国电信网 (CHINANET, 也称之为中国公用计算机互联网)
  • 中国移动互联网(CMNET)
  • 中国联通互联网(UNINET)
  • 中国长城互联网(CGWNET)
  • 中国网通公用互联网(CNCNET,包括金桥网CHINAGBN)
  • 中国铁通互联网(CRCNET)
  • 中国卫星集团互联网(CSNET)
  • 中国科技网(SCTNET)
  • 中国教育和科研计算机网络(CERNET)
  • 中国国际经济贸易互联网(CIETNET)

广为人知的,无非是前三家,中国电信,中国移动和中国联通。

三种类型的查询

  • 递归查询(recursive query)。 递归查询就是指DNS客户端(这里用DNS客户端代指终端机器)与本地DNS服务器之间的请求往来。递归查询的结果要么是一个具体的DNS record,要么是找不多该域名解析结果的报错信息。

  • 迭代查询(Iterative query)。 而迭代查询就是指本地DNS服务器在DNS分层服系统中【自上而下】地查询域名所对应IP地址的过程。这个自上而下就是指从root name server到权威DNS服务器的追查方向。

  • 非递归查询(non-recursive query)。它就是指本地DNS服务器与某个name server之间的请求往来。

三种类型的DNS缓存

  • 浏览器DNS缓存(browser DNS caching)。如果DNS解析请求是从浏览器发出的话,那么这将是DNS解析的第一站。它缓存着所有已经访问过的域名的DNS解析结果,以便跳过后续的DNS解析流程,直接向该域名的IP地址发起网络连接请求。在chrome浏览器下面,你可以通过chrome://net-internals/#dns来查看你得浏览器DNS缓存。

  • DNS客户端缓存(DNS client caching)。DNS客户端本身主要是为了DNS缓存而生。如果DNS解析解析请求是从浏览器发出的话,那么将会是第二个保存有DNS解析结果缓存的地方。

  • 本地DNS服务器缓存(recursive DNS server caching)。跟前面两个缓存一样,在本地DNS服务器在决定发出DNS解析请求前,它会检查自身的DNS缓存。如果缓存中存在该域名的DNS解析结果,那么就直接返回给终端机器。

上面分别介绍了组织机构系统和服务器分层系统相关概念后,我们将两者结合来看的话,将会得到这样的一个图:

DNS解析流程

在不考虑DNS缓存的情况下,一般而言,DNS的解析包含8个步骤。下面以查询example.com这个域名的IP地址为例,用文字描述如下:

  1. 当用户在浏览器地址栏输入example.com之后,浏览器会通过操作系统的DNS客户端向本地DNS服务器请求该域名的解析结果。
  2. 因为此处不考虑DNS缓存,所以本地DNS服务器会接着向根域名服务器转发请求。
  3. 根域名服务器一看到顶级域名为.com后,它二话不说,直接返回.com这个顶级域名的服务器IP地址给本地DNS服务器。
  4. 本地DNS服务器收到这个IP地址,就接着向.com的顶级域名服务器发送DNS解析请求。
  5. .com的顶级域名服务器一看到二级域名为example,就返回了注册到这个顶级域名之下的二级域名example服务器IP地址给本地DNS服务器。
  6. 同样,本地DNS服务器接着会向example二级域名服务器发送请求。
  7. example二级域名服务器就是所谓的权威DNS服务器。它知道这个域名的所有信息(DNS record),主要是IP地址。于是它就把IP地址返回给本地DNS服务器;
  8. 本地DNS服务器接收到这个域名的IP地址后返回给DNS客户端,DNS客户端再返回到浏览器。接下里,浏览器就可以跟这个IP地址的服务器开始建立连接了。

如果把终端机器跟真正要访问的we服务器的请求往返都算在里面的话,那么整个DNS解析流程是这样的:

另外,如果你想以拟人化的方式去帮助自己理解的话,那么这张图也是可以帮到你的:

DNS实践

下面我们以解析news.qq.com域名的IP地址为例,使用ISC软件包BIND里面的dig工具来演示一下整个解析过程。

首先,我们在Mac系统的命令行窗口里面敲下“dig +trace news.qq.com”,我们就会看到以下的打印结果:

// 第一段
; <<>> DiG 9.8.3-P1 <<>> +trace news.qq.com
;; global options: +cmd
.   378722 IN NS e.root-servers.net.
.   378722 IN NS a.root-servers.net.
.   378722 IN NS l.root-servers.net.
.   378722 IN NS f.root-servers.net.
.   378722 IN NS i.root-servers.net.
.   378722 IN NS c.root-servers.net.
.   378722 IN NS j.root-servers.net.
.   378722 IN NS g.root-servers.net.
.   378722 IN NS d.root-servers.net.
.   378722 IN NS m.root-servers.net.
.   378722 IN NS b.root-servers.net.
.   378722 IN NS h.root-servers.net.
.   378722 IN NS k.root-servers.net.
;; Received 508 bytes from 192.168.43.1#53(192.168.43.1) in 68 ms
// 192.168.43.1是本地DNS服务器的IP地址,而以上罗列的就是十三个神神秘秘的根域名服务器(编号从a-m)。

// 第二段
com.   172800 IN NS k.gtld-servers.net.
com.   172800 IN NS l.gtld-servers.net.
com.   172800 IN NS j.gtld-servers.net.
com.   172800 IN NS f.gtld-servers.net.
com.   172800 IN NS d.gtld-servers.net.
com.   172800 IN NS h.gtld-servers.net.
com.   172800 IN NS b.gtld-servers.net.
com.   172800 IN NS g.gtld-servers.net.
com.   172800 IN NS a.gtld-servers.net.
com.   172800 IN NS e.gtld-servers.net.
com.   172800 IN NS c.gtld-servers.net.
com.   172800 IN NS i.gtld-servers.net.
com.   172800 IN NS m.gtld-servers.net.
;; Received 492 bytes from 192.36.148.17#53(192.36.148.17) in 97 ms
// 192.36.148.17是第一个作出响应的根域名服务器的IP地址。该服务器的DNS record如上。

// 第三段
qq.com.   172800 IN NS ns1.qq.com.
qq.com.   172800 IN NS ns2.qq.com.
qq.com.   172800 IN NS ns3.qq.com.
qq.com.   172800 IN NS ns4.qq.com.
;; Received 293 bytes from 192.43.172.30#53(192.43.172.30) in 489 ms
// 192.43.172.30是第一个作出响应的顶级域名服务器的IP地址。该服务器的DNS record如上。

// 第四段
news.qq.com.  86400 IN NS ns-tel1.qq.com.
news.qq.com.  86400 IN NS ns-tel2.qq.com.
;; Received 137 bytes from 101.89.19.165#53(101.89.19.165) in 127 ms
// 101.89.19.165是第一个作出响应的二级域名服务器的IP地址,该服务器也就是所谓的权威服务器。该服务器的DNS record如上。

// 第五段
news.qq.com.  600 IN CNAME https.qq.com.
https.qq.com.  600 IN A 183.3.226.35
;; Received 65 bytes from 123.151.66.83#53(123.151.66.83) in 66 ms
// 123.151.66.83是第一个作出响应的三级域名服务器的IP地址。该服务器的DNS record如上。

可以看到,打印结果按照迭代查询的顺序,依次分为5个段落。每个段落其实都是DNS record表。而每一次响应本地DNS服务器请求的只有一个服务器,那我们将这个服务器所对应的DNS record抽出来,就会组成这样的一张表:

要查询的域名 TTL 查询信息的类别 record type 服务器名称或者IP地址
. 378722 IN NS e.root-servers.net
com. 172800 IN NS d.gtld-servers.net.
qq.com. 172800 IN NS ns1.qq.com.
news.qq.com. 86400 IN NS ns-tel1.qq.com.
https.qq.com. 600 IN A 183.3.226.35

在这里,我们要对几个表头进行简单的解释:

  • 要查询的域名:当前层级要查询的域名是什么;
  • TTL:Time To Live,DNS缓存的有效时间长度,单位秒;
  • 查询信息的类别:IN 代表类别为 IP 协议,即 Internet;
  • record type:记录条目的类型,常见取值有A,CNAME,NSAAAA
    • A - 即address,代表IPv4地址记录;
    • CNAME - 即Canonical Name,代表别名记录;
    • NS - 即name server,代表是DNS服务器记录;
    • AAAA - 代表IPv6地址记录。

如果将本示例中的整个解析过程画成一张流程图的话,将会是这样的:

参考资料

  1. wikipedia: Robert Taylor
  2. wikipedia: ARPANET
  3. DNS的起源
  4. DNS history. When and why was DNS created?
  5. 工程师最容易搞错的域名知识
  6. Root Zone Database
  7. How many top-level domains are there now
  8. HTIRW: The Business Side of DNS (1)
  9. HTIRW: The Business Side of DNS (2)
  10. 中国互联网络信息中心-用户FAQ
  11. zh.wikipedia:中国互联网络信息中心;
  12. 域名注册商和域名注册机构(域名注册管理机构)有什么不同?
  13. What Is DNS? | How DNS Works?
  14. 13个根域名服务器维护者信息:https://root-servers.org/