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

1、二者區別

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)      

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

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

2、爲何UDP有時比TCP更有優點?

UDP以其簡單、傳輸快的優點,在愈來愈多場景下取代了TCP,如實時遊戲。計算機網絡

(1)網速的提高給UDP的穩定性提供可靠網絡保障,丟包率很低,若是使用應用層重傳,可以確保傳輸的可靠性。視頻

(2)TCP爲了實現網絡通訊的可靠性,使用了複雜的擁塞控制算法,創建了繁瑣的握手過程,因爲TCP內置的系統協議棧中,極難對其進行改進。server

採用TCP,一旦發生丟包,TCP會將後續的包緩存起來,等前面的包重傳並接收到後再繼續發送,延時會愈來愈大,基於UDP對實時性要求較爲嚴格的狀況下,採用自定義重傳機制,可以把丟包產生的延遲降到最低,儘可能減小網絡問題對遊戲性形成影響。blog

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協議終止連接要四次?

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

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

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

四、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

相關文章
相關標籤/搜索