网络中的主机通信是通过IP地址来实现的,通常IPv4的地址是四个数字加点组成,如果和每台主机通信我们都要去记忆IP地址的话,这通常对于人类来讲是相当痛苦的。于是网络上就有了一套为了解决这个问题的方案出现了,也就是DNS主机名称解析系统。它是一套能够将数以千万计的IP地址通过查询DNS数据库,轻松的转化成与之对应的一串单词字符串,也就是主机名,网络上称之为域名,相对于IP地址,用单词组成的域名明显好记多了。
DNS域名解析系统是有层级关系的,整个层级关系的表现形式就像一棵大树,每一层,我们称之为域。最顶层的域我们通常叫作根域,用点号表示,第二层通常用com、net、edu、gov、mil、org....,这层我们叫作顶级域,往下第三层,也就是我们经常见到的域名了,如51cto.com,这一层我们称之为二级域,当二级域加上www后,就是第四层了,就这样一直往下细分。域名的写法通常是由小到大,从左往右书写,用点连接,最后加点表示根,整个结构如下图所示:
我们要查询这些庞大数据当然要有专门的主机负责这些工作了,提供查询、存储DNS数据服务的主机我们称之为DNS服务器。网络上为了方便域名的注册、管理、解析,将DNS域名映射到特定类型的资源信息,我们称之为资源记录。资源记录是有类型的,主要有SOA、NS、MX、A、PTR、AAA和CNAME这7种类型。
类型 |
含义 |
特点 |
SOA |
起始授权 |
只能有一个,而且必须是第一个 |
NS |
域名服务器 |
用于表示DNS服务器的域名地址 |
MX |
邮件交换器 |
用于一个域下的邮件使用 |
A |
域名-->IP |
我们经常用到的就是它了 |
PTR |
IP-->域名 |
和A记录相反,用于反向解析 |
AAAA |
域名-->IPv6 |
基本不用 |
CNAME |
别名记录 |
用于作A记录的域名的别名 |
假设以wubinary.blog.51cto.com为例:
第一步:当我们使用DNS客户端请求查询此域名的的A记录时,DNS服务器首先会判断所要查询域名是属于哪个区域,是否在自己的管辖范围,假设此次域名不在管辖范围。
第二步:为了确定当前域名是在哪个级别,DNS服务器要向根询求帮助,根会向DNS服务器返回所在域名的顶级域的DNS服务器地址,也就是根的下一级com的DNS服务器地址。此时DNS服器根据这个地址又再次查询,此次查询获得了51cto.com的DNS的服务器地址。于是终于确定了wubinary.blog.51cto.com的区域所在的DNS服务器地址了。DNS服务器的此类确定一个地址,并使用这个址去查询下一个的查询方式我们称之为迭代查询。
第三步:确定了区域地址后,51cto.com为了向DNS服务器返回结果需要一级一级的往下查。一开始查询到了blog.51cto.com的DNS服务器地址,于是blog.51cto.com的DNS服务器则向下查询。blog.51cto.com又查询到了wubinary.blog.51cto.com的DNS服务器地址,此时的地址正是DNS服务器要找的地址。到了这一步,wubinary.blog.51cto.com的DNS服务器则会把结果向它的上级汇报,于是上一级又向上一级汇报,最终结果回到了最初的DNS服务器,此时DNS客户端才能获得最终的IP地址。像这样DNS服务器的数据逐级遍历及逐级返回的过程,我们称之为递归查询。
备注:如果我们查询的域名正好和当前查询使用的DNS服务器所匹配,则DNS服务器会先查询本地缓存是否存在,如果存在则返回缓存数据,如果不存在则去数据文件中读取数据并运回结果。
三个与解析有关的配置文件
/etc/hosts:此文件早期在没有出现DNS服务器的时候,作用和DNS服务器类似,不过随着网络的发展,单个文件根本无法满足需求,于是,此文件通常运用于本地IP解析。
/etc/resolv.conf:定义DNS服务器IP地址,本地解析域名通常使用的都是这里面定义的IP地址。
/etc/nsswitch.conf:这个文件则是来决定先要使用/etc/hosts还是/etc/resolv.conf的设置。
备注:理解DNS的树状结构、递归及迭代查询后,其它就好办了。
一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。
一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求;
迭代查询和递归查询是可以发送到域名服务器的两种请求。递归查询是最常见的发送到本地域名服务器的请求。当本地域名服务器接受了客户机的查询请求时,本地域名服务器将力图代表客户机来找到答案,而在域名服务器执行所有工作的时候,客户机只是等待。如果本地域名服务器不能直接回答,则它将在域名树中的各分支上下递归搜索来寻找答案。
对于一个递归查询,DNS服务器将持续搜索直到收到回答。这种回答可以是主机的IP地址,也可以回答“主机不存在”。不论是哪种结果,递归域名服务器将把结果返回给客户机。一个域名服务器若设置为使用前向服务器,则它将发送递归查询到指定的前向主机。这台收到前向查询的主机也将工作在递归模式以回答查询。如果本地服务器不是一个从属服务器,过一会儿它可能会自行开始查询过程,尽管它仍然希望从它的前向主机处得到回答。如果本地域名服务器设置为一个前向服务器的从属服务器,则工作方式会有所不同。客户机可以发送递归查询到一台从属服务器,但从属服务器不能进行递归查询,它实质上将成为其前向服务器的客户机等待回答。
迭代查询则有所不同。迭代查询的最好例子是一台本地域名服务器发送请求到根服务器。当某个企业的本地域名服务器向根服务器提出查询,根服务器并不一定代表本地域名服务器来担当起回答查询的责任。另一种说法是根服务器不接收递归查询。事实上,根服务器只是为解析查询做一件事:指引本地域名服务器到另一台主机来查询回答。这种做法通常称为重指引,也是期望得到的迭代查询的结果。例如,当根服务器被要求查询www.isi.edu的地址,根服务器不会到ISI域名服务器查询www主机的地址,它只是给本地域名服务器返回一个提示,告诉本地域名服务器到ISI域名服务器去继续查询和得到结果。