[計算機網絡][TCP][三次握手][四次揮手]

TCP三次握手 四次揮手

三次握手

目的:保證傳輸的可靠性,爲了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。主要防止資源的浪費。

具體過程:當客戶端發出第一個連接請求報文段時並沒有丟失,而是在某個網絡節點出現了長時間的滯留,以至於延誤了連接請求在某個時間之後纔到達服務器。這應該是一個早已失效的報文段。但是服務器在收到此失效的連接請求報文段後,以爲是客戶端的一個新請求,於是就想客戶端發出了確認報文段,同意建立連接。假設不採用三次握手,那麼只要服務器發出確認後,新的連接就可以建立了。但是由於客戶端沒有發出建立連接的請求,因此不會管服務器的確認,也不會向服務器發送數據,但服務器卻以爲新的運輸連接已經建立,一直在等待,所以,服務器的資源就白白浪費掉了。
在這裏插入圖片描述

四次揮手

由於 TCP 的半關閉造成的。因爲 TCP 連接是全雙工的(即數據可在兩個方向上同時傳遞)所以進行關閉時每個方向上都要單獨進行關閉。這個單方向的關閉就叫半關閉。當一方完成它的數據發送任務,就發送一個 FIN 來向另一方通告將要終止這個方向的連接。
在這裏插入圖片描述

常見問題

  1. 爲什麼建立連接是三次握手,而關閉連接卻是四次揮手呢?
    這是因爲服務端在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些數據給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送。

  2. 爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態? 雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。