Domain-Name-System

DNS 協議如何從 UDP 切換到 TCP?

  • June 12, 2015

在有人問之前:我已經看到DNS 查詢何時使用 TCP 而不是 UDP?它沒有回答我的問題。

我一直聽到的是“如果答案太長,DNS 將使用 TCP ”。這並不能解釋它是如何發生的。

所以情況如下:DNS 客戶端請求使用 UDP 解析記錄。UDP 的記錄太長:

  1. 伺服器用特定的操作碼回答,讓客戶端切換到 TCP
  2. 伺服器根本不響應,客戶端通過 TCP 重試
  3. 伺服器打開到客戶端的 TCP 連接(愚蠢,如果你算上 NAT,但誰知道呢?)
  4. 客戶端以某種方式(?)“知道”給定的查詢應該通過 TCP 執行,因此它首先不會打擾 UDP
  5. 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。

引用自:https://serverfault.com/questions/698251