TCP四次揮手

TCP四次揮手

TCP作爲可靠的連接協議,不僅體現在連接的建立上,也體現在其釋放連接上,但是世界上是不存在百分之百可靠的通信機制的,我們來看下TCP釋放連接,也就是四次揮手是如何儘可能保證TCP的可靠性的。

使用Wireshark抓包,如圖:

1.四次揮手的過程

  1. 當客戶端已經發送完數據後,調用close方法向服務端發送FIN包,請求關閉連接,此時客戶端進入FIN_WAIT1狀態,代表客戶端已經不再發送數據,但是還能接收服務端數據,這個狀態也叫半關閉狀態。

因爲TCP是全雙工協議,客戶端和服務端能互相發送數據,都有可能先傳輸完數據請求關閉連接,所以先請求關閉的一方稱爲主動關閉方,而另一方稱爲被動關閉方

  1. 服務端收到客戶端的FIN包後進入CLOSE_WAIT狀態,並返回一個ACK給客戶端,客戶端端收到後,進入FIN_WAIT2狀態。

  2. 當服務端沒有數據向客戶端發送時,向客戶端發送FIN包,然後服務端進入LAST_ACK狀態,客戶端收到FIN包,會進入TIME_WAIT狀態,這是一個比較特殊的狀態,後面會單獨講解。

  3. 服務端收到ACK後進入CLOSE狀態,客戶端在TIME_WAIT等待2MSL後會進入CLOSE狀態。

MSL是Maximum Segment Lifetime英文的縮寫,即報文的最大生存時間,超過這個時間的報文將會被丟棄。

在TCP中還存在一種特殊的情況,就是同時關閉。就是客戶端和服務端同時發送FIN包,但是這種情況並不常見,知道這麼個概念就行了,這裏就不過多闡述了。

2.TCP四次揮手改爲三次可以嗎

因爲TCP連接是全雙工的,數據在兩個方向上能夠同時傳遞,因此每個方向的數據傳輸都必須單獨關閉。當一端收到FIN並響應給對端的時候,這一方向的數據流便停止了,也就是半關閉狀態。但是由於TCP有延遲確認的功能或者服務端收到FIN包後沒有數據發送了,就能同時發送FIN+ACK包,所以其實三次揮手是可以的。

但是延遲確認可能會帶來一個問題,就是如果被動關閉方沒有及時ACK,主動關閉方的FIN包,主動關閉方可能認爲FIN包丟失了,導致不必要的重傳發生。所以四次揮手是相對最合理的關閉連接的方式。

關注作者微信公衆號:

發佈了57 篇原創文章 · 獲贊 29 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章