本地dns服务器的工作原理是什么?它是怎样解析ip地址的?

2024-12-20 14:28:44
推荐回答(1个)
回答1:

DNS 介绍
DNS 由来

DNS 全名是 Domain Name System, 透过 DNS 系统, 我们可以由一部机器的 domain name 查其 IP, 也可以由机器的 IP 反查它的 domain name, 除此之外 DNS 还与 Mail System 结合, 提供 Mail routing 的功能.

早期这个 domain name 与 IP 的对应表是记在每部机器的 /etc/host 这个档案, 当电脑个数不多还好, 但是电脑数目一多就会发生问题了, 主要有下列问题

1. Traffic & Load
2. Conflict
3. Consistency

因为用 hosts 记录 domain name <-> ip mapping 有上述问题, 所以后来发展出 DNS.

Domain Name Space

整个 INTERNET 上的电脑如此众多, 如何保证两部电脑不会有相同的 domain name/IP 是一个很重要的问题. 几个重要的观念如下

1. Domain (网域)
将整个 internet 分成许多 domain, 每个 domain 下又细分为许多 domain, 然后这些细分的 domain 视实际需求又再细分成许多 domain, 一直循环下去.
基本上每个 domain 内的 mapping 由一部主机负责管理.

top level domain - com, edu, gov, mil, net, org, int (现在又多出许多 top domain 了如 isp, art 等)

2. Delegation (授权)
刚才提到每个 domain 都可因实际需求再细分成许多 sub domain. 上层的 domain 可以将其分出的某个 sub domain 的 domain name 与 IP mapping 交由另一部机器管理, 这个动作我们称之为 delegation

3.Forward/Reverse(正解/反解)
在讲到 domain name <-> IP mapping, 其实应该看成两个命名空间:

一个是 domain name -> IP, 称之为 forward mapping, 在这个命名空间中就是先分成前面提到的那些 top domain, 再细分 sub domain, 再细分...
比如说 winnie.corp.hp.com -> 15.16.192.152 代表在负责 corp.hp.com 这个 sub domain 的机器上, 可以查到其 mapping table 上有一笔记录是 winnie -> 15.16.192.152.

一个是 IP -> domain name 称为 reverse mapping. 在这个命名空间中, 所有的 IP 组成一个叫作 arpa.in-addr 的 top domain, 然后再依 IP 层层细分...
比如说 15.16.192.152 -> winnie.corp.hp.com 代表在负责 192.16.15.in-addr.arpa(注意是反过来写, 因为 top domain 要在最后面) 这个 sub domain 的机器上, 可以查到其 mapping table 上有一笔记录是 152 -> winnie.cop.hp.com

值得注意的是:
a. 负责 forward mapping 和 reverse mapping 的机器不一定是同一部
负责 corp.hp.com domain 与负责 192.16.15.in-addr.arpa 的机器不一定是同一部机器, 即使在同一部机器, 如果不注意的话, 两边的内容可能也会有不 match 的情形.
b. domain 与 ip subnet 并没有一对一关系
举例而言成大电机的 domain 是 ee.ncku.edu.tw, 但是因为成大电机内部机器数多的关系, 所用到的 IP subnet 有 140.116.72, 140.16.49, 140.116.163, 140.116.156, 140.116.227 共 5 组

Name Server

负责记录 forward/reverse mapping 的机器会执行一个叫 name server 的软体, 透过这个软体回应来自其它机器对 domain name 或 IP 的查询

1. zone & domain
上面提到基本上每个 domain交由一个机器来负责, 其实更精确地说应该是每个 zone 交由一个 name server 来负责, 所谓 zone 就是把一个 domain 扣掉分给下层负责的部份, 剩下来的就是 zone

2. Primary/Secondary
每个 zone 交由一部 name server负责的作法会有一个问题, 万一这个 name server 当掉, 可能造成 INTERNET 上其它机器无法取得属於这个 zone 的资料(就是 domain name 和 ip mapping). 为了避免这种情形, 我们可以把这个 zone 的资料同时交给多部 name server 负责.原本的这部称为 primary name server, 其它的称为 secondary name server. Secondary name server 会定期将 primary name server 上 zone 的资料拷贝一份下来备用.

对於上层的 name server 而言, 它只是设定某个 zone 同时 delegate 给一部以上的下层 dns server, 但是它并不去分辨谁是真正的 primary, 谁是 secondary. 它只是依据顺序寻问, 当第一部负责某个 zone 的 dns server 当掉时, 它会依序找下一个负责的 dns server.

ps: primary/secondary 在新版 name server 程式中改称为 master/slave

Name Resolution (名称解析, 名称查询)

接下来我们介绍名称查询运作时一些重要名词或观念

1. Resolver
相当於是 DNS server 的 client 端, 通常是以函式库的方式被放在整套作业系统中, 各类的应用程式经由呼叫这个 resolver 函式库可以很容易地向 DNS server 进行查询, 得到所要的资料.

2. Root Name Server
在查询资料时, 总是要有一个起点, 当一个 local DNS server 收到来自 client 端关於一个 domain name 的查询, 这个 local DNS server 怎麼知道这个 domain name 的相关资料是记录在 INTERNET 中的哪一个 DNS 上呢?
答案是向 root name server 寻问. root name server 记录了各 top domain 分别是由哪些 DNS server 负责. 比如说要找 www.yohoo.com 时, root name server 会告诉 local DNS server 哪部 name server 负责 .com 这个 domain, 然后 local dns 再向负责 .com 的 name server 询问关於 yohoo.com 是哪部 name server 在负责. 最后 local DNS 就可以向负责 yohoo.com 的 name server 问到有关 www.yohoo.com 的资料.

注: 考量 root name server 会被全世界的 DNS sever 询问, 负担很大, 在世界各地共有十多个root name server. 而每个 name server 软体都附有一个文字档, 其中记录了这十多个世界知名的 root name server 的 IP 位址

3.Recursive Query
在上面介绍的过程中, DNS client 端只丢出一个询问给 local DNS server, 然后 local DNS 就会不断地查到答案出来为止, 最后把结果传回来给 client, 这种查询称为 recursive query

上图中 DNS client 端(resolver) 向 local DNS server 进行 recursive query, 查 girigri.gbrmpa.gov.au 的 IP. local DNS server 会由 root name server 开始问起, 依序找到负责 .au domain 的 DNS server, 负责 .gov.au domain 的 DNS server, 负责 gbrmpa.gov.au domain 的 DNS server, 最后在负责 gbrmpa.gov.au 的 DNS server 问到 girigri.gbrmpa.gov.au 的资料, 然后传回给 DNS client (resolver).

4. Iterative Query
前面的介绍中, local DNS 对其它 DNS 发出的询问, 都只是知道一个更进一步的线索, 然后发问者(local DNS)根据线索再去进一步找答案, 这种询问方式称为 iterative query

ps:
a.一般说来, resolver 对 local DNS server 都是 recursive query, 而 DNS server 之间的 query 多是iterative.
b.大部份的 DNS server 都可以接受 recursive 和 iterative 两种 query 方式, 但是考量负载问题, root name server 只接受 iterative query.

5. DNS Caching
由前面的叙述我们可以了解由 resolver 发出一个 query 给 local DNS, 到最后 local DNS 把答案传回来, 中间需要许多次的查询, 为了节省这些反覆查寻的时间, DNS server 会把查到的结果偷偷暂存一阵子, 这麼一来当有其它机器发出相同询问时, 就可以省下不少的时间.
举例而言, 在一次询问 www.ncku.edu.tw 的过程中, local DNS 上可以得知
a. 负责 .tw 的 name server IP
b. 负责 .edu.tw 的 name server IP
c. 负责 .ncku.edu.tw 的 name server IP
d. www.ncku.edu.tw 的 IP
除了有机器再次查询 www.ncku.edu.tw 会变快外, 查询和 a, b, c 相关 domain 的资料也会变快, 因为 local DNS 不必再从 root name server 一层层问下来.

ps: 当 local DNS 偷偷记下一些资料以便加速时, 万一真正的资料有修改时怎麼办呢? DNS server 针对它负责的 domain 资料有一个 TTL(time to leave)参数, 用来告诉其它 DNS 在 cache 其资料时, 资料只应该 cache 多久. 超过 TTL, 那个 cache 就要视为过期无效.