我現在所知道的 DNS


為什麼我們需要 Domain Name System (DNS) ?

我們總是習慣的輸入某個特定網址(Domain Name),就能使用相關服務,這跟 DNS 又有什麼關係呢?

DNS 有三個主要的功能:

  1. 將 Domain Name 轉譯為 IP 位址
  2. 主機別名 (Host aliasing)
  3. 郵件伺服器別名 (Mail server aliasing)
  4. 負載分配 (Load distribution)

我們今天會著重於第一個功能:將 Domain Name 轉譯為 IP 位址。
因為人跟電腦記憶的方式不同,電腦更擅長於記憶數字。但人記憶文字更有效率,為了填補這個空隙,於是人們便發展出了 DNS 。

DNS 是什麼?

你可以把 DNS 看成一種分散式、階層式的資料庫,讓世界各地使用者能夠有效率的取得所需服務的主機位置(IP)。
你也可以把 DNS 看作是一種協定,一種說好的規範如何傳送特定資訊。DNS 訊息格式

為什麼需要做成分散、階層式的資料庫?只做一個不行嗎?

如果全球只有一台 DNS Server 可能會發生的事

  1. 如果這個 Server 出問題了,全世界斷網 QQ
  2. 假設這個主機在台灣,那離台灣遠的國家在使用網路的時候,會需要更多時間等待(回覆)
  3. 難以維護,只要每次維護,就有可能無法提供服務。

DNS 是怎麼做通訊的?

DNS 協定是透過 UDP 來運作,使用 Port 號為 53 。
會用 UDP 的幾個原因是

  • UDP 更快
  • DNS 協定的資訊量並不大
  • 雖然 UDP 不可靠,但是可以透過 application layer 補強,比如說 Resend 機制等。
  • 但是也不是只使用 UDP ,如果資料量過大,也會使用 TCP 。

一般使用流程

我們在瀏覽器上輸入網址按下 enter 的那一瞬間,瀏覽器其實幫我們做了很多事。

  1. 使用者使用瀏覽器發出請求給 www.google.com
  2. 使用者的電腦會執行 DNS Client 端
  3. 瀏覽器把 www.google.com 交給 DNS Client 端
  4. DNS Client 傳送一筆查詢資訊給 DNS Server
  5. DNS Client 收到回覆,交給瀏覽器
  6. 瀏覽器收到 IP ,建立 TCP 連線,到該 IP 伺服器上

上面看似簡單輕鬆的過程其實一點都不簡單,還記得我們前面說過 DNS 是個分散式架構的資料庫嗎?

就讓我們來看看,DNS Client 是如何跟一大群 Server 互動的。

各種 DNS Server 之間的互動

互動流程:

  1. 使用者主機,要求 Local DNS Server 查詢 gaia.cs.umass.edu
  2. Local DNS Server 詢問 Root DNS Server ,Root 判斷為 .edu 回傳 TLD Server IP
  3. Local DNS Server 轉向 edu TLD Server 詢問,TLD 判斷為 umass 回傳 umass 官方 DNS Server IP
  4. Local DNS Server 再轉向 umass 官方 DNS Server 詢問 gaia.cs.umass.edu’s IP
  5. 最後終於回傳到了 Local DNS Server ,再回給使用者。
  6. 使用者終於可以連線了 QQ

DNS Server 分類

上面有這麼多種 Server ,為了更好理解,我們先將這些 Server 做一些簡單的分類

  1. Local DNS Server(區域 DNS 伺服器)
    • 嚴格說來不屬於 DNS Server 階層環節( Root DNS 開始才算)
    • 通常由 ISP 提供
  2. Root DNS Server(根 DNS 伺服器)
    • 提供 TLD Server 伺服器的 IP
  3. TLD Server(高階網域 DNS 伺服器)
    • ex. com, tw, org, edu…..
    • 提供官方 DNS 伺服器的 IP
  4. 官方 DNS Server
    • ex. dns.the-best.com, dns.wow.edu, ….
    • 只要你有主機提供服務,就需要提供 DNS 紀錄(Type A)給使用者存取。

DNS 紀錄與訊息

與許多 Server 互動,他們究竟在交流些什麼呢?
他們透過 DNS 訊息獲得 DNS Resources Record 情報。 每台 DNS Server 都會有 DNS Resources Record (RRs),用來幫助我們找到服務主機 IP 。
RR 主要包含四個數值 (Name, Value, Type, TTL)

Type 又可以簡單分為:

  • A:Name 為主機名稱,Value 為 IP 位置
  • NS:Name 為網域(ex. foo.com),Value 為該網域的官方 DNS 伺服器主機名稱(ex. dns.foo.com)
    • (foo.com, dns.foo.com, NS, 14400)
  • CNAME( Canonical Name Record):Name 為主機別名,Value 為主機正規名稱。
    • 舉例來說 (foo.com, relay1.bar.foo.com, CNAME)
    • 我們會說 relay1.bar.foo.com 是 foo.com 的 CNAME
  • MX:Name 為郵件伺服器別名,Value 為郵件伺服器正規名稱,概念同 CNAME。

DNS Caching

我們現在知道了我們會需要跟很多 Server 互動,但每次的搜尋都這樣去找 IP 位置是不是太麻煩了?

沒錯

為了避免每次都要重複上面所說的工作流程。
每當 DNS Server 收到 DNS 的回覆時,它會把它存在本機的記憶體內
但因為主機名稱與 IP 並不是一直固定不變的,所以一定時間後 DNS 便會把 Cache 清掉(通常是兩天)
現實生活中,因為 Caching 的關係,大部分的 Root DNS Server 都被跳過了

在 DNS 資料庫中加入紀錄

我們了解到每次的使用都不簡單。
但,我開發好了一個網站,想給其他人來瀏覽該怎麼辦呢?
 

  1. 向廠商註冊一個 Domain Name ,就假設我申請的是 lester.tw ,所以我就要向管理 .tw 的廠商申請付費。

  2. 申請完之後,我要自己建一個 DNS Server 假設他的網址是 dns.lester.tw, IP 為 111.22.333.444 ,並告知廠商。

  3. 廠商確認後就會在他的 DNS Server 內建立兩筆資料,分別是

    • (lester.tw, dns.lester.tw, NS, 14400)
    • (dns.lester.tw, 111.22.333.444, A, 14400)
  4. 然後我要在我自己的 DNS server 內確認有放入

    • (cs.lester.tw, 112.222.333.111, A, 14400)

這樣設定好之後,讓我們來看看使用者要怎麼找到我的主機位置吧。

(假設沒有任何 cache)

  1. 使用者輸入 cs.lester.tw

  2. DNS Client 前往 Local DNS Server,無法找到,前往 Root DNS Server

  3. Root DNS Server 找到 .tw 回覆 Local 訊息(訊息包含兩筆 RRs 分別為 Type NS, TYPE A, 指向 TLD Server)

  4. Local 詢問 TLD Server, TLD Server 找到 lester.tw 回覆 Local 訊息(這兩筆 RRs 就是我們交給廠商的 RRs)

  5. Local 詢問 dns.lester.tw, dns.lester.tw 找到 cs.lester.tw 的 RRs(cs.lester.tw, 111.222.333.444, A, 14400) 回覆給 Local

  6. Local 回給使用者 DNS Client ,使用者連接上 cs.lester.tw

小結

以上就是我目前知道的 DNS 。

但現實生活中 DNS 已經變得更加複雜或者說變得更加方便。

比如說,我並沒有架設自己的 DNS Server 而是交給其他廠商託管。

DNS Caching 的部分在現實生活中其實做得相當好,甚至我們電腦主機內也有一份 Caching 。
大多數時候,我們常用的網站,我們在一開始的時候就已經知道其 IP 位置。不用每次都去做詢問。

如果有什麼地方理解錯誤的話,就煩請給予建議指教囉。

資料來源

電腦網際網路
CNAME記錄 - 維基百科,自由的百科全書
鳥哥的 Linux 私房菜 – 申請合法的主機名稱
鳥哥的 Linux 私房菜 – DNS Server
List of DNS record types - Wikipedia
Domain Name System - Wikipedia

DNS 

comments powered by Disqus