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客戶端來講是個考驗,好的重傳和超時檢測就顯得更重要了。安全
DNS同時佔用UDP和TCP端口53是公認的,這種單個應用協議同時使用兩種傳輸協議的狀況在TCP/IP棧也算是個另類。但不多有人知道DNS分別在什麼狀況下使用這兩種協議。
先簡單介紹下TCP與UDP。
TCP是一種面向鏈接的協議,提供可靠的數據傳輸,通常服務質量要求比較高的狀況,使用這個協議。UDP---用戶數據報協議,是一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
TCP與UDP的區別:
UDP和TCP協議的主要區別是二者在如何實現信息的可靠傳遞方面不一樣。TCP協議中包含了專門的傳遞保證機制,當數據接收方收到發送方傳來的信息時,會自動向發送方發出確認消息;發送方只有在接收到該確認消息以後才繼續傳送其它信息,不然將一直等待直到收到確認信息爲止。 與TCP不一樣,UDP協議並不提供數據傳送的保證機制。若是在從發送方到接收方的傳遞過程當中出現數據報的丟失,協議自己並不能作出任何檢測或提示。所以,一般人們把UDP協議稱爲不可靠的傳輸協議。相對於TCP協議,UDP協議的另一個不一樣之處在於如何接收突發性的多個數據報。不一樣於TCP,UDP並不能確保數據的發送和接收順序。事實上,UDP協議的這種亂序性基本上不多出現,一般只會在網絡很是擁擠的狀況下才有可能發生。
既然UDP是一種不可靠的網絡協議,那麼還有什麼使用價值或必要呢?其實否則,在有些狀況下UDP協議可能會變得很是有用。由於UDP具備TCP所可望不可即的速度優點。雖然TCP協議中植入了各類安全保障功能,可是在實際執行的過程當中會佔用大量的系統開銷,無疑使速度受到嚴重的影響。反觀UDP因爲排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應用來完成,極大下降了執行時間,使速度獲得了保證。
DNS在進行區域傳輸的時候使用TCP協議,其它時候則使用UDP協議;
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查詢包。服務器
UDP
UDP 與 TCP 的主要區別在於 UDP 不必定提供可靠的數據傳輸。事實上,該協議不能保證數據準確無誤地到達目的地。UDP 在許多方面很是有效。當某個程序的目標是儘快地傳輸儘量多的信息時(其中任意給定數據的重要性相對較低),可以使用 UDP。ICQ 短消息使用 UDP 協議發送消息。
許多程序將使用單獨的TCP鏈接和單獨的UDP鏈接。重要的狀態信息隨可靠的TCP鏈接發送,而主數據流經過UDP發送。
TCP
TCP的目的是提供可靠的數據傳輸,並在相互進行通訊的設備或服務之間保持一個虛擬鏈接。TCP在數據包接收無序、丟失或在交付期間被破壞時,負責數據恢復。它經過爲其發送的每一個數據包提供一個序號來完成此恢復。記住,較低的網絡層會將每一個數據包視爲一個獨立的單元,所以,數據包能夠沿徹底不一樣的路徑發送,即便它們都是同一消息的組成部分。這種路由與網絡層處理分段和從新組裝數據包的方式很是類似,只是級別更高而已。
爲確保正確地接收數據,TCP要求在目標計算機成功收到數據時發回一個確認(即 ACK)。若是在某個時限內未收到相應的 ACK,將從新傳送數據包。若是網絡擁塞,這種從新傳送將致使發送的數據包重複。可是,接收計算機可以使用數據包的序號來肯定它是否爲重複數據包,並在必要時丟棄它。
TCP與UDP的選擇
若是比較UDP包和TCP包的結構,很明顯UDP包不具有TCP包複雜的可靠性與控制機制。與TCP協議相同,UDP的源端口數和目的端口數也都支持一臺主機上的多個應用。一個16位的UDP包包含了一個字節長的頭部和數據的長度,校驗碼域使其能夠進行總體校驗。(許多應用只支持UDP,如:多媒體數據流,不產生任何額外的數據,即便知道有破壞的包也不進行重發。)
很明顯,當數據傳輸的性能必須讓位於數據傳輸的完整性、可控制性和可靠性時,TCP協議是固然的選擇。當強調傳輸性能而不是傳輸的完整性時,如:音頻和多媒體應用,UDP是最好的選擇。在數據傳輸時間很短,以致於此前的鏈接過程成爲整個流量主體的狀況下,UDP也是一個好的選擇,如:DNS交換。把SNMP創建在UDP上的部分緣由是設計者認爲當發生網絡阻塞時,UDP較低的開銷使其有更好的機會去傳送管理數據。TCP豐富的功能有時會致使不可預料的性能低下,可是咱們相信在不遠的未來,TCP可靠的點對點鏈接將會用於絕大多數的網絡應用。網絡
TCP(Transmission Control Protocol,傳輸控制協議)是基於鏈接的協議,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。一個TCP鏈接必需要通過三次「對話」才能創建起來。三次對話的簡單過程:主機A向主機B發出鏈接請求數據包:「我想給你發數據,能夠嗎?」,這是第一次對話;主機B向主機A發送贊成鏈接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工做)的數據包:「能夠,你何時發?」,這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:「我如今就發,你接着吧!」,這是第三次對話。三次「對話」的目的是使數據包的發送和接收同步,通過三次「對話」以後,主機A才向主機B正式發送數據。
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發送過去!
UDP適用於一次只傳送少許數據、對可靠性要求不高的應用環境。好比,咱們常用「ping」命令來測試兩臺主機之間TCP/IP通訊是否正常,其實「ping」命令的原理就是向對方主機發送UDP數據包,而後對方主機確認收到數據包,若是數據包是否到達的消息及時反饋回來,那麼網絡就是通的。例如,在默認狀態下,一次「ping」操做發送4個數據包(如圖2所示)。你們能夠看到,發送的數據包數量是4包,收到的也是4包(由於對方主機收到後會發回一個確認收到的數據包)。這充分說明了UDP協議是面向非鏈接的協議,沒有創建鏈接的過程。正由於UDP協議沒有鏈接的過程,因此它的通訊效果高;但也正由於如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,所以有時會出現收不到消息的狀況。HTTP是用TCP協議傳輸的。tcp
TCP協議與UDP協議的區別性能
TCP基於面向鏈接的協議,數據傳輸可靠,傳輸速度慢,適用於傳輸大量數據,可靠性要求高的場合。測試
UDP協議面向非鏈接協議,數據傳輸不可靠,傳輸速度快,適用於一次只傳送少許數據、對可靠性要求不高的應用環境。
spa
面向鏈接的TCP設計
「面向鏈接」就是在正式通訊前必需要與對方創建起鏈接。好比你給別人打電話,必須等線路接通了、對方拿起話筒才能相互通話。server
TCP協議能爲應用程序提供可靠的通訊鏈接,使一臺計算機發出的字節流無差錯地發往網絡上的其餘計算機,對可靠性要求高的數據通訊系統每每使用TCP協議傳輸數據。排序
面向非鏈接的UDP協議
「面向非鏈接」就是在正式通訊前沒必要與對方先創建鏈接,無論對方狀態就直接發送。這與如今風行的手機短信很是類似:你在發短信的時候,只須要輸入對方手機號就OK了。
UDP適用於一次只傳送少許數據、對可靠性要求不高的應用環境
UDP協議是面向非鏈接的協議,沒有創建鏈接的過程。正由於UDP協議沒有鏈接的過程,因此它的通訊效果高;但也正由於如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,所以有時會出現收不到消息的狀況。
TCP協議與UDP協議支持的應用協議
TCP支持的應用協議主要有:Telnet、FTP、SMTP等;
UDP支持的應用層協議主要有:NFS(網絡文件系統)、SNMP(簡單網絡管理協議)、DNS(主域名稱系統)、TFTP(通用文件傳輸協議)等。
TCP和UDP都是位於OSI模型中的傳輸層中。
TCP優勢:面向鏈接的,具備實時性,就象打電話同樣,二者必須創建鏈接.
它保證你所傳輸的東西是準確到達的,而且收方要給你一個收到或沒有\ 收到的回覆,因此它具備安全性的特色..
UDP優勢:面向無鏈接的,就象給某人寄信同樣,對方不須要在郵局等着你的信到.
因此說,它沒有保障性,不能確保你必定能收到信,不象TCP那樣,,可是 它比TCP好的一點,就是速度快,由於他不須要雙方交流是否收到,對發的東西有一個確認的過程.