TCP、UDP協議詳解


</pre></h1><div class="postBody"><div id="cnblogs_post_body"><pre id="best-answer-content" class="reply-text mb10" name="code" style="white-space: pre-wrap; word-wrap: break-word;"><strong>面向連接的TCP</strong>
“面向連接”就是在正式通信前必須要與對方建立起連接。比如你給別人打電話,必須等線路接通了、對方拿起話筒才能相互通話。
TCP協議能爲應用程序提供可靠的通信連接,使一臺計算機發出的字節流無差錯地發往網絡上的其他計算機,對可靠性要求高的數據通信系統往往使用TCP協議傳輸數據。



<strong>面向非連接的UDP協議</strong>
“面向非連接”就是在正式通信前不必與對方先建立連接,不管對方狀態就直接發送。這與現在風行的手機短信非常相似:你在發短信的時候,只需要輸入對方手機號就OK了。
UDP適用於一次只傳送少量數據、對可靠性要求不高的應用環境
UDP協議是面向非連接的協議,沒有建立連接的過程。正因爲UDP協議沒有連接的過程,所以它的通信效果高;但也正因爲如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,因此有時會出現收不到消息的情況。

1.  
      現在Internet上流行的協議是TCP/IP協議,該協議中對低於1024的端口都有確切的定義,他們對應着Internet上一些常見的服務。這些常見的服務可以分爲使用TCP端口(面向連接)和使用UDP端口(面向無連接)兩種。
      說到TCP和UDP,首先要明白“連接”和“無連接”的含義,他們的關係可以用一個形象地比喻來說明,就是打電話和寫信。兩個人如果要通話,首先要建立 連接——即打電話時的撥號,等待響應後——即接聽電話後,才能相互傳遞信息,最後還要斷開連接——即掛電話。寫信就比較簡單了,填寫好收信人的地址後將信 投入郵筒,收信人就可以收到了。從這個分析可以看出,建立連接可以在需要通信的雙方建立一個傳遞信息的通道,在發送方發送請求連接信息接收方響應後,由於是在接受方響應後纔開始傳遞信息,而且是在一個通道中傳送,因此接受方能比較完整地收到發送方發出的信息,即信息傳遞的可靠性比較高。但也正因爲需要建立連接,使資源開銷加大(在建立連接前必須等待接受方響應,傳輸信息過程中必須確認信息是否傳到及斷開連接時發出相應的信號等),獨佔一個通道,在斷開連接前不能建立另一個連接,即兩人在通話過程中第三方不能打入電話。而無連接是一開始就發送信息(嚴格說來,這是沒有開始、結束的),只是一次性的傳遞,是先不需要接受方的響應,因而在一定程度上也無法保證信息傳遞的可靠性了,就像寫信一樣,我們只是將信寄出去,卻不能保證收信人一定可以收到。
      TCP是面向連接的,有比較高的可靠性,  一些要求比較高的服務一般使用這個協議,如FTP、Telnet、SMTP、HTTP、POP3等,而UDP是面向無連接的,使用這個協議的常見服務有 DNS、SNMP、QQ等。對於QQ必須另外說明一下,QQ2003以前是隻使用UDP協議的,其服務器使用8000端口,偵聽是否有信息傳來,客戶端使 用4000端口,向外發送信息(這也就不難理解在一般的顯IP的QQ版本中顯示好友的IP地址信息中端口常爲4000或其後續端口的原因了),即QQ程序 既接受服務又提供服務,在以後的QQ版本中也支持使用TCP協議了。

      
2.
      在瞭解TCP和UDP之前,我們需要來了解倆個概念,面向連接的服務和無連接的服務,應用面向連接的服務時,客戶和服務器在進行數據發送前,彼此向對方發送控制分組,這就是所謂的握手過程,使得客戶和服務器都做好分組交換準備。這個準備是很鬆散的,面向連接服務與很多其他的服務捆綁在一起,包括可靠的數據傳輸,流量控制和擁塞控制等,依賴連接以正確的順序無錯地傳遞所有數據。還要使用確認和重傳機制實現來可靠性。而無連接服務側是沒有握手過程的,當一方想發送數據時就直接了當地發送,因爲沒有握手過程也就沒有什麼流量控制和擁塞控制,這樣數據可能傳輸得更快,但是,由於也沒有確認過程,源端就不知道那些分組到達了目的端。因此可能在傳輸過程中丟失數據,不適合用在一些文件的傳輸,可以用在因特網電話,視頻會議什麼的。

    TCP(傳輸控制協議)和UDP(用戶數據報協議)是傳輸層的倆個傳輸協議,它們倆個的最大區別就是是否面向連接。

    TCP包括了面向連接和可靠數據傳輸服務,在客戶端和服務器端進行通信前,要先交換傳輸層控制信息,爲雙方的通信做好準備。在這個握手階段後,我們就可以認爲在這倆個進程間存在一個TCP連接,且是一個全雙工的連接,在消息發送完後,應用程序會告訴TCP拆除這個連接。可靠的傳輸服務爲了保障彼此通信能無差錯地順序傳遞所有數據。

    當其中任何一個應用程序把一個字節流傳如套接字時,它可以指望TCP把同樣的字節流傳遞到對方的套接字,中間不回丟失和重傳。TCP是因特網的一種公益服務,其目的是能調節數據傳輸過程中的一些問題,因此還要包含一個擁塞機制。TCP擁塞機制在網絡變得擁塞時阻止發送進程。確切地說,TCP擁塞控制試圖把每個TCP連接限定在它所公平共享的網絡帶寬上。對於有最小帶寬需求限制的實時音頻或視頻應用來說,阻止其帶寬那就讓它們不能正常工作,此外,我們能想象一下,在網絡電話通話時,偶爾的不連續是可以容忍的,可見實時應用可以容忍丟失少部分數據,不需要完全可靠服務。

    說了這麼多,TCP能提供的好的服務,再看一下其缺點吧,首先,TCP不保證最小傳輸率,通俗點說,TCP不允許發送進程以想要的速率發送數據,受到TCP擁塞控制的調節,發送進程有可能被迫以一個較低的平均速率發送。其次,TCP不提供任何延時保障,具體點說,發送進程把數據傳入自己的TCP套接字後,這個數據將最終到達其接受套接字,但是中間所經歷的時間就不能保證了 ,花幾秒或則幾分鐘都不一定。

    UDP是一個非面向連接的輕量級傳輸協議,具有一個最簡單的服務模型。UDP是無連接的,因此兩個進程彼此通信之前沒有握手過程。UDP提供不可靠的數據傳輸服務,也就是說當一個進程往自己套接字發送一個消息時,UDP不能保障這個消息回最終到達接受套接字。另外,就確實到達接收套節字的消息而言,他們的到達順序也可能不是有序的。
   
    UDP不含擁塞控制機制,因此發送進程能夠以任意速率往UDP套接字發送數據,儘管不能保證所有數據都到達接收套接字,但是會有相當比列的數據到達。實時應用程序的開發人員往往選擇在UDP上運行他們的應用。與TCP類似,UDP也不提供任何延遲保證。

    說了這麼多,我們可以通過下表來體會一下上面說的真正含義。

    

應用層協議

用來支撐的傳輸協議

電子郵件

SMTPRFC82

TCP

遠程終端訪問

Telenet

TCP

WEB

HTTP

TCP

文件傳送

FTP

TCP

遠程文件服務器

NFS

TCPUDP

流多媒體

專屬

UDPTCP

因特網電話

專屬

一般爲UDP


    在表中我們看到,電子郵件,遠程終端訪問,WEB和文件傳送都使用TCP協議,這些應用選擇TCP的主要原因是在於TCP提供了可靠的數據傳輸服務,能夠保證所有數據最終到達其目的地。我們還看到,因特網電話一般運行在UDP協議上面,一個因特網電話應用的倆端都得以某個最小速率跨越網絡發送數據;另外,因特網電話可以容忍數據丟失,從這個倆個條件來看,都適合UDP,不需要可靠的TCP傳輸服務。

    總的來說,TCP能保證傳遞全部數據,而UDP不能,且他們都不提供延遲保證。他們不提供延遲保證,並不意味着時間敏感的應用不能運行在現在的因特網上,而是應用是通過一些其他的方法來保證這些需要。

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