DNS報文主要使用53/UDP,何時會用到53/TCP?服務器
根據RFC1035,對於DNS服務器,遞歸解析時用53/UDP,區傳輸因須要可靠傳輸,必須使用53/TCP。DNS服務器的標準實現必須同時支持53/TCP和53/UDP。RFC 1035中還指出,53/UDP上的UDP數據區(不包括UDP首部)不得超過512字節,發送時若是超過512字節,將被截斷成512字節,同時DNS協議Flags字段Truncated位置位。53/TCP上的數據區最前面是big-endian序的2字節長度域,不包括自身這2字節,指明瞭後續數據長度。ide
當DNS響應數據大於512字節的時候,數據只返回512字節,剩餘的數據將被丟棄.這個時候名字解析器(DNS客戶端或遞歸解析中的DNS服務器)一般使用TCP重發原來的查詢請求,它將容許返回的響應超過512個字節.因此什麼時候使用TCP是由名字解析器決定的,也就是說,名字解析器用TCP發送請求,名字服務器纔會用TCP發送響應,正常狀況下決不會出現請求抱文是UDP而響應報文是TCP的狀況.spa
即"當DNS服務器產生的響應數據大於512字節(指UDP數據區)時會自動改用53/TCP"這種說法是錯誤的.遞歸
使用 DNS 的擴展名機制 (EDNS0)資源
DNS 的擴展機制容許 DNS 請求者公佈其 UDP 數據包的大小,而且更便於傳輸大於 512 字節(對於 UDP 數據包大小的原始 DNS 限制,RFC 1035)的數據包。DNS 服務器經過 UDP 傳輸層接收請求時,它對來自 OPT 資源記錄 (RR) 的請求者的 UDP 數據包大小進行標識,測量其響應,以包含請求者指定的最大 UDP 數據包大小中容許的多個資源記錄。
it