DNS 负责将域名解析为 IP 地址
域名
域名是一个具有层次的结构,从上到下一次为根域名、顶级域名、二级域名、三级域名...
例如 www.xxx.com,www 为三级域名、xxx 为二级域名、com 为顶级域名,系统为用户做了兼容,域名末尾的根域名.一般不需要输入
在域名的每一层都会有一个域名服务器,如下图:
除此之外,还有电脑默认的本地域名服务器
迭代查询
域名缓存
在域名服务器解析的时候,使用缓存保存域名和 IP 地址的映射
计算机中 DNS 的记录也分成了两种缓存方式:
- 浏览器缓存:浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗
- 操作系统缓存:操作系统的缓存其实是用户自己配置的 hosts 文件
查询过程
解析域名的过程如下:
- 首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表
- 若没有命中,则继续搜索操作系统的 DNS 缓存
- 若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器首先查看所要求查询的域名是不是自己能回答的,如果能回答,则直接给予回答,如是不能回答,再查看自己的 DNS 缓存,采用递归查询自己的 DNS 缓存,查找成功则返回结果
- 若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行迭代查询
- 首先本地域名服务器向根域名服务器发起请求,根域名服务器返回顶级域名服务器的地址给本地服务器
- 本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
- 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
- 本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
- 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来
- 至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来
顶级域名服务器在收到 DNS 查询请求后,也是先查询自己的缓存,如果有所请求的 DNS 域名的记录项,则相接把对应的记录项返回给本地名称服务器,否则向本地名称服务器返回所请求的 DNS 域名中的二级域名所对应的二级域名服务器地址(对应的是权限域名服务器)。然后本地名称服务器继续按照前面介绍的方法一次次地向三级、四级域名服务器查询,直到最终的对应域名所在区域的权威名称服务器返回到最终的记录给本地名称服务器)
流程如下图所示:
DNS 客户端和本地域名服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。也就是下图中的(a)情形。
其实 DNS 递归查询又可以分 2 种情况,即
- DNS 客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。
- DNS 客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间也是递归。
迭代与递归
一、主机向本地域名服务器的查询一般都是采用递归查询。
所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以 DNS 客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。
因此,递归查询返回的查询结果或者是所要查询的 IP 地址,或者是报错,表示无法查询到所需的IP地址。
二、本地域名服务器向根域名服务器的查询的迭代查询。
迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。
然后让本地服务器继续进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。
顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。
最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机