扒一扒 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)。還有別的類,像CH或HS,但現在基本上不用了。
類型:代表這條記錄存的是哪一類資料。最常見的類型有:
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 世界的一角。它在現實世界中能幹的事和帶來的影響,遠比我們在這裡講的豐富和深遠得多。