TCP和UDP的9個區別是什麼

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

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

 

TCP與UDP之間的區別

 

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

 

1. 基於鏈接vs無鏈接

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

 

圖1:TCP消息握手(TCP - Handshake Message)面試

 

2. 可靠性 不一樣

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

 

3.有序性

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

 

4.數據邊界

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

 

5.速度

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

 

6.重量級vs輕量級

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

 

7. 頭大小

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

 

圖2:TCP包格式(TCP Packet Format)

 

圖3:UDP包格式(UDP Packet format)

 

8. 擁塞或流控制

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

 

9. 用法和應用

在互聯網中,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,他們極大的幫助調試和排除任何鏈接問題。

 

原文參考:

9 Difference between TCP and UDP Protocol – Java Network Interview Question from our JCG partner Javin Paul at the Javarevisited blog.TCP和UDP的9個區別是什麼

相關文章
相關標籤/搜索