【網絡】TCP和UDP的區別以及TCP的三次握手四次釋放


一、兩者區別

1.TCP面向連接的運輸層協議,UDP無連接
2.TCP是可靠交付,UDP是盡最大努力交付
3.TCP面向字節流,UDP面向報文
4.TCP是點對點連接的,UDP一對一,一對多,多對多都可以
5.TCP適合用於網頁,郵件等,UDP適合用於視頻,語音廣播等

TCP(Transmission Control Protocol):

可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送緩存&接收緩存)、面向字節流。

使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸程序。

UDP(User Datagram Protocol)      

不可靠的、無連接的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。

使用UDP的應用:域名系統 (DNS);視頻流;IP語音(VoIP)。

二、為什么UDP有時比TCP更有優勢?

UDP以其簡單、傳輸快的優勢,在越來越多場景下取代了TCP,如實時游戲。

(1)網速的提升給UDP的穩定性提供可靠網絡保障,丟包率很低,如果使用應用層重傳,能夠確保傳輸的可靠性。

(2)TCP為了實現網絡通信的可靠性,使用了復雜的擁塞控制算法,建立了繁瑣的握手過程,由於TCP內置的系統協議棧中,極難對其進行改進。

采用TCP,一旦發生丟包,TCP會將后續的包緩存起來,等前面的包重傳並接收到后再繼續發送,延時會越來越大,基於UDP對實時性要求較為嚴格的情況下,采用自定義重傳機制,能夠把丟包產生的延遲降到最低,盡量減少網絡問題對游戲性造成影響。

TCP三次握手的過程

第一次握手,發送SYN報文,傳達信息:“你好,我想建立連接”;
第二次握手,回傳SYN+ACK報文,傳達信息:“好的,可以建立鏈接”;
第三次握手,回傳ACK報文,傳到信息:“好的,我知道了,那我們連接”。然后就建立連接了。在發送報文之前各方都要確認可以進行連接。
之所以采取三次握手機制,不過是為了信息傳輸的可靠性。

二次握手可能導致的問題:

 

      

        如上圖所示,如果僅僅是2次握手的話,可能出現的問題如下:

       Host A發送的數據包由於網絡的原因,出現了滯留,即延時到達了HostB。此時,B以為HostA發來了請求,於是就向HostA發送確認報文,以建立連接。而HostA收到報文后,由於其沒有向HostB發起建立連接的請求,因此不會理睬HostB的確認,也不會向HostB發送數據。而此時的B認為已經建立起連接了,就等待HostA發送的數據,導致HostB的資源白白浪費!

另一種表述:

謝希仁版《計算機網絡》中的例子:
"已失效的連接請求報文段”的產生在這樣一種情況下:
client發出的第一個連接請求報文段並沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server。
本來這是一個早已失效的報文段,但server收到此失效的連接請求報文段后,就誤認為是client再次發出的一個新的連接請求。
於是就向client發出確認報文段,同意建立連接。

假設不采用“三次握手”,那么只要server發出確認,新的連接就建立了。
由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據,但server卻以為新的運輸連接已經建立,並一直等待client發來數據。
這樣,server的很多資源就白白浪費掉了。
采用“三次握手”的辦法可以防止上述現象發生。
例如剛才那種情況,client不會向server的確認發出確認,server由於收不到確認,就知道client並沒有要求建立連接。”

這個例子很清晰的闡釋了“三次握手”對於建立可靠連接的意義。

TCP三次握手之打電話的例子

  A : 你好我是A,你聽得到我在說話嗎

  B : 聽到了,我是B,你聽到我在說話嗎

  A : 嗯,聽到了

  建立連接,開始聊天!

四次揮手過程

為什么TCP協議終止鏈接要四次?

1、當主機A確認發送完數據且知道B已經接受完了,想要關閉發送數據口(當然確認信號還是可以發),就會發FIN給主機B。

2、主機B收到A發送的FIN,表示收到了,就會發送ACK回復。

3、但這是B可能還在發送數據,沒有想要關閉數據口的意思,所以FIN與ACK不是同時發送的,而是等到B數據發送完了,才會發送FIN給主機A。

4、A收到B發來的FIN,知道B的數據也發送完了,回復ACK, A等待2MSL以后,沒有收到B傳來的任何消息,知道B已經收到自己的ACK了,A就關閉鏈接,B也關閉鏈接了。

通俗例子:

A:“喂,我不說了。”A->FIN_WAIT1

B:“我知道了。等下,上一句還沒說完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,說完了,我也不說了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保證B收到了消息,否則重說一次”我知道了”,A->CLOSED


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM