TCP/IP協議--09 DNS域名系統
一臺機器要靠IP地址和MAC地址,其中,MAC地址可以通過ARP協議得到,所以這對使用者是透明的,但是IP地址就不行,無論如何使用者都需要用一個指定的IP來訪問一臺計算機,而IP地址又非常不好記,於是就出現了DNS系統。
DNS系統介紹
DNS的全稱是Domain Name System。它負責把FQDN(就是以"."分隔結尾的名字)翻譯成一個IP。最初的DNS系統使用的是一個巨大的hosts.txt檔案(很吃驚,用 這個就好使了?),可是一段時間以後,開發這就不得不用資料庫來代替hosts.txt檔案,最終發展到了現在的分散式資料庫。
DNS系統是一個巨大的樹,最上方有一個無名樹根,下一層是arpa,com,edu,gov,int,mil,us, cn。等等,其中arpa,是域名反解析樹的頂端;而com,edu,等域名本來只用在美國(這就是技術特權啊),但是現在幾乎全世界通用;而us, cn,等叫做國家域。這個樹裡面的域名並不是統一管理的,網路資訊中心(NIS)負責分配頂級域合委派其他制定地區域的授權機構。
一個獨立管理的DNS子樹叫做zone,最常見的區域就是二級域名,比如說.com.cn。我們還可以把這個二級域名給劃分成更小的區域,比如說sina.com.cn。
DNS系統是一個分散式的資料庫,當一個數據庫發現自己並沒有某查詢所需要的資料的時候,它將把查詢轉發出去,而轉發的目的地通常是根伺服器,根服 務器從上至下層層轉發查詢,直到找到目標為止。DNS還有一個特點就是使用快取記憶體,DNS把查詢過的資料快取在某處,以便於下次查詢時使用。
DNS協議
DNS報文定義了一個既可以查詢也可以響應的報文格式。對各個欄位簡單解釋如下:
-
最前面的16個bit唯一的標示了問題號碼,用於查詢端區別自己的查詢。
-
緊接著的16個bit又可以做進一步的細分,標示了報文的性質和一些細節,比如說是查詢報文還是響應報文,需要遞迴查詢與否(一般伺服器都支援遞迴查詢,而且不需要任何設定,BIND就是這樣)
-
查詢問題後面有查詢型別,包括A,NS,CNAME,PTR,HINFO,MX,如果熟悉BIND的話,就知道在zong的配置檔案裡面,每一條記錄都記載了各自的型別,比如A就是IP地址,NS就是名字伺服器。
-
響應報文可以回覆多個IP,也就是說,域名可以和多個IP地址對應,並且有很多CNAME。
反向查詢
正向查詢指的是通過域名得到IP的查詢,而反向查詢就是通過IP得到域名。例如用host命令,host ip就可以得到伺服器的域名,host domainName 就得到IP。
稍微知道一點資料結構的人都能意識到,在正向查詢的域裡面做反向查詢,其做法只有遍歷整個資料集合----對於DNS來說,那就是遍歷整個資料庫, 這將帶來巨大的負擔,所以DNS採取了另一種方法,使用另一棵子樹來維護IP-〉域名的對應表。
這個子樹的根節點是in-addr.arpa,而一個IP 例如192.168.11.2)所具有的DNS地址就是 2.11.168.192.in-addr.arpa(ip倒置)。在DNS系統裡面,一個反向地址對應一個PTR紀錄(對應A紀錄),所以反向查詢又叫 做指標(PTR)查詢。
其他問題的討論
DNS伺服器快取記憶體
BIND9預設是作為一個快取記憶體伺服器,其將所有的查詢都轉交到根伺服器去,然後得到結果並放在本地的緩衝區,以加快查詢速度。如果有興趣可以安裝一個BIND9來嘗試一下。而自己定義的zone則可以規定其在快取中的時間,一般是1天(就是配置檔案中的1D)。
用UDP還是TCP
DNS伺服器支援TCP和UDP兩種協議的查詢方式,而且埠都是53。而大多數的查詢都是UDP查詢的,一般需要TCP查詢的有兩種情況:
-
當查詢資料多大以至於產生了資料截斷(TC標誌為1),這時,需要利用TCP的分片能力來進行資料傳輸(看TCP的相關章節)。
-
當主(master)伺服器和輔(slave)伺服器之間通訊,輔伺服器要拿到主伺服器的zone資訊的時候。