前言
我們在上一篇說到,IP 地址的發明把我們紛亂復雜的網絡設備整齊划一地統一在了同一個網絡中。
但是類似於 192.168.1.0
這樣的地址並不便於人類記憶,於是發明了 域名(Domain Name) 來幫助解決這樣的問題。
對應的,我們也需要一個系統來幫助"翻譯":
Part 1. DNS 是什么?
DNS (Domain Name System 的縮寫) 的作用非常簡單,就是根據域名查出對應的 IP 地址,你可以把它想象成一本巨大的電話本。
換句話說,DNS 是將域名映射到響應 IP 地址的服務。
Part 2. DNS 是如何工作的?
DNS 是我們今天使用 Internet 的核心。
最新報告顯示,2020 年第三季度有 3.71
億個域名,如果沒有 DNS 將其對應解析成對應的 IP 地址,我們將會在網絡世界中迷路。
當寧想要使用手機打電話給某人,寧幾乎不太可能背出確切的電話號碼,而是直接使用此人的名字進行搜索和撥號。
當寧想要加載網站時,DNS 會執行類似的操作。
解析域名或者主機名需要經歷幾個不同的階段。
在某些情況下,DNS 解析是一個一步就完成的過程,而某些情況下,則需要聯系多個 DNS 服務器。
下圖就展示了這一過程必要的步驟,並且沒有考慮瀏覽器緩存:
過程可能有些復雜,為了便於理解,我們在進一步說明之前需要先說明兩點:「DNS 服務器和域名的分級」 以及 「DNS 緩存」。
Part 3. 域名和 DNS 服務器的分級
域名的分級
我們日常上網輸入的網址,比如:https://www.google.com
,其實可以拆成幾個部分看待:
默認支持的服務類型(HTTP/ HTTPS)、主機名(www)、端口號(80)、默認文檔(index.html)是可以省略的,所以以上網址可以省略為:google.com
。
嚴格來說,google.com
才被稱為域名(全球唯一),www
是主機名,對應着一種服務,google.com
域名下不同的主機服務器,可以提供很多不同的服務:
www
、blog
等很多服務可以部署在同一台服務器上,而一台服務器獨占着一個 IP 地址,可見,域名和 IP 地址的對應關系可以是多對一的,或者一對多(負載均衡),也可以一對一。
所有的域名都有一個根的概念,所以整個互聯網的域名空間看起來會是這樣:
DNS 分級
把全世界所有的電話號碼存儲在同一個通訊錄里面既不現實也效率低下。
DNS 也是類似,對應域名空間,DNS 也有類似的結構:
整個域名系統采取分布式存儲。
全世界根域名服務器總共有 13 個,其中 10 個在美國,英國瑞典各 1 個,日本 1 個:
這是邏輯上的數量,這 13 個根域名器服務器背后其實還是有很多台物理的服務器在工作。
根域名服務器只負責管理頂級域名服務器(Top Level Domain,簡稱 TLD),記錄所有 TLD 的位置。
而 TLD 則對應管理着所有注冊在當前頂級域名下的所有權限服務器,也就是真實提供服務的服務器的真實 IP 地址。
這有點兒類似於我們真實的通訊錄,比如我們想要給 香克斯 打電話:
可以這樣想象:全世界的域名被根域名服務器邏輯的統一在一個通訊錄中,而根域名服務器就像右邊的導航一樣,存儲着不同標識對應列表的位置信息;
而這些標識類似於頂級域名服務器,存儲着注冊其下所有的權限服務器(比如 google.com
對應的服務器)信息;
只有查詢權限服務器,你才能拿到詳細的 IP 地址(不考慮緩存的情況下);
Part 4. 為什么需要 DNS 緩存?
通過上面通訊錄的例子,我們已經足夠理解 DNS 查詢的主要過程了:(再來看一眼)
但實際上,真正訪問 DNS 服務器之前,我們會在多個地方緩存域名與 IP 之間的對應關系:
- 這樣可以減少對 DNS 服務器的訪問,減緩 DNS 服務器的訪問壓力;
- 這樣也能夠加快域名解析的過程;
涉及 DNS 的地方就會有緩存,包括瀏覽器、操作系統、本地 DNS 服務器、路由器、ISP 提供的遞歸路由器、根域名服務器等,它們都會對 DNS 結果做一定程度的緩存。
但是,DNS 緩存也存在一些問題:
- DNS 更改刷新需要時間來傳播,這意味着每一台 DNS 服務器緩存更新到最新的 IP 需要一段時間;
- DNS 緩存也是黑客潛在的攻擊手段;
Part 5. 一次請求的詳細過程
這一次我們來跟蹤一次詳細的過程,例如我們在瀏覽器輸入網址 www.example.com
並回車:
- 查詢瀏覽器緩存,有結果則返回;(如果你使用 Chrome 瀏覽器可以輸入
chrome://net-internals/#dns
自行查看) - 查詢系統緩存,通常存在於 host 文件中,有結果則返回;
- Mac:
/etc/hosts
- Windows:
C:\Windows\System32\drivers\etc\hosts
- Mac:
- 向本地 DNS 服務器,通常是路由器,有結果則返回,否則向上查詢直連 ISP 的遞歸 DNS 服務器;
- 查詢 ISP 提供的 「遞歸 DNS 服務器」,有緩存則返回,否則一直遞歸查詢到 「根服務器」;
- 「遞歸 DNS 服務器」 向 「根服務器」 查詢 「
.com
權威 DNS 服務器」 的地址; - 「遞歸 DNS 服務器」 向 「
.com
權威 DNS 服務器」 查詢 「example.com
所使用權威 DNS 服務器」 的地址; - 「遞歸 DNS 服務器」 向 「
example.com
所使用權威 DNS 服務器」 查詢解析獲得 DNS 記錄並緩存; - 「遞歸 DNS 服務器」 向瀏覽器返回結果;
- 瀏覽器拿到 IP 地址並向
www.example.com
發送請求;(完畢)
結合上面的內容,我相信你已經對 DNS 如何工作不再陌生。
相關問題
為什么根 DNS 只有 13 台?
簡而言之:由於歷史和技術原因,對於 IPv4 來說,根 DNS 只能有 13 個。
不簡而言之的簡而言之:
DNS 消息使用 UDP 協議進行傳輸,這規定了消息最大的長度在 512 字節(不包含 IP 頭部、UDP 頭部)。
有了最大長度限制之后,一個 UDP 協議傳輸的 DNS 響應能夠返回的資源記錄數量就是有限的。
要讓所有的根服務器數據能包含在一個 512 字節的 UDP 包中,根服務器只能限制在 13 個。(事實上改進之后才能容納 13 個,最開始也沒有 13 個這么多)
(擴展閱讀(下3))
當鍵入網址后,到網頁顯示,其間發生了什么?
本文涉及輸入網址訪問,這是自然而然會聯想到的問題。但本文只是詳細說明了 DNS 查詢域名背后 IP 的過程。
該問題涉及瀏覽器原理、網絡協議等細節問題,感興趣可以戳這里(下4)
美國如果把根域名服務器封了,中國會從網絡上消失嗎?
美國擁有最多的根域名服務器,如果美國把根域名服務器封了,中國會從網絡上消失嗎?
答案是:不會。 因為雖然根不在我們手里,但是我們有鏡像(備份)。
后記
這一篇文章我們又進一步揭開了一點網絡關於 DNS 一角的神秘面紗:
也是使用了 PPT 制作了動圖幫助大家理解,希望大家能夠有所收獲。
后續也會繼續跟大家一起學習計算機網絡的基礎知識,也會嘗試着跟着后端學習路線圖的腳步跟着大家一起學習進階。
(完)
參考資料
- What Is A Domain Name System (DNS) & How Does It Work? - https://phoenixnap.com/kb/what-is-domain-name-system-works
- 域名報告 - https://www.verisign.com/assets/domain-name-report-Q32020.pdf
- 根域名服務器只有 13 台? - https://zhuanlan.zhihu.com/p/107492241
- 30張圖解:當鍵入網址后,到網頁顯示,其間發生了什么? - https://zhuanlan.zhihu.com/p/113702574
- 美國如果把根域名服務器封了,中國會從網絡上消失? - https://segmentfault.com/a/1190000023696737
- 本文已收錄至我的 Github 程序員成長系列 【More Than Java】,學習,不止 Code,歡迎 star:https://github.com/wmyskxz/MoreThanJava
- 個人公眾號 :wmyskxz,個人獨立域名博客:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長!
Hi,這里是 我沒有三顆心臟,2021,與您在 Be Better 的路上共同成長!