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

本文詳細介紹了 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 查詢報文和回答報文:

查詢報文:

回答報文:

轉載: DNS 是如何影響你衝浪速度的? https://www.cnblogs.com/yifeng-coding/p/17085389.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章