天天看點

從浏覽器輸入域名開始分析DNS解析過程

作者:華為雲開發者聯盟

本文分享自華為雲社群《DNS那些事——從浏覽器輸入域名開始分析DNS解析過程-雲社群-華為雲》,作者: 磚業洋__ 。

1. DNS伺服器有哪些?

  • 遞歸DNS伺服器:

也稱為DNS解析器。這種伺服器是 DNS 查詢的起點,它負責從根 DNS 伺服器開始解析域名,一步步查詢到目标域名所在的 DNS 伺服器,并将解析結果傳回給使用者裝置。遞歸 DNS 伺服器通常由網絡服務提供商(ISP)或公司網絡管理者管理。

  • 根域名伺服器:

這些伺服器負責管理域名系統的根區域,它們存儲着所有頂級域名(如.com、.org、.cn等)的 DNS 記錄。根 DNS 伺服器分為13個,分布在全球不同地點,由不同組織管理,以保證 DNS 的高可靠性和穩定性。根域名伺服器由一家名為 Internet 名稱與數字位址配置設定機構(ICANN) 的非營利組織進行監督。

根域名伺服器由13組叢集伺服器構成(并不是隻有13台伺服器),每組叢集伺服器中包含多台伺服器,共同承擔服務。這些伺服器被部署在全球各地的資料中心中,以確定根域名伺服器的高可用性和容錯能力,每個叢集中都有多台伺服器進行備援備份,它們的備份和副本分布在世界各地的不同地方。

舉個例子,13個根域名伺服器的IP位址可能是這樣

a.root-servers.net (198.41.0.4)
b.root-servers.net (199.9.14.201)
c.root-servers.net (192.33.4.12)
d.root-servers.net (199.7.91.13)
e.root-servers.net (192.203.230.10)
f.root-servers.net (192.5.5.241)
g.root-servers.net (192.112.36.4)
h.root-servers.net (198.97.190.53)
i.root-servers.net (192.36.148.17)
j.root-servers.net (192.58.128.30)
k.root-servers.net (193.0.14.129)
l.root-servers.net (199.7.83.42)
m.root-servers.net (202.12.27.33)
           
  • 頂級域名伺服器:

TLD(Top Level Domain)伺服器負責管理頂級域名(如.com、.org、.net、.cn等)的 DNS 記錄。當使用者通路一個域名時,遞歸 DNS 伺服器首先會向根 DNS 伺服器查詢頂級域名的DNS 伺服器位址,然後再向相應的 TLD 伺服器查詢該域名的DNS伺服器位址。一旦找到權威 DNS 伺服器,遞歸 DNS 伺服器就會向其查詢域名的 IP 位址,最終傳回給使用者裝置。

TLD 域名伺服器的管理由 Internet 編号配置設定機構(IANA) 處理,其為 ICANN 的一個分支機構,IANA 将 TLD 伺服器分為幾組:

  1. 通用頂級域:這些是非特定國家/地區的域,一些最知名的通用 TLD 包括 .com(商業企業) .org .net .edu .gov(美國政府實體),IANA 過去曾嚴格限制新通用頂級域(gTLD)的建立,但在 2010 年這些限制有所放松。現在有數百個不太知名的 gTLD,例如“.top”、“.xyz”和“.loan”。
  2. 國家/地區代碼頂級域:這些包括特定于某個國家/地區或州的任何域。例如,.cn、.uk、.us、.ru 和 .jp 等。
  3. 贊助的頂級域:這些 TLD 通常代表專業、種族或地理社群。每個贊助 TLD 都有一個代表該社群的授權贊助商。例如,“.app”是針對開發者社群的 TLD,由 Google 贊助。同樣,“.gov”旨在供美國政府使用,由總務管理局贊助。
  4. 基礎設施性頂級域:此類别僅包含一個 TLD:“.arpa”。“.arpa”以幫助開創現代網際網路的美國軍事研究組織 DARPA 命名,是有史以來建立的第一個 TLD,現在保留用于基礎設施職責,例如促進反向 DNS 查找。
  5. 保留的頂級域:一些 TLD 位于保留清單中,這意味着它們永遠無法使用。例如,“.localhost”保留用于本地計算機環境,“.example”保留用于示例示範。
  • 權威性域名伺服器:

當遞歸解析器收到來自 TLD 域名伺服器的響應時,該響應會将解析器定向到權威性域名伺服器。權威性域名伺服器通常是解析器查找 IP 位址過程中的最後一步。

2. 從浏覽器輸入https://abc13.ban2.lcy0000.top/,DNS如何解析?

放一張cloudflare的圖更友善了解輸入網址後請求的過程。

從浏覽器輸入域名開始分析DNS解析過程

假設我們要通路 abc13.ban2.lcy0000.top(假設存在該網站),當浏覽器輸入這個網址後,查詢流程如下

本地 hosts 檔案

本地計算機會首先檢查本地 hosts 檔案是否包含 abc13.ban2.lcy0000.top 的 IP 位址映射。如果存在,則直接傳回該 IP 位址,否則繼續進行 DNS 查詢。

本地 DNS 緩存

本地計算機會檢查本地 DNS 緩存是否包含 abc13.ban2.lcy0000.top 的 IP 位址。如果存在,則直接傳回該 IP 位址,否則繼續進行 DNS 查詢。

ISP的遞歸 DNS 伺服器(圖中的DNS Resolver)

本地計算機會向 ISP 的DNS 伺服器發起 DNS 查詢請求,詢問 abc13.ban2.lcy0000.top 的 IP 位址。(圖中的連線1)

ISP是網際網路服務提供商,簡單了解為就是移動、聯通、電信。

根DNS伺服器(圖中的Root Server)

ISP 的 DN S 伺服器會向根 DNS 伺服器查詢 .top 頂級域名的 DNS 伺服器的 IP 位址,根 DNS 伺服器會傳回 .top 頂級域名的 DNS 伺服器的 IP 位址。(圖中的2、3連線代表查詢和傳回)

頂級域名伺服器(圖中的TLD Server)

ISP的 DNS 伺服器會向該 DNS 伺服器查詢 lcy0000.top 二級域名的 DNS 伺服器的 IP 位址。(圖中的4、5連線代表查詢和傳回)

權威DNS伺服器

ISP的 DNS 伺服器會向lcy0000.top 二級域名的 DNS 伺服器查詢 ban2.lcy0000.top的DNS伺服器的 IP 位址。(圖中的連線6)

權威DNS伺服器

ban2.lcy0000.top 的 DNS 伺服器查詢 abc13.ban2.lcy0000.top 的 IP 位址,abc13.ban2.lcy0000.top 的 IP 位址被傳回。權威伺服器之間的查詢過程不需要ISP的遞歸伺服器參與,ISP的DNS隻需要查詢一次權威伺服器即可(圖中的連線7)

ISP的遞歸DNS伺服器(圖中的DNS Resolver)

ISP的 DNS 伺服器會将查詢結果傳回給本地計算機。作業系統将使用該IP位址來通路對應的網站,并将該IP位址添加到本地DNS緩存中,以便下次通路同一網站時更快地擷取IP位址。(圖中的連線8)

本地計算機

本地計算機将使用該 IP 位址與 abc13.ban2.lcy0000.top 進行通信,浏覽器使用該IP位址向 abc13.ban2.lcy0000.top 的伺服器發起HTTP請求,擷取相應的網頁内容。(圖中的9、10連線代表查詢和傳回)

從圖上可以看到,從浏覽器到ISP的遞歸DNS伺服器的這個步驟是遞歸查詢(Recursive Query),從遞歸DNS伺服器到根、頂級、權威域名伺服器這個過程是疊代查詢(Iteractive Query)。

3. hosts檔案是什麼?為什麼通路網站會先查找hosts檔案?

hosts檔案中存放着IP位址和對域名,可以手動配置,作用是為了将特定的域名映射到特定的IP位址上,進而在通路這些域名時不需要進行DNS解析,直接使用hosts檔案中的IP位址進行通路。如果通路的域名不在hosts檔案中,則會查找DNS緩存或者從DNS伺服器擷取對應的IP位址并進行通路。如果你在hosts檔案配置錯了IP,那這個網站将無法通路。因為後面不會再去查找本地DNS緩存和DNS伺服器解析,就根據hosts檔案中的IP去通路。

相對于本地DNS緩存,hosts檔案的優勢在于它可以直接控制特定域名的解析結果。當你在hosts檔案中手動添加了一個IP位址和域名的對應關系後,這個映射關系将會一直生效,不受DNS緩存的影響。而本地DNS緩存是由作業系統自動維護的,它會根據DNS伺服器傳回的TTL值來判斷緩存是否過期,當緩存過期後需要重新進行DNS解析,如果DNS伺服器傳回了不同的IP位址,則會更新緩存中的記錄。

從浏覽器輸入域名開始分析DNS解析過程

hosts檔案通常位于作業系統中的一個特定目錄下,比如在Windows系統中,hosts檔案通常位于C:\Windows\System32\drivers\etc目錄下,它是一個以文本形式存儲的檔案,可以使用任何文本編輯器進行編輯。在mac中,位于/etc/目錄下。

4. 如何檢視本地DNS伺服器緩存的域名對應的IP?

windows可以用下面指令

ipconfig /displaydns
           

mac可以用下面指令

// 這個是重新整理本地 DNS 緩存,并清除所有緩存記錄
sudo killall -HUP mDNSResponder
// 這個是顯示本地 DNS 伺服器緩存的所有域名和對應的 IP 位址
dscacheutil -cachedump -entries Host
           
從浏覽器輸入域名開始分析DNS解析過程

執行了這個指令卻沒看到我剛通路的域名對應的ip,這是沒緩存嗎?

如果執行了 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 指令,但是沒有看到剛通路的域名對應的 IP 位址,可能有以下幾種情況:

  • 本地 DNS 伺服器沒有緩存該域名的 IP 位址。如果你第一次通路一個域名,本地 DNS 伺服器很可能沒有緩存該域名的 IP 位址。在這種情況下,執行 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 指令時,看不到該域名的緩存記錄。
  • 本地 DNS 伺服器緩存的 TTL 時間已經過期。當你通路一個域名時,本地 DNS 伺服器會将該域名的 IP 位址緩存一段時間,這個時間就是 TTL(Time To Live)時間。如果 TTL 時間已經過期,本地 DNS 伺服器就會從權威 DNS 伺服器重新擷取該域名的 IP 位址。在這種情況下,執行 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 指令時,可能看不到該域名的緩存記錄。
  • 你的電腦可能使用了其他 DNS 伺服器或者代理伺服器。如果你的電腦使用了其他 DNS 伺服器或者代理伺服器,那麼執行 ipconfig /displaydns 或者 dscacheutil -cachedump -entries Host 指令時,緩存記錄可能來自其他 DNS 伺服器或者代理伺服器,而不是本地 DNS 伺服器。

5. DNS A記錄/AAAA記錄/CNAME記錄

  • A 記錄

A 記錄是 DNS 中最基本的一種記錄類型,用于将一個域名(例如 www.example.com)映射到一個 IPv4 位址(例如 192.168.0.1)。具體來說,A 記錄将一個域名與一個 IP 位址建立映射關系。當使用者輸入一個域名時,DNS 伺服器會傳回與之對應的 IP 位址,進而使使用者能夠通路該域名對應的網站或服務。

舉個例子,假設我們有一個網站 www.example.com,它的 IP 位址是 192.168.0.1。我們可以在 DNS 中添加一個 A 記錄,将 www.example.com 指向 192.168.0.1。這樣,當使用者輸入 www.example.com 時,DNS 伺服器會傳回 IP 位址 192.168.0.1,進而使使用者能夠通路我們的網站。

如下這是我買的域名配置的圖:

從浏覽器輸入域名開始分析DNS解析過程
  • AAAA 記錄

AAAA 記錄是 A 記錄的擴充,用于将一個域名(例如 www.example.com)映射到一個 IPv6 位址。具體來說,AAAA 記錄将一個域名與一個 IPv6 位址建立映射關系。當使用者輸入一個域名時,DNS 伺服器會傳回與之對應的 IPv6 位址,進而使使用者能夠通路該域名對應的網站或服務。

舉個例子,假設我們有一個網站 www.example.com,它的 IPv6 位址是 2001:0db8:85a3:0000:0000:8a2e:0370,我們通路 www.example.com 時,DNS 解析過程中就會查詢該 AAAA 記錄,傳回 IPv6 位址。

圖就不放了,和上面類似。

  • CNAME 記錄

CNAME 記錄将一個域名(例如 www.example.com)指向另一個域名(例如 example.com)。這個過程類似于重定向,友善使用者快速通路該域名。CNAME 記錄通常用于将某個子域名指向其父域名,或将一個域名指向另一個域名(例如将 www.example.com 指向 example.com)。

舉個例子,假設我們有一個網站 www.example.com,它的 IP 位址是 192.168.0.1,同時我們還希望使用者能夠通過 example.com 通路該網站。我們可以在 DNS 中添加一個 CNAME 記錄,将 example.com 指向 www.example.com。這樣,當使用者輸入 example.com 時,DNS 伺服器會傳回 www.example.com 的 IP 位址 192.168.0.1,進而使使用者能夠通路我們的網站。

從浏覽器輸入域名開始分析DNS解析過程

在DNS解析過程中,如果輸入的域名沒有CNAME記錄,DNS權威伺服器會查找該域名對應的IP位址并傳回。但是如果該域名有CNAME記錄,DNS權威伺服器會先将域名重定向到CNAME指向的域名,然後繼續解析該域名的IP位址。這個過程也被稱為“CNAME鍊”。

是以,添加了www的CNAME記錄會将沒有www字首的域名重定向到添加了www字首的域名,這樣通路者就可以通過www字首來通路網站了。

6. 為什麼輸入baijiahao.baidu.com可以通路,加上www.之後變成www.baijiahao.baidu.com就無法通路?

一般來說,兩個域名的DNS解析的結果可能不同,指向的是不同的伺服器。當通路"baijiahao.baidu.com"時,域名對應的IP可以被解析出來。但是在URL中加上"www."之後,請求的域名變為"www.baijiahao.baidu.com",這個域名的DNS解析結果可能不同于"baijiahao.baidu.com",如果該域名未被配置,則無法通路該站點。

玩過雲伺服器配置過域名解析的就會知道,從請求的結果來看,就是www.baijiahao.baidu.com沒配置對應IP。

這個配置需要在域名所有權者的DNS解析控制台中進行。具體的配置方式可能會因不同的DNS服務提供商而有所不同,但通常可以通過添加DNS記錄來配置子域名。

在這個例子中,百度作為域名所有者,他們可能會在他們的DNS解析控制台中添加一個名為"www"的CNAME記錄,将其指向"baijiahao.baidu.com",類似于重定向,這樣當使用者在浏覽器中輸入"www.baijiahao.baidu.com"時,DNS伺服器就會傳回指向"baijiahao.baidu.com"的IP位址,進而使使用者能夠通路該網站。或者添加一個名為"www.baijiahao.baidu.com"的"A"記錄,然後IP配置的和"baijiahao.baidu.com"的IP位址一樣,這樣不管通路"www.baijiahao.baidu.com"還是"baijiahao.baidu.com"都解析為同一個IP。

各位可以在指令行ping www.baidu.com和ping baidu.com,會發現IP不一樣,也許就是配置了兩個不同的A記錄。

從浏覽器輸入域名開始分析DNS解析過程

7. 在浏覽器輸入abc.coc這種不符合規範的域名後,執行過程是怎樣的?

假設輸入的域名是abc.coc,這個域名顯然不符合域名規範,應該是 abc.com 或 abc.cn 等等。

首先,本地和遞歸DNS伺服器會檢查DNS緩存是否存在該域名的解析記錄,由于這是一個不存在的域名,本地和遞歸DNS伺服器緩存中肯定沒有相關記錄,是以會向根域名伺服器發送查詢請求。

根域名伺服器無法解析該域名,因為 .coc 不是一個合法的頂級域名,是以根域名伺服器會傳回一個“域名不存在”的錯誤資訊給遞歸DNS伺服器。

遞歸DNS伺服器收到根域名伺服器的響應後,會将“域名不存在”的錯誤資訊傳回給用戶端,用戶端顯示無法解析該域名。

需要注意的是,由于 abc.coc 不符合域名規範,大部分浏覽器或作業系統會在輸入時就進行格式校驗,當輸入的字元串無法被識别為域名,就會變成搜尋操作。

8. DNS解析是TCP還是UDP?

DNS解析使用的是UDP協定,因為DNS查詢通常隻需要發送小量的資料,而UDP協定是無連接配接、不可靠的,但是比TCP更快速和輕量級。當然,對于一些特殊情況下的DNS解析,也可能使用TCP協定,比如DNS資料包超過了UDP封包最大長度時,會使用TCP進行分片傳輸。如果 DNS 查詢包的大小超過 512 位元組,或者查詢傳回的響應包的大小超過 512 位元組,則必須使用 TCP 協定。

9. 權威域名伺服器中的循環DNS

為了提高服務的可靠性和可用性,通常會部署多台相同配置的 DNS 伺服器,提供相同的 DNS 解析服務,通過将這些伺服器添加到一個邏輯組中,可以實作循環 DNS 技術,進而實作負載均衡和高可用性(是以這個負載均衡并不是靠專門的硬體,有缺點)。

通過将多個相同的 DNS 權威伺服器添加到一個邏輯組中,以均衡 DNS 解析請求的負載。假設有六台伺服器(A、B、C、D、E、F),它們都在循環 DNS 配置中。當用戶端發起 DNS 查詢請求時,循環 DNS 伺服器會從該組中選擇一個伺服器,并将請求發送到該伺服器。循環 DNS 伺服器選擇伺服器 A 處理該請求。如果伺服器 A 無法響應請求,則循環 DNS 伺服器會将請求發送到 B 伺服器。如果 B 伺服器也無法響應請求,則循環 DNS 伺服器會将請求發送到 C 伺服器,以此類推。每次查詢 DNS 伺服器時,它都會以循環方式将最近響應的 IP 位址發送到隊列後面。

但是缺點很明顯,越往後因為拒絕服務導緻重試的次數越多,請求變慢。

超過了設定的逾時時間,用戶端就會認為該DNS伺服器未能響應。逾時時間的長度是可以設定的,通常在幾秒鐘到幾十秒鐘之間。如果在逾時時間内未能獲得響應,用戶端就會嘗試向下一個DNS伺服器發起請求。如果所有的DNS伺服器都未能響應,就會傳回一個錯誤資訊給使用者。

在這種情況下,如果用戶端的 DNS 解析逾時并向另一個 DNS 伺服器送出請求,則浏覽器的 network 中可能會出現兩個 HTTP 請求記錄。第一個記錄是 DNS 解析無響應的請求,第二個記錄是重試能成功的 HTTP 請求。如果 DNS 解析逾時并且沒有重試,則隻會顯示一個請求記錄,即 DNS 解析請求。

10. 解決循環DNS的缺點——DNS負載均衡技術

  • DNS負載均衡技術

可以用負載均衡來配置設定 DNS 查詢請求到不同的 DNS 伺服器上,以實作負載均衡。這些 DNS 伺服器可以根據請求的源 IP 位址、地理位置或者其他特定條件來配置設定權重,進行篩選最優的伺服器,進而避免單個權威 DNS 伺服器承受過多的請求壓力。如果其中一台DNS伺服器出現問題,系統會自動将它從輪詢清單中删除,進而確定之後用戶端的請求不會被發送到不可用的DNS伺服器上。

  • Anycast DNS技術

可以根據地理位置将 DNS 查詢發送到最近的 DNS 伺服器,是因為它利用了網絡路由中的機制。在網際網路中,路由器将資料包轉發到下一跳時,通常會選擇距離最短的路徑。這個距離可以通過測量網絡的實體距離、延遲等名額來計算。Anycast DNS 利用了這個機制,在不同的地理位置部署多個 DNS 權威伺服器,進而實作了就近通路。

假設有一個名為 www.example.com 的域名,該域名有三個 DNS 權威伺服器,分别位于深圳、上海和北京。這三個 DNS 伺服器根據域名能解析出同一個 IP 位址。現在,一個位于深圳的用戶端發起 DNS 查詢請求。路由器會将該請求發送到距離最近的 DNS 伺服器,也就是深圳的那個 DNS 伺服器。如果這個 DNS 伺服器無法響應,那麼路由器會将請求發送到次近的 DNS 伺服器,也就是上海的那個 DNS 伺服器。以此類推,直到找到可響應請求的 DNS 伺服器為止。

上面說的是DNS權威伺服器之間的的負載均衡,應用基于DNS的負載均衡又是怎樣的呢?

假設有一個域名 example.com,它對應着多個應用伺服器的 IP位址,為了實作負載均衡,可以在同一個權威域名伺服器的 DNS 記錄中配置多個 A 記錄,每個 A記錄對應一個應用伺服器的 IP位址,權威域名伺服器會将A記錄中的多個IP位址傳回給DNS遞歸伺服器,由遞歸伺服器根據一定的負載均衡政策選擇其中一個IP位址傳回給用戶端。這樣就實作了應用基于DNS的負載均衡。

遞歸伺服器的負載均衡政策通常會根據一定的算法從多個IP位址中選擇一個來傳回給用戶端,這個算法通常是根據IP位址的性能、可用性、距離等因素來進行選擇。以下是一些常見的負載均衡算法:

輪詢算法:遞歸伺服器按照固定的順序依次輪詢選擇IP位址傳回給用戶端,確定每個IP位址都能夠得到平均的請求量。比如:第一次傳回 IP1,第二次傳回 IP2,第三次傳回 IP3,第四次傳回 IP1,以此類推。随機算法:遞歸伺服器随機選擇一個IP位址傳回給用戶端,確定每個IP位址都有一定的機會被選擇到。帶權重的輪詢算法:為了解決某些IP位址性能更高或者負載更輕的問題,遞歸伺服器會給每個IP位址配置設定一個權重,輪詢時會優先選擇權重高的IP位址。比如:IP1的權重為3,IP2的權重為2,IP3的權重為1,則輪詢順序為 IP1、IP1、IP1、IP2、IP2、IP3。最少連接配接數算法:遞歸伺服器會記錄每個IP位址目前的連接配接數,優先選擇連接配接數最少的IP位址傳回給用戶端。這種算法适用于負載均衡伺服器的場景。IP位址雜湊演算法:遞歸伺服器會根據用戶端IP位址的哈希值選擇一個IP位址傳回給用戶端。這種算法适用于需要固定用戶端通路同一個伺服器的場景。

以上是一些常見的遞歸伺服器的負載均衡算法,實際應用中可以根據具體的情況選擇不同的算法。

11. DNS 預解析(DNS prefetching)技術

現代浏覽器還引入了 DNS 預解析(DNS prefetching)技術,可以在頁面加載時自動解析該頁面中可能需要的 DNS 記錄,以便在使用者點選連結時可以更快地打開頁面。這種技術可以有效地減少 DNS 查詢時間。

具體來說,當浏覽器遇到頁面中的連結或資源(如圖檔、樣式表、腳本等)時,會自動進行DNS預解析。這樣,在使用者點選連結或浏覽到相關資源時,域名已經被解析,可以更快地擷取到資料,提升使用者體驗。

DNS預解析的原理是通過浏覽器的解析器在背景進行DNS查詢并緩存結果,以減少DNS查詢的延遲。當浏覽器發現一個可能需要進行DNS查詢的連結或資源時,它會自動在背景發起DNS查詢并緩存結果。如果使用者後續通路同一域名下的其他資源,浏覽器就可以直接使用緩存的DNS結果,而無需再次進行DNS查詢。

例如,當浏覽器遇到以下HTML代碼時(<a>标簽預設開啟DNS預解析):

<a href="https://www.example.com">Example</a>
           

浏覽器就會自動進行DNS預解析,向DNS伺服器查詢www.example.com的IP位址,并将結果緩存下來。當使用者點選連結後,浏覽器就可以直接使用緩存的DNS結果,而無需再次進行DNS查詢。

需要注意的是,DNS預解析雖然可以提高頁面加載速度和性能,但也會增加網絡負載和DNS伺服器的負擔。考慮到實際需求,一般都不會去禁止DNS預解析,也不會出現很多需要預解析多個域名的情況。

關注#華為雲開發者聯盟# 點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

繼續閱讀