DNS同時佔用UDP和TCP端口53是公認的,這種單個應用協議同時使用兩種傳輸協議的狀況在TCP/IP棧也算是個另類。但不多有人知道DNS分別在什麼狀況下使用這兩種協議。安全
先簡單介紹下TCP與UDP。服務器
TCP是一種面向鏈接的協議,提供可靠的數據傳輸,通常服務質量要求比較高的狀況,使用這個協議。UDP---用戶數據報協議,是一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。網絡
TCP與UDP的區別:.net
UDP和TCP協議的主要區別是二者在如何實現信息的可靠傳遞方面不一樣。TCP協議中包含了專門的傳遞保證機制,當數據接收方收到發送方傳來的信息時,會自動向發送方發出確認消息;發送方只有在接收到該確認消息以後才繼續傳送其它信息,不然將一直等待直到收到確認信息爲止。 與TCP不一樣,UDP協議並不提供數據傳送的保證機制。若是在從發送方到接收方的傳遞過程當中出現數據報的丟失,協議自己並不能作出任何檢測或提示。所以,一般人們把UDP協議稱爲不可靠的傳輸協議。相對於TCP協議,UDP協議的另一個不一樣之處在於如何接收突發性的多個數據報。不一樣於TCP,UDP並不能確保數據的發送和接收順序。事實上,UDP協議的這種亂序性基本上不多出現,一般只會在網絡很是擁擠的狀況下才有可能發生。 排序
既然UDP是一種不可靠的網絡協議,那麼還有什麼使用價值或必要呢?其實否則,在有些狀況下UDP協議可能會變得很是有用。由於UDP具備TCP所可望不可即的速度優點。雖然TCP協議中植入了各類安全保障功能,可是在實際執行的過程當中會佔用大量的系統開銷,無疑使速度受到嚴重的影響。反觀UDP因爲排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應用來完成,極大下降了執行時間,使速度獲得了保證。 事務
DNS在進行區域傳輸的時候使用TCP協議,其它時候則使用UDP協議;get
DNS的規範規定了2種類型的DNS服務器,一個叫主DNS服務器,一個叫輔助DNS服務器。在一個區中主DNS服務器從本身本機的數據文件中讀取該區的DNS數據信息,而輔助DNS服務器則從區的主DNS服務器中讀取該區的DNS數據信息。當一個輔助DNS服務器啓動時,它須要與主DNS服務器通訊,並加載數據信息,這就叫作區傳送(zone transfer)。
爲何既使用TCP又使用UDP?同步
首先了解一下TCP與UDP傳送字節的長度限制:域名
UDP報文的最大長度爲512字節,而TCP則容許報文長度超過512字節。當DNS查詢超過512字節時,協議的TC標誌出現刪除標誌,這時則使用TCP發送。一般傳統的UDP報文通常不會大於512字節。域名解析
區域傳送時使用TCP,主要有一下兩點考慮:
1.輔域名服務器會定時(通常時3小時)向主域名服務器進行查詢以便了解數據是否有變更。若有變更,則會執行一次區域傳送,進行數據同步。區域傳送將使用TCP而不是UDP,由於數據同步傳送的數據量比一個請求和應答的數據量要多得多。
2.TCP是一種可靠的鏈接,保證了數據的準確性。
域名解析時使用UDP協議:
客戶端向DNS服務器查詢域名,通常返回的內容都不超過512字節,用UDP傳輸便可。不用通過TCP三次握手,這樣DNS服務器負載更低,響應更快。雖然從理論上說,客戶端也能夠指定向DNS服務器查詢的時候使用TCP,但事實上,不少DNS服務器進行配置的時候,僅支持UDP查詢包。