因特网的域名空间是一棵倒着生长的树,各级域名由其上一级域名管理机构管理。
这种按等级管理的命名方法便于维护名字的唯一性,并且容易设计出一种高效的域名查询机制。
注意:域名只是个逻辑概念,并不代表计算机所在的物理地点
域名分区管理
根域名服务器通常并不直接对域名进行解析,而是返回该域名所属顶级域名的顶级域名服务器的 IP 地址。
DNS 顶级域名服务器
一个顶级域名下会有非常多的子域名,一台 DNS 服务器根本存储不下这些域名及其 IP 的映射关系。采用划分区的办法,一台 DNS 服务器负责管辖的范围叫做区,管理一个区的 DNS 服务器称为权限域名服务器。
DNS 权限域名服务器
每个区都有一个域名服务器,称为权限域名服务器,也有叫“权威域名服务器”的。
树状结构的 DNS 域名服务器
根域名服务器是最高层次的域名服务器,也是最重要的域名服务器,根域名服务器都知道所有的顶级域名服务器的 IP 地址。
顶级域名服务器负责管理在该顶级域名服务器注册的所有二级域名,当收到 DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是某个权限域名服务器的 IP 地址)
当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的 DNS 客户,下一步应当找哪一个权限域名服务器。
本地域名服务器
本地域名服务器并不属于域名服务器层次结构。
当一个主机发出 DNS 查询请求时,这个查询请求报文就发送给本地域名服务器。
域名的解析过程
递归查询
递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文(即替该主机继续查询)
-
主机向本地域名服务器的查询一般都是采用递归查询
-
本地域名服务器向根域名服务器的查询通常是采用迭代查询
迭代查询
- ① 主机先向其本地域名服务器进行递归查询。
- ② 本地域名服务器采用迭代查询。它先向根域名服务器查询。
- ③ 根域名服务器告诉本地域名服务器,下一次应查询的 com 顶级域名服务器的 IP 地址。
- ④ 本地域名服务器向 com 顶级域名服务器进行查询。
- ⑤ 顶级域名服务器告诉本地域名服务器,下一次应查询的权限域名服务器的 IP 地址。
- ⑥ 本地域名服务器向权限域名服务器进行查询
- ⑦ 权限域名服务器告诉本地域名服务器,所查询的主机的 IP 地址。
- ⑧ 本地域名服务器最后把查询结果告诉主机
DNS 进程的请求在传输层使用 UDP 协议,默认端口号是 53
(熟知端口号),以上 8 个步骤总共需要使用 8 个 UDP 用户数据报的报文。
DNS 缓存
域名到 IP 的映射关系一般不经常变,所以我们可以使用缓存来优化 DNS 查询性能。
缓存可以减少根域名服务器的负荷,减少因特网上 DNS 查询报文的数量。
缓存中的每个项目也必须要有生命周期的,因为域名到 IP 的映射关系是会变的,比如可以 10 分钟清除下缓存,去拿取最新的域名映射的 IP。
主机中的 DNS 缓存
不但在本地域名服务器中需要缓存,在主机中也很需要。
许多主机在启动时从本地域名服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的缓存中,并且只在从缓存中找不到名字时才使用域名服务器。
维护本地域名服务器数据库的主机,应该定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删掉无效的项。
由于域名改动并不频繁,大多数网点不需花太多精力就能维护数据库的一致性。
总结
-
根域名服务器:是最高层次的域名服务器,根域名服务器都知道所有顶级域名服务器的 IP 地址, 根域名服务器通常不直接对域名解析,而是返回该域名所属的顶级域名服务器的 IP 地址
-
顶级域名服务器:管理所有在该顶级域名服务器注册的二级域名,收到 DNS 请求时,可能返回解析结果也可能返回某个权限域名服务器的 IP 地址
-
权限域名服务器:管理顶级域名下的不同划分区的域名映射,当一个权限域名服务器还不能给出最终结果时,会告诉客户端下一步应该找哪一个权限域名服务器
-
本地域名服务器:本地服务器不属于域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出 DNS 请求时,请求报文就先发送给本地域名服务器。
域名解析过程:
-
主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,继续向其它根域名服务器发出查询请求报文(即替主机继续查询)。因此,递归查询返回的查询结果或者是所要查询的 IP 地址,或者是报错,表示无法查询到所需的 IP 地址。
-
本地域名服务器向根域名服务器的查询通常采用迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”,然后让本地服务器进行后续的查询。
一次域名查询请求的基本流程:
- 主机向本地域名服务器进行递归查询
- 本地域名服务器向根域名服务器进行迭代查询
- 根域名服务器告诉本地域名服务器,下一步要查询的顶级域名服务器的 IP 地址
- 本地域名服务器向顶级域名服务器查询
- 顶级域名服务器要么返回查询的 IP 地址,要么返回下一步要查询的权限域名服务器的 IP 地址
- 本地域名服务器向权限域名服务器进行查询
- 权限域名服务器要么返回查询的 IP 地址,要么返回下一步要查询的权限域名服务器的 IP 地址
- 本地域名服务器最后把查询结果返回给主机
DNS请求在传输层使用 UDP 协议,以上 8 步需要使用 8 个UDP报文。
DNS缓存:在主机以及本地域名服务器中都有域名缓存,当缓存命中时,直接读取缓存的结果,否则才真正的向根服务器发出 DNS 请求报文。
Android 可以在
Application
的onCreate()
方法中设置 DNS 缓存的时间,通过设置系统属性值"networkaddress.cache.ttl
"来实现。