计算机网络应用层之域名系统DNS

一、为什么存在DNS
就像我们寄信需要一个地址一样,我们需要向网络上的某台主机通信,也要知道我们的主机的地址。我们知道,这个地址就是IP地址,它是一个可以在因特网上唯一标识一台主机的地址。然而就如我们知道的那样,IP地址只是4个十进制数字,并不符合人们的记忆和使用,而人们希望使用有意义的易于记忆的主机名作为地址。而且这也更适合我们的生活习惯。举个例子吧,就像我们身份证号一样,每个人都有一个身份证号,但是我们平时与人交流(通信)时,并不会叫人们的身份证号,而是叫他的名字。然而通过这个名字(假设没有重名),去查身份证的话,我们就可以找到一个对应的身份证号。

然而,从平时使用因特网来看,我们可以通过两种方式来识别主机,一种是主机名,一种是IP地址,例如,可以使用 www.baidu.com来访问百度的网站,当然也可以通过IP地址115.239.210.27来访问百度的网站。就好像我们能用名字和身份证号来确定一个人一样。为什么用主机名也能与指定的主机通信呢?其实这就是DNS的功能了。

因为DNS提供的就是主机名到IP地址转换的目录服务,即我们上面说到的,它会把 www.baidu.com转换成IP地址115.239.210.27。

二、什么是DNS
知道了DNS存在的意义后,让我们更加详细地看看,什么是DNS吧。DNS是一个由分层的DNS服务器实现的分布式数据库,它是一个允许主机查询分布式数据库的应用层协议,DNS协议运行在UDP之上,使用53号端口。

DNS通常由其他应用层协议使用,用于将用户提供的主机名解析为IP地址。下面以客户机A用浏览器通过主机名 www.baidu.com访问百度网站作为例子,简单地介绍一个DNS是如何把这个主机名转化为IP地址的。其做法如下:
1)同一台用户主机上运行着DNS应用的客户机端
2)该浏览器从输入的网址中取得主机名,并将这个主机名传给DNS应用的客户机端
3)该DNS客户机向DNS服务器发送一个包含主机名的请求
4)该DNS客户机最终收到一份回答报文,其中包含对应于主机名的IP地址,在这个例子中为115.239.210.27
5)一旦该浏览器接收到来自DNS的IP地址,它就可以向由该IP地址定位的HTTP服务器发起一个TCP连接。

看到这里,大家应该就能明白为什么我们能以主机名来代替IP地址,与特定的主机进行通信了吧!

三、DNS的工作原理
上面已经简单地跟大家介绍过DNS的工作方式了,但是对于一个这么好的服务、一个这么好用的协议,这点知识并不能满足我们的求知欲,反而让我们更加渴望了解它。

1、分布式、层次数据库
为了处理规模问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在世界各地。注意,没有一台DNS服务器具有所有主机的映射,相反,该映射分布在所有的DNS服务器上。大致来说,有3种类型的DNS服务器:根DNS服务器,顶级域DNS服务器(如com DNS服务器、org DNS服务器、edu DNS服务器等)和权威DNS服务器(如yahoo.com DNS服务器,qt-project.org DNS服务器、umass.edu DNS服务器等),它以为根DNS服务器为树根,按树形层次结构组织起来。

为什么DNS服务器不是集中式而是分布式的呢?试想一下,假如因特网使用集中式的DNS服务器,也就是说,因特网上的所有主机要使用DNS服务,都要向该集中的DNS服务器发送请求,则当DNS服务器发生故障时,因特网上的所有的主机都将不能使用DNS服务。同时,所有的主机都向该DNS服务器发送请求,单个的DNS服务器不得不处理所有的DNS服务请求,然而DNS服务器能接收到的数据却受到通信容量(带宽)的限制。此外,可能该DNS服务器集合可能离请求主机非常远,则如果使用集中式的DNS服务器,则请求主机必须把请求传输非常远的距离。看完下面的DNS缓存后,我们就可以更加清楚地看到分布式、层次的DNS服务器的好处。

PS:至于负责把主机名对应的IP地址的记录放入根DNS服务器的数据库的,是一个全球唯一的机构——注册登陆机构,就是它把记录插入数据库的。

1)根DNS服务器,在因特网上有13个根DNS服务器(标号从A到M),尽管我们将这13个根DNS服务器中的每一个都视为单个的服务器,但实际上,根DNS服务器并不只有13台主机,每台“服务器”实际上是冗余服务器的群集,以提供安全性和可靠性。

2)顶级服务器,负责顶级域名(如,com、org、net)和所有国家的顶级域名(如uk,fr,cn)。

3)权威DNS服务器,在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机映射为IP地址。

4)本地DNS服务器,在上面的介绍中,没有介绍本地DNS服务器,严格点来说本地DNS服务器并不属于DNS服务器的层次结构,但是它对DNS层次结构是非常重要的,在此不得不提。因为主机的本地DNS服务器通常“邻近”本主机,所以当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。

知道了这些内容之后,我们再来看看,上面所说的DNS服务是如何进行的。
1)首先客户机向其本地DNS服务器发送DNS一个DNS查询报文,该报文含有要被转换的主机名 www.baidu.com。
2)本地服务器向根DNS服务器转发该查询报文
3)根DNS服务器注意到其com前缀并向本地DNS服务器返回负责com的顶级DNS服务器的IP地址列表
4)本地DNS服务器再次向这些顶级DNS服务器发送查询报文
5)顶级DNS服务器注意到baidu.com前缀,并返回权威DNS服务器的IP地址列表进行响应
6)最后本地DNS服务器直接向ww.baidu.com重发查询报文,该服务用其IP地址进行响应
其查询过程如下图所示:

其实在现实中,还有一种查询方式,如下:
1)首先,同样地,首先客户机向其本地DNS服务器发送DNS一个DNS查询报文,该报文含有要被转换的主机名 www.baidu.com
2)本地服务器向根DNS服务器转发该查询报文
3)根DNS服务器注意到其com前缀,并向com顶级DNS服务器转发该查询
4)顶级DNS服务器注意到baidu.com前缀,并向ww.baidu.com转发该查询报文
5)最后获得IP地址后,沿着4、3、2、1发送响应报文返回到客户机。

其过程如下图所示:


第二个方法使用的是递归查询,而第一种方式使用的则包括递归查询和迭代查询。

2、DNS缓存
其实前面所描述的过程,并不完全是现实中的查询过程,至少在大多数情况下不是。为什么?然而我们说DNS是分层的、分布式的,但是,在前面的描述中,我们看到无论是第一种还是第二种查询方式,都总要访问那13个根DNS服务器,这就跟集中式没有什么区别了,它同样有着集中式DNS的所有缺点!这是因为我们还没有讨论DNS系统中的一个重要特征——DNS缓存。

实际上,为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。它的原理非常简单,在请求链中,当一个DNS服务器接收到一个DNS回答(即包含主到名到IP的映射)时,DNS服务器能将回答中的信息缓存在本地存储器。

例如,每当本地DNS服务器从某个DNS服务器收到一个回答时,它就缓存包含在该回答中的任何信息。如果在DNS服务器中缓存了一个主机名/IP地址对,另一个对相同主机名的查询到达该DNS服务器时,该服务器就能够直接提供所要求的IP地址,即使它不是该主机名的权威DNS服务器。由于主机和主机名与IP地址间的信息不是永久的,所以DNS服务器在一段时间后,将丢弃缓存的信息。

然而,所有的DNS服务器都采用这种机制——DNS缓存,也就是说,我们的请求将很少会要去到根DNS服务器才能被查询出来,可能在本地DNS服务器就已经存在要要求的主机名的缓存,也可能是在通向根DNS服务器的途中的某台DNS服务器上找到了。

看到这里,你应该明白,为什么DNS是分布式、层次式的了吧,也明白为什么它能解决集中式带来的问题了吧!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值