http://turtle.ee.ncku.edu.tw/~tung/dns/dnsintro.html
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 就要視為過期無效.