TCP協議的三次握手和四次揮手以及斷開時各階段的狀態分析

我們知道,https協議是在http協議之上封裝了SSL協議,爲了完成客戶端和服務端的雙向認證和可靠傳輸,需要在通信之前雙方進行多次的握手協商。TCP協議與https協議類似。

1.TCP的連接(俗稱三次握手)

 

在TCP協議數據報文的頭部(TCP Header)結構中有32位序號(Sequence number) 和32位確認序號(Acknowledge number):SYN,ACK。

  第一次握手 Client發送位碼爲syn=1,隨機產生seq number的數據包到server,server由SYN=1知道,Client要求連接;

     第二次握手 server收到請求後要確認連接信息,向Client發送ack number=(Client的seq+1),syn=1,ack=1,隨機產生seq number的包

  第三次握手 Client收到後檢查ack number是否正確,即第一次發送的seq number+1,以及ack是否爲1,若正確,Client會再發送ack number=(server的seq+1),ack=1,server收到後確認seq值與ack=1則連接建立成功。

 

2.TCP的關閉(俗稱四次揮手)

 

TCP連接是全雙工的,可以同時發送和接受數據,關閉的時候要關閉這兩個方向的通道

下圖是 Client主動關閉連接

 

第一次揮手:Client給Server發送FIN,請求關閉連接 

第二次揮手:Server收到FIN之後給Client返回確認ACK,同時關閉Receive通道,Client收到對自己的FIN確認後,關閉Send通道

第三次揮手: Server關閉連接,給Client發送FIN

第四次揮手:Client收到後給Server回覆ACK確認,同時Client關閉Receive通道,進入TIME_WAIT狀態。Server接收到Client對自己的FIN的確認ACK,關閉Send通道

 

狀態的說明

CLOSE_WAIT: 表示在等待關閉。當主動關閉連接的一方關閉SOCKET後發送FIN報文給被動關閉一方,被動關閉一方迴應一個ACK報文給對方,此時被動關閉一方則進入到CLOSE_WAIT狀態

 

FIN_WAIT_1:是當Socket在已經連接的狀態時主動關閉連接,向對方發送了FIN報文,此時該Socket進入到FIN_WAIT_1狀態。而當對方迴應ACK報文後,則進入到FIN_WAIT_2狀態

FIN_WAIT_2:表示半連接,揮了兩次手的狀態等待對方的Fin報文

 

TIME_WAIT:TCP協議中主動關閉連接的一方要處於TIME_WAIT狀態,等待兩個MSL(maximum segment lifetime)的時間後才能回到CLOSED狀態,在TIME_WAIT期間仍然不能再次監聽同樣的server端口。

 

LAST_ACK: 被動關閉一方在發送FIN報 文後,最後等待對方的ACK報文。當收到ACK報文後進入CLOSED狀態。

 

CLOSED:已經完全關閉.

 

 

3.TIME_WAIT或CLOSE_WAIT過多分析

在對服務端的程序進行壓力測試的時候,用netstat -anput命令會經過出現很多的close_wait或time_wait狀態的連接。

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