域名系統(DNS)101—網址的小旅行

YH Yu
後端新手村
Published in
8 min readJul 19, 2019

本文屬於系列:系統設計學習地圖

什麼是域名系統(Domain Name System, DNS)

若我們想要約朋友在台北車站碰面,我們不會約在“台北市北平西路3號”,而是直接說“台北車站”見。因為台北車站是個好記憶的地標,而地址不是。

同樣的道理,雖然在網際網路中,每台伺服器的實際地址是用“IP”來表示。但方便我們識別的是“域名”(domain name),就好像地標一樣。

舉例來說,Google的域名是“google.com”,其中一個網站伺服器的IP地址是“172.217.160.78”。我們在瀏覽器的網址列輸入“google.com”後,實際上是透過“172.217.160.78”連線到Google首頁的。

那麼,瀏覽器如何知道域名該對應哪個IP地址呢?網路上現有的域名和IP不計其數,難道是有一台龐大的中央資料庫來保存所有對應關係嗎?

實際的情況是,的確有伺服器會負責保存這些資訊。只是不是一台,而是由一群遍佈全球的名稱伺服器(Name Server)合力完成。這些名稱伺服器與其運作的機制統稱為域名系統(DNS)。

DNS的運作原理

DNS由許多不同層級的名稱伺服器組成,每個層級的名稱伺服器都只會保存部分的資訊,但它們知道要再去找哪台名稱伺服器接續處理。

解析域名的過程是由右向左。例如域名是“www.pchome.com.tw”的話,“.tw”會先被解析(連線到負責“.tw”的名稱伺服器),然後是“.com”(連線到負責“.com”的名稱伺服器),依此類推。

Source:鳥哥的 Linux 私房菜

接下來用一個實際的例子來說明,若我們要連線到“example.com”,從瀏覽器出發到取得結果,過程大致上可以分為五個階段

Step 1. DNS Resolver

瀏覽器的第一站是DNS Resolver(或稱Recursive Resolver)伺服器,通常是由我們的網際網路服務供應商(Internet Service Provider,ISP,例如中華電信)提供。

DNS Resolver伺服器本身並沒有域名的對應資訊,它的功能是負責整個查詢的過程,也就是在瀏覽器和名稱伺服器間扮演著中間人的角色。

每個DNS Resolver伺服器都有著一份清單,裡面紀錄了它的第一站,也就是Root名稱伺服器的IP地址。解析域名的旅程從這邊開始!

Step 2. Root Name Server

DNS Resolver伺服器向Root名稱伺服器詢問“example.com”在哪裡?

雖然Root名稱伺服器並沒有直接保存“example.com”的IP地址,但是它持有Top-level Domain(TLD)名稱伺服器的清單。顧名思義,top-level是最上層,也就是域名結尾的部分,像是最常見的“.com”、“.io”等等。

以我們的例子來說,Root名稱伺服器會從它的清單中,找出哪個TLD名稱伺服器負責“.com”的域名。將這個TLD名稱伺服器的IP地址,回傳給DNS Resolver伺服器後就算完成它的任務了。

Step 3. TLD Name Server

DNS Resolver伺服器向TLD名稱伺服器詢問“example.com”在哪裡?

和Root名稱伺服器類似,TLD名稱伺服器也沒有直接保存“example.com”的IP地址。但它知道要去哪裡找負責該域名的名稱伺服器,稱為Domain名稱伺服器,這個清單又是哪來的呢?

Root名稱伺服器和TLD名稱伺服器是由特定的機構管理(ICANN)。想要註冊某個域名的時候,就需要提供自己的Domain名稱伺服器的IP位址,來跟它們做申請,通過後就會被加入到清單中。

目前很常見的方式是透過域名服務供應商(e.g. GoDaddyRoute 53)來辦理。由它們幫忙申請域名,甚至還可以使用託管的Domain名稱伺服器(不用自己架設),我們只需要支付相對應的費用。

Step 4. Domain Name Server

DNS Resolver伺服器向Domain名稱伺服器詢問“example.com”在哪裡?

終於,我們找到知道這個問題的答案的人了!Domain名稱伺服器持有這個域名的IP地址,是時候談談名稱伺服器實際上如何保存這些資訊了。

所有(包含Root和TLD)名稱伺服器,在保存各個域名的相關資訊時,格式是一筆筆的紀錄(Record)。紀錄的類型有很多種,對我們來說最先需要知道的是CNAME record和A record。

直接看例子,假設我們註冊了“myShop.com”這個域名,並且希望使用者除了“myShop.com”外,也可以透過“www.myShop.com”來連到網站,可以這樣設定:

www.myShop.com.   IN CNAME   myShop.com.
myShop.com. IN A xx.xx.xx.xx

先看第一行,CNAME record的用途是幫域名設定別名(alias)。以這個例子而言,當我們連線到“www.myShop.com”時,名稱伺服器實際上是去找“myShop.com”在哪裡,而“myShop.com”的IP地址就紀錄在第二行的A record。

IP地址是我們最終的目的地,所以A record當然是必要的。而CNAME record可以方便我們管理多個域名對應到同一個IP地址的情況。

若不使用CNAME record的話,每個域名就必須個別設定A record。假設某天網站伺服器的IP位址有變,全部的A record都要一起更新。但使用CNAME record的話,我們只要更新一筆即可。

Note: CNAME record有一些先天上的規範限制,所以部分域名服務供應商會提供一些替代做法,像是ALIAS record(非標準,可以參考AWS的文件)。

Step 5. Website Server

最後,瀏覽器透過DNS Resolver伺服器回傳的IP位址去連線網站伺服器,大功告成!

雖然看起來步驟很繁瑣,但整個過程通常是以毫秒(千分之一秒)計算。此外,為了加速查詢的效率,各個名稱伺服器,甚至我們的瀏覽器,都有實作快取(cache)機制,來保存先前查詢過的域名及IP地址。

DNS的查詢工具

digdomain information groper)這個指令可以幫助我們查看DNS的解析過程。以“example.com”為例:

$ dig example.com
example.com. 8423 IN A 93.184.216.34

我們可以知道域名“example.com”的實際IP地址是“93.184.216.34”。

dig還可以加上參數+trace來獲得更詳細的資訊,順便複習一下整個過程是不是和我們理解的一樣。

$ dig example.com +trace
# 以下省略大部分的輸出資訊
# 1. DNS Resolver -> Root Name Server
. 3600 IN NS c.root-servers.net.
# 2. Root Name Server -> TLD Name Server
com. 172800 IN NS k.gtld-servers.net.
# 3. TLD Name Server -> Domain Name Server
example.com. 172800 IN NS a.iana-servers.net.
# 4. Domain Name Server -> Website Server
example.com. 86400 IN A 93.184.216.34

NS record之前沒有提到,但也很重要。它代表的是該域名由哪個名稱伺服器負責,讓DNS Resolver伺服器可以前往下一個目的地。

其它DNS相關的指令還有像是nslookuptraceroute等等,有興趣可以自行試試看!

總結

在本文中,我們依序介紹了DNS解析域名的五個步驟,涵蓋了DNS Resolver和各個層級(Root、TLD、Domain)的名稱伺服器。再來是名稱伺服器中常見的幾種紀錄類型,像是NSCNAMEA record。最後則是透過dig指令去觀察一個域名的解析過程。

為什麼需要了解DNS的運作原理?最直接的,若我們需要註冊一個自己的域名,即使是透過域名服務供應商,這些基本的知識對於調整域名的設定來說也是非常必要的。

而以系統設計的觀點,DNS除了解析域名的功能外,還可以扮演分派流量的角色。這在系統架構上提供了更多的彈性,也就是雖然是同一個域名,但根據我們選擇的策略,可以對應到不同的IP地址。以Route 53為例,可以做到機率分流(A/B Testing),甚至自動選擇地理位置最近的IP地址等等。

如果這篇文章對你有所幫助的話,歡迎拍手讓我知道,最多可以拍50下喔👏👏

--

--

YH Yu
後端新手村

Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.