TCP四次揮手
TCP作爲可靠的連接協議,不僅體現在連接的建立上,也體現在其釋放連接上,但是世界上是不存在百分之百可靠的通信機制的,我們來看下TCP釋放連接,也就是四次揮手是如何儘可能保證TCP的可靠性的。
使用Wireshark抓包,如圖:
1.四次揮手的過程
當客戶端已經發送完數據後,調用close方法向服務端發送FIN包,請求關閉連接,此時客戶端進入 FIN_WAIT1
狀態,代表客戶端已經不再發送數據,但是還能接收服務端數據,這個狀態也叫半關閉
狀態。
因爲TCP是全雙工協議,客戶端和服務端能互相發送數據,都有可能先傳輸完數據請求關閉連接,所以先請求關閉的一方稱爲
主動關閉方
,而另一方稱爲被動關閉方
。
服務端收到客戶端的FIN包後進入
CLOSE_WAIT
狀態,並返回一個ACK給客戶端,客戶端端收到後,進入FIN_WAIT2
狀態。當服務端沒有數據向客戶端發送時,向客戶端發送
FIN
包,然後服務端進入LAST_ACK
狀態,客戶端收到FIN
包,會進入TIME_WAIT
狀態,這是一個比較特殊的狀態,後面會單獨講解。服務端收到
ACK
後進入CLOSE
狀態,客戶端在TIME_WAIT
等待2MSL後會進入CLOSE
狀態。
MSL是Maximum Segment Lifetime英文的縮寫,即報文的最大生存時間,超過這個時間的報文將會被丟棄。
在TCP中還存在一種特殊的情況,就是同時關閉
。就是客戶端和服務端同時發送FIN
包,但是這種情況並不常見,知道這麼個概念就行了,這裏就不過多闡述了。
2.TCP四次揮手改爲三次可以嗎
因爲TCP連接是全雙工的,數據在兩個方向上能夠同時傳遞,因此每個方向的數據傳輸都必須單獨關閉。當一端收到FIN並響應給對端的時候,這一方向的數據流便停止了,也就是半關閉狀態。但是由於TCP有延遲確認
的功能或者服務端收到FIN
包後沒有數據發送了,就能同時發送FIN+ACK
包,所以其實三次揮手是可以的。
但是延遲確認
可能會帶來一個問題,就是如果被動關閉方沒有及時ACK,主動關閉方的FIN
包,主動關閉方可能認爲FIN
包丟失了,導致不必要的重傳發生。所以四次揮手是相對最合理的關閉連接的方式。
關注作者微信公衆號: