DNS解析原理:递归 VS 迭代

DNS解析原理:递归 VS 迭代,第1张

DNS解析流程分为 递归查询 迭代查询递归查询是以本地名称服务器为中心查询, 递归查询是默认方式,迭代查询是以DNS客户端,也就是客户机器为中心查询。 其实DNS客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。

“递归解析”(或叫“递归查询”,其实意思是一样的)是最常见, 也是默认的解析方式 。在这种解析方式中,如果客户端配置的本地名称服务器, (又称Local DNS, 可以是默认的运营商提供的Local DNS 或者自己设置的DNS) 不能解析的话,则后面的查询全由本地名称服务器代替DNS客户端进行查询,直到本地名称服务器从权威名称服务器得到了正确的解析结果,然后由本地名称服务器告诉DNS客户端查询的结果。

下图是windows下默认获取的运营商Local DNS或者 自己设置的Local DNS

在这个查询过程中,一直是以本地名称服务器(Local DNS)为中心的,DNS客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态的,直到本地名称服务器发来了最终的查询结果。此时的本地名称服务器就相当于中介代理的作用。如果考虑了本地名称服务器的缓存技术(也就是在DNS服务器上对一定数量的以前查询记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率)的话,则递归解析的基本流程如下:

(1)客户端向本机配置的本地名称服务器(在此仅以首选DNS服务器为例进行介绍,所配置其它备用DNS服务器的解析流程完全一样)发出DNS域名查询请求。

(2)本地名称服务器收到请求后,先查询本地的缓存,如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则本地名称服务器再以DNS客户端的角色发送与前面一样的DNS域名查询请求发给 根名称服务器

(3)根名称服务器收到DNS请求后,把所查询得到的所请求的DNS域名中 顶级域名所对应的顶级名称服务器 地址返回给本地名称服务器。

(4)本地名称服务器根据根名称服务器所返回的顶级名称服务器地址,向对应的顶级名称服务器发送与前面一样的DNS域名查询请求。

(5)对应的顶级名称服务器在收到DNS查询请求后,也是先查询自己的缓存,如果有所请求的DNS域名的记录项,则相接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给DNS客户端,否则向本地名称服务器返回所请求的DNS域名中的二级域名所对应的二级名称服务器地址。

然后本地名称服务器继续按照前面介绍的方法一次次地向三级、四级名称服务器查询,直到最终的对应域名所在区域的 权威名称服务器 返回到最终的记录给本地名称服务器。然后再由本地名称服务器返回给DNS客户,同时本地名称服务器会缓存本次查询得到的记录项。

DNS客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。

DNS递归名称解析 : 在DNS递归名称解析中,当所配置的本地名称服务器解析不了时,后面的查询工作是由本地名称服务器替代DNS客户端进行的(以“本地名称服务器”为中心),只需要本地名称服务器向DNS客户端返回最终的查询结果即可。

DNS迭代名称解析 :(或者叫“迭代查询”)的所有查询工作全部是DNS客户端自己进行(以“DNS客户端”自己为中心)。在条件之一满足时就会采用迭代名称解析方式:

通过图片看看他们的不同:

权威 DNS 是特定域名记录(例如“example.com”)在域名注册商处所设置的 DNS 服务器,用于特定域名本身的管理(增加、删除、修改等)。

权威 DNS 服务器只对自己所拥有的域名进行域名解析,对于不是自己的域名则拒绝访问。比如,向“example.com”的权威 DNS 服务器查询“test.com”的域名肯定会查询失败。

递归 DNS(也称本地 DNS 或者缓存 DNS)用于域名查询。递归 DNS 会迭代权威服务器返回的应答,直至最终查询到的 IP 地址,将其返回给客户端,并将请求结果缓存到本地。

对用户发出的域名解析请求,递归 DNS 必须给出一个最终的 IP 地址结果。完整的递归DNS 查询流程需要 DNS 服务器从根域名 “.” 服务器,顶级域名服务器(例如“.com”),一级域名服务器(例如“example.com”)等一级一级递归查询,直到最终找到权威服务器取得结果,并返回给客户。同时,递归服务器根据域名 TTL,缓存查询结果,便于相同域名重复查询。

递归 DNS 服务器大多数在运营商端,负责网络接入终端的 DNS 查询,即网络访问设备上配置的 DNS 服务器 IP。

递归 DNS 的访问过程如下图所示(递归 DNS 在图中表示为 Local DNS):

https://www.alibabacloud.com/help/zh/doc-detail/60303.htm

https://www.zhihu.com/question/36891472

192.168.16.101 常态根服务器

192.168.16.104 紧急根服务器

192.168.6.102 根区副本  可在 常态192.168.16.101或紧急192.168.16.104之间切换

测试时根切换在192.168.16.101

192.168.16.105 递归服务器 根指向根区副本 192.168.6.102

192.168.16.103 com顶级域ns  配一个 hww.com 域 ns 192.168.16.109

192.168.16.109 hww.com 域权威服务器

从192.168.6.54对着递归服务器105请求www.hww.com

抓包文件可以看出正常递归

54->105->101->103->109->105->54

详细配置如下

192.168.6.102作为根的从服务器 可指向 常态192.168.16.101或紧急192.168.16.104

测试时根指向192.168.16.101

根指向根区副本 192.168.6.102

ns  配一个 hww.com 域 ns 192.168.16.109

从192.168.6.54对着递归服务器105请求www.hww.com

抓包文件可以看出正常递归

54->105->101->103->109->105->54

附:named.conf 举例

options {

        listen-on port 53 { any}

        listen-on-v6 port 53 { any}

        allow-notify    { any}

        directory      "/var/named"

        dump-file      "/var/named/data/cache_dump.db"

        zone-statistics true

        statistics-file "/var/named/data/named_stats.txt"

        memstatistics true

        memstatistics-file "/var/named/data/named_mem_stats.txt"

        allow-query    { any}

        allow-query-on    { any}

        allow-recursion { any}

        allow-recursion-on { any}

        recursion yes

        recursing-file "recursing.stat"

        allow-transfer { none}

        transfer-format many-answers

        allow-update { none}

        blackhole {

                none

        }

        auth-nxdomain yes

        ixfr-from-differences false

        provide-ixfr false

        request-ixfr false

        masterfile-format text

        clients-per-query 10000

        max-clients-per-query 10000

        min-refresh-time 60

        recursive-clients 10000

        resolver-query-timeout 10

        max-cache-size 4000M

        lame-ttl 600

        max-ncache-ttl 1800

        max-cache-ttl 604800

        dnssec-enable no

        dnssec-validation no

        dnssec-accept-expired false

}

logging {

        channel default_debug {

                file "data/named.run" versions 10 size 300M

print-time yes     

print-severity yes       

severity dynamic

        }

        channel sys_log{

                file "data/sys.log" versions 10 size 100M

                severity warning

                print-time yes

                print-severity yes

        }

        channel user_log{

                file "data/user.log" versions 10 size 100M

                print-time yes

print-severity yes

severity error

        }

        category default {

                sys_log

        }

}

zone "." IN {

        type master

        file "named.copy.ca"

}

include "/etc/named.rfc1912.zones"

include "/etc/named.root.key"

域名解析耗时就是将域名解析获得对应IP地址,并返回给客户端这个过程所消耗的时间。

当我们对某个域名发起访问,并不是直接就能对响应站点发起访问的,需要借助DNS获取域名与IP地址对应关系,在取得解析记录之后,才能发起访问。

解析过程的具体流程大致如下:

(1)客户端对某个域名发起访问。

(2)浏览器会首先对浏览器、系统缓存以及本机HOSTS文件等本地信息进行查询,如果有结果直接告知客户端,解析过程结束。

(3)如果本地没有结果,浏览器就会请求递归服务器,递归服务器有结果就会告知客户端,解析过程借宿。

(4)如果递归服务器没有结果,就会委托递归服务器进行全球递归查询,首先请求根域名。

(5)根域名告知递归服务器域名所在的顶级域名服务器,递归服务器对顶级服务器发起请求。

(6)顶级服务器告知递归服务器域名所在的权威域名服务器,权威域名服务器将解析记录告知递归服务器。

(7)递归服务器将结果再告知客户端,解析过程结束。

流程图如下所示:

由此可见,影响域名解析耗时的因素有以下几点:

(1)本地缓存

如果本地缓存中有域名和IP地址的对应关系,就会直接在本机获取结果,无需进行全球递归查询,这样解析用时就大大缩短,但缓存对于解析安全有较大影响;

(2)递归服务器

一般而言,我们无法决定用户使用何种DNS Server,大部分初级用户使用的是本地ISP自动获取的DNS Server,部分用户则使用第三方DNS Server比如Open DNS或者Google DNS。

不过你可以建议你的用户使用Google DNS (8.8.8.8 和8.8.4.4),该DNS Server会比电信或网通自动获取的DNS Server快许多。

(3)权威域名服务器

权威域名服务器时影响域名解析耗时的关键,一般的解析服务器都是单节点单线路,如果域名距离较远,可能就会因为跨域跨网造成较大的延迟,如果域名的访问量大,还会造成线路的拥堵。所以为了减少解析时间,建议选择性能较好,多节点,多线路的权威域名服务器。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/108158.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-10
下一篇2023-03-10

发表评论

登录后才能评论

评论列表(0条)

    保存