TCP協議與UDP協議之間的九個區別

      CP和UDP是兩個傳輸層協議,廣泛應用於網絡中不同主機之間傳輸數據。對任何程序員來說,熟悉TCP和UDP的工作方式都是至關重要的。這就是爲什麼TCP和UDP是一個流行的Java編程面試問題。我曾經在各種不同的Java面試中見過這個問題,尤其是對服務器端Java開發人員的面試。由於FIX(金融信息交換)協議也是一個基於TCP協議,一些投資銀行,對衝基金,和交換解決方案提供商也在尋找有良好的TCP和UDP的知識的Java開發人員。爲高速電子交易平臺編寫FIX引擎和服務器端組件需要能夠對數據結構、算法以及網絡等基本知識都理解透徹的的開發人員的

       順便說一下,使用TCP和UDP並不侷限於一個領域,它處於互聯網的中心位置。HTTP是基於TCP,而HTTP是整個互聯網的核心部分。另一個Java開發人員應該理解這兩個協議的理由是, java廣泛用於編寫多線程、並行以及可伸縮的服務器程序。Java還提供了豐富的基於TCP和UDP套接字編程API。在這篇文章中,我們將學習TCP和UDP協議之間的關鍵差異。首先,TCP代表傳輸控制協議和UDP代表用戶數據報協議,兩者都廣泛的應用於構建互聯網應用。

TCP與UDP之間的不同

       我喜歡比較兩事物的不同點,這不僅使他們更加容易比較,而且會更容易記住他們之間的差異。當我們比較TCP,UDP,我們需要了解TCP和UDP各自的工作方式,瞭解哪種協議提供了可靠保證交付和而哪個又沒有。哪種協議是快速的,他爲什麼更加快速,最重要的是,當我們瞭解了這些,在建設我們自己的分佈式應用程序時,就知道該選擇TCP還是 UDP。在這篇文章中,我們將看到9點UDP和TCP之間的差異,例如,連接步驟,排序,速度,可靠性,開銷,頭大小,擁塞控制,應用以及基於TCP和UDP協議不同,他們如何傳輸數據

       基於連接vs無連接

他們之間的第一點並且最重要的區別是:TCP是面向連接的協議,而UDP是無連接的協議。這意味着當一個客戶端和一個服務器通過TCP發送數據之前,必須先建立連接,他們可以通過TCP發送數據。建立連接的過程也被稱爲TCP握手,他通過控制消息在客戶端和服務器之間互換來實現。下面的圖形象描述了TCP握手過程。客戶端,它也是TCP連接的發起者,發送一個SYN消息給服務器,該服務器端正在監聽某個TCP端口。服務器接收該消息併發送一個SYN-ACK消息,客戶端接受到該消息之後會再回一個ACK消息。一旦服務器收到ACK消息,TCP連接就建立成功,準備數據傳輸了。另一方面,UDP是無連接的協議,和點對點連接之前不需要發送消息。這就是爲什麼,UDP更加適合消息的多播發布,從單個點向多個點傳輸消息。

 

 

seq和ack號存在於TCP報文段的首部中,seq是序號,,大小均爲4字節。

seq:佔 4 字節,序號範圍[0,2^32-1],序號增加到 2^32-1 後,下個序號又回到 0。TCP 是面向字節流的,通過 TCP 傳送的字節流中的每個字節都按順序編號,而報頭中的序號字段值則指的是本報文段數據的第一個字節的序號。

ack:佔 4 字節,期望收到對方下個報文段的第一個數據字節的序號

       (1)第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
        (2)第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
        (3)第三次握手:Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否爲K+1,ACK是否爲1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。

 

可靠性   

TCP提供交付保證,這意味着一個使用TCP協議發送的消息是保證交付給客戶端的。如果消息在傳輸過程中丟失,那麼它將重發,這是由TCP協議本身控制的。另一方面,UDP是不可靠的,它不提供任何交付的保證。一個數據報包在運輸途中可能會丟失。這就是爲什麼UDP是不適合保證交付的項目。

 

有序性

除了提供交付保證,爲TCP也保證了消息的有序性。該消息將以從服務器端發出的同樣的順序發送到客戶端,儘管這些消息到網絡的另一端時可能是無序的。TCP協議將會爲你排好序。UDP不提供任何有序性或序列性的保證。數據包將以任何可能的順序到達。這就是爲什麼TCP是適合需要順序交付方式的應用,儘管有基於UDP的協議通過使用序列號和重傳來提供有序和可靠性的應用,如TIBCO Rendezvous,他實際上就是一個基於UDP的應用。

 

數據邊界

TCP不保存數據的邊界,而UDP保證。在傳輸控制協議,數據以字節流的形式發送,並沒有明顯的標誌表明傳輸信號消息(段)的邊界。在UDP中,數據包單獨發送的,只有當他們到達時,纔會再次集成。包有明確的界限來哪些包已經收到,這意味着在消息發送後,在接收器接口將會有一個讀操作,來生成一個完整的消息。雖然TCP也將在收集所有字節之後生成一個完整的消息,但是這些信息在傳給傳輸給接受端之前將儲存在TCP緩衝區,以確保更好的使用網絡帶寬

 

速度

總而言之,TCP速度比較慢,而UDP速度比較快,因爲TCP必須創建連接,以保證消息的可靠交付和有序性,他需要做比UDP多的多的事。這就是爲什麼UDP更適用於對速度比較敏感的應用,例如:在線視頻媒體,電視廣播和多人在線遊戲。

 

重量級vs輕量級

由於上述的開銷,TCP被認爲是重量級的協議,而與之相比,UDP協議則是一個輕量級的協議。因爲UDP傳輸的信息中不承擔任何間接創造連接,保證交貨或秩序的的信息。這也反映在用於承載元數據的頭的大小。

 

頭大小

TCP具有比UDP更大的頭。一個TCP數據包報頭的大小是20字節,UDP數據報報頭是8個字節。TCP報頭中包含序列號,ACK號,數據偏移量,保留,控制位,窗口,緊急指針,可選項,填充項,校驗位,源端口和目的端口。而UDP報頭只包含長度,源端口號,目的端口,和校驗和。下圖是TCP和UDP頭:

 

 

 

擁塞和流量控制

TCP有流量控制。在任何用戶數據可以被髮送之前,TCP需要三數據包來設置一個套接字連接。TCP處理的可靠性和擁塞控制。另一方面,UDP不能進行流量控制。

 

使用和應用

在互聯網中,TCP和UDP都運行在哪些環境中了?在瞭解了TCP和UDP之間的關鍵差異之後,我們可以很容易地得出結論,哪種情況適合他們。由於TCP提供可靠交付和有序性的保證,它是最適合需要高可靠並且對傳輸時間要求不高的應用。UDP是更適合的應用程序需要快速,高效的傳輸的應用,如遊戲。UDP是無狀態的性質,在服務器端需要對大量客戶端產生的少量請求進行應答的應用中是非常有用的。在實踐中,TCP被用於金融領域,如FIX協議是一種基於TCP的協議,而UDP是大量使用在遊戲和娛樂場所。

 

基於TCP和UDP的協議

基於TCP協議的最好例子是HTTP協議和HTTPS協議,他們幾乎存在於互聯網的任何地方,實際上,絕大多數你所熟悉的通常協議,都是基於TCP的,例如:Telnet,FTP以及SMTP協議。UDP協議沒有TCP協議那麼受歡迎,但是也被廣泛應用,比如DHCP以及DNS協議,其他還有一些基於UDP的協議如SNMP,TFTP,BOOTP以及NFS(早期版本)。

特別需要記住的是,TCP是面向連接的,可靠的,緩慢的,可靠交付以及保證消息順序的,而UDP是無連接的,不可靠的,沒有序列保證,但是一個快速傳輸的協議。TCP頭開銷也比UDP高得多,因爲它每個數據包中藥發送更多的元數據。值得一提的是,TCP頭的大小是20個字節,而UDP頭大小是8個字節。如果你不想丟失任何消息,使用TCP協議,而UDP能夠高速傳輸數據,並且丟失少量的數據包是可以接受的,如視頻流或在線多玩家遊戲。對於基於TCP / UDP協議,運行在Linux上的應用,需要牢記的基本網絡命令,如Telnet和netstat,他們極大的幫助調試和排除任何連接問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章