我们已经知道,既可以使用主机名标识一台主机,也可以使用IP地址标识。人们更愿意使用便于记忆的主机名标识符,而路由器则只愿使用长度固定并有层次结构的IP地址。
我们可以通过多种方法来识别一个人。例如,通过出生证明上的姓名,还可以通过社会安全编号、通过驾驶执照编号。尽管这些标识都可以用来识别人,但是在某种背景下会有一种标识比其他的标识更加恰当。例如,IRS(美国的一个税收机构)中的计算机喜欢使用固定长度的社会安全编号而不是出生证上的姓名来标注。另——方面,日常生活中人们喜欢用更好记的出生证上的姓名而不是社会安全编号〔确实,你能想象出如果一个人说“嗨,我的名字是132—67—9875,请找一下我丈夫,178—87—1146”会是何等滑稽的场景)。
因特网中的主机就像人一样能以多种力式标识。标识方法之一是使用主机名(hostname)。主机名(例如cnn.com,www.yahoo.com)是助记性的,人们更愿意使用。然而主机名几乎没有提供关于主机在因特网中的位置信息(主机名为sina.com.cn的主机也许是在中国境内,此外不再有别的位置信息了)。另外,主机名是由可变长度的字母数字字符构成的,路由器处理起来有困难。因此因特网中的主机也使用所谓的IP地址标识。我们将在以后深入讨论IP地址,这里只简单地说明一下。IP地址由4个字节构成,具有严格的层次结构。IP地址一般以点分十进制数格式表示,也就是说所有4个字节都以0—255之间的十进制数表示,各个字节之间以点号分隔,例如121.7.106.83。IP地址具有层次结构,当从左到右扫描某个地址时,我们得到关于其主机在因特网中所在位置的越来越明确的信息。这就像从下到上扫描某个邮政地址时,我们得到关于住宅所在位置的越来越明确的信息一样。
DNS提供的服务
我们已经知道,既可以使用主机名标识一台主帆,也可以使用IP地址标识。人们更愿意使用便于记忆的主机名标识符,而路由器则只愿使用长度固定民有层次结构的IP地址。为调解这两种不同的偏好,我们需要一个把主机名转换成IP地址的目录服务。这就是因特网的域名系统(Domain Name System,DNS)的主要任务。DNS既是一个在由名称服务器主机构成的层次结构中实现的分布式数据库,又是一个允许客户主机和名称服务器主机通信以使用域名转换服务的应用层协议。名称服务器主机通常是运行Berkeley Internet Name Domain(简称BIND)软件的UNIX主机。DNS协议运行在UDP之上,使用端口号53。
其他应用层协议(例如HTTP,SMTP,FTP)普遍使用DNS把由用户提供的主机名转换成IP地址。作为例子,我们考虑某个用户使用运行在本地主机上的一个浏览器(也就是HTTP客户)请求http://www.yesky.com时会发生什么。为了把HTTP请求消息发送到名为www.yesky.com的web服务器主机,浏览器必须获悉这台主机的IP地址。我们知道,差不多每台主机都运行着DNS应用的客户端。浏览器从URL中抽取出主机名后把它传递给本地主机上的DNS应用客户端。DNS客户于是向某个DNS服务器发出一个包含该主机名的DNS查询消息。DNS客户最终收到一个包含与该主机名对应的IP地址的应答消息。浏览器接着打开一个到位于该IP地址的HTTP服务器的TCP连接。从这个例子中可以看出,DNS给使用它的因特网应用引入了额外延迟(有时还相当大)。所幸的是,正如我们即将讨论的那样.预期的主机名—IP地址对应关系往往高速缓存在就近的DNS名称服务器主机中,从而帮助降低了DNS访问延迟和DNS网络流量。
除了从主机名到IP地址的转换,DNS还提供其他一些重要的服务:●主机别名(hody aliasing)。具有复杂主机名的主机还可以有一个或多个别名。例如,
主机名为relay1.west-coast.enterprise.com的主机有两个别名:enterprise.com和www.enterprise.com。这种情况下,主机名relay1.west-coast.enterprise.com特称为正规主机名(canonical hostname),另外两个主机名则是别名主机名(alias hostname)。
别名主机名往往比正规主机名更便于记忆。应用可以调用DNS获取所给定别名主机名的正规主机名和IP地址。
●邮件服务器别名(mail server aliasing)。电子邮件地址显然要求便于记忆。例如,如果Bob有一个hotmail账号,那么他的电子邮件地址可能是简单的bob@hotmail.com。然而hotmail邮件服务器的主机名要比hotmail.com复杂且不易记住。电子邮件应用可以调用DNS获取所给定别名主机名的正规主机名和IP地址。事实上,DNS允许一个公司的邮件服务器和Web服务器使用相同的别名主机名。例如,某个公司的web服务器和邮件服务器可以都称为enterprise.com。
●负载分担(load distribution)。DNS还越来越多地用于执行在多个复制成的服务器(例如复制成的Web服务器)之间的负载分担。像cnn.com那样的繁忙站点往往把Web服务器复制成多个,每个服务器运行在不向的端系统上,具有不同的IP地址。对于复制成的多个Web服务器,与其单个正规主机名相关联的是一组IP地址。DNS数据库中保存着这组IP地址。客户发出针对映射到一组IP地址的某个主机名的DNS查询后,服务器响应以整组IP地址,不过每次响应的地址顺序是轮转的。既然访问web站点时,浏览器一般把HTTP请求消息发送给内DNS客户否询到的一组IP地址中的第一个,DNS轮转于是把web站点的访问负载分担在所有复制成的服务器上。电子邮件应用也可以使用DNS轮转,这样多个邮件服务器可以有相同的别名。近来,有些公司已经以更为复杂的方式使用DNS提供web内容分发服务。
DNS在RFC 1034和RFC 1035中有详细说明,并在另外若干个RFC中作了更新。DNS是一个复杂的系统,我们只在这儿讨论其操作的关键方面。感兴趣的读者可以参见协议文档。
DNS工作机理概述
我们就DNS工作机理的讨论将集中在从主机名到IP地址的转换服务上。从客户看来,DNS是一个黑盒子。客户把一个DNS查询消息发送给这个黑盒于,其中指明需要转换成IP地址的主机名。在许多基于UNIX的主机上,应用程序通过调用库函数gethostbyname()发出查询消息。过了从数毫秒到数十秒的一段延迟时间之后,客户收到一个给出所需映射关系的DNS响应消息。因此从客户看来,DNS是一个简单而直接了当的转换服务。然而实现这个服务的黑盒子事实上相当复杂,涉及散布全球的许多台名称服务器主机,以及说明名称服务器和DNS客尸如何通信的一个应用层协议。
DNS可以简单地设计成让单个因特网名称服务器包含所有映射关系。在这种集中式的设计中,客户简单地把所有咨询消息发送给这个惟一的名称服务器,该名称服务器则把响应消息返回给查询的客户。这种设汁尽管具有诱人的简单性,但对于今今的因特网来说却完全不合适,因为其中的主机数非常巨大,而且仍在增长。集中式设计的问题在于:
●单点故障 要是惟一的名称服务器崩溃了,整个因特网也完了。
●巨大访问量 单个名称服务器将不得不处理所有DNS查询消息(因为所有的HITP请求和电子邮件消息都是由数百万台的主机生成的。
●远距离集中式数据库 单台名称服务器主机不可能在所有请求查询的客户主机附近。例如,假设名称服务器在纽约,而所有的查询都来自于地球另一边的澳大利亚,可能要经过缓慢且拥塞的链路。这样造成的远距离访问将导致相当大的延迟。
●维护 单台名称服务器将保存所有因特网主机的记录。这个集中式数据库不仅会相当巨大,而且不得不为每台新增的主机频繁更新。允许任何用户在集中式数据库中注册主机还存在身份认证与授权问题。
总之,存放在单台名称服务器主机中的集中式数据库是不可扩展的。可见DNS必须设计成分布式数据库。实际上,DNS是一个如何在因特网中实现分布式数据库的范例。
为了应对扩展问题,DNS使用以某种层次结构组织的散布全世界各地的大量名称服务器主机。其中没有一个名称服务器拥有因特网中所有主机的主机名—IP地址映射关系。相反,这些映射关系足散布在各个名称服务器上的。近似地说,共有三种类型的名称服务器:局部名称服务器、根名称服务器和权威名称服务器。再近似地说,这些名称服务器本身之间相互作用,并且还和查询主机之间相互作用,如下:
●局部名称服务器
每个ISP一如大学、一个学院中的部门、一个雇员的公司或者一个居民区的ISP———都有一个局部名称服务器(也称为默认名称服务器)。当一台主机发布了DNS查询消息,该消息首先被发送到主机的局部名称服务器上。局部名称服务器上的IP地址通常是在主机中手动设置的(在一台Wlndows机器上可以用你的PC机通过如下过程找到:首先打开控制面板,然后选择“网络”,然后选择己安装的TCP/1P组件,查看它的属性)。局部名称服务器通常是在客户端“附近”的。在一个教育公共机构的ISP情况下,它可能会和客户端主机位于同一个局域网中;对于一个住宅区的ISP来说,名称服务器通常是和客户端主机仅通过少量路由器分隔开来的。如果一个主机为另一属于同一个ISP的主机请求解析,那么局部名称服务器将能够立即提供所请求的IP地址。例如,当主机surf.yesky.com求baie yesky.com的IP地址时,yesky.com的局部名称服务器将不用和任何其他名称服务器联络就能够提供所请求的IP地址。
●根名称服务器
因特网中有十几个左右的根名称服务器,它们目前大多数都位于北美。当一个局部名称服务器无法立即满足一个从主机到来的查询的时候(因为它没有被请求的主机名称记录),局部名称服务器就会作为一个DNS客户端并向根名称服务器查询。如果根名称服务器有该主机的记录,它就会给局部名称服务器发送一个DNS应答消息,并且局部名称服务器给发出查询的主机做以应答。但是根名称服务器可能也没有该主机的记录。相反,根名称服务器知道一个有详细的主机名称映射的“权威名称服务器”的IP地址。
●权威名称服务器
每个主机都被记录在一个权威名称服务器上。通常,一个主机的权威名称服务器是该主机的局部ISP中的名称服务器(事实上,要求每个主机都至少有两个权威名称服务器,以防它们出现故障)。由定义可知,如果它总是存在着将主机名称解析为IP地址的DNS记录,那么该名称服务器对于主机来说就是权威性的。当一个权威名称服务器被一个根服务器查询的时候,权威名称服务器就会用包含着请求映射的DNS应答来响应。然后根服务器将映射发送到局部名称服务器上,然后局部名称服务器将映射转发到发出请求的主机上。很多名称服务器都是同时作为局部和权威名称服务器使用的。
让我们看一个简单的例子。假设主机surf.eurecom.cn想要得到gain.cs.umass.edu的IP地址。并且假设eurecom的局部名称服务器称为dns.eurecom.cn,而gain.cs.umass.edu的权威名称服务器称为dns.umass.edu。如图1所示,主机surf.eurecom.cn首先给它的局部名称服务器dns.eurecom.cn发送一个DNS请求消息。该请求消息包含着要被解析的主机名称,也就是gain.cs.umass.edu。局部名称服务器将查询消息发送到一个根名称服务器。根名称服务器将该查询消息发送到umass.edu域中所有主机的权威名称服务器上,例如,发送到dns.umass.edu。然后权威名称服务器将所要的映射通过根名称服务器和局部名称服务器发送到发出查询的主机上。注意,在这个例子中,为了得到一个主机名称的映射,发送了6个DNS消息:3个查询消息和3个应答消息。
图1 获得域名映射所进行的递归查询
到这里为止,我们的讨论假设了根名称服务器知道了每个主机名的权威名称服务器的IP地址。这个假设可能是不正确的。对于一个给定的主机名称,根服务器可能只知道一个中间名称服务器的IP地址,该中间名称服务器间接地知道主机的权威名称服务器IP地址。为了对此进行描述,再次设想上面的例子中主机surf.eurecom.cn对gain.cs.umass.edu的IP地址发出请求的情况。假设现在麻萨诸塞大学有一个学校的名称服务器,称为dns.umass.edu。还假设麻萨堵塞大学的各个院系都有自己的名称服务器,并且每个系的名称服务器对于该系中所有的主机来说都是权威性的。如图2中所示的那样,当根名称服务器接收到了对以umass.edu为结尾的主机名称的查询时,它会将该查询传送到名称服务器dns.umass.edu。这个名称服务器会将所有的对以.cs.umass.edu结尾的主机名称的查询发送到名称服务器dns.cs.umass.edu上,这个服务器对于以.cs.umass.edu结尾的主机名称来说是权威性的。权威名称服务器将所需的映射发送给中间名称服务器dns.umass.edu,这个服务器将该映射发送给根名称服务器,然后根名称服务器将映射发送给局部名称服务器dns.eurecom.cn,局部名称服务器将该映射发送给发出查询的主机。在这个例子中,共发送了8个DHS消息。事实上,为了解析一个主机名称,可能会发送更多的DNS消息——在根名称服务器和权威名称服务器之间可能会有两个或者更多的中间名称服务器。
图2 根名称服务器和权威名称服务器之间通过中间名称服务器进行递归查询
到此为止,这个例了假设了所有的查询都是所谓的递归查询。当一个主机或者名称服务器A发送一个递归请求给名称服务器B时,服务器B就得到了所请求的代表A的映射并且将该映射传送给A。DNS协议还允许在发出请求的主机和授权名称服务器之间的链式结构中的每一步上执行迭代查询(iterative query)。当一个名称朋务器A对名称服务器B进行迭代查询的时候,如果名称服务器B没有所请求的映射,它就会立即给A发送一个包含者该链式结构中下一个名称服务器,也就是名称服务器C的IP地址的DNS应答。然后名称服务器A直接给名称服务器C发送一个查询。
在解析一个主机名称所要求的查询序列中,有一些查询可以是迭代的,另一些则可以是递归的。图3中描述了递归和迭代查询的结合。通常,除了从局部名称服务器到根名称服务器上的查询是迭代的之外,查询链中的所有查询都是递归的(因为根服务器要对大量的查询进行处理,所以最好在根服务器上使用载荷较少的迭代查询)。
图3 带有递归查询和迭代查询的查询链
到此为止,我们的讨论还没有触及到DNS的一个重要特性:域名解析缓存(DNScaching)。实际上,是为了提高延迟性能并义减少网络中的DN5消息数量,DNS才扩展性地使用了缓存。这种思想非常简单。当一个名称服务器接收到了某个主机名称的DNS映射的时候,它就在将该消息沿着名称服务器的链式结构进行传送的同时,把该映射缓存在局部内存(磁盘或者RAM)中。给定一个缓存的主机名称IP地址解析对之后.如果另一对同一主机名称的查询到达了该名称服务器,即使该名称服务器对于该主机名称不是权威性的,它也可以提供所要求的IP地址了。为了对短暂的主机进行处理,在一段时间(通常设置为两天)之后缓存的记录就被丢弃了。例如,假设surf.eurecom.cn为了得到主机cnn com的IP地址而对DNS进行查询。而旦,假设几个小时之后,另一台主机baue.eurecom.cn也向DNS查询同一个主机名。由于缓存,所以eurecom的局部名称服务器能够立即给发出请求的主机返回cnn com的IP地址,而不需要再到另一个域中的名称服务器上进行查询了。任何名称服务器都能缓存DNS映射。
DNS记录
一起实现DNS分布式数据库的那些名称服务器存储了从主机名到IP地址映射的资源记录(resource record,RR)。每个DNS应答消息携带着一个或者多个资源记录。在本部分与下一部分中,我们提供了对DNS资源记录和消息的简短介绍;DNSRFC文档[RFC 1034,RFC 1035]中描述了更多的细节。
一个四元组的资源记录包含了以下的字段:
(Name,value,type,TTL)
TTL是留住资源记录的时间:它确定了一个资源从缓存中删除的时间。在下面给出的例子记录中,我们将忽略TTL字段。name和value的意义依赖于TyPe:
●如果Type=A,那么Name是一个主机名并且value是该主机名所对应的IP地址。这样,一个TYPE A的记录提供了标难的主机名称到IP地址的映射。作为例子,{relay1.bar.foo com,145.37.93.126,A}就是一个Type A的记录。
●如果Type=NS,那么Name就是一个域(如foo.com),并且value是一个知道如何获得该域中主机的IP地址的权威名称服务器的主机名称。这个记录用于将DNS查询沿着查询的链式结构进行路由。作为例子,{foo.com,dns.foo.com,NS}就是一个Type 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记录使得邮件服务器的主机名具有简单的别名。
如果一个名称服务器对于一个特殊的主机名是权威的,那么这个名称服务器将为这个主机名包含一个Type A记录(即使名称服务器不是权威的,它也可以在它的缓存中包含一个Type A记录)。如果一个服务器对于一个主机名不是权威的,那么该服务器将为包含该主机名的域包含一个Type NS记录:它还包含一个在该NS记录的value字段中提供了名称服务器IP地址的Type A记录。作为例子,假设一个根服务器对于主机gain.cs.umass.edu不是权威的。那么根服务器将包含一个包括了主机cs.umass.edu的域的记录,例如,{umass.edu,dns.umass.edu,NS)。根服务器也包含一个Type A记录,该记录将名称服务器(dns.umass.edu)映射到一个IP地址上,例如,{dns.umass.edu,128.119.40.111,A}。
DNS消息
在前面,我们间接提到了DNS查询和应答消息。它们仅仅是两种DNS消息。而且,请求和应答消息有相同的格式,如图4所示。
图4 DNS消息格式
一个DNS消息的各个字段的语义如下:
●前12个子节是头部区,它有很多字段。第一个字段是一个用来进行标识查询的16比特的数字。这个标识符被拷贝到一个查询的应答消息中,使得客户能够将接收到的应答和所发送的查询相匹配。在标志字段中包括很多标志。一个1比特的查询/应答标志指明了该消息是查询(0)还是应答(1)。当一个名称服务器对于所查询的名称来说是一个权威服务器的时候,应答消息中就对一个1比特的权威标志进行了设置。当一个客户(主机或者名称服务器)希望当它没有该记录时名称服务器执行递归的时候,就设置一个1比特的要求递归标志。如果名称服务器支持递归的话,就在应答中设置一个1比特的递归可用宇段。在头部中,还有四个“数目”字段。这些字段指明了头部之后出现的四种类型的“数据”部分的出现数目。
●问题部分包含了关于所执行的查询的信息。这个区包括了(1)包含了被查询的名称的名称字段,(2)指明了所询问的关于该名称的问题类型的类型字段(例如,与一个名称相关的主机地址——type A,或者一个名称的邮件服务路—type MX)。
●在一个从名称服务器发出的应答中,答案部分包含了最初被查询的名称的资源记录。前面讲过,在每个资源记录中都有Type(例如,A,NS,CNAME和MX),value和TTL。应答可以在答案中返回多个RR,因为一个主机名称可以有多个IP地址(例如,对于前面所讨论的重复的web服务器的情况)。
●权威部分包含了其他权威服务器的记录。
●补充部分包含了其他“有帮助的”记录。例如,一个对应于MX查询的应答中的答案字段将包含与别名NAME相关联的邮件服务器的主机名。补充区将包含一个Type A记录,该记录提供了该邮件服务器的正规主机名所对应的IP地址。以上的讨论集中在如何从DNS数据库中检索数据。你可能会奇怪,最先数据是如何进入到数据库中的呢?直到最近,每个DNS服务器的内容都被静态配置了,例如,由一个系统管理员创建的配置文件。更近的,为了允许从数据库中通过DNS消息动态加入或者删除数据,在DNS协议中加入了UPDATE选项。RFC 2136详细说明了DNS的动态更新。
DNSNet提供了一个很好的、关于DNS的文档集合[DNSNetl999I。因特网软件联盟(Internet Software Consortium)为BIND提供了很多资源,BIND是一个流行的、Unix下的公共域名服务器软件,不过因其暴露出的一些安全问题,目前它正被其它竞争产品逐步替代。
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |