域名系统DNS
DNS是为各种网络应用(例如:web浏览器或者邮件阅读器)提供的一种核心服务,即名字服务,用来把计算机的名字转换为对应的IP地址。
域名系统初识
在网络层为了更高效的查找转发地址,使用等长的32位IP地址来标志一台主机而不是不等长的主机名(因为机器处理等长的数字比处理等长的字符串更高效)。在应用层为了便于用户记忆,更多的是使用主机名字。
早期ARPANET时代,整个网络只有百台计算机,那个时候使用一个叫做hosts的文件,列出所有主机名字和相应的IP地址,主要用户输入一个主机名字,计算机就可以很快查出对应的IP地址。
DNS不采用单点涉及而采用分布式域名系统的原因
理论上,只使用一台计算机,就可以回答所有对IP地址的查询,但是这种做法却并不可取。原因在于当今因特网上有着数量巨大并且在持续增长的主机,这种集中式出现下列问题:
1.单点故障(这台计算机出现故障,整个因特网发生瘫痪)
2.通信容量(上亿台主机发送的查询DNS报文请求,包括不限于所有的HTTP请求,电子邮件报文服务器,TCP长连接服务,计算机会因为超过符合无法正常工作)
3.远距离的时间延迟(如澳大利亚到纽约)
4.维护开销大(因为所有的主机名 ip映射都要在一个服务器站点更新)
综合上述原因,因特网在1983年采用层次结构的命名树作为主机的名字,并使用分布式的域名系统,这两个文档早已成为了因特网的标准。
因特网的域名系统是一个联机分布式数据库系统,并采用客户/服务器体系。DNS使大多数名字都在本地解析,仅少量解析需要在因特网上通信,因此效率特别高。而且,由于DNS是分布式系统,即使单个计算机除了故障,也不会妨碍整个系统的正常运行。
域名到IP地址的解析是由若干个域名服务器程序完成的。这种域名到IP地址转换的过程叫做域名解析。
DNS是应用层协议,事实上他是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。具体过程如下:
①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如http://www.baidu.com/
, 并将这个主机名传送给DNS应用的客户端
③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接
DNS提供的其他服务
除了进行域名解析,DNS还提供一些其他重要的服务
1.主机别名
一些主机的主机名比较复杂,还可以为该主机其多个简单的别名。应用程序可以调用DNS来获得主机别名对应的规范主机名(不是别名的主机名)以及主机的IP地址
2.负载均衡
DNS允许用同一个主机名对应一个IP地址集合。DNS服务器收到该主机名的解析请求时,随机或循环返回地址集合中的一个地址。一些热门网站,可以利用该服务将该网站复制到多个服务器上,这些服务器公用一个域名,从而实现在这些服务器上的负载均衡。
3.反向域名解析
有时某些应用需要将某个IP地址转化为域名。
因特网的域名结构
由于因特网上用户数量激增,因特网后来采用了层次树状结构的命名方法,任何一个连接在因特网上的主机或者路由器,都有唯一的层次结构的名字,即域名。这里的”域”是名字空间中一个可被管理的划分。域还可以继续划分为子域,如二级域,三级域等。
域名结构由若干个分量组成,各分量之间用点隔开:
~.三级域名.二级域名.*域名
各分量代表不同级别的域名。每一级的域名都由英文字母和数字组成,级别最低的域名写在最左边,级别最高的域名写在最右边。
域名系统不规定一个域名要包含多少个下级域名,也不规定每一级域名代表什么意思,各级域名由其上一级域名管理机构管理,而最高的*域名由ICANN管理。
如下图所示。因特网名字的空间结构实际上是一棵倒过来的树,树根在最上面没有名字。树根下面一级的节点就是最高一级的*域结点。在*域结点下面是二级域结点,下面就是单台计算机。
域名服务器
DNS将整个名字空间划分为很多区,每个区的域名信息由一个权限域名服务器负责管理。
区是域名服务器管辖范围的单位,每个区有一个权限域名服务器。权限域名服务器的责任就是负责本管辖区的域名转换,但其权限范围仅在本管辖区内。
DNS服务器一般分三种,根DNS服务器,*DNS服务器,权威DNS服务器。
域名解析的过程
DNS可以完成域名到IP地址的解析,也可以将IP地址反向解析为域名,但最主要的功能是前一个。
递归查询
主机向本地服务器的查询一般采用递归查询。递归查询就是如果本地域名服务器不知道被查询域名的IP地址时,那么本地域名服务器就以DNS客户的身份向某个根域名服务器继续发出查询请求的报文,即代替该主机继续查询,而不是让该主机自己进行下一步的查询。
迭代查询
迭代查询就是由本地域名服务器进行循环查询。当根域名服务器收到查询请求报文但并不知道被查询域名的IP地址时,这个根域名服务器就把自己知道的定义域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向*域名服务器查询。*域名服务器收到本地域名服务器的查询之后,告诉它下一步应该向哪一个权限域名服务器发起查询,就这样,主机就能查询到域名的IP地址。
因为递归查询对于被查询的域名服务器负担太大,通常采取的模式是:从请求主机到本地域名服务器的查询就是递归查询,而其余的查询是迭代查询。
为了提高DNS查询效率并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛地使用了高速缓存。
距离说明DNS的具体查询过程:(查询域名:www.qq.com)
1.在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有就调用这个网址映射,完成域名解析。
2.如果hosts文件中没有这个域名的映射,则查找本地的DNS解析器缓存,看是否有这个网址映射关系,如果有直接返回,完成域名解析。
3.如果hosts与本地服务器缓存都没有相应的网址映射关系,首先会找到TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名包含在本地配置的区域资源中,则范湖解析的结果给客户,则完成域名解析,此解析具有权威性。
4.如果要查的域名不由本地DNS服务器解析,但该服务器已经缓存了此网址映射的关系,则调用这个IP地址映射,完成域名解析,此解析不权威性。(获取的缓存中的映射关系可能不是最新的)
5.如果本地DNS服务器与本地区域文件与缓存解析都失败,则根据本地DNS服务器的设置进行查询,如果未用转发模式,本地DNS就将请求发送至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该*域名服务器的一个IP。本地DNS服务器收到IP信息之后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://qq.com域服务器,重复上面的动作,进行查询,直至找到www . qq .com主机。
6.如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。