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

2023-02-02 12:00:36

本文詳細介紹了 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)。

一個資源記錄包含四部分內容,分別是 NameValueTypeTTL

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 查詢報文和回答報文:

查詢報文:

回答報文: