【Linux】四次揮手

客戶端和服務器通過close()四次揮手斷開連接。

關閉連接的過程爲四次揮手,由於TCP是全雙工的通訊。所以每個方向都必須單獨進行關閉。當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向上的連接。收到一個FIN只意味着這一方向上沒有數據流動一個TCP連接在收到一個FIN後仍能繼續發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

第一次揮手:斷開連接時,客戶端向服務器發送FIN包(seq = x),用來關閉客戶端到服務器的數據傳送。並進入FIN_WAIT_1狀態,等待服務器確認。

第二次揮手:服務器收到FIN包,必須確認客戶端的FIN(即發送ACK包,ack = x+1),確認客戶端到服務器的傳送中斷。並進入CLOSE_WAIT狀態,客戶端進入FIN_WAIT_2狀態。

第三次揮手:服務器向客戶端發送FIN包(seq = y),用來關閉服務器到客戶端的數據傳送。並進入LAST_ACK狀態。

第四次揮手:客戶端收到FIN包,必須確認服務器的FIN(即發送ACK包,ack = y=1),確認服務器到客戶端的傳送中斷。並進入TIME_WAIT狀態。

四次揮手示意圖

揮手在某些情況下三次能完成嗎?

可以。當本端關閉了連接,恰好也同時收到了對方的FIN報文,此時可以把自己的FIN和給對方的確認ACK合在一起發送,就變成了三次。

TIME_WAIT狀態存在的意義?

TIME_WAIT狀態是:主動斷開連接的一端收到對端的FIN報文段並且將ACK報文段發出後的一種狀態。

意義:

       保證遲來的報文段能被識別並丟棄。

       保證可靠的終止TCP連接。保證對端能收到最後一個ACK,如果ACK丟失,在TIME_WAIT狀態本端還可以接受到對端重傳的FIN報文段並重新發送ACK。所以TIME-WAIT的存在時間爲2MSL。

TIME_WAIT和CLOSE_WAIT有什麼區別?

CLOSE_WAIT是被動關閉的一端在接收到對端關閉請求(FIN報文段)並且將ACK發送出去後所處的狀態。這種狀態表示:收到了對端關閉的請求,但是本端還沒有完成工作,還未關閉。

TIME_WAIT狀態是在主動關閉的一端在本端已經關閉的前提下,收到對端的關閉請求(FIN報文段)並且將ACK發送出去後所處的狀態。這種狀態表示:雙方都已經完成了工作,只是爲了確保遲來的數據報能被識別並丟棄,可靠的終止TCP連接。

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章