DNS 支援 TCP 和 UDP 雙協議,但為何偏偏只鍾情 UDP?
一、前言
之前在聊到 App 網路優化時,聊到通過 HTTPDNS 替換掉傳統的 DNS 解析,來達到網路優化的效果。其中提到 DNS 解析,是支援 UDP 和 TCP 雙協議的。
但是細心的朋友通過 wireshark、sniffer、tcpdump 等抓包工具分析,會發現基本上所有客戶端發起 DNS 查詢的場景下,都只使用到了 UDP 協議。
那在 DNS 中,TCP 協議在什麼場景下才會用到呢?
今天我們就來聊聊,DNS 的 TCP 的使用場景。
二、DNS
2.1 什麼是 DNS
先來簡單瞭解一下 DNS。
在網路的世界中,每個有效的域名背後都有為其提供服務的伺服器,而我們網路通訊的首要條件,就是知道伺服器的 IP 地址。
但是記住域名(網址)肯定是比記住 IP 地址簡單。如果有某種方法,可以通過域名,查到其提供服務的伺服器 IP 地址,那就非常方便了。這裡就需要用到 DNS 伺服器以及 DNS 解析。
DNS(Domain Name System),它的作用就是根據域名,查出對應的 IP 地址,它是 HTTP 協議的前提。只有將域名正確的解析成 IP 地址後,後面的 HTTP 流程才可以繼續進行下去。
DNS 同時佔用了 UDP 和 TCP 的 53 埠,但是大多數情況下,DNS 查詢都只使用到了 UDP,而 TCP 只在一些特殊情況下才會被使用到。
簡單來說,DNS 使用 TCP 的情況,只有兩種:
-
DNS 查詢響應報文大於 512 位元組時。
-
DNS 主、輔助伺服器之間,進行區域傳送時。
使用 TCP 的場景,基本上就是以上兩種場景,當然,如果客戶端主動發起一個 TCP 的 DNS 查詢,也會使用 TCP 協議,這就不在討論的範圍內了。
2.2 DNS 響應報文大於 512 位元組
說到 DNS 響應報文,先來看看 DNS 資料包的結構,對於 DNS 來說,請求報文和響應報文的結構是一樣的。

image
這其中,我們主要關注 Flags 這個標誌位的結構。

image
在 Flags 中,每個欄位都有其自己的含義,在這裡我們做重關注 QR 和 TC 兩個欄位。
QR 是一個 Bit,用於標識當前是查詢報文(0)還是響應報文(1)。
TC 也是一個 Bit,當它的值為 1 時,表示當前響應報文總長度,已經超過 512 位元組,所以做了截斷處理,只返回前 512 個位元組。
當遇到這種情況時,DNS 解析器會使用 TCP 來重發原來的查詢請求,UDP 要求相應報文在 512 位元組以內,而 TCP 則沒有此限制,TCP 能用多個報文段來傳送任意長度的使用者資料。
DNS 查詢是一個過程複雜,但是結果簡單的過程。通常返回的資料不會大於 512 位元組,這也就是為什麼我們通過抓包的手段,得到的結果都是 DNS 在使用 UDP 協議。
需要注意的是,在實際使用中,很多 DNS 伺服器在進行配置的時候,就把 TCP 查詢包的方式關閉,僅支援 UDP 查詢包。
2.3 DNS 主、輔助伺服器的區域傳送
DNS 伺服器,在設計時就要求一定要是高可用、高併發和分散式的伺服器,它被分為多個層次結構,分別是根 DNS 伺服器、頂級域 DNS 伺服器、權威 DNS 伺服器。
這三類 DNS 伺服器,組成一種類似樹的結構。

image
在這個"樹"中,一個獨立管理的 DNS 子樹,稱為一個區域(zone)。一個 DNS 伺服器負責管理一個或多個區域, 為了滿足高可用,一個區域的管理者必須為該區域提供一個主 DNS 伺服器和至少一個輔助 DNS 伺服器 。
主 DNS 伺服器和輔助 DNS 伺服器,必須是獨立和冗餘的,以便當某個 DNS 伺服器發生故障時,不會影響該區域的 DNS 查詢。
既然 DNS 伺服器有主和輔助之分,那必然面臨了資料同步的情況,我們將輔助伺服器從主伺服器同步資訊的動作,稱為 區域傳送 ,而在觸發區域傳送試,使用的就是 TCP 協議。
觸發 DNS 區域傳送的情況有兩種:
-
新上線一臺輔助伺服器,會從主伺服器執行區域傳送,進行同步資料。
-
輔助伺服器會定時(通常是 3 小時),向主伺服器查詢,以便了解到主伺服器的資料是否發生變動,如果變動,也會觸發一次區域傳送。
區域傳送會使用 TCP 協議,一方面是為了保證資料的可靠,另一方面此時傳送的資料,也遠比一個查詢或響應大的多。
三、小結時刻
到此我們就瞭解清楚了,雖然 DNS 伺服器支援 TCP 和 UDP 雙協議,但是通常我們在做 DNS 查詢的時候,也只用到了 UDP 協議。
TCP 只有在以下兩種情況下,才會被使用到:
-
DNS 響應報文大於 512 位元組,通過 TC 標記為截斷是,才會使用 TCP 重新查詢一遍。
-
DNS 主伺服器和輔助伺服器之間,進行區域傳送時,為了保證穩定以及傳輸資料太大的原因,也會使用 TCP 協議傳輸。
DNS 查詢和響應,通常都在廣域網上通訊,對於 DNS 客戶端,保證好的重傳和超時機制,就顯得尤為重要了。
reference:《TCP/IP 詳解卷一》14.8 用 UDP 還是 TCP
http://www.xumenger.com/dns-udp-tcp-20180604