網絡通訊中的三次握手與四次揮手原理詳解


0.  准備知識

(1)ACK ,TCP協議規定只有ACK=1時有效,也規定連接建立后所有發送的報文的ACK必須為1。

(2)SYN,在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1,因此SYN置1就表示這是一個連接請求或連接接受報文。

(3)FIN,用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,並要求釋放連接。

 

 

1.  三次握手和四次揮手示意圖

 

1. 1 三次握手詳細示意圖

 

(1)首先由Client發出請求連接即 SYN=1 ACK=0,TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,因此聲明自己的序號是 seq=x。

(2)然后 Server 進行回復確認,即 SYN=1 ACK=1 seq=y,ack=x+1。

(3)再然后 Client 再進行一次確認,但不用SYN 了,這時即為 ACK=1,seq=x+1, ack=y+1。

 

1. 2  三次握手中的問題

 

1.3  四次揮手詳細示意圖

 

(1)當客戶端沒有東西要發送時就要釋放連接的時候(注意這里首先提出中斷連接端可以是Client端,也可以是Server端),客戶端會發送一個FIN為1的沒有數據的報文,進入FIN_WAIT狀態,服務器收到后會給客戶端一個確認,這時客戶端那邊不再發送數據信息(但仍可接收信息)。  

(2)客戶端收到服務器的確認后進入等待狀態,等待服務器請求釋放連接。 服務器數據發送完成后就向客戶端請求連接釋放(也是用FIN=1 表示,並且用ack = u+1(如圖)), 客戶端收到后回復一個確認信息,又要進入 TIME_WAIT 狀態(等待2MSL 時間,最大報文生存時間)。服務器收到后關閉連接。

最后這里為什么還要等待呢?是防止最后一個ACK的丟失,服務器在超時后會重新發送FIN。如果客戶端這時收到FIN就知道最后一個ACK丟失了,會重發。否則客戶端等待一段時間后依然沒有收到回復,則證明Server端已正常關閉,那好,我客戶端也可以關閉連接了。

 

1.4  最后是一些細節總結

 

(1)TIME_WAIT狀態中所需要的時間是依賴於實現方法的。典型的值為30秒、1分鍾和2分鍾。

(2)服務器存在一個保活狀態,即如果客戶端突然故障死機了,那B那邊的連接資源什么時候能釋放呢? 

就是保活時間到了后,B會發送探測信息,以決定是否釋放連接。

(3)為什么連接的時候是三次握手,關閉的時候卻是四次揮手?

關閉連接時,當Server端收到FIN報文時,很可能數據信息沒有傳完並不會立即關閉連接,所以只能先回復一個ACK報文(告訴Client端,"你發的FIN報文我收到了")。只有等到Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步揮手。


免責聲明!

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



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