扒一扒 DNS 的前世今生

今天就來跟大家科普一下關於DNS的相關知識,講一講一個網址背後發生的一些故事。

 

簡單來說,DNS(網域系統)就是網域名稱和各種資料之間的一個映射表。最常見的映射就是把像 chatgpt.com 這樣的網域轉換成電腦能懂的IP位址。

 

當你把 chatgpt.com 敲進瀏覽器時,DNS 就會出馬,找到並回傳這個網域綁定的 IP 位址:

 

當然啦,這背後發生了很多事。在這篇文章裡,我們就來扒一扒它到底是怎麼運作的。

 

我希望這篇文章能比 ChatGPT DeepSeek 講得還好懂,要是連它們都能寫得比我好,那我就太失敗了!

 

好了,閒話少說,咱們開始吧。

 

DNS 誕生前

在深入 DNS 之前,咱先看看它出現之前是啥情況。

 

80 年代現代網路出現之前,有個叫ARPAnet的玩意兒。它是當時第一個分組交換網絡,算是現代互聯網的老祖。

 

ARPAnet 用一個叫HOSTS.TXT的文件,把伺服器的網域名稱和網路位址(也就是 IP 位址)對應起來。

 

這份文件大概長這樣:

 

 

 

這個「主」 HOSTS.TXT 文件就一份,由史丹佛研究所 (SRI) 獨家維護。這慢慢就出問題了,為啥呢?

 

流量和伺服器壓力山大:所有設備都得找 SRI 的伺服器查名字,SRI 伺服器快被壓垮了。

名字撞車越來越頻繁:網路變大了,大家想用的好名字就那些,衝突越來越多。

檔案變得巨胖:檔案大小漲到了 100-200KB。現在看這點數據不算啥,但在 80 年代的基礎設施條件下,這已經是個大瓶頸了。

這些問題可太要命了,直接催生了 DNS 的誕生。

 

DNS登場

DNS 架構

DNS (網域名稱系統)最好理解成一個分散式的和層次化的系統。

 

啥意思呢?

 

分散式:意思是 DNS 運作在好多台互相連線的伺服器(也就是 DNS 伺服器)上。

層次化:DNS 組織成一個樹狀結構,上面的伺服器管著下面的伺服器。等一下講到 DNS 區域時再細說。

DNS 記錄

現在我們知道了,DNS 是一堆伺服器以樹狀結構組織起來,互相通訊。那這些伺服器存啥呢?

 

DNS 伺服器存的就是DNS 記錄。看個例子:

 

來詳細掰扯掰扯每個欄位是啥意思:

 

域名:就是網路上的域名,例如 chatgpt.com。注意結尾那個點 . 表示根域(通常可以省略)。

TTL:生存時間(單位秒)。意思是這個記錄你能在本地快取多久,過期了就得去問權威伺服器要新的。

類別:這玩意兒基本上總是IN,代表「網際網路」 (Internet)。還有別的類,像CHHS,但現在基本上不用了。

類型:代表這條記錄存的是哪一類資料。最常見的類型有:

A:代表一個IPv4 位址。

 

AAAA:代表一個IPv6 位址。

 

CNAME:意思是規範名稱,就是給另一個網域取個別名。

 

MX:郵件交換器,指定誰來收這個網域的郵件(後面跟優先級,數字越小越優先)。

 

TXT:文字記錄,可以存任意文字(例如驗證資訊、安全性策略啥的)。

 

數據:你要查的那個資訊的真身。具體是啥完全取決於類型欄位。

DNS 區域

還記得我們說過 DNS 是個大樹嗎?

 

那麼,一個 DNS 區域就可以代表整棵樹、樹的一個分支、或是樹裡的一個節點。

 

在下面的示意圖裡,我圈出了兩個分支,標示為區域1和區域2。不過區域怎麼劃分其實蠻隨意的。

 

關鍵點在於:位於一個區域根部的那個 DNS 伺服器,負責管理它下面的所有伺服器。例如,example.com 這個伺服器就管著 hello world(如果它們是子網域的話)。

 

DNS 伺服器

DNS 伺服器」這個詞用得很寬泛,這也是我學 DNS 時最暈乎的地方之一。

 

簡單說,任何執行 DNS 軟體的伺服器都可以叫 DNS 伺服器。但有四種核心角色你必須知道:

 

權威網域名稱伺服器:這些伺服器存著它們負責的DNS 區域裡所有網域的官方 DNS 記錄。例如 .com 的權威伺服器就存所有以 .com 結尾網站的記錄。

 

遞歸解析器:一個專門幫客戶(例如你的電腦)查找 DNS 資訊的程序,還會把結果快取起來。例如客戶說“我要訪問 www.example.com”,遞歸解析器就把複雜的查詢過程全包了,最後直接給你回傳 example.com 的正確 IPv4 位址(A 記錄)。你的路由器或 ISP(像電信、聯通)提供的 DNS 伺服器通常就做這個活。

快取伺服器:專門用來存之前查過的 DNS 結果,這樣下次再問就能快速給答案。

轉發器:它自己不去查,而是把收到的 DNS 查詢請求 轉給另一個能查的伺服器(通常就是個遞歸解析器)去處理。

 

一台實體上的 DNS 伺服器可以同時做好幾樣活。例如,一個遞歸解析器通常也自備快取功能(也就是快取伺服器)。

 

DNS 查詢實例

術語講夠了,讓我們看個動圖(腦補一下)!看看這一切是怎麼配合工作的,請舉個栗子:一個客戶端第一次查詢 hello.world.com IP 位址(A 記錄)。

 

請求內容是:A hello.world.com? (意思是:hello.world.com IP 是啥?)

 

接下來,就要進行遞迴 DNS 查詢了。過程大概是這樣的:

 

用戶端問路由器/本地DNS:「嘿,hello.world.com IP 是啥?」(本地沒快取)

本地DNS(遞歸解析器)開始工作:

先看看自己快取裡有沒有,沒有。

跑去問根網域伺服器:“.com 該找誰管啊?”

根伺服器回覆:「.com 的事歸這些 TLD 伺服器(頂級網域伺服器)管,位址是 X.X.X.X」。

.com TLD 伺服器:“world.com 該找誰管啊?”

.com TLD 伺服器回覆:「world.com 歸這些權威伺服器管,位址是 Y.Y.Y.Y」。

world.com 權威伺服器:

hello.world.com IP 是啥?”

world.com 的權威伺服器回覆:「在這裡呢,hello.world.com A 記錄是143.54.1.8」。

結果回傳與快取:

遞歸解析器拿到最終答案 143.54.1.88,開心地把它回傳給客戶端(一路經過路由器)。

這個結果會一路被快取:ISP 的解析器會快取它,你的路由器(如果支援)也可能會緩存,你的電腦作業系統也會快取。緩存多久?看記錄的 TTL 值,通常幾小時到幾天不等(例如 1 72 小時)。

連線建立:客戶端瀏覽器拿到 IP 位址 143.54.1.88,終於可以傳送 HTTP 請求到這個位址載入網頁了。

 

結語

DNS 這玩意兒挺繞的,倒不是因為它本身有多難,而是因為要搞懂的東西實在有點多。

 

即使有了這些概念解釋和實例演示,我們也只是掀開了 DNS 世界的一角。它在現實世界中能幹的事和帶來的影響,遠比我們在這裡講的豐富和深遠得多。