本文参考《计算机网络 自顶向下法》
DNS工作机理分析
DNS:因特网的目录服务
一 DNS提供的服务
DNS除了可以提供主机名与IP地址之间的转换,还可以提供负载均衡。
本文主要记录一下DNS域名服务器解析域名—>IP的流程。
DNS由以下两部分组成:
- 由分层的DNS服务器组成的分布式数据库
- 一个使得主机可以查询分布式数据库的应用层协议
DNS运行在UDP之上,使用53号端口
DNS除了提供主机名与IP地址转换以外,还提供以下服务:
- 主机别名:有时候主机名太长,可以用别名替代。DNS的RR中提供了主机别名与规范主机名的转换。
- 邮件服务别名:DNS同样也提供邮件服务器主机名和别名的转换服务
- 负载均衡:一个IP地址集合同一个规范主机名相联系;当客户发出一个DNS请求时,该服务器会用IP地址的整个集合作为响应,在每个回答中循环这些地址次序。(因为客户一般是向IP地址最前面的服务器发送请求,所以实现了负载均衡)
二 DNS工作机理概述
DNS是一个提供简单、直接的转换服务的黑盒子
事实上,这个黑盒子极为复杂。它由分布于全球的大量DNS服务器以及定义了DNS服务器与查询主机通信方式的应用层协议组成
单点DNS服务器的缺陷:
- 单点故障
- 通信容量
- 远距离的集中式数据库
- 维护
1.分布式、层次数据库
为了处理扩展性问题,DNS使用了大量的DNS服务器。大致来说,有3种类型的服务器:根DNS服务器、顶级域(Top-Level Domain.TLD)DNS服务器和权威DNS服务器
根DNS服务器:因特网上有13个根DNS服务器,这13个服务器实际上是一个冗余的计算机网络以提供安全性和可靠性;它主要提供TLD服务器的IP地址
顶级域DNS服务器:负责顶级域名,如com,org,net,edu,gov以及各个国家的顶级域名,主要提供权威DNS服务器的IP地址
权威DNS服务器:互联网上的每一个能够公共访问的主机都具有一个DNS记录,这些记录由某些组织机构的权威服务器保存。例如常见的服务提供商以及学校和公司都会实现和维护自己的权威服务器来保存一些主机DNS记录。
本地DNS服务器:该DNS服务器不属于上述的层次结构。但它发挥着极其重要的作用
每个ISP(如一个居民区的ISP或者一个机构的ISP)都有一台本地DNS服务器,这些本地DNS服务器通常“邻近”用户主机。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。
各种DNS服务器交互的过程如图所示:
假设主机cse.sicnu.edu需要查询gaia.cs.umass.edu的ip地址,会发生的流程如下:
TLD服务器不一定知道用于主机的权威DNS服务器的IP地址,通常是TLD服务器只是知道中间的某个DNS服务器,该中间DNS服务器依次才能知道用于该主机的权威DNS服务器。(例如上述例子中,权威服务器和gaia.cs.umass.edu的主机之间可能还有处理dns.cs.umass.edu前缀的权威服务器)
上述例子中利用了递归查询和迭代查询:
- 递归查询:DNS服务器收到一个域名解析请求时,如果所要检索的资源记录不在本地,DNS服务器将和自己的上一层服务器交互,获得最终的答案,并将其返回给客户(例如上述的cse.sicnu.edu到dns.sicnu.edu的查询)
- 迭代查询:DNS服务器收到解析请求,首先在本地的数据库中查找是否有相应的资源记录,如果没有,则向客户(本地服务器)提供另外一个DNS服务器的地址,客户(本地服务器)负责把解析请求发送给新的DNS服务器地址
实战中,常常是采用上述的方式进行解析。(只有从请求主机到本地DNS服务器的查询是递归的,其余的查询都是迭代的)
如上述可见,我们为了获得一份主机名的映射,发送了8份DNS报文。消耗太多,所以我们需要引入缓存这一概念。
2.DNS缓存(DNS caching)
为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS缓存有如下作用
DNS服务器在接收到一个DNS回答(包含主机名到IP地址的映射)时,将映射缓存在本地存储器中。
由于主机和主机名与IP地址间的映射并不是永久的,DNS服务器在一段时间后,将丢弃缓存的信息。
本地DNS服务器也可以缓存TLD服务器的IP地址,因而允许本地DNS服务器绕过查询链中的根DNS服务器,事实上,因为缓存的存在,大多数DNS查询中,根服务器都被绕过了。
由此可见,通过DNS缓存可以大大的减少因特网上到处传输的DNS报文数量。
3.DNS工作原理:
这里有一些内容,本文没有说明,感兴趣的可以自己去查一下,主要是为了说明最终会去通过本地DNS服务器去执行递归查询操作
- 当在浏览器中输入URL时,浏览器会先检查自己的缓存是否有域名IP的映射关系,有则直接使用IP进行通信
- 如浏览器没有缓存,则操作系统检查本地hosts文件是否有域名IP的映射关系,有则使用IP进行通信
- 如果hosts没有这个域名的映射,则查找本地DNS解析器缓存是否有映射关系,有则直接返回完成域名解析
- 如果还未找到映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,也就是本地DNS服务器,如果服务器已缓存了映射关系,则使用这个IP地址映射返回完成域名解析,此时解析不具有权威性。
- 如果本地DNS服务器缓存已经失效,进行上述的递归查询和迭代查询操作。
4.DNS记录
所有的DNS服务器共同构成了DNS分布式数据库,在这些DNS服务器中存储了资源记录(Resource Record),RR提供了主机名到IP地址的映射。每个DNS回答报文包含一条或多条资源记录。
RR是一个4元组:(Name,Value,Type,TTL)
TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。
Name和Value的值取决于Type:
- if Type = A then Name是主机名,Value是该主机名对应的IP地址。
- if Type = NS then Name是个域,Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。
- if Type = CNAME then Value是别名为Name的主机对应的规范主机名。
- if Type = MX then Value是个别名为Name的邮件服务器的规范主机名。
在DNS查询链中,通常在获得一个NS类型的RR时,会携带一个A类型的RR,A类型的RR记录了NS类型的RR中Value的DNS服务器的IP地址。
例如如下格式:
(umass.edu,dns.umass.edu,NS)
(dns.umass.edu,128.119.40.111,A)
1.DNS报文
DNS只有两种报文:查询报文和回答报文,且具有相同的格式。
em,这里就不详细说明了
2.在DNS数据库中插入记录
在DNS数据库中插入记录是用于我们为自己的网站注册域名的时候使用,主要需要做以下两步来保证我们的域名能够被公开访问
- 与你的网站域名有关的基本DNS服务器和权威DNS服务器的信息记录在顶级域名服务器中:注册机构会保证将一个类型NS和一个类型A的记录输入到TLD.com服务器中
- 主机名和IP记录在权威服务器中:需要将你的A类型资源记录和MX资源记录输入到你的权威DNS服务器中