Linux基础服务 ·

DNS解析流程

[隐藏]

DNS 查询流程

DNS 是『金字塔结构』以类似『树状目录』的形态来进行主机名称的管理的!所以每一部 DNS 服务器都『仅管理自己的下一层主机名称的转译』而已,至于下层的下层,则『授权』给下层的 DNS 主机来管理!

其中不负责具体域名解析的服务器,我们称之为缓存名称服务器,它只负责记录解析某个域。

其中负责具体域名解析的服务器,我们称之为主名称服务器和辅助名称服务器,它记录着某个域内的具体域名解析。

首先,当你在浏览器的网址列输入 https://www.getlinux.cn 时,你的电脑就会依据相关设定( 在Linux底下就是利用/etc/resolv.conf 这个文件 )所提供的 DNS 的 IP 去进行连线查询。而我们默认的 DNS 地址一般都会是运营商最近的 DNS 服务器。

示例:我们访问 www.email.getlinux.cn。

收到用户的查询要求,先查看本身有没有纪录,若无则向 . 查询: 由于 DNS 是阶层式的架构,每部主机都会管理自己辖下的主机名称解析。此时会先查询本机的 hosts 文件有没有记录对应信息,如实没有则通过预设的 DNS 服务器进行查询,若查询不到此记录。此时当前 DNS 就会向最顶层,也就是 . (root)服务器询相关 IP 信息。

向最顶层的. (root)查询: 此时 预设DNS 会主动的向 . 询问 www.email.getlinux.cn 的 IP ,但是由于 . 只记录了顶级域的信息,此时 . 会告知『我是不知道这部主机的 IP ,但是你应该向 .cn 去询问,我这里不管!我跟你说. cn 在哪里吧!』

向第二层的 .cn 服务器查询:预设 DNS 接着又到 .cn 去查询,而该部机器管理的又仅有 .getlinux.cn , .edu.cn ……那几部主机,经过比对后发现我们要的是 .3.cn 的域,所以这个时候 .cn 又告诉 我们的 DNS服务器 说:『你要去管理 .getlinux.cn 这个域的主机那里查询,我有 .getlinux.cn 的IP !』

向第三层的 .getlinux.cn 服务器查询:同理可证, .getlinux.cn 只会告诉 我们的预设 DNS ,应该要去 email.getlinux.cn 进行查询,这里只能告知 .email.getlinux.cn 的 IP 而已。

向第四层的 email.getlinux.cn 服务器查询:等到预设 DNS 找到 email.getlinux.cn 之后, email.getlinux.cn 说:『没错!这部主机名称是我管理的~我跟你说他的IP是 ...  此时 我们的预设DNS 就能够查到 www.email.getlinux.cn 的 IP 了!

记录暂存记忆体并回报用户:查到了正确的 IP 后,运营商的 DNS 机器会记录一份查询的结果在自己内存当中,以方便回应下一次的相同要求!最后则将结果回报给 client 端!那个缓存在 cache 当中的数据是有时间性的,当过了 DNS 设定存储的时间(通常可能是24小时),那么该记录就会被释放!

整个分层查询的流程就是这样,总是得要先经过. 来向下一层进行查询,最终总是能得到答案的。这样分层的好处是:

  • 主机名称修改的仅需自己的 DNS 更动即可,不需通知其他人:当一个『合法』的 DNS 服务器里面的设定修改了之后,来自世界各地任何一个 DNS 的要求,都会正确无误的显示正确的主机名称对应 IP 的信息,因为他们会一层一层的寻找下来。所以,要找你的主机名称对应的 IP 就一定得要通过你的上层 DNS 服务器的纪录才行!因此,只要你的主机名字是经过上层『合法的DNS』服务器设定的,那么就可以在 Internet 上面被查询到!
  • DNS 服务器对主机名称解析结果的缓存时间:由于每次查询到的结果都会储存在 DNS 服务器的缓存内存中,以方便若下次有相同需求的解析时,能够快速的回应。不过,查询结果已经被缓存了,但是原始 DNS 的主机名称与 IP 对应却修改了,此时若有人再次查询,系统可能会回报旧的IP!所以,在缓存内的结果是有时效的!通常是数十分钟到三天之内。这也是为什么我们常说当你修改了一个 domain name 之后,可能要 2 ~ 3 天后才能全面的启用的缘故啦!
  • 可持续向下授权(子域名的名称授权):每一部可以记录主机名称与 IP 对应的 DNS 服务器都可以随意更动其自己的数据库中的对应数据,因此主机名称与域名在各个主机底下都不相同。

一般我们需要访问一个域名时,你的 DNS 会一层一层向上查询,我们将这种方式称为递归查询。而一直查询到根服务器,此时根服务器会指示其向下查询,此时我们称为迭代查询。

DNS 使用的端口(port number)

DNS 系统使用的是网络的查询,那么自然需要有监听的 port!而 DNS 默认使用的就是 53 端口!

我们可以查询 Linux 底下的 /etc/services 这个文件!搜寻一下 domain 这个关键字,就可以查到 53 这个port !

通常 DNS 查询的时候,是以 udp 这个较快速的资料传输协议来查询的,但是万一没有办法查询到完整的信息时,就会再次的以 tcp 这个协议来重新查询!所以启动 DNS 的 daemon (named进程)时,会同时启动 tcp 及 udp 的 port 53!所以,防火墙也要同时放行 tcp, udp port 53

参与评论