DNS 是如何影響你衝浪速度的?

2023.02.04

DNS 是如何影響你衝浪速度的?

在日常上網過程中,出於好記的原因,人們更喜歡在瀏覽器中輸入網站的域名​,而不是IP 地址。比如想要訪問百度,則會輸入www.baidu.com,而不是202.108.22.5(或者百度網站的其他IP)。

本文詳細介紹了DNS 相關知識,包括DNS 工作原理、如何提升域名解析速度、以及DNS 記錄與報文等內容。

1. 域名與域名服務器​

在日常上網過程中,出於好記的原因,人們更喜歡在瀏覽器中輸入網站的域名​,而不是IP 地址。比如想要訪問百度,則會輸入www.baidu.com,而不是202.108.22.5(或者百度網站的其他IP)。

然而計算機網絡通信中所識別的標識並不是域名​,而是IP 地址,因為其可以提供主機在互聯網中的位置信息,而且是定長的,路由器等設備更容易處理。

圖片

為了折中人類和計算機不同的偏好,就出現了DNS(Domain Name System,域名系統),其主要任務是根據域名查出對應的IP 地址。

下面先介紹一下域名和域名服務器,之後再介紹DNS 的工作原理。

域名由若干個英文字符串組成(不區分大小寫),各字符串之間用點號『.』分隔連接,其中越靠右的表示域名級別越高。

舉個例子,百度的域名為www.baidu.com,其中com 是頂級域名(一級域名),baidu 是二級域名,www 是三級域名。

圖片

域名服務器(也稱為DNS 服務器)負責存儲域名和IP 地址的映射關係,當我們需要獲取某個域名對應的IP 地址時,只需要從域名服務器中查詢即可。

圖片

由於域名非常非常多,如果都存放在一台域名服務器中,那麼不僅查詢速度慢,服務器壓力大,而且難以保證服務的可靠性。因此,DNS 採用了分佈式的設計方案,大量的域名服務器之間通過​層次方式組織,分佈在全世界範圍內。

一般而言,域名服務器可以分為以下四類:

  • 根域名服務器:最高層級的域名服務器,因特網上一共有13 個根域名服務器(以英文字母A 到M 依序命名,格式為[a~m].root-servers.net),每個根域名服務器都知道所有頂級域名服務器的IP 地址,比如知道負責com 域的頂級域名服務器的IP 地址。
  • 頂級域名服務器:對於每個頂級域名,如com、org、edu 等,都有對應的頂級域名服務器。頂級域名服務器知道其所管理的所有權威域名服務器的IP 地址,比如負責com 域的頂級域名服務器知道負責baidu.com 域的權威域名服務器的IP 地址。
  • 權威域名服務器:一個網站需要將其域名和IP 地址註冊到相應的權威域名服務器中,比如網站www.baidu.com 的域名和IP 地址就存儲在負責baidu.com 域的權威域名服務器中。
  • 本地域名服務器:本地域名服務器不屬於上述域名服務器的層次結構,但是它對域名系統非常重要。每個ISP(如一個大學、一個公司)都有一個本地域名服務器(也叫默認域名服務器)。具體在下一節中介紹。

圖片

2. 域名解析流程​

知道了域名和域名服務器的基礎知識後,我們來了解一下域名解析的具體流程,以輸入百度域名為例,看看我們的主機是如何得到www.baidu.com 的IP 地址的。

圖片

  1. 請求主機向本地域名服務器發送DNS 查詢報文,詢問www.baidu.com 的IP 地址是什麼;
  2. 本地域名服務器轉發此查詢報文到根域名服務器;
  3. 根域名服務器發現要查詢的頂級域名為com,於是向本地域名服務器發送響應報文,報文中封裝了負責com 域的頂級域名服務器的IP 地址列表;
  4. 本地域名服務器收到根域名服務器響應的報文後,選擇其中一個頂級域名服務器的IP 地址,並向其發送查詢報文;
  5. 頂級域名服務器發現要查詢的二級域名為baidu,於是向本地域名服務器發送響應報文,報文中封裝了負責baidu.com 域的權威域名服務器的IP 地址列表;
  6. 本地域名服務器收到頂級域名服務器響應的報文後,選擇其中一個權威域名服務器的IP 地址,並向其發送查詢報文;
  7. 權威域名服務器通過查詢數據庫,找到www.baidau.com 的IP 地址,並將此信息封裝為一個響應報文,發送給本地域名服務器;
  8. 本地域名服務器將響應報文發送給原請求主機。我們的主機就知道了百度的IP 地址,DNS 查詢過程結束。

在此過程中,請求主機與本地域名服務器之間的交互稱為遞歸查詢​,而本地域名服務器與域名服務器層次結構中相關服務器的交互稱為迭代查詢。

請求主機是如何知道本地域名服務器的IP 地址的?

當用戶插上網線或者連上WIFI 後,電腦會通過DHCP 協議分配一個IP 地址,與此同時,也會獲取到本地域名服務器的IP 地址!

本地域名服務器是如何知道根域名服務器的IP 地址的?

因特網上一共有13 個根域名服務器,它們的IP 地址是固定不變的,因此被集成在了操作系統中,每台電腦都知道!

為了解析出百度域名的IP 地址,一共發送了8 份DNS 報文。用戶本來只是想和百度的服務器進行交互,卻耗費了大量的時間進行域名解析,如果每次都這樣搞,豈不是得慢死?因此就需要有一些提升域名解析速度的方式。

3. 提升域名解析速度​

(1)TCP or UDP

我們都知道,TCP 相較於UDP 更可靠,但是速度更慢。

圖片

DNS 應該採用哪個傳輸層協議呢?

  • 如果採用TCP 協議,不僅需要三次握手建立連接,而且需要進行擁塞控制等,那麼域名解析速度將慢成龜速,不利於用戶體驗。
  • 如果採用UDP 協議,萬一丟包了怎麼辦?如果解析不出來IP,怎麼訪問目標網站?不利於用戶體驗。

實際上,DNS 主要使用UDP,在特殊情況下,也會使用TCP,端口號都是53。

一般情況下,DNS 報文都比較小,只需要一個包就能承載所有信息。既然只有一個包,就無需考慮哪個包未送達,直接重發一個包即可,因此無需使用TCP 那樣複雜的協議,直接使用UDP 協議,DNS 協議自己處理超時和重傳問題,以提供可靠性服務。

當然有的時候DNS 報文比較大,比如響應報文中可能一個域名包含有很多IP 記錄。當服務器響應時,會將報文中的TC 標誌位設置為1,表示響應長度超過了512 字節,此報文僅僅返回前512 字節。當我們的主機收到響應後,就會使用TCP 協議重發原來的查詢請求,以獲取完整報文。

此外,為了防止本地域名服務器(主域名服務器)宕機而導致無法對域名進行解析,本機還需要設置一個輔助域名服務器。當主域名服務器宕機後,由輔助域名服務器繼續提供域名解析的服務。輔助域名服務器會定時(通常是每隔3小時)向主服務器發送查詢請求以實現同步,此時傳輸數據較多,因而使用TCP 協議。

(2)DNS 緩存

即使採用UDP 協議,但是如果每次都需要從根服務器開始一層一層的查詢,仍然很慢,且處於層級結構中的域名服務器將會接收到大量的請求,處理速度進一步降低!

為了提升域名解析速度並減輕域名服務器的壓力,DNS 廣泛使用了緩存技術。

當用戶訪問了某個網站後,本地域名服務器會將解析出的域名和IP 地址的映射關係緩存一定時間。在緩存過期前,用戶再訪問相同網站時,本地域名服務器就可以直接返回查詢結果,而無需再去詢問根域名服務器、頂級域名服務器等,這樣就能大大減少傳輸的DNS 報文數量!

實際上,不僅在本地域名服務器中設置了高度緩存,用戶主機也有緩存。對於Windows 電腦,可以通過命令ipconfig/displaydns查詢當前DNS 緩存,比如當我訪問了百度後,本機就會緩存以下信息:

圖片

緩存雖然提升了DNS 解析速度,但並不能保證一致性,因為一個網站的域名和IP 地址的映射關係並不是永久不變的,可能緩存的解析結果已失效,因而DNS 緩存時間不能設置太大!

Windows 電腦也可以通過命令ipconfig/flushdns清空本機緩存。

(3)切換本地域名服務器

前面提到,在進行域名解析時,主機會向本地域名服務器發起遞歸查詢,如果本地域名服務器的性能較差,或者未正確配置緩存,那麼我們上網的速度將會變得非常慢,因此選擇一個好的本地域名服務器將有助於提升衝浪速度!

默認情況下,本機在聯網時會通過DHCP 協議自動獲得一個DNS 服務器地址,那麼如果此服務器性能不好,該如何更換呢?

以Windows 為例,可以通過控制面板​—>網絡和Internet​—>網絡連接​—>Internet 協議版本4(TCP/IPv4)修改本地域名服務器的IP 地址。

圖片

互聯網上常見的公共DNS 服務器的IP 地址如下:


首選DNS 服務器地址

備用DNS 服務器地址

阿里

223.5.5.5

223.6.6.6

騰訊

119.29.29.29

182.254.116.116

百度

180.76.76.76

114.114.114.114

谷歌

8.8.8.8

8.8.4.4

114DNS

114.114.114.114

114.114.115.115

​一般情況下,自動獲取的本地域名服務器與主機位於同一個子網中,速度都挺快的。但是如果在上網過程中,發現打開網頁的速度很慢,也可以嘗試使用上面的公共DNS 服務器,說不定速度會有所改善。

4. DNS 記錄和報文​

實際上,域名服務器中保存並不僅僅是域名和IP 地址,而是保存了一個資源記錄(Resource Record,RR)。

一個資源記錄包含四部分內容,分別是Name,Value,Type,TTL。

TTL 指的是記錄的生存時間,以秒為單位,它決定了緩存此記錄的過期時間。

Name 和Value 的含義隨著Type 的不同而不同,舉幾個常見例子:

  • 當Type = A 時(A 是Address 縮寫,也可用編號1 表示),Name 表示域名,Value 表示對應的IP 地址,如(www.example.com,93.184.216.34,A,86400)。
  • 當Type = NS 時(NS 是Name Server 縮寫,也可用編號2 表示),Name 表示一個域,Value 為負責該域解析的域名服務器的域名,如(baidu.com,ns1.baidu.com,NS,172800),此記錄用於沿著層級結構查詢鏈來路由DNS 查詢。

如果一台域名服務器是用於某特定域名的權威域名服務器,那麼其將會有一條包含該域名的A 記錄。

如果一台域名服務器不是用於某特定域名的權威域名服務器,那麼其將包含一條NS 記錄,該記錄用來指定該域名由哪個域名服務器來進行解析;除此之外,它還將包含一條A 記錄,該記錄提供了在NS 記錄中Value 字段中的域名服務器的IP 地址。

圖片

接下來介紹一下DNS 報文的具體內容。DNS 報文分為兩類:查詢報文和回答報文,二者有著相同的格式,如下圖所示:

圖片

  • 事務ID:用於標識DNS 查詢的標識符。查詢報文和其對應的回答報文有著相同的事務ID,因此通過它可以區分DNS 回答報文是對哪個請求進行響應的。
  • 標誌:此字段中含有若干標誌,比如有一個『QR』標誌位用於指出此報文是查詢報文(0)還是回答報文(1),再比如有一個『TC』標誌位用於指出此報文長度是否大於512 字節。
  • 問題數:對應於下面查詢問題的數量(支持同時查詢多個域名,通常為一個)。
  • 回答資源記錄數:對應於下面回答問題相關資源記錄的數量(一個域名可能有多個IP 對應,那麼將會有多個回答記錄)。
  • 權威資源記錄數:對應於下面權威域名服務器相關資源記錄的數量。
  • 附加資源記錄數:對應於下面附加信息相關資源記錄的數量。
  • 查詢問題:此區域為查詢內容,包含查詢域名和查詢類型(如 www.example.com,A)。
  • 回答問題:此區域為查詢結果,包含一到多條資源記錄(如www.example.com,93.184.216.34, A,300)。
  • 權威域名服務器:此區域為其他權威域名服務器的記錄,即含有指向權威域名服務器的資源記錄,用以繼續解析過程。(如baidu.com,ns1.baidu.com,NS,172800)。
  • 附加信息:此區域為其他有幫助的信息,比如提供權威域名服務器所對應的IP 地址。

最後,使用Wireshark 抓一個DNS 查詢報文和回答報文:

查詢報文:

圖片

回答報文:

圖片


本文轉載自微信公眾號「 一楓說碼」,作者「一楓說碼」,可以通過以下二維碼關注。

轉載本文請聯繫「 一楓說碼」公眾號。