DNS

当你请求www.baidu.com时,为了使用户的主机能够将一个HTTP请求报文发送到Web服务器www.someschool.edu,该用户主机必须获得www.someschool.edu 的IP地址。其做法如下。
同一台用户知己运行着DNS应用的客户端。
浏览器从上述URL中抽取主机名www.someschool.edu,并将这台主机名传给DNS应用的客户端。
DNS客户向DNS服务器发送一个包含主机名的请求。
DNS客户最终会收到一份回答报文,其中含有对应于该主机名的IP地址。
一旦浏览器接收到来自DNS 的IP地址,它能够向位于该IP地址80端口的HTTP服务器进程发起一个TCP连接。
从上个例子中,我们可以看到DNS给使用它的因特网应用带来了额外的时延,有时还相当可观,幸运的事,想获得的IP地址通常缓存在一个附近的DNS服务器中,这有助于减少DNS的网络流量和DNS的平均时延。
除了进行主机名到IP地址的转换外,DNS还提供了一些重要的服务。
主机别名(host aliasing)
有着复杂主机名的主机能拥有一个或多个别名。例如,一台名为relay1.west-coast.enterprise.com的主机,可能还有两个别名为enter-prise.com和www.enterprise.com。在这种情况下,relay1.west-coast.enterprise.com也称为规范主机名。主机别名比主机规范名更加容易记忆。应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址。
邮件服务器别名(mail server aliasing)。 显而易见,人们也非常希望电子邮件地址好记忆。例如,如果Bob在Hotmail上有一个账户,Bob的邮件地址就像bob@hot-mail.com这样简单。然而,Hotmail邮件服务器的主机名可能更为复杂,不想hot-mail.com那样简单好记。电子邮件应用程序可以调用DNS,对提供的邮件服务器别名进行解析,以获得该主机的规范主机名及IP地址。
负载分配
DNS也用于在冗余的服务器(如冗余的Web服务器等)之间进行负载分配。(如cnn.com)被冗余分布在多台服务器上,每台服务器均运行在不同的端系统上,每个都有着不同的IP地址。由于这些冗余的Web服务器,一个IP地址集合因此与同一个规范主机名相联系。DNS数据库中存储着这些IP地址集合。当客户对映射到某地址集合的名字发出一个DNS请求时,该服务器用IP地址的整个集合进行响应,但在每个回答中循环这些地址次序。因为客户通常总是向IP地址排在最前面的服务器发送HTTP请求报文,所以DNS就在所有这些冗余的Web服务器之间循环分配了负载。DNS的循环同样可以用于邮件服务器,因此,多个邮件服务器之间循环分配了负载。DNS循环同样可以用于邮件服务器,因此多个邮件服务器可以具有相同的别名。
假设运行在用户主机上的某些应用程序(如Web浏览器或邮件阅读器)需要将主机名转换为IP地址,这些应用程序将调用DNS的客户端,并指明需要被转换的主机名(在很多基于UNIX的机器上,应用程序为了执行这种转换需要调用函数gethostbyname())。
用户主机上的DNS接收到后,向网络中发送一个DNS查询报文。所有的DNS请求和回答报文使用UDP数据经端口53发送。经过若干毫秒到若干秒的时延后,用户主机上的DNS接收到一个提供所希望映射的DNS回答报文。这个映射结果则被传递到调用DNS的应用程序。因此,从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子。但事实上,实现这个服务的黑盒子非常复杂,它由分布于全球的大量DNS服务器已经定义了DNS服务器与查询主机通信方式的应用层协议组成。
DNS的一种简单设计是在因特网上只使用一个DNS服务器,该服务器包含所有的映射。在这种集中式设计中,客户直接将所有查询直接发往单一的DNS服务器,同时DNS服务器直接对所有的查询客户做出相应。尽管这种设计的简单性非常具有吸引力,但它不适用于当今的因特网,因为因特网有着数量巨大(并持续增长)的主机。这种集中式设计的问题包括:
单点故障:如果该DNS服务器崩溃,整个因特网随之瘫痪!
通信容量:单个DNS服务器不得不处理所有的DNS查询(用于为上亿台主机产生的所有HTTP请求报文和电子邮件报文服务)。
远距离的集中式数据库。单个DNS服务器不可能邻近所有查询客户。如果我们将单台DNS服务器放在纽约市,那么所有来自澳大利亚的查询必须传播到地球的另一边,中间也许还要经过低俗和拥塞的链路,这将导致严重的时延。
维护:单个DNS服务器将不得不为所有因特网主机保留记录,这不仅将使这个中央数据库非常庞大,而且他还不得不为解决每个新添加的主机而频繁更新。

分布式、层次数据库
为了处理扩展性问题,DNS使用了大量的DNS 服务器,
来看一个简单的例子,假设主机cis.poly.edu想知道主机gaia.cs.umass.edu的IP地址。同时假设理工大学(Polytechnic)的本地DNS服务器为dns.poly.edu,并且gaia.cs.umass.edu的权威DNS服务器dns.umass.edu。
首先,主机cis.poly.edu首先向它的本地DNS服务器dns.poly.edu发送一个DNS查询报文。该查询报文含有被转换的主机名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地址进行响应。

前面的例子假设了TLD服务器知道用于主机的权威DNS服务器的IP地址。一般而言,这种假设并不总是正确的。相反,TLD服务器只是知道中间的某个DNS服务器,该中间DNS服务器依次才能知道用于该主机的权威DNS服务器。例如,再次假设马萨诸塞大学有一台用于本大学的DNS服务器,它称为dns.umass.edu。同时假设该大学的每个系都有自己的DNS服务器,每个系的DNS服务器是本系所有主机的权威服务器。在这种情况下,当中间DNS服务器dns.umass.edu收到了对某主机的请求时,该主机名是以cs.umass.edu结尾,它向dns.poly.edu返回dns.cs.umass.edu的ip地址,后者是所有以cs.umass.edu结尾的主机的权威服务器。本地DNS服务器dns.poly.edu则向权威DNS服务器发送查询,该权威DNS服务器将请求的映射发送给本地DNS服务器,该本地服务器依次向请求主机返回该映射。这个例子中,共发送了10份DNS报文

DNS缓存

为了改善时延性能并减少在因特网上到处传输的DNS的报文数量。DNS广泛使用了缓存技术。DNS缓存的原理非常简单。在一个请求链中,当某DNS服务器接收一个DNS回答(例如,包含主机名到IP地址的映射)时,它能将该回答中的信息缓存在本地存储器中。
每当本地DNS服务器dns.poly.edu从某个DNS服务器接收到一个回答,它能够缓存包含在该回答中的任何信息。如果在DNS服务器中缓存了一台主机名/IP地址对,另一个对相同主机名的查询到达该DNS服务器时,该DNS服务器能够提供所要求的IP地址,即使它不是该主机名的权威服务器。由于主机和主机名与IP地址间的映射并不是永久的,DNS服务器在一段时间后将丢弃缓存信息。
举一个例子,假定主机apricot.poly.edu向dns.poly.edu查询主机名cnn.com的IP地址。此后,假定过去了几个小时,Polytechnic理工大学的另外一台主机如kiwi.poly.edu也向dns.poly.edu查询相同的主机名。因为有了缓存,该本地DNS服务器可以立即返回cnn.com的IP地址,而不必查询任何其他DNS服务器。本地DNS服务器也能够缓存TLD服务器的IP地址,因而允许本地DNS绕过查询链中的跟DNS服务器。
DNS记录和报文
共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record, RR),RR提供了主机名到IP地址的映射。每个DNS回答报文包含了一条或多条资源记录。
资源记录是一个包含了下列字段的4元组:
(Name,Value,Type,TTL)
TTL是该机记录的生存时间,它决定了资源记录应当从缓存中删除的时间。
如果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 = MX,则Value是个别名为Name的邮件服务器的规范主机名。举例来说,(foo.com,mail.bar.foo.com,MX)就是一条MX记录。MX记录允许邮件服务器主机名具有简单的别名。值得注意的是,通过使用MX记录,一个公司的邮件服务器和其他服务器(如它的Web服务器)可以使用相同的别名。为了获得邮件服务器的规范主机名,DNS客户应当请求一条MX记录;而为了获得其他服务器的规范和主机名,DNS客户应当请求CNAME记录。
如果一台DNS服务器是用于某特定主机名的权威DNS服务器,那么该DNS服务器会有一条包含该主机名的类型A记录(即使该DNS服务器不是其权威DNS服务器,它也可能在缓存中包含有一条类型A记录)。如果服务器不是用于某主机名的权威服务器,那么该服务器将包含一条类型NS记录,该记录对应于包含主机名的域;它还将包括一条类型A记录,该记录提供了在NS记录的Value字段中的DNS服务器的IP地址。举例来说,假设一台eduTLD服务器不是主机gaia.cs.umass.edu的权威DNS服务器,则该服务器将包含主机cs.umass.edu的域记录,如(umass.edu,dns.umass.edu,NS);该edu TLD 服务器还将包含一条类型A记录,如(dns.umass.edu,128.119.49.111,A),该记录将名字dns.umass.edu映射为一个IP地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值