初识DNS服务器
我们都知道IP可以确定一台计算机在Internet上的唯一地址,但人对数字的感知有限,因此为了方便网络中计算机的访问,便给每台计算机和IP建立一个映射关系,访问主机时只需输入主机名就可以了,就像我们的***一样,日常生活中,总不能用***号去称呼每一个人吧。早期TCP/IP网络中,这种名称解析工作通过hosts文件完成,但hosts文件是一个纯文本文件,在小型网络中,还可以满足人们的使用,但在Internet中,如果用hosts文件维护所有主机和IP之间的关系,显然是不合理的,因此DNS便应运而生。
DNS是Internet的一项核心服务,采用层级(树状)和划分域的方式管理各主机。最早被保罗提出时,我们输入的主机地址最后必须加一个小数点.结尾,经过后期的优化,这个小数点可以省略。这个小数点就是根域,通过顶级域、二级域、主机名构成一个倒置的树状结构,组织成一个域名空间。到目前为止,全球共有13个根域,由Internet名称注册授权机构管理。顶级域分为三种类型:组织域,如:.com、.net、.org、.gov、.edu等;国家域:.cn、.us等;反向域:.in-addr-arpa,这些域不允许个人或组织注册。二级域是指那些注册到个人、组织或公司的名称,相当于承包到户。而主机名是最最底层的域名空间。由主机名加DNS后缀共同组成FQDN(Full Qualified Domain Name,完全合格域名空间),例如域名www.luyouqiwang.com,www是其主机名,luyouqiwang.com是其DNS后缀。
那么DNS服务是如何工作的呢?当我们在地址栏中输入一个地址时,计算机首先查询的是hosts文件(/etc/hosts),当找不到主机时,会去本地dns缓存去查找,无果后,再请求DNS服务器,
DNS服务器是如何工作的呢?当DNS服务器收到查询请求时,会遍历其数据库文件,最后要么响应一个查询成功的回复给客户端,要么返回查询失败的回复;这便是递归查询。当DNS服务器在自己的缓存区找不到主机时会直接请求根域,由根域响应其子域的IP,子域继续查询它的下一级域,直到找到拥有该域名的DNS服务器,或者查询超时为止,这种查询便是迭代查询。无论是DNS客户端还是DNS服务器端都会将查询结果记录在本地dns缓存中,方便下次访问主机。
当我们访问www.xiaoxiongboke.com时,将该域名的查询提交给DNS服务器,DNS服务器没有查询到该域名的记录时,会直接将该查询提交给根服务器,要求解析(①),根接收该查询请求,将.com的DNS服务器的IP回复给DNS服务器(②),则DNS服务器将该域名提交给.com域的服务器要求其解析(③),.comDNS服务器会将luyouqiwang.com域的DNS服务器IP地址回复给DNS服务器(④),则DNS服务器将该域名的查询请求再提交给51.cto域的DNS服务器(⑤),如果此服务器找到了www.xiaoxiongboke.com的记录,将其IP回复给DNS服务器;如果查无此记录,则返回查询失败的结果给DNS服务器(⑥)。由DNS服务器将查询到的IP或查询失败的消息返回给客户端即我们。
每个DNS服务器在提供域名查询服务时,都是基于自己的区域解析数据库,该数据库包含了DNS区域资源信息的资源记录。DNS区域数据库的资源记录常见的有以下几种:
SOA:起始授权记录,定义了该区域的全局参数,进行整个区域的管理设置,一个区域有且只有一条SOA记录
NS:域名服务器记录,记录了某区域的授权服务器,一个区域至少有一条NS记录
A:地址记录,将一个FQDN映射成IP地址,若查到某域名的A记录有多条,DNS服务器会基于“轮询”的方式给多个用户进行响应
PTR:反向地址记录,将一个IP映射到FQDN
MX:邮件服务器记录
CNAME:别名记录,可以定义当客户端错误域名请求时自动更正错误,如wwww.luyouqiwang.com转换成www.luyouqiwang.com
其成功查询的响应结果也有两种:权威回答:客户端请求的域名是该DNS服务器负责的域;非权威回答:DNS服务器在其缓存文件中找到的A记录。
为提供更优质的DNS服务,对同一区域解析的DNS服务器通常会设置多个,主DNS服务器:负责某区域解析,对区域所有的资源记录更新都通过此服务器进行;从DNS服务器:也是负责某区域的DNS服务解析,但不负责更新操作,只能从该区域的主服务器或其他从服务器同步其区域数据库文件;DNS缓存服务器:不负责任何区域的权威应答,仅用于帮助指向此服务器的客户端作递归查询。
那么主从DNS服务器是如何协调工作的呢?每个区域数据库文件定义了区域数据库版本号serial、刷新时间refresh、重试时间retry、过期时间expire和否定应答的TTL值。从DNS服务器在达到了刷新时间间隔之后,就会发起同步请求到主DNS服务器,主DNS服务器则响应serial给从DNS服务器,从DNS服务器将自己的serial与主DNS服务器的serial做比较,如果发现主的serial大于自己,意味着主服务器的区域数据库文件更新了,因此请求同步。这种协调存在问题,万一主DNS服务器上有更新,恰巧相应的客户端DNS请求发送到了从服务器,这岂不是坑了客户端吗?还好DNS服务的notify机制巧妙的处理了这个问题,主DNS服务器为让从DNS服务器及时更新区域数据库文件,会主动触发从服务器发起更新请求,即使从DNS服务器的刷新时长未到。因此其协调机制总结为:周期性检查+通知。