一、域名系统(Domain Name System, DNS)
在Internet网络中,计算机相互识别彼此靠的是IP,IP就是用句号分割的一串数字,如202.156.36.89。然而对于人类而言,这样的数字是不容易记忆的,于是给这些数字起名字,这些名字就是所谓的域名。每个域名只能对应一个IP地址(此语似乎有误,但尚未理解,欢迎拍砖),但是同一个IP可以有几个名字,其中一个称为规范主机名,其他的称为别名。
说到起名字,是不能乱起的。DNS发展过程中,人们逐渐规范了域名的命名方式,即采用句点分隔的办法,将域名分为不同的层级,这也方便了后来的管理。正规表示的域名的格式类似这样: 三级域名.二级域名.顶级域名. 如www.baidu.com. 注意,末尾有一个句点,这个句点称为根域名,但是一般都忽略不写(不写不等于不存在),作用类似于linux的文件系统的根目录符号“/”。顶级域名是如com.
org. cn. 这样的存在,是已经被规定好了的,无法自己取名字的,只能沿用;而二级域名 如baidu.com以及三级域名如www.baidu.com是可以自己取名字的。可以看到,越往前域名的级别越低,三级域名之前还可以继续添加四级、五级,但是一般也就到五级了(未查证)。低级别的域名称为上一级域名的子域名。父域名下面可以设置多个子域名,它们指向不同的IP,如baidu.com下面可以有wenku.baidu.com
baike.baidu.com tieba.baidu.com等。假设你注册了一个域名(其实是租赁,过期而不再续费后,就会被销毁供其他人注册、使用),就可以任意设置、使用它的子域名,换句话说,以这个域名为命名基础的子域名也同时被你买断了。
不过显而易见的是,只能注册二级或更低级的域名,顶级域名已经被规定为com、org、net等,或者就是国家的英文缩写如cn(代表中国),简而言之,顶级域名是被一些强力组织如政府垄断的,不能修改。一般而言,注册的域名都是二级域名,但是现在很多好的二级域名(如business.com)都已经被抢注了,不得不佩服这些眼光长远之人的赚钱之道,于是只能注册更低级的域名。
二、DNS服务器
有了DNS,还要有能支持这套理论的硬件,这就是DNS服务器了。我们可以设想,如果把“将域名解析成IP”这件事完全交给一台服务器,然后全球所有的上网主机都需要访问该服务器以获得解析服务,这会是怎样一副场景?全球能上网的主机那么多,这台服务器的访问量绝对会居高不下,那么可能许多人都要排队等候;另外,一旦这台服务器除了故障,那就谁都别想上网了。。
所以,现实中的硬件体系是不会这么设计的。实际上,全球DNS服务器是一个大的分布式数据库系统,对应于域名系统的每一个层级,(都)有专门的服务器来进行管理、服务。如下图:
(此为盗图)
最顶层是根域名服务器(实际上是一个大的系统,而不是只有一台,但这里不再详细介绍,google之),根域名服务器中只存储下一级域名(即顶级域名)的DNS服务器的IP信息,同样的道理,顶级域名服务器里只存储二级域名服务器的IP信息,依此循环。
这些DNS服务器都称为权威服务器,它们对自己存储的信息都拥有读写的权力,通俗的讲,这些服务器可以给属于自己管理的IP起名字(当然实际操作由人类完成,比如叫www.baidu.com),他说这个IP叫什么,那这个IP就叫什么,因此称之为权威。于此对应的,是所谓的本地缓存服务器,这也是一种专门的DNS服务器,不同的是,这类服务器对自己所存储的信息只有读而没有写的权力,即它们不能随意修改IP的名字。本地缓存服务器一般用于链接互联网终端用户,比如我们这种普通网民。每台主机链接入网时,其ISP都会为其分配一台本地缓存服务器的IP,自己的电脑需要DNS服务时,首先询问的是本地缓存服务器,然后由该服务器向外面的主DNS服务器系统查询。它的角色类似于代理。
那么我们来模拟一下,解析一条域名的大致流程是怎样的:
(1)每台主机操作系统上首先都会配备DNS客户端,它发起解析请求比如zh.wikipedia.org
(2)客户端询问本地缓存服务器,本地缓存服务器不知道
(3)本地缓存服务器询问根域名服务器,根域名服务器不存储某个具体的IP,他只有某个顶级域名的DNS服务器IP。于是它通过分析该请求的顶级域名部分,就把管理org顶级域的那些DNS服务器的IP返回给本地缓存服务器
(4)本地缓存服务器询问org顶级域的DNS服务器,该服务器对比自己的存储信息,发现也没有这个域名的IP信息,但是却有管理wikipedia.org域的DNS服务器的IP,于是返回这个IP
(5)本地缓存服务器询问管理wikipedia.org域的DNS服务器,该服务器查询自己的存储,发现正好有对应的IP,于是直接返回该IP
(6)本地缓存服务器将最终结果返回给客户端,同时保留一个这个查询以及答案的备份,这个备份就是缓存。下次再遇到其他客户端查询此域名,直接可以给出答案,而不必再像上面那样反复追问。
在终端可以使用dig命令具体查看,上图:
图中,127.0.1.1是我的本地缓存服务器的IP,这个服务器的BIND软件(成为一台DNS服务器所必须的软件,当然也有竞争者)的配置文件中会有根域名服务器的IP,这几个IP基本是不会变化的;
有了根域名服务器的IP,向其中的一个(本例是g.root-servers.net.)发起查询,得到的回答是com顶级域DNS服务器的IP;
向其中一个(k.gtld-servers.net)发起查询,得到baidu.com二级域名的DNS服务器IP;
向其中一个(ns4.baidu.com)发起查询,得到的是一个规范名bk.n.shifen.com. 也就是说,baike.baidu.com只是一个别名;
于是只好再次使用dig,参数改成bk.n.shifen.com. 然后就能得到最终答案(自己动一下手吧)。
然后就是几个没有搞清楚的问题:
(1)根域名服务器里面存放的只是顶级域名的DNS服务器 的IP,但顶级域名实际上数量相对较少,所以其存储量应该不大。但是根域名服务器却做成一个系统。共有13个IP,每个IP下都有至少几十台服务器,全球大概有1000多台。我猜,之所以这么做,不是因为存储量的问题,而是访问太频繁的缘故。从上面可以看出,本地缓存服务器查询的第一站就是根域名服务器。但是我没有证据。
(2)入网的主机都会分配IP,DNS服务器本身也不例外。在第4步中,顶级域的DNS服务器一般存放的信息仍然是其子域名的DNS服务器的IP,而不会是某个具体主机(我们可以理解为非DNS服务器),但是我没有证据。