1. 程式人生 > >網路通訊中的三次握手和四次揮手詳解

網路通訊中的三次握手和四次揮手詳解

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報文,因此不能一起傳送。故需要四步揮手。