DNS分別在什么情況下使用UDP和TCP
服務器dns DNS同時占用UDP和TCP端口53是公認的,這種單個應用協議同時使用兩種傳輸協議的情況在TCP/IP棧也算是個另類。但很少有人知道DNS分別在什么情況下使用這兩種協議。
如果用wireshark、sniffer或古老些的tcpdump抓包分析,會發現幾乎所有的情況都是在使用UDP,使用TCP的情況非常罕見,神秘兮兮。其實當解析器發出一個request后,返回的response中的tc刪節標志比特位被置1時,說明反饋報文因為超長而有刪節。這是因為UDP的報文***長度為512字節。解析器發現后,將使用TCP重發request,TCP允許報文長度超過512字節。既然TCP能將data stream分成多個segment,它就能用更多的segment來傳送任意長度的數據。
另外一種情況是,當一個域的輔助域名服務器啟動時,將從該域的主域名服務器primary DNS server執行區域傳送。除此之外,輔域名服務器也會定時(一般時3小時)向PDS進行查詢以便了解SOA的數據是否有變動。如有變動,也會執行一次區域傳送。區域傳送將使用TCP而不是UDP,因為傳送的數據量比一個request或response多得多。
DNS主要還是使用UDP,解析器還是服務端都必須自己處理重傳和超時。DNS往往需要跨越廣域網或互聯網,分組丟失率和往返時間的不確定性要更大些,這對于DNS客戶端來說是個考驗,好的重傳和超時檢測就顯得更重要了。