配色: 字号:
2.5DNS:因特网的目录服务
2014-06-25 | 阅:  转:  |  分享 
  
第二章应用层



2.5DNS:因特网的目录服务



因特网上的主机可以用多种方式识别,一种是用它的主机名,如www.aaa.com,这些名字便于记忆。然而,主机名提供了很少关于主机在因特网中位置的信息。此外,主机名可能由不定长的字母数字组成,所以路由器很难处理。基于这些原因,主机可以使用IP地址进行识别。



一个IP地址由4个字节组成,并有着严格的层次结构。例如,像121.7.106.83这样一个IP地址,其中的每个字节都被句点分隔开来,表示了0-255的十进制数字。我们说地址有层次结构是因为当我们从左至右扫描它时,会得到越来越详细的关于主机位于因特网何处的信息。



2.5.1DNS提供的服务



上面提到的两种识别主机的方式,人们更喜欢便于记忆的主机名,而路由器则喜欢定长的、有着层次结构的IP地址。为了折中这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录服务。这就是域名系统(DomainNameSystem,DNS)的主要任务。DNS是:一个由分层的DNS服务器实现的分布式数据库;一个允许主机查询分布式数据库的应用层协议。DNS服务器通常是运行BIND(BerkeleyInternetNameDomain)软件的UNIX机器。DNS协议运行在UDP之上,使用53号端口。



DNS通常由其它应用层协议(包括HTTP、SMTP、FTP)使用,用于将用户提供的主机名解析为IP地址。举一个例子,为了使用户的主机能够将一个HTTP请求报文发送到Web服务器www.aaa.com,该用户主机必须获得www.aaa.com的IP地址,其做法如下:



同一台用户主机上运行着DNS应用的客户机端。



该浏览器从上述URL中抽取出主机名www.aaa.com,并将这个主机名传给DNS应用的客户机端。



该DNS客户机向DNS服务器发送一个包含主机名的请求。



该DNS客户机最终会收到一份回答报文,其中含有对应于该主机名的IP地址。



一旦该浏览器接收到来自DNS的IP地址,它就可以向由该IP地址定位的HTTP服务器发起一个TCP连接。



从该例子中,我们可以看到DNS给使用它的因特网应用带来了额外的时延。



除了进行主机名到IP地址的转换外,DNS还提供了一些重要的服务:



主机别名(hostaliasing):有着复杂主机名的主机可以拥有一个或者多个别名。例如,一台名为relay1.west-coast.enterprise.com的主机,可能还有两个别名---enterprise.com和www.enterprise.com。在这种情况下,relay1.west-coast.enterprise.com也叫规范主机名(canonicalhostname)。主机别名比规范主机名更容易记忆。应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址。



邮件服务器别名(mailserveraliasing):人们也希望电子邮件地址好记忆。例如Bob在Hotmail上有一个账户,Bob的邮件地址就像bob@hotmail.com这样简单。然而,Hotmail邮件服务器的主机名可能更为复杂。电子邮件应用程序调用DNS,对提供的邮件服务器别名进行解析,以获得该主机的规范主机名及其IP地址。MX记录允许一个公司的邮件服务器和Web服务器使用相同的主机名。例如一个公司的Web服务器和邮件服务器都可以叫做enterprise.com。



负载分配(loaddistribution):DNS也用于在冗余的服务器之间进行负载分配。繁忙的站点被冗余分布在多台服务器上,每台服务器均运行在不同的端系统上,有着不同的IP地址。对于这些冗余的Web服务器,一个IP地址集合对应于同一个规范主机名。DNS数据库中存储着这些IP地址集合。当客户机为映射到这个IP地址集合的名字发出一个DNS请求时,该服务器用包含全部这些地址的报文进行回答,但在每个回答中旋转这些地址排放的顺序。因为客户机通常总是向IP地址排在最前面的服务器发送HTTP请求报文,所以DNS就在所有这些冗余的Web服务器之间旋转分配负载。此分配方式同样可用于邮件服务器。



DNS工作机理概述



假设运行在用户主机上的某些应用程序需要将主机名转换为IP地址,这些应用程序将调用DNS的客户机端,并指明需要被转换的主机名。用户主机上的DNS接收到后,向网络中发送一个DNS查询报文,所有的DNS请求和回答报文使用UDP数据报经端口53发送。经过若干毫秒到若干秒的时延后,用户主机上的DNS接收到一个提供所希望映射的DNS回答报文。这个查询结果则被传递到调用DNS应用程序。



DNS的一种简单设计方式是在因特网上只使用一个DNS服务器,该服务器包含所有的映射。在这种集中式设计中,客户机直接将所有查询直接发往单一的DNS服务器,同时该DNS服务器直接对所有的查询客户机做出响应。尽管这种设计方式非常具有吸引力,但它不适用于当今的因特网,因为因特网有着数量巨大的主机。这种集中式设计的问题包括:



单点故障(asinglepointoffailure):如果该DNS服务器崩溃,整个因特网将随之瘫痪。



通信容量(trafficvolume):单个DNS服务器不得不处理所有的DNS查询。



远距离的集中式数据库(distantcentralizeddatabase):单个的DNS服务器不可能‘邻近’所有查询客户机。如果我们将单台DNS放在美国,那么所有来自澳大利亚的查询必须传播到地球的另一边,中间也许还要经过低俗和拥塞的链路,这将导致严重的时延。



维护(maintenance):单个DNS服务器将不得不为所有的因特网主机保留记录。这不仅将使这个中央数据库非常庞大,而且它还不得不为解决每个新添加的主机而频繁更新。



在单一DNS服务器上运行集中式数据库完全没有可扩展能力,因此,DNS采用了分布式设计方案。为了处理规模问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。没有一台DNS服务器具有因特网上所有主机的映射,该映射分布在所有的DNS服务器上,大致上看,有三种类型的DNS服务器:根DNS服务器、顶级域DNS(Top-LevelDomain,TLD)服务器和权威DNS服务器。这些服务器以图2-19中所示的层次结构组织起来。





假定一个DNS客户机要确定主机名www.aaa.com的IP地址。粗略来说,将发生下列事件。该客户机首先与根服务器之一联系,它将返回顶级域名com的TLD服务器的IP地址。该客户机则与这些TLD服务器之一联系,它将为aaa.com返回权威服务器的IP地址。最后,该客户机为aaa.com联系权威服务器之一,它为主机名www.aaa.com返回IP地址。



根DNS服务器:在因特网上有13个根DNS服务器,大部分位于北美洲。尽管我们将这13个根DNS服务器中的每个视为单个的服务器,但每台‘服务器’实际上时冗余服务器的群集,以提供安全性和可靠性。



顶级域服务器:这些服务器负责顶级域名(如com、org、net、edu和gov)和所有国家的顶级域名(如uk、cn、fr和jp)。



权威DNS服务器:在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。由组织机构的权威DNS服务器负责保存这些DNS记录。组织结构可以选择实现它自己的权威DNS服务器来保持这些记录,另一种方法是支付费用将这些记录存储在某个服务提供商的权威DNS服务器中



还有一类重要的DNS,称为本地DNS服务器。它严格来说并不属于DNS服务器的层次结构,但它对DNS层次结构很重要。每个ISP都有一台本地DNS服务器。当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台其本地DNS服务器的IP地址。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。



我们来看一个简单的例子,假设主机cis.poly.edu想知道主机gaia.cs.umass.edu的IP地址,它的本地DNS服务器为dns.poly.edu,并且gaia.cs.umass.edu的权威DNS服务器为dns.umass.edu。如图2-21所示,主机cis.poly.edu首先向它的本地DNS服务器dns.poly.edu发送一个查询报文。该查询报文含有被转换的主机名gaia.cs.umass.edu。本地DNS服务器将该报文转发到根DNS服务器。该根DNS服务器注意到其edu前缀并向本地DNS服务器返回负责edu的TLD的IP地址列表。该本地DNS服务器则再次向这些TLD服务器发送查询报文。该TLD服务器注意到umass.edu前缀,并用权威DNS服务器的IP地址进行响应,该权威DNS服务器是负责马萨诸塞大学的dns.umass.edu。最后,本地DNS服务器直接向dns.umass.edu重发查询报文,dns.umass.edu用gaia.cs.umass.edu的IP地址进行响应。在本例中,为了获得一个主机名的映射,共发送了8份DNS报文:4份查询报文和4份回答报文。



图2-21所示的例子利用了递归查询(recursivequery)和迭代查询(inerativequery)。从cis.poly.edu到dns.poly.edu发出的查询是递归查询,因为该查询请求dns.poly.edu以自己的名义获得该映射。而后继的3个查询是迭代查询,因为所有的回答都是直接返回给dns.poly.edu。从理论上讲,任何DNS查询既可以是迭代的也可以是递归的。实际中,查询通常遵循图2-21中的模式:从请求主机到本地DNS服务器的查询是递归的,其余的查询是迭代的。



DNS系统的一个重要特征:DNS缓存(DNScaching)。DNS缓存的原理非常简单:在请求链中,当一个DNS服务器接收一个DNS回答(例如,包含主机名到IP地址的映射)时,DNS服务器能将回答中的信息缓存在本地存储器。例如,在图2-21中,每当本地DNS服务器dns.poly.edu从某个DNS服务器接收到一个回答,它就缓存包含在该回答中的任何信息。如果在DNS服务器中缓存了一个主机名/IP地址对,另一个对相同主机名的查询到达该DNS服务器时,该服务器能够提供所要求的IP地址,即使它不是该主机名的权威DNS服务器。由于主机和主机名与IP地址间的映射不是永久地,所以DNS服务器在一段时间后将丢弃缓存的信息。



DNS记录和报文



实现DNS分布式数据库的所有DNS服务器共同存储着资源记录(ResourceRecord,RR),RR提供了主机名到IP地址的映射。每个DNS回答报文包含了一条或多条资源记录。资源记录是一个包含了下列字段的4元组:(Name,Value,Type,TTL)。TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间,在下面的例子中,我们忽略TTL。



Name和Value的值取决于Type:



如果Type=A,则Name是主机名,Value是该主机名的IP地址。因此,一条类型为A的资源记录提供了标准的主机名到IP地址的映射。例如,(relay1.bar.foo.com,145.37.93.126,A)就是一条类型A的记录。



如果Type=NS,则Name是域(如foo.com),而Value是知道如何获得该域中主机IP地址的权威DNS服务器的主机名。这个记录用于沿着查询链路进一步路由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记录。MX记录允许邮件服务器的主机名具有简单的别名。注意,通过使用MX记录,一个公司的邮件服务器和其它服务器(如它的Web服务器)可以使用相同的别名。为了获得其它服务器的规范主机名,DNS客户机应当请求一条MX记录;而为了获得其它服务器的规范主机名,DNS客户机应当请求一条CNAME记录。



DNS只有查询和回答这两种报文。并且,查询和回答报文有着相同的格式,如图2-13所示:



前12个字节是首部区域,其中有几个字段。第一个字段是一个16比特的数,用于标识该查询。这个标识符会被复制到对查询的回答报文中,以便让客户机用它来匹配发送的请求和接收到的回答。标志字段中含有若干标志。1比特的‘查询/回答’标志位指出报文是查询报文(0)还是回答报文(1)。当某DNS服务器正好是被请求主机的权威DNS服务器时,1比特的‘权威的’标志位被置在回答报文中。如果客户机(主机或者DNS服务器)希望DNS服务器执行递归查询,将设置1比特的‘希望递归’标志位。如果该DNS服务器支持递归查询,在它的回答报文中会对1比特的‘递归可用’标志位置位。在该首部中,还有4个‘数量’字段,这些字段指出了在首部后4类数据区域出现的数量。



问题区域包含着正在进行的查询信息。该区域包括:名字字段,用于指出正在被查询主机名字;类型字段,用于指出正被询问的问题类型,例如是与一个名字相联系的主机地址(类型A)还是某个名字的邮件服务器(类型MX)。



在来自DNS服务器的回答报文中,回答区域包含了对最初请求的名字的资源记录。每个资源记录中有Type(如A、NS、CNAME和MX)字段、Value字段和TTL字段。在一个回答报文的回答区域中可以包含多条RR,因为一个主机名可以对应多个IP地址。



权威区域包含了其它权威DNS服务器的记录。



附加区域包含了其它一些有帮助的记录。例如,对于一个MX请求的回答报文的回答区域中包含了一条资源记录,该记录提供了邮件服务器的规范主机名。该附加区域就可以包含一个类型A记录,该记录提供了对于该邮件服务器的规范主机名的IP地址。



上面提到的是如何从DNS数据库中取数据,再来看一下这些数据最初是怎样进入数据库中的。当你刚创建了一个公司,第一件事是在注册登记机构注册域名aaa.com。注册登记机构(registrar)是一个商业实体,它验证域名的唯一性,将域名输入DNS数据库,对所提供的服务收取少量费用。



当向某些注册登记机构注册域名aaa.com时,需要向该机构提供你的基本权威DNS服务器和辅助权威DNS服务器的名字和IP地址假定该名字和IP地址是dns1.aaa.com和dns2.aaa.com及212.212.212.1和212.212.212.2。对这两个权威DNS服务器的每一个,该注册登记机构确保将一个类型NS和一个类型A的记录输入TLDcom服务器。特别是用于aaa.com的基本权威服务器,该注册登记机构将下列两条资源记录插入该DNS系统中:(aaa.com,dns1.aaa.com,NS),(dns1.aaa.com,212.212.212.1,A)。



你也必须确保用于Web服务器www.aaa.com的类型A资源记录和用于邮件服务器mail.aaa.com的类型MX资源记录被输入你的权威DNS服务器中。

献花(0)
+1
(本文系miracle859首藏)