DNS服务器是如何工做的
原文:https://www.slashroot.in/how-dns-worksnode
做者:Sarath Pillai数据库
原文发表日期:2012年10月22日浏览器
翻译:tommwq服务器
译文:http://tommwq.tech/blog/?p=344网络
1 DNS服务器历史简介
你们好!在这篇文章中,咱们将讨论互联网世界中最重要、最不可或缺的资源。这个资源咱们每一个人都会用到,不管咱们是否了解它。网站
网络中的每台机器都被一个数字地址所标识。网络中的机器使用这个地址相互通讯。若是没有将数字地址和一个名字相关联,要记住网络中全部的数字地址是很是困难的。即便对于本地网络中的少数主机,记住所有地址也是很难的。更不要说记住互联网上4亿多台主机的地址了。google
最初了解决这个问题,产生了hosts文件的概念。网络中的每台机器都有一个hosts文件(/etc/hosts),其中包含了名字到数字地址的映射。但随着时间的推移,问题来了:url
- 每台机器都须要本身更新地址映射条目。
- 没有通知机制,让客户端知道添加了新的地址映射条目。
- 随着时间的推移,hosts文件不断膨胀,变得难以处理。
在20世纪70年代中期,名字服务器(name servers)的概念出现了。名字服务器背后的思想是:人们更容易记住名字而非数字,尤为是名字描述了资源的某些特色时。spa
在网络中把名字转换成数字地址的问题,几乎和计算机网络自己同样古老。操作系统
若是网络中存在名字服务器,机器只需知道名字服务器的数字地址,以及目标机器或网站的名字。有了这些信息,机器能够向名字服务器查询目标机器的数字地址(IP地址)。
集中式名字服务器比/etc/hosts文件的解决方案更好。如今有了一个专门用于解析名字的中央服务器,机器只须要知道名字服务器的数字地址。不管什么时候发出请求,名字服务器都会返回目标机器名字对应的数字地址。
拥有中心名字服务器的主要优势在于,服务器的IP地址能够在其余机器无感知的状况下发生变动。此时名字服务器只须要更新IP地址条目。
可是中心名字服务器也有一些缺点,要是中心服务器不可用了怎么办?所以产生了多个名字服务器的想法,在网络中,一台做为主服务器,其余做为辅助服务器。若是主服务器不可用,则向辅助服务器查询答案。
即便是这种方案(主服务器和辅助服务器)也存在一些缺点。具体以下:
- 随着网络中名字数量的不断增长,名字服务器很难从数百万个条目中检索信息。咱们须要一种方法来管理这些名字。
- 假设一个名字服务器每秒收到大量查询请求,在这种状况下,名字服务器的负载会增长。咱们须要找到一种方法来分散负载。
- 咱们须要一种机制来隔离名字服务器中条目的维护工做,由于许多不一样的管理员都会添加条目。
2 互联网域名系统
完整的DNS功能在下面的RFC中解释:
- RFC 1034
- RFC 1035
互联网的域名系统是一个倒立的树状结构。树的顶部是根域名服务器(不用担忧,我会解释什么是根服务器),根服务器后面是顶级域名(Top Level Domain,TLD)服务器,以后是二级域名(Second Level Domain,SLD)服务器。各级域名用点(.)分隔。
理解上面加下划线的文字对于理解DNS的概念很是重要。
根服务器由一个点表示。
顶级域名分为两种类型,通用顶级域名(Generic Top Level Domain,gTLD)是诸如.com、.net、.org、.edu的域名。国家顶级域名(Country Code Top Level Domain,ccTLD)是相似.in、.us、.uk的域名。
咱们称www.slashroot.in是一个域名,这个域名是通用顶级域名、二级域名和主机名的组合。咱们过段时间再讨论这个问题。
咱们一般提到的域名,好比google.com,是顶级域名和二级域名的组合。
这个域名系统(树)中的每一个节点(node)都被分配给一个机构或组织来管理。对特定节点负责的组织被称为是是权威的(authoritative)。在DNS系统中,权威这个词会被屡次用到。
位于系统层级顶点的根名字服务器,其权威机构是一个名为ICANN(互联网名称与数字地址分配机构)的组织。
通用顶级域名也由ICANN管理,并委托给ICANN认证机构。国家顶级域名由ICANN认证给不一样国家管理。
在DNS系统中,委托是一个重要的概念。我会在另一篇文章中介绍委托。
理解下面这个事实是很是重要的:在相似www.slashroot.in的地址中,最左边的部分(www)是主机名。网站使用www主机名只是出于惯例。没有规则要求网站必须使用什么主机名。网站也能够命名为xyz.example.com。
3 当我在浏览器地址栏中输入www.example.com时发生了什么?
根名字服务器(.)是名字服务器层次结构中最重要的资源。当一个名字服务器查询不到请求的信息时,它首先会询问根名字服务器。
一共有13个根名字服务器,包括:
- a.root-servers.net.
- b.root-servers.net.
- c.root-servers.net.
- d.root-servers.net.
- e.root-servers.net.
- f.root-servers.net.
- g.root-servers.net.
- h.root-servers.net.
- i.root-servers.net.
- j.root-servers.net.
- k.root-servers.net.
- l.root-servers.net.
- m.root-servers.net.
如今全部DNS软件都包含上述所有根服务器的IP地址。所以DNS服务器能够访问任意一个根服务器,无需向其余服务器查询。
步骤1:用户在浏览器中输入www.example.com。
步骤2:操做系统首先检查/etc/hosts文件,查找www.example.com的IP地址。(这一机制能够经过/etc/nsswitch调整),而后检查/etc/resolv.conf文件,查找DNS服务器的IP地址。
步骤3:DNS服务器在其数据库中查询www.example.com。若是找到记录,返回。若是没有找到,向根服务器查询。
步骤4:根服务器会返回.com顶级域名服务器的地址(顶级域名服务器知道全部二级域名服务器)。在这里例子中咱们查询的是www.example.com,因此根服务器将返回.com顶级域名服务器的信息。
若是输入的是www.example.net,根服务器将返回.net顶级域名服务器的地址。
步骤5:如今.com顶级域名服务器将为咱们提供example.com二级域名服务器的地址。
步骤6:example.com二级域名服务器将返回www主机(www是主机名)的IP地址。
如今让咱们看看这个过程其实是如何工做的。
[root@myvm1 ~]# dig +trace www.google.com ; <<>> DiG 9.3.4-P1 <<>> +trace www.google.com ;; global options: printcmd . 5 IN NS a.root-servers.net. . 5 IN NS b.root-servers.net. . 5 IN NS c.root-servers.net. . 5 IN NS d.root-servers.net. . 5 IN NS e.root-servers.net. . 5 IN NS f.root-servers.net. . 5 IN NS g.root-servers.net. . 5 IN NS h.root-servers.net. . 5 IN NS i.root-servers.net. . 5 IN NS j.root-servers.net. . 5 IN NS k.root-servers.net. . 5 IN NS l.root-servers.net. . 5 IN NS m.root-servers.net. ;; Received 228 bytes from 192.168.159.2#53(192.168.159.2) in 49 ms com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; Received 504 bytes from 198.41.0.4#53(a.root-servers.net) in 153 ms google.com. 172800 IN NS ns2.google.com. google.com. 172800 IN NS ns1.google.com. google.com. 172800 IN NS ns3.google.com. google.com. 172800 IN NS ns4.google.com. ;; Received 168 bytes from 192.33.14.30#53(b.gtld-servers.net) in 12 ms www.google.com. 300 IN A 74.125.236.48 www.google.com. 300 IN A 74.125.236.50 www.google.com. 300 IN A 74.125.236.51 www.google.com. 300 IN A 74.125.236.49 www.google.com. 300 IN A 74.125.236.52 ;; Received 112 bytes from 216.239.34.10#53(ns2.google.com) in 108 ms
如今你能够从dig输出中清楚地看到,请求首先发送到根服务器。a.root-servers.net返回的都是.com通用顶级域名服务器。而后b.gtld-servers.net返回了google.com的二级域名服务器。最终,ns2.google.com返回了www.google.com的IP地址。
但愿大家喜欢这个帖子!!