如果您為您的機(jī)器設(shè)定過 internet 連線﹐那么您一定接觸過 DNS 了﹐但 DNS 又是什么東東呢﹖說穿了﹐DNS 是用來幫助記憶網(wǎng)路位址的﹐完全是為了遷就人類的記憶思維而設(shè)的。
DNS 的全稱是 Domain Name System(或 Service) ﹐當(dāng)您連上一個(gè)網(wǎng)址﹐在URL打上﹕www.google.com 的時(shí)候﹐可以說就是使用了 DNS 的服務(wù)了。但如果您知道這個(gè) www.google.com 的 IP 位址﹐直接輸入 216.239.53.101 也同樣可以到達(dá)這個(gè)網(wǎng)址。其實(shí)﹐電腦使用的只是 IP 位址而已(最終也是 0 和 1 啦)﹐這個(gè) www.google.com 只是讓人們?nèi)菀子洃浂O(shè)的。因?yàn)槲覀內(nèi)祟惄o對一些比較有意義的文字記憶(如﹕www.google.com)﹐比記憶那些毫無頭緒的號碼(如﹕216.239.53.101)﹐往往容易得多。DNS 的作用就是為我們在文字和 IP 之間擔(dān)當(dāng)了翻譯﹐而免除了強(qiáng)記號碼的痛苦。
假如您的電話有名字記憶功能﹐您只需知道對方的名字﹐就可以撥號給友人了﹐我們可以說﹐這電話也具備如 DNS 的功能了呢﹗但是﹐我們在網(wǎng)路中使用的 DNS 系統(tǒng)﹐就是這么簡單嗎﹖非也﹐復(fù)雜得很呢﹗下面﹐就讓我們一起去探索一下 DNS 的奧秘﹕
在早期的 IP 網(wǎng)路世界里面﹐每臺電腦都只用 IP 位址來表示﹐不久人們就發(fā)現(xiàn)這樣很難記憶﹐于是﹐一些 UNIX 的管理者﹐就建立一個(gè) HOSTS 對應(yīng)表﹐將 IP 和主機(jī)名字對應(yīng)起來﹐這樣﹐用戶只需輸入電腦名字﹐就可以代替 IP 來進(jìn)行溝通了。如果你安裝了 Linux 系統(tǒng)﹐在 /etc 下面就可以找到這個(gè) hosts 檔案﹔在 NT 的系統(tǒng)里﹐你也可以在 winntsystem32driversetc 下面找到它。不過這個(gè) HOSTS 檔是要由管理者手工維護(hù)的﹐最大的問題是無法適用于大型網(wǎng)路﹐而且更新也是件非常頭痛的事情。這就是 DNS 大派用場的時(shí)候了。
DNS 的結(jié)構(gòu)
DNS 是一個(gè)分層級的分散式名稱對應(yīng)系統(tǒng)﹐有點(diǎn)像電腦的目錄樹結(jié)構(gòu)﹕在最頂端的是一個(gè)“root”﹐然后其下分為好幾個(gè)基本類別名稱﹐如﹕com﹑org﹑edu 等﹔再下面是組織名稱﹐如﹕ibm﹑microsoft﹑intel 等﹔繼而是主機(jī)名稱﹐如﹕www﹑mail﹑ftp 等。因?yàn)楫?dāng)初 internet 是從美國發(fā)展起的﹐所以當(dāng)時(shí)并沒有國域名稱﹐但隨著后來 internet 的蓬勃發(fā)展﹐DNS 也加進(jìn)了諸如 tw﹑hk﹑cn 等國域名稱。所以一個(gè)完整的 dns 名稱就好象是這樣的﹕www.xyz.com.tw﹐而整個(gè)名稱對應(yīng)的就是一個(gè)(或多個(gè)) IP 位址了。
在早期的設(shè)計(jì)下﹐root 下面只有六個(gè)組織類別﹕
不過﹐自從組織類別名稱開放以后﹐各種各樣五花八門的名稱也相繼涌現(xiàn)出來了﹐但無論如何﹐取名的規(guī)則最好盡量適合網(wǎng)站性質(zhì)。除了原來的類別資料由美國本土的 NIC(Network Information Center) 管理之外﹐其它在國域以下的類別分別由該國的 NIC 管理(比方說臺灣的 DNS 將授權(quán)給 twnic 來管理)。這樣的結(jié)構(gòu)看起來就像這樣﹕
bitsCN#com中國網(wǎng)管聯(lián)盟 在結(jié)構(gòu)中﹐各組織的 DNS 經(jīng)過申請后由該組織或其委托主機(jī)管理(通常當(dāng)您申請注冊一個(gè) domain 域名稱的時(shí)候﹐都要指定兩臺 DNS 主機(jī)負(fù)責(zé)該域名的 DNS 管理)。
DNS 的運(yùn)作
在我們設(shè)定 IP 網(wǎng)路環(huán)境的時(shí)候﹐都要告訴每臺主機(jī)關(guān)于 DNS 伺服器的位址(我們可以手動(dòng)的在每一臺主機(jī)上面設(shè)置﹐也可以使用 DHCP 來指定)。但這設(shè)定的義意何在呢?從前面的介紹我們或可知道:其目的就是請 DNS 幫忙解析主機(jī)名稱與 IP 位址啦。在這個(gè)設(shè)定過程中,DNS 被稱為 resolver (也就是負(fù)責(zé)解析的 DNS Server),而被設(shè)定主機(jī),則只是單純的 DNS Client 了,也就是提出解析請求的主機(jī)。
下面讓我們看看 DNS 是怎樣運(yùn)作的﹕
1. 當(dāng)被詢問到有關(guān)本域名之內(nèi)的主機(jī)名稱的時(shí)候﹐DNS 伺服器會(huì)直接做出回答﹔
2. 客戶端向伺服器提出查詢項(xiàng)目﹔
3. 當(dāng)被詢問到有關(guān)本域名之內(nèi)的主機(jī)名稱的時(shí)候﹐DNS 伺服器會(huì)直接做出回答﹔
4. 如果所查詢的主機(jī)名稱屬于其它域名的話﹐會(huì)檢查快取記憶體(Cache)﹐看看有沒有相關(guān)資料﹔
5. 如果沒有發(fā)現(xiàn)﹐則會(huì)轉(zhuǎn)向 root 伺服器查詢﹔
6. 然后 root 伺服器會(huì)將該域名之下一層授權(quán)(authoritative)伺服器的位址告知(可能會(huì)超過一臺)﹔ bitsCN~com
7. 本地伺服器然后會(huì)向其中的一臺伺服器查詢﹐并將這些伺服器名單存到記憶體中﹐以備將來之需(省卻再向 root 查詢的步驟)﹔
8. 遠(yuǎn)方伺服器回應(yīng)查詢﹔
9. 若該回應(yīng)并非最后一層的答案,則繼續(xù)往下一層查詢,直到獲的客戶端所查詢的結(jié)果為止﹔
10. 將查詢結(jié)果回應(yīng)給客戶端﹐并同時(shí)將結(jié)果儲存一個(gè)備份在自己的快取記憶里面﹔
11. 如果在存放時(shí)間尚未過時(shí)之前再接到相同的查詢﹐則以存放于快取記憶里面的資料來做回應(yīng)。
從這個(gè)過程我們可以看出﹐沒有任何一臺 DNS 主機(jī)會(huì)包含所有域名的 DNS 資料﹐資料都是分散在全部的 DNS 伺服器中﹐而 NIC 只需知道各 DNS 伺服器位址就可以了。
為了更好地理解一下 DNS 的運(yùn)作﹐讓我們用下圖看看查詢 www.home.netman.com.tw 這臺主機(jī)位址的過程﹕
在這個(gè)例子中﹐www.home.netman.com.tw 臺主機(jī)的 DNS 對應(yīng)資料﹐是由負(fù)責(zé) home.netman.com.tw 這個(gè)域名的 DNS 伺服器管理的。(在 DNS 術(shù)語中﹐我們稱一個(gè)域名為“zone”﹐這個(gè) zone 可以是您從 NIC 申請回來的域名﹐也可以是從該域名之下延伸出來的“sub-zone”)。在這臺 DNS 伺服器上面﹐必須有一個(gè)關(guān)于 home.netman.com.tw 這個(gè) zone 的檔案﹐而這檔案里面必須有一筆關(guān)于 www 的記錄(任何主機(jī)都是以“記錄”來表示,稱為 Resource Record)。這個(gè)記錄可以為一個(gè) IP 位址﹐也可以以別名形式來對應(yīng)一臺主機(jī)名稱﹐但無論如何﹐所對應(yīng)的主機(jī)名稱最終是要被一個(gè) IP 位址所對應(yīng)著就是了。 bitsCN#com中國網(wǎng)管聯(lián)盟
同時(shí)﹐DNS 還能提供“反查詢”(reverse lookup) 功能﹐也就是以 IP 來查詢主機(jī)名稱。網(wǎng)路上面的許多服務(wù)﹐如﹕FTP, SMTP﹑等等﹐都需要到這個(gè)功能。其實(shí)﹐DNS 服務(wù)本身就必須要使用反查詢功能﹐而且在設(shè)定上﹐也必須要為每個(gè)網(wǎng)路建立起 reverse zone。雖然有些人發(fā)覺即使沒有 reverse zone 也可以使用到 DNS 服務(wù)﹐但其中弊端卻不容易被察覺到﹐在這個(gè)(中文)網(wǎng)頁﹕http://dnsrd.nctu.edu.tw/Basic/WhenToUse-Rev.html 上面﹐您可以看到忽略 revers zone 所致一些問題。
DNS 的名稱記錄
事實(shí)上﹐DNS 不僅僅是用來解釋位址用的﹐而且還可以回答更多關(guān)于網(wǎng)路和主機(jī)的其它信息﹐其中很重要的一個(gè)功能就是可以供郵件系統(tǒng)進(jìn)行路由。這些資料﹐通常會(huì)以不同的“記錄”名稱出現(xiàn)在DNS的資料檔案中。下面讓我們參考一個(gè) Linux 的 DNS 檔案﹐看看這些記錄是如何表示的﹕
;
; Zone file for siyongc.domain
;
; Then full zone file
;
$TTL 86400
@ IN SOA redhat52.siyongc.domain. netman.siyongc.domain. (
1999092801 ; serial
8H ; refresh
2H ; retry
1W ; expire bbs.bitsCN.com
1D ) ; minimun
;
IN TXT "A test domain, created by Netman"
IN NS redhat52
IN NS debian.home
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home
;
localhost IN A 127.0.0.1
﹔
gw IN A 192.168.0.17
IN HINFO "Redhat" "MASQ"
IN TXT "The masquerade gateway to internet"
﹔
redhat52 IN A 192.168.0.17
IN MX 10 redhat52
IN MX 20 debian.home
IN HINFO "Dell PII 266" "Linux RedHat"
www IN CNAME redhat52
mail IN CNAME redhat52
ftp IN CNAME redhat52
news IN CNAME redhat52
smtp IN CNAME redhat52
﹔
pii266 IN A 192.168.0.15
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
﹔
slware36 IN A 192.168.0.18
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
﹔
rhroute IN A 192.168.0.4
bbs.bitsCN.com
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
﹔
home IN ns debian.home.siyongc.domain.
debian.home IN A 10.0.2.101
我們姑且不理會(huì)開頭那幾行的意思﹐那是給 DNS 系統(tǒng)本身使用的(我將會(huì)在“學(xué)習(xí) Linux”文章里面再詳細(xì)討論)﹐這里我們只是看看幾個(gè)記錄名稱而已﹕
分擔(dān) DNS 工作
由於 DNS 的重要性日益顯著,為提高其容錯(cuò)能力及查詢效能,我們在架設(shè)某一單一 zone 的時(shí)侯,常以多臺伺服器來負(fù)責(zé)該 zone 的服務(wù)。其中,我們必需指定一臺 Primary(master) DNS 伺服器,它是架設(shè)在某一個(gè)網(wǎng)域下被主要授權(quán)並控制所有名稱記錄的主控伺服器﹐管轄著該網(wǎng)域的所有記錄資料﹐這些記錄資料只有 primary(master) 可以修改。
但如果在一個(gè)比較大型的網(wǎng)路中﹐DNS 伺服器就會(huì)變得很繁忙﹐所以您可以設(shè)定多個(gè) DNS 來分擔(dān) master 的工作﹐但您或許不願(yuàn)意到每一個(gè) DNS 伺服器去更新資料吧﹖而且就算您願(yuàn)意這樣做﹐也容易出現(xiàn)錯(cuò)誤或資料不同步的情形。這樣您可以設(shè)定其它的伺服器為 secondary (slave) DNS 來複製 master 上面的記錄資料﹐這樣﹐其它的電腦可以被分派到不同的 DNS 做查詢﹐既可以分擔(dān) master 的工作﹐而且資料也可以自動(dòng)進(jìn)行同步工作。為確保資料的一致性,master 每次更新過資料後會(huì)以 notify 機(jī)制主動(dòng)通知 slave 前來同步。此外,您可以設(shè)定 DNS 資料同步的時(shí)間間隔﹐在 dns 檔案中的 Refresh 設(shè)定就是了。


