DNS 支持 TCP 和 UDP 雙協(xié)議,但為何偏偏只鐘情 UDP?
一、前言
之前在聊到 App 網(wǎng)絡(luò)優(yōu)化時(shí),聊到通過(guò) HTTPDNS 替換掉傳統(tǒng)的 DNS 解析,來(lái)達(dá)到網(wǎng)絡(luò)優(yōu)化的效果。其中提到 DNS 解析,是支持 UDP 和 TCP 雙協(xié)議的。
但是細(xì)心的朋友通過(guò) wireshark、sniffer、tcpdump 等抓包工具分析,會(huì)發(fā)現(xiàn)基本上所有客戶端發(fā)起 DNS 查詢的場(chǎng)景下,都只使用到了 UDP 協(xié)議。
那在 DNS 中,TCP 協(xié)議在什么場(chǎng)景下才會(huì)用到呢?
今天我們就來(lái)聊聊,DNS 的 TCP 的使用場(chǎng)景。
二、DNS
2.1 什么是 DNS
先來(lái)簡(jiǎn)單了解一下 DNS。
在網(wǎng)絡(luò)的世界中,每個(gè)有效的域名背后都有為其提供服務(wù)的服務(wù)器,而我們網(wǎng)絡(luò)通信的首要條件,就是知道服務(wù)器的 IP 地址。
但是記住域名(網(wǎng)址)肯定是比記住 IP 地址簡(jiǎn)單。如果有某種方法,可以通過(guò)域名,查到其提供服務(wù)的服務(wù)器 IP 地址,那就非常方便了。這里就需要用到 DNS 服務(wù)器以及 DNS 解析。
DNS(Domain Name System),它的作用就是根據(jù)域名,查出對(duì)應(yīng)的 IP 地址,它是 HTTP 協(xié)議的前提。只有將域名正確的解析成 IP 地址后,后面的 HTTP 流程才可以繼續(xù)進(jìn)行下去。
DNS 同時(shí)占用了 UDP 和 TCP 的 53 端口,但是大多數(shù)情況下,DNS 查詢都只使用到了 UDP,而 TCP 只在一些特殊情況下才會(huì)被使用到。
簡(jiǎn)單來(lái)說(shuō),DNS 使用 TCP 的情況,只有兩種:
DNS 查詢響應(yīng)報(bào)文大于 512 字節(jié)時(shí)。
DNS 主、輔助服務(wù)器之間,進(jìn)行區(qū)域傳送時(shí)。
使用 TCP 的場(chǎng)景,基本上就是以上兩種場(chǎng)景,當(dāng)然,如果客戶端主動(dòng)發(fā)起一個(gè) TCP 的 DNS 查詢,也會(huì)使用 TCP 協(xié)議,這就不在討論的范圍內(nèi)了。
2.2 DNS 響應(yīng)報(bào)文大于 512 字節(jié)
說(shuō)到 DNS 響應(yīng)報(bào)文,先來(lái)看看 DNS 數(shù)據(jù)包的結(jié)構(gòu),對(duì)于 DNS 來(lái)說(shuō),請(qǐng)求報(bào)文和響應(yīng)報(bào)文的結(jié)構(gòu)是一樣的。
這其中,我們主要關(guān)注 Flags 這個(gè)標(biāo)志位的結(jié)構(gòu)。
在 Flags 中,每個(gè)字段都有其自己的含義,在這里我們做重關(guān)注 QR 和 TC 兩個(gè)字段。
QR 是一個(gè) Bit,用于標(biāo)識(shí)當(dāng)前是查詢報(bào)文(0)還是響應(yīng)報(bào)文(1)。
TC 也是一個(gè) Bit,當(dāng)它的值為 1 時(shí),表示當(dāng)前響應(yīng)報(bào)文總長(zhǎng)度,已經(jīng)超過(guò) 512 字節(jié),所以做了截?cái)嗵幚?,只返回?512 個(gè)字節(jié)。
當(dāng)遇到這種情況時(shí),DNS 解析器會(huì)使用 TCP 來(lái)重發(fā)原來(lái)的查詢請(qǐng)求,UDP 要求相應(yīng)報(bào)文在 512 字節(jié)以內(nèi),而 TCP 則沒(méi)有此限制,TCP 能用多個(gè)報(bào)文段來(lái)傳送任意長(zhǎng)度的用戶數(shù)據(jù)。
DNS 查詢是一個(gè)過(guò)程復(fù)雜,但是結(jié)果簡(jiǎn)單的過(guò)程。通常返回的數(shù)據(jù)不會(huì)大于 512 字節(jié),這也就是為什么我們通過(guò)抓包的手段,得到的結(jié)果都是 DNS 在使用 UDP 協(xié)議。
需要注意的是,在實(shí)際使用中,很多 DNS 服務(wù)器在進(jìn)行配置的時(shí)候,就把 TCP 查詢包的方式關(guān)閉,僅支持 UDP 查詢包。
2.3 DNS 主、輔助服務(wù)器的區(qū)域傳送
DNS 服務(wù)器,在設(shè)計(jì)時(shí)就要求一定要是高可用、高并發(fā)和分布式的服務(wù)器,它被分為多個(gè)層次結(jié)構(gòu),分別是根 DNS 服務(wù)器、***域 DNS 服務(wù)器、權(quán)威 DNS 服務(wù)器。
這三類 DNS 服務(wù)器,組成一種類似樹(shù)的結(jié)構(gòu)。
在這個(gè)"樹(shù)"中,一個(gè)獨(dú)立管理的 DNS 子樹(shù),稱為一個(gè)區(qū)域(zone)。一個(gè) DNS 服務(wù)器負(fù)責(zé)管理一個(gè)或多個(gè)區(qū)域,為了滿足高可用,一個(gè)區(qū)域的管理者必須為該區(qū)域提供一個(gè)主 DNS 服務(wù)器和至少一個(gè)輔助 DNS 服務(wù)器。
主 DNS 服務(wù)器和輔助 DNS 服務(wù)器,必須是獨(dú)立和冗余的,以便當(dāng)某個(gè) DNS 服務(wù)器發(fā)生故障時(shí),不會(huì)影響該區(qū)域的 DNS 查詢。
既然 DNS 服務(wù)器有主和輔助之分,那必然面臨了數(shù)據(jù)同步的情況,我們將輔助服務(wù)器從主服務(wù)器同步信息的動(dòng)作,稱為區(qū)域傳送,而在觸發(fā)區(qū)域傳送試,使用的就是 TCP 協(xié)議。
觸發(fā) DNS 區(qū)域傳送的情況有兩種:
- 新上線一臺(tái)輔助服務(wù)器,會(huì)從主服務(wù)器執(zhí)行區(qū)域傳送,進(jìn)行同步數(shù)據(jù)。
- 輔助服務(wù)器會(huì)定時(shí)(通常是 3 小時(shí)),向主服務(wù)器查詢,以便了解到主服務(wù)器的數(shù)據(jù)是否發(fā)生變動(dòng),如果變動(dòng),也會(huì)觸發(fā)一次區(qū)域傳送。
區(qū)域傳送會(huì)使用 TCP 協(xié)議,一方面是為了保證數(shù)據(jù)的可靠,另一方面此時(shí)傳送的數(shù)據(jù),也遠(yuǎn)比一個(gè)查詢或響應(yīng)大的多。
三、小結(jié)時(shí)刻
到此我們就了解清楚了,雖然 DNS 服務(wù)器支持 TCP 和 UDP 雙協(xié)議,但是通常我們?cè)谧?DNS 查詢的時(shí)候,也只用到了 UDP 協(xié)議。
TCP 只有在以下兩種情況下,才會(huì)被使用到:
DNS 響應(yīng)報(bào)文大于 512 字節(jié),通過(guò) TC 標(biāo)記為截?cái)嗍?,才?huì)使用 TCP 重新查詢一遍。
DNS 主服務(wù)器和輔助服務(wù)器之間,進(jìn)行區(qū)域傳送時(shí),為了保證穩(wěn)定以及傳輸數(shù)據(jù)太大的原因,也會(huì)使用 TCP 協(xié)議傳輸。
DNS 查詢和響應(yīng),通常都在廣域網(wǎng)上通信,對(duì)于 DNS 客戶端,保證好的重傳和超時(shí)機(jī)制,就顯得尤為重要了。
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)聯(lián)系作者獲取授權(quán)】