Domain-Name-System
DNS 協議如何從 UDP 切換到 TCP?
在有人問之前:我已經看到DNS 查詢何時使用 TCP 而不是 UDP?它沒有回答我的問題。
我一直聽到的是“如果答案太長,DNS 將使用 TCP ”。這並不能解釋它是如何發生的。
所以情況如下:DNS 客戶端請求使用 UDP 解析記錄。UDP 的記錄太長:
- 伺服器用特定的操作碼回答,讓客戶端切換到 TCP
- 伺服器根本不響應,客戶端通過 TCP 重試
- 伺服器打開到客戶端的 TCP 連接(愚蠢,如果你算上 NAT,但誰知道呢?)
- 客戶端以某種方式(?)“知道”給定的查詢應該通過 TCP 執行,因此它首先不會打擾 UDP
- DNS pixies 在需要時神奇地將 UDP 轉換為 TCP
我一直在網際網路上尋找答案,但有很多噪音(見上文),我似乎無法為此編寫正確的 Google 查詢(就此而言,我也無法在 RFC 中找到資訊) .
客戶端事先並不知道響應會太大,所以會通過UDP向服務端查詢。
伺服器將通過 UDP 響應,並將盡可能多地包含並設置截斷的標頭位(“TC” http://www.networksorcery.com/enp/protocol/dns.htm)。
然後客戶端可以通過 TCP 重新發送請求並獲得完整的響應。
另見:https ://www.rfc-editor.org/rfc/rfc5966
在沒有 EDNS0(DNS 0 的擴展機制)(見下文)的情況下,任何需要發送超過 512 字節限制的 UDP 響應的 DNS 伺服器的正常行為是伺服器截斷響應以使其適合在該限制內,然後在響應標頭中設置 TC 標誌。當客戶端收到這樣的響應時,它會將 TC 標誌作為它應該通過 TCP 重試的指示。
並且:https ://www.ietf.org/rfc/rfc2181.txt
正如評論中提到的,當然 DNS 區域傳輸總是使用 TCP。