TCP通信之三次握手四次揮手

TCP是面向連接的,雙方發送數據之前,必須先在雙方之間建立一條連接。TCP協議不同於UDP協議,UDP協議不保證可靠性,而TCP 協議提供可靠的連接服務,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方的序列號和確認號 並交換 TCP窗口大小信息。看圖說話


很清晰的一張圖,當然了,這不是我畫的,我只是引用過來說明問題了。

三次握手是什麼?

1.第一次握手:建立連接。客戶端發送連接請求報文段,向服務器發送同步碼SYN seq = x,等待服務器的確認;

2.第二次握手:服務器收到客戶端同步碼SYN,向客戶端發送應答碼ack = x + 1,併發送服務器同步碼SYN seq = y。

3.第三次握手:客戶端收到服務器的SYN+ACK,向服務器發送應答碼ack = y + 1,這個報文段發送完畢以後,TCP三次握手完成。

完成了三次握手,客戶端和服務器端就可以開始傳送數據。以上就是TCP三次握手的總體介紹。

那四次分手呢?

客戶端和服務器通過三次握手建立了TCP連接,當數據傳送完畢,肯定是要斷開TCP連接。那對於TCP的斷開連接,這就是“四次分手”。

1.第一次分手:主機1(可以使客戶端,也可以是服務器端),向主機2發送結束碼FIN假設其值爲M,這表示主機1沒有數據要發送給主機2了;

2.第二次分手:主機2收到了主機1發送的結束碼FIN,向主機1回一個應答碼ACK = M + 1,主機2告訴主機1,我也沒有數據要發送了,可以進行關閉連接了;

3.第三次分手:主機2向主機1發送結束碼FIN,假設其值爲N,請求關閉連接 ;

4.第四次分手:主機1收到主機2發送的結束FIN,向主機2發送應答碼ACK = N + 1,主機2收到主機1的應答碼ACK以後,就關閉連接; 此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連接了。

至此,TCP的四次分手完成了。

爲什麼要三次握手?

既然總結了TCP的三次握手,那爲什麼非要三次呢?怎麼覺得兩次就可以完成了。那TCP爲什麼非要進行三次連接呢?在謝希仁的《計算機網絡》中是這樣說的:

爲了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。

在書中同時舉了一個例子,如下:

"已失效的連接請求報文段”的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,

而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以後的某個時間纔到達server。本來這是一

個早已失效的報文段。但server收到此失效的連接請求報文段後,就誤認爲是client再次發出的一個新

的連接請求。於是就向client發出確認報文段,同意建立連接。假設不採用“三次握手”,那麼只要server

發出確認,新的連接就建立了。由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,

也不會向server發送數據。但server卻以爲新的運輸連接已經建立,並一直等待client發來數據。這樣,

server的很多資源就白白浪費掉了。採用“三次握手”的辦法可以防止上述現象發生。例如剛纔那種情況,

client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連接。"

這就很明白了,防止了服務器端的一直等待而浪費資源。

爲什麼要四次分手?

那四次分手又是爲何呢?TCP協議是一種面向連接的、可靠的、基於字節流的運輸層通信協議。TCP是全雙工 模式,這就意味着,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2, 它的數據已經全部發送完畢了;但是,這個時候主機1還是可以接受來自主機2的數據;當主機2返回ACK報文 段時,表示它已經知道主機1沒有數據發送了,但是主機2還是可以發送數據到主機1的;當主機2也發送了FIN 報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,之後彼此 就會中斷這次TCP連接。

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