1. 程式人生 > >DNS服務(一):由域名解析出IP

DNS服務(一):由域名解析出IP

DNS簡介

DNS,就是Domain Name System的縮寫,翻譯過來就是域名系統,是網際網路上作為域名和IP地址相互對映的一個分散式資料庫。DNS能夠使使用者更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的IP數串。通過域名,最終得到該域名對應的IP地址的過程叫做域名解析(或主機名解析)。
image
- 根域名伺服器:最重要的域名伺服器,因為不管是哪一個本地域名伺服器,若要對因特網上任何一個域名進行域名解析,只要自己無法解析,就首先要求助於根域名伺服器。假定所有的(共有13個不同IP地址的裝置,每一套裝置使用一個域名,,每一套裝置在世界多個地點安裝了根域名伺服器,每一個地點的根域名伺服器還可以有多臺機器組成)根域名伺服器都癱瘓了,那麼整個DNS系統就無法工作。

根域名伺服器並不直接把待查詢的域名裝換成IP(它的機器裡也沒有存放這種資訊),而是告訴本地域名伺服器下一步應該找哪一個頂級域名伺服器進行查詢。
- 頂級域名伺服器(TLD伺服器):負責管理在該伺服器註冊的所有二級域名。當收到DNS查詢請求是,就給出響應的回答(可能是最後的結果,也可能是下一步應該查詢的域名伺服器的IP地址).頂級域名伺服器被分為三個部分:1.arpa是一個用作地址到名字轉換的特殊域。 2.普通域或組織域(7個,每個3字元長)
3. 國家域
- 許可權域名伺服器:負責一個區的域名伺服器。當一個許可權域名伺服器還不能給出最後的查詢回答時,就會告訴發出查詢請求的DNS客戶(這裡一般是本地域名伺服器扮演DNS客戶的角色),下一步應該找哪一個許可權域名伺服器
- 本地域名伺服器:不屬於樹狀圖中的某個層次。當一個附近發出DNS請求是,這個請求報文的傳送和響應報文的接收就交由本地域名伺服器。每一個因特網服務提供者ISP,或一個大學,甚至大學裡的某個系都可以擁有一個本地域名伺服器,也叫預設域名伺服器。在WINDOWS裡,”屬性” -> “網路” ->”Internet協議” -> “屬性” ,就可以看到有關DNS地址的選項(自動獲取或手動指定)。這裡的DNS 伺服器值得就是本地域名伺服器,它裡使用者比較近,僅有幾個路由的距離。當索要查詢的主機也屬於同一個本地ISP時,該本地域名伺服器立即就能將查詢的主機名轉化為他的IP地址。

採用協議

簡單來說:
- DNS伺服器間進行域傳輸的時候用TCP 53
- 客戶端查詢DNS伺服器時用 UDP 53
- DNS查詢超過512位元組,TC標誌出現 使用TCP傳送

解釋說明:
- DNS同時佔用UDP和TCP埠53是公認的,這種單個應用協議同時使用兩種傳輸協議的情況在TCP/IP棧也算是個另類,一種比較特殊的情況
- TCP與UDP的區別:

- UDP和TCP協議的主要區別是兩者在如何實現資訊的可靠傳遞方面不同。TCP協議中包含了專門的傳遞保證機制,當資料接收方收到傳送方傳來的資訊時,會自動向傳送方發出確認訊息;傳送方只有在接收到該確認訊息之後才繼續傳送其它資訊,否則將一直等待直到收到確認資訊為止。 

- 與TCP不同,UDP協議並不提供資料傳送的保證機制。如果在從傳送方到接收方的傳遞過程中出現數據報的丟失,協議本身並不能做出任何檢測或提示。因此,通常人們把UDP協議稱為不可靠的傳輸協議。

- 相對於TCP協議,UDP協議的另外一個不同之處在於如何接收突發性的多個數據報。不同於TCP,UDP並不能確保資料的傳送和接收順序。事實上,UDP協議的這種亂序性基本上很少出現,通常只會在網路非常擁擠的情況下才有可能發生。 

- 既然UDP是一種不可靠的網路協議,那麼還有什麼使用價值或必要呢?其實不然,在有些情況下UDP協議可能會變得非常有用。因為UDP具有TCP所望塵莫及的速度優勢。雖然TCP協議中植入了各種安全保障功能,但是在實際執行的過程中會佔用大量的系統開銷,無疑使速度受到嚴重的影響。反觀UDP由於排除了資訊可靠傳遞機制,將安全和排序等功能移交給上層應用來完成,極大降低了執行時間,使速度得到了保證。 
  • DNS在進行區域傳輸的時候使用TCP協議,其它時候(如:域名解析)則使用UDP協議。

    • DNS的規範規定了2種類型的DNS伺服器,一個叫主DNS伺服器,一個叫輔助DNS伺服器。在一個區中主DNS伺服器從自己磁碟上的資料檔案中讀取該區的DNS資料資訊,而輔助DNS伺服器則從區的主DNS伺服器中讀取該區的DNS資料資訊。當一個輔助DNS伺服器啟動時,它需要與主DNS伺服器通訊,並載入資料資訊,這就叫做區傳送(zone transfer)。
    • 為什麼既使用TCP又使用UDP?

      首先了解一下TCP與UDP傳送位元組的長度限制:
      image
      標識欄位由客戶程式設定並由伺服器返回結果。客戶程式通過它來確定響應與查詢是否 匹配。
      16 bit的標誌欄位被劃分為若干子欄位,如下圖
      image
      • TC是1 bit欄位,表示“可截斷的 (truncated)”。使用UDP時,它表示當應答的總長度超
      過512位元組時,只返回前 512個位元組。

    UDP報文的最大長度為512位元組,而TCP則允許報文長度超過512位元組。當DNS查詢超過512位元組時,協議的TC標誌出現刪除標誌,如果使用UDP,512位元組後的資料就無法接收到,這時則使用TCP傳送。通常傳統的UDP報文一般不會大於512位元組。

    • 區域傳送時使用TCP,主要有一下兩點考慮:

      1. 輔域名伺服器會定時(一般3小時)向主域名伺服器進行查詢以便了解資料是否有變動。如有變動,則會執行一次區域傳送,進行資料同步。區域傳送將使用TCP而不是UDP,因為資料同步傳送的資料量比一個請求和應答的資料量要多得多,肯定不止512個位元組。
      2. TCP是一種可靠的連線,保證了資料的準確性。
    • 域名解析時使用UDP協議:
      客戶端向DNS伺服器查詢域名,一般返回的內容都不超過512位元組,用UDP傳輸即可。不用經過TCP三次握手,這樣DNS伺服器負載更低,響應更快。雖然從理論上說,客戶端也可以指定向DNS伺服器查詢的時候使用TCP,但事實上,很多DNS伺服器進行配置的時候,僅支援UDP查詢包。

查詢方式:

  • 遞迴查詢
    主機向本地域名伺服器的查詢一般都是採用遞迴查詢。所謂遞迴查詢就是:如果主機所詢問的本地域名伺服器不知道被查詢域名的IP地址,那麼本地域名伺服器就以DNS客戶的身份。向其他根域名伺服器繼續發出查詢請求報文(即替該主機繼續查詢),而不是讓主機自己進行下一步的查詢。因此,查詢遞迴返回的查詢結構或者是索要查詢的IP地址,或者是報錯表示無法查詢到。

  • 迭代查詢
    本地域名伺服器向根域名伺服器的查詢通常是迭代查詢。迭代查詢的特點是:當根域名伺服器收到本地域名伺服器發出的迭代查詢請求報文時,要麼給出所要查詢的IP地址,要買告訴本地域名伺服器:“你下一步應當向哪一個域名伺服器查詢”。然後讓本地域名伺服器進行後續的查詢(而不是替本地域名伺服器進行後續查詢)。本地域名伺服器再想頂級域名伺服器查詢。頂級域名伺服器收到請求後,要麼給出對用的IP地址,㭉告訴本地域名伺服器下一步應該想哪一個許可權域名伺服器請求,本地域名伺服器就這樣進行迭代查詢。最後,自己得到IP地址,返回給客戶主機。當然本地域名伺服器也可以採用迭代查詢。

image

解析過程

下面來詳細解釋DNS域名解析的過程:

  1. 網路客戶端就是我們平常使用的電腦,開啟瀏覽器,輸入一個域名。比如輸入www.163.com,這時,你使用的電腦會發出一個DNS請求到本地DNS伺服器。本地DNS伺服器一般都是你的網路接入伺服器商提供,比如中國電信,中國移動。

    • 查詢www.163.com的DNS請求到達本地DNS伺服器之後,本地DNS伺服器會首先查詢它的快取記錄,如果快取中有此條記錄,就可以直接返回結果。如果沒有,本地DNS伺服器還要向DNS根伺服器進行查詢。

    • 根DNS伺服器沒有記錄具體的域名和IP地址的對應關係,而是告訴本地DNS伺服器,你可以到域伺服器上去繼續查詢,並給出域伺服器的地址。

    • 本地DNS伺服器繼續向域伺服器發出請求,在這個例子中,請求的物件是.com域伺服器。.com域伺服器收到請求之後,也不會直接返回域名和IP地址的對應關係,而是告訴本地DNS伺服器,你域名的解析伺服器(即前面說到的許可權域名伺服器)的地址。

    • 最後,本地DNS伺服器向域名的解析伺服器發出請求,這時就能收到一個域名和IP地址對應關係,本地DNS伺服器不僅要把IP地址返回給使用者電腦,還要把這個對應關係儲存在快取中,以備下次別的使用者查詢時,可以直接返回結果,加快網路訪問。

快取記憶體

  • 上面的過程是假設第一次查詢,沒有利用快取的過程。
    實際上為了提高DNS查詢效率,減輕伺服器負荷,在域名伺服器和本機上都廣泛的使用了快取記憶體。快取記憶體用來存放最近查詢過的域名以及從何處獲得域名對映的的記錄。
  • 在不久前已經查詢或www.163.com,那麼本地域名伺服器就可以直接把自己在告訴快取中的結果取出來返回客戶本機。

    如果本地域名伺服器快取沒有對用IP地址,而快取了頂級域名伺服器地址,就可以跳過根域名伺服器直接向頂級域名伺服器發出請求,減少報文數量和根域名伺服器的符合。

    每項都有一個快取時間。許可權域名伺服器回答一個查詢是,在響應中都指明繫結有效存在的時間值。增加此時間可減少網路開銷,而減少此時間可提高域名轉化的準確性。

    處理本地域名伺服器,本機也有快取。它在啟動時從本地域名伺服器下載名字和地址的全部資料庫,維護存放自己最近使用的域名的快取記憶體。查詢域名時,在本機host檔案和快取中找不到時就會請求本地域名伺服器。

域名配置ZONE檔案

ZONE檔案是DNS上儲存域名配置的檔案,
一個域名對應一個ZONE檔案,現以abc.com的ZONE檔案為
例展開,該==ZONE存在於權威DNS上==。

$TTL 6h //第1行
$ORIGIN abc.com. //第2行   主權威DNS
@ 3600 IN SOA ns1.ddd.com. root.ddd.com.( //第3行
929142851 ; Serial //第4行
1800 ; Refresh //第5行
600 ; Retry //第6行
2w ; Expire //第7行
300 ; Minimum //第8行
) 
@ 2d IN NS ns1.ddd.com. //第9行     權威DNS 解析:域名->IP
@ 2d IN NS ns2.ddd.com. //第10行    權威DNS
@ 2d IN NS ns3.ddd.com. //第11行    權威DNS
@ 3600 IN A 120.172.234.27 //第12行
a 3600 IN A 120.172.234.27 //第13行
b 3600 IN CNAME a.abc.com. //第14行
@ 3600 IN MX a.abc.com. //第15行
@ 3600 IN TXT "TXT" //第15行
  • 第1行,這行內容給出了該域名(abc.com)各種記錄的預設TTL值,這裡為6小時。即如果該域名的記錄沒有特別定義TTL,則預設TTL為有效值。這的TTL是指該域名對應的IP可以被其他主機快取的時間。
  • 第2行,這行內容標識出該ZONE檔案是隸屬那個域名的,這裡為abc.com。
  • 第3行,從這行開始到第8行為該域名的SOA記錄部分,這裡的@代表域名本身。==ns1.ddd.com表示該域名的主權威DNS==。root.ddd.com表示該主權威DN
    S管理員郵箱,等價於[email protected]
  • 第4行,Serial部分,這部分用來==標記ZONE檔案更新==,如果發生更新則Serial要單增,否則MASTER不會通知SLAVE進行更新。

  • 第5行,Refresh部分,這個標記SLAVE伺服器多長時間主動(忽略MASTER的更新通知)向MASTER複核Serial是否有變,如有變則更新之。

  • 第6行,Retry部分,如Refresh過程不能完成,重試的時間間隔。
  • 第7行,Expire部分,如SLAVE無法與MASTER取得聯絡,SLAVE繼續提供DNS服務的時間,這裡為2W(兩週時間)。Expire時間到期後SLAVE仍然無法聯
    系MASTER則停止工作,拒絕繼續提供服務。Expire的實際意義在於它==決定了MASTER伺服器的最長下線時間(如MASTER遷移,DOWN機等)==。

  • 第8行,Minimum部分,這個部分定義了DNS對否定回答(NXDOMAIN即訪問的記錄在權威DNS上不存在)的快取時間。

  • 第9-11行,定義了該域名的3個權威DNS伺服器。通常NS記錄的TTL大些為宜,這裡為2天。設定過小隻會增加伺服器無謂的負擔,同時解析穩定性會
    受影響。這的TTL這的是其他主機對查詢域名所屬的權威DNS伺服器的地址的快取時間。
  • 第12-15行,比較簡單,是兩個A(對應有IP),CNAME,MX記錄,不再討論了。

名詞解釋:
SOA記錄:權威記錄從這裡開始,它定義了3-8行這些重要的引數。
A記錄:記錄域名到IP之間的關聯。
CAME記錄:讓域名B指向域名A,兩個域名指向同一個IP,這時訪問A或B結果都跟直接訪問A時一樣的效果。
MX記錄:定義了發往[email protected]郵箱的郵件伺服器地址。
TXT記錄:這個記錄的內容是文字格式如126.COM的TXT為”v=spf1 include:spf.163.com -all”,TXT通常用於郵件伺服器來標識自己的身份避免被認
為是垃圾郵件伺服器。這裡不再深入討論。
其他不常用記錄型別沒有列出!