DNS:因特网的目录服务
在因特网上,主机和人类都一样,可以用很多种方式进行标识,主机的一种标识方法是它的主机名。
但是主机名一般是用IP来表示,IP是由四个字节组成,并且有严格的层次结构,不利于人类的记忆,为此一种新式的、允许人类以喜欢的方式、创建标识的方式诞生,域名和DNS。
DNS提供的服务
DNS是:
1.一个由分层的DNS服务器实现的分布式数据库。
2.一个使得主机能够查询分布式数据库的应用层协议。
DNS协议运行在UDP之上,使用53号端口。
DNS通常是由其它应用层协议所使用的,包括HTTP、SMTP、FTP等,将用户提供的主机名解析为IP地址。
DNS的其它服务
主机别名
有着复杂的主机名的主机能拥有一个或者多个别名。
例如:
一台名为relay1.west-coast.enterprise.com的主机,可能还有两个别名为enterpraise.com和www.enterprise.com两个别名。
在这种情况下,relay1.west-coast.enterprise.com称为规范主机名。
主机别名比规范主机名更容易记忆,应用程序可以调用DNS来获得主机别名对应的规范主机名以及对应的主机IP地址。
邮件服务器别名
显而易见,人们也希望电子邮件地址也好记忆。
为此电子邮件应用程序也可以调用DNS来对主机名别名进行解析。
例如xxx.@163.com中的163.com就是一个别名。
负载分配
DNS也用在亢余的服务器(如亢余的Web服务器等)之间进行负载分配。
繁忙的站带你被亢余分配在多台服务器上,每台服务器均运行在不同的端系统上,每个都有着不同的IP地址。
由于这些亢余的Web服务器,一个IP地址集合因此与一个规范主机名相联系。
DNS数据库中存储着这些IP地址集合。
当客户映射到某地址集合的名字发出一个DNS请求时,该服务器用整个IP地址集合进行相应,并且对该集合进行遍历循环。
DNS工作机理概述
分布式、层次数据库DNS数据库
为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。
没有一台DNS服务器拥有因特网上所有主机的映射,相反,这些映射分布在所有的DNS服务器上。
大致来说,共有三种类型的DNS服务器:
根DNS服务器、顶级域DNS服务器(Top-Level Domain/TLD)和权威DNS服务器。
三种服务器的结构如下所示。
现在我们假定有一个DNS客户要决定主机名www.amazon.com的IP地址,它的经过路径如下:
客户首先与根服务器之一联系,它将返回顶级域名com的TLD服务器的IP地址。
客户则与这些TLD服务器之一联系,它将返回amazon.com权威服务器的IP地址。
最后客户与amazon.com的全威威服务器之一联系,它为主机名www.amazon.com返回IP地址。
根DNS服务器
有400多个根服务器遍及全世界。
根服务器中提供TLD服务器的IP地址。
顶级域服务器(TLD)服务器
对于每个顶级域(com、org、net、edu、gov)和所有国家的顶级域(uk、fr)等等,都有TLD服务器。
权威DNS服务器
在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。
本地DNS服务器
一般来说,每个ISP都有一台本地DNS服务器(也叫默认名字服务器)
当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台本地DNS服务器的IP地址。
下图是一个简单的本地DNS作用图。
现在是一个简单的例子。
假设主机cse.nyu.edu现在查询主机gaia.cs.umass.edu的IP地址。
则cse,nyu.edu先向本地DNS服务器dns.nyu.edu发送一个DNS查询报文。
随后本地DNS服务器将该报文转发到根DNS服务器,该根DNS服务器注意到其edu前缀并向本地DNS服务器返回负责edu的TLD的IP地址列表。
该本地DNS服务器则再次向这些TLD服务器之一发送查询报文,该TLD服务器注意到umass.edu前缀并用权威DNS服务器IP地址(dns.umass.edu)进行响应。
最后,本地DNS服务器向dns.umass.edu权威服务器发送查询报文,dns.umass.edu用gaia.umass.edu的IP地址返回,最后经由本地DNS服务器返回给请求主机cse.nyu.edu。
在该例子中,一共发送了四份查询报文,四份回答报文,共计八份报文。
递归查询和迭代查询
上面例子中(图2.18)同时利用了递归查询和迭代查询。
从cse.nyu.edu到dns.nyu.edu发出的查询是递归查询。
后继的3个查询都是迭代查询。
下面的图是一条全部为递归查询的查询链,但是实际应用并不是这种方式,而是上面所讲的递归查询和跌打查询一起使用。
DNS缓存
DNS缓存是为了改善时延并减少在因特网上到处传播DNS报文数量而诞生的。
在一个请求链中,当某DNS服务器接受一个DNS回答后,会保存该回答的记录并且缓存在本地存储器中。
例如,在上面的例子中,本地DNS服务器dns.nyu.edu接收到一个DNS服务器的回答后,后面另一个对相同主机查询到达该DNS服务器后,本地DNS就可以直接返回对应的IP地址,而不再需要查询其它DNS服务器。
值得注意的是,缓存并不是永久的,DNS服务器在一段时间后就会丢弃缓存的信息。
DNS记录和报文
DNS记录
共同实现DNS分布式数据库的所有DNS服务器都存储了资源记录(Resource Record/RR)
RR提供了主机名到IP地址的映射。
一个DNS回答报文一般包含了多个RR。
资源记录是一个包含了下列字段的4元组。
TTL是该记录的生存时间,它决定了资源记录应当在缓存中删除的时间。
其中,Name和Value的值取决于Type。
若Type = A。
则Name是主机名,Value是该主机名对应的IP地址,例如(relay1.bar.foo.com,145.37.93.126,A)就是一条A记录。
若Type = NS。
则Name是一个域(如foo.com),而Value是个知道如何获得该域中IP地址的权威DNS服务器的主机名,(foo.com,dns.foo.com,NS)就是一个NS记录。
若Type = CNAME。
则Value是别名为Name的主机对应的规范主机名,(foo.com,relay1.bar.foo.com,CNAME)就是一个CNAME记录。
如果Type = MX。
则Value是一个别名为Name的邮件服务器的规范主机名,(foo.com,mail.bar.foo.com,MX)就是一条MX记录。值得注意的是,为了获得邮件服务器的规范主机名,DNS客户应当请求一条MX记录,而为了获得其它服务器的规范主机名,DNS客户应当请求CNAME记录。
DNS报文
DNS只有查询报文和回答报文。
查询报文和回答报文是一样的格式。
前12个字节是首部区域:
其中,标识符是一个16bit的数,用于标识唯一的一组报文(查询/回答)。
标志中有着若干标志,例如是“查询/回答”中的什么,查询的是权威NDS服务器还是TLD服务器等等。
剩下的四个数量字段(问题数、回答RR数、权威RR数、附加RR数)指出了在首部后的四类数据区域出现的数量。
问题区域包含着正在查询的信息,包含:
1.名字字段,正在被查询的主机名字。
2.类型字段,指出有关该名字正在被查询的问题类型,是A还是MX等等。
回答区域包含了对最初请求的名字的资源记录:
(A、NS、CNAME、MX)等等都在这里。在回答报文的回答区域中可以有很多条RR,因为一个主机名可以有很多个IP地址。(例如亢余Web服务器)
权威区域包含了其它权威服务器的记录。
附加区域包含了其它有帮助的记录:
例如对于一个MX回答,可能该附加区域包含了一个关于MX回答中Value规范主机名的IP地址的A记录。
更多可以使用nslookup程序来直接发送查询DNS报文。