從瀏覽器輸入域名開始分析DNS解析過程
摘要:DNS(Domain Name System)是域名系統的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,用于 TCP/IP 網絡。
本文分享自華為云社區《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 服務器分為幾組:
- 通用頂級域:這些是非特定國家/地區的域,一些最知名的通用 TLD 包括 .com(商業企業) .org .net .edu .gov(美國政府實體),IANA 過去曾嚴格限制新通用頂級域(gTLD)的創建,但在 2010 年這些限制有所放松。現在有數百個不太知名的 gTLD,例如“.top”、“.xyz”和“.loan”。
- 國家/地區代碼頂級域:這些包括特定于某個國家/地區或州的任何域。例如,.cn、.uk、.us、.ru 和 .jp 等。
- 贊助的頂級域:這些 TLD 通常代表專業、種族或地理社區。每個贊助 TLD 都有一個代表該社區的授權贊助商。例如,“.app”是針對開發者社區的 TLD,由 Google 贊助。同樣,“.gov”旨在供美國政府使用,由總務管理局贊助。
- 基礎設施性頂級域:此類別僅包含一個 TLD:“.arpa”。“.arpa”以幫助開創現代互聯網的美國軍事研究組織 DARPA 命名,是有史以來創建的第一個 TLD,現在保留用于基礎設施職責,例如促進反向 DNS 查找。
- 保留的頂級域:一些 TLD 位于保留列表中,這意味著它們永遠無法使用。例如,“.localhost”保留用于本地計算機環境,“.example”保留用于示例演示。
- 權威性域名服務器:
當遞歸解析器收到來自 TLD 域名服務器的響應時,該響應會將解析器定向到權威性域名服務器。權威性域名服務器通常是解析器查找 IP 地址過程中的最后一步。
2. 從瀏覽器輸入
https://abc13.ban2.lcy0000.top/,DNS如何解析?
放一張cloudflare的圖更方便理解輸入網址后請求的過程。
假設我們要訪問 abc13.ban2.lcy0000.top(假設存在該網站),當瀏覽器輸入這個網址后,查詢流程如下
1.本地 hosts 文件
本地計算機會首先檢查本地 hosts 文件是否包含 abc13.ban2.lcy0000.top 的 IP 地址映射。如果存在,則直接返回該 IP 地址,否則繼續進行 DNS 查詢。
2.本地 DNS 緩存
本地計算機會檢查本地 DNS 緩存是否包含 abc13.ban2.lcy0000.top 的 IP 地址。如果存在,則直接返回該 IP 地址,否則繼續進行 DNS 查詢。
3.ISP的遞歸 DNS 服務器(圖中的DNS Resolver)
本地計算機會向 ISP 的DNS 服務器發起 DNS 查詢請求,詢問 abc13.ban2.lcy0000.top 的 IP 地址。(圖中的連線1)
ISP是互聯網服務提供商,簡單理解為就是移動、聯通、電信。
4.根 DNS 服務器(圖中的Root Server)
ISP 的 DNS 服務器會向根 DNS 服務器查詢 .top 頂級域名的 DNS 服務器的 IP 地址,根 DNS 服務器會返回 .top 頂級域名的 DNS 服務器的 IP 地址。(圖中的2、3連線代表查詢和返回)
5.頂級域名服務器(圖中的TLD Server)
ISP的 DNS 服務器會向該 DNS 服務器查詢 lcy0000.top 二級域名的 DNS 服務器的 IP 地址。(圖中的4、5連線代表查詢和返回)
6.權威 DNS 服務器
ISP的 DNS 服務器會向lcy0000.top 二級域名的 DNS 服務器查詢 ban2.lcy0000.top的DNS服務器的 IP 地址。(圖中的連線6)
7.權威 DNS 服務器
ban2.lcy0000.top 的 DNS 服務器查詢 abc13.ban2.lcy0000.top 的 IP 地址,abc13.ban2.lcy0000.top 的 IP 地址被返回。權威服務器之間的查詢過程不需要ISP的遞歸服務器參與,ISP的DNS只需要查詢一次權威服務器即可(圖中的連線7)
8.ISP的遞歸 DNS 服務器(圖中的DNS Resolver)
ISP的 DNS 服務器會將查詢結果返回給本地計算機。操作系統將使用該IP地址來訪問對應的網站,并將該IP地址添加到本地DNS緩存中,以便下次訪問同一網站時更快地獲取IP地址。(圖中的連線8)
9.本地計算機
本地計算機將使用該 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地址,則會更新緩存中的記錄。
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
執行了這個命令卻沒看到我剛訪問的域名對應的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 中最基本的一種記錄類型,用于將一個域名(例如 http://www.example.com)映射到一個 IPv4 地址(例如 192.168.0.1)。具體來說,A 記錄將一個域名與一個 IP 地址建立映射關系。當用戶輸入一個域名時,DNS 服務器會返回與之對應的 IP 地址,從而使用戶能夠訪問該域名對應的網站或服務。
舉個例子,假設我們有一個網站 http://www.example.com,它的 IP 地址是 192.168.0.1。我們可以在 DNS 中添加一個 A 記錄,將 http://www.example.com 指向 192.168.0.1。這樣,當用戶輸入 http://www.example.com 時,DNS 服務器會返回 IP 地址 192.168.0.1,從而使用戶能夠訪問我們的網站。
如下這是我買的域名配置的圖:
- AAAA 記錄
AAAA 記錄是 A 記錄的擴展,用于將一個域名(例如 http://www.example.com)映射到一個 IPv6 地址。具體來說,AAAA 記錄將一個域名與一個 IPv6 地址建立映射關系。當用戶輸入一個域名時,DNS 服務器會返回與之對應的 IPv6 地址,從而使用戶能夠訪問該域名對應的網站或服務。
舉個例子,假設我們有一個網站 http://www.example.com,它的 IPv6 地址是 2001:0db8:85a3:0000:0000:8a2e:0370,我們訪問 http://www.example.com 時,DNS 解析過程中就會查詢該 AAAA 記錄,返回 IPv6 地址。
圖就不放了,和上面類似。
- CNAME 記錄
CNAME 記錄將一個域名(例如 http://www.example.com)指向另一個域名(例如 http://example.com)。這個過程類似于重定向,方便用戶快速訪問該域名。CNAME 記錄通常用于將某個子域名指向其父域名,或將一個域名指向另一個域名(例如將 http://www.example.com 指向 http://example.com)。
舉個例子,假設我們有一個網站 http://www.example.com,它的 IP 地址是 192.168.0.1,同時我們還希望用戶能夠通過 http://example.com 訪問該網站。我們可以在 DNS 中添加一個 CNAME 記錄,將 http://example.com 指向 http://www.example.com。這樣,當用戶輸入 http://example.com 時,DNS 服務器會返回 http://www.example.com 的 IP 地址 192.168.0.1,從而使用戶能夠訪問我們的網站。
在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記錄。
7. 在瀏覽器輸入abc.coc這種不符合規范的域名后,執行過程是怎樣的?
假設輸入的域名是abc.coc,這個域名顯然不符合域名規范,應該是 http://abc.com 或 http://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 權威服務器,從而實現了就近訪問。
假設有一個名為 http://www.example.com 的域名,該域名有三個 DNS 權威服務器,分別位于深圳、上海和北京。這三個 DNS 服務器根據域名能解析出同一個 IP 地址。現在,一個位于深圳的客戶端發起 DNS 查詢請求。路由器會將該請求發送到距離最近的 DNS 服務器,也就是深圳的那個 DNS 服務器。如果這個 DNS 服務器無法響應,那么路由器會將請求發送到次近的 DNS 服務器,也就是上海的那個 DNS 服務器。以此類推,直到找到可響應請求的 DNS 服務器為止。
上面說的是DNS權威服務器之間的的負載均衡,應用基于DNS的負載均衡又是怎樣的呢?
假設有一個域名 http://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服務器查詢http://www.example.com的IP地址,并將結果緩存下來。當用戶點擊鏈接后,瀏覽器就可以直接使用緩存的DNS結果,而無需再次進行DNS查詢。
需要注意的是,DNS預解析雖然可以提高頁面加載速度和性能,但也會增加網絡負載和DNS服務器的負擔。考慮到實際需求,一般都不會去禁止DNS預解析,也不會出現很多需要預解析多個域名的情況。
浙公網安備 33010602011771號