- 輕量級網站評論系統Commento安裝教程 - 2024年8月25日
- CMS超級播放器artplayer、dplayer跳過片頭片尾源碼 - 2024年8月19日
- Google Adsense 申請記錄 - 2024年8月14日
TCP四次揮手
在講解tcp四次揮手之前我們也先來認識一下tcp首部中的某些字段:
ACK:隻有該字段置1時ack(确認号)才有效
FIN:當該字段置1時用于請求釋放連接
seq:序列号,表示該報文段的序号
ack:确認号,表示希望收到的下一個報文段,并且該報文段以前的報文已經收到
四次揮手
先來講解一下大體的一個過程:(以客戶端先主動釋放連接爲例)
一、 客戶端釋放連接,客戶端進入FIN-WAIT1狀态
二、 服務端收到tcp報文段,并發出确認 服務端進入CLOSE-WAIT狀态
客戶端收到确認後進入FIN-WAIT2狀态。
這兩個步驟完成後該tcp進入半關閉狀态,即客戶端到服務端的連接已經關閉,但有可能服務端需要向客戶端發送數據,所以有可能需要等待服務端繼續發送數據
三、 服務端釋放連接 服務端進入LAST-ACK狀态
四、 客戶端收到該報文段,發出确認,客戶端進入TIME-WAIT狀态,在經過2MSL(最長報文段壽命)時間後進入CLOSED狀态
服務端收到确認報文後也進入COISED狀态。
爲什麽最後客戶端需要等待2MSL的時間,原因有兩個:
一、 保證客戶端最後發送的确認報文段可以被服務端收到,使服務端順利進入CLOSED狀态。因爲最後客戶端發出的确認請求報文可能不能到達服務端,而2MLS的時間可以保證服務端重發釋放連接的報文可以到達客戶端,這樣才能保證客戶端确認報文一定可以到達服務端。
二、 防止已失效的連接請求報文。
2MLS時間可以讓本報文段所産生的所有報文都從網絡中消失。
具體過程:
一、 客戶端将tcp頭部 FIN置1,seq=u(u等于前面發送報文段序号+1),向服務端發送該報文,客戶端進入FIN-WAIT1狀态
二、 接收到客戶端的報文後,将tcp頭部ACK置1, ack=u+1,seq=v(v等于前面發送報文段序号+1),服務端進入CLOSE-WAIT狀态
客戶端收到确認報文後進入FIN-WAIT2狀态,整個tcp連接進入半關閉狀态
中間可能服務端依然向客戶端發送數據
三、 服務端數據發送完成後,将tc頭部FIN置1,seq=w(w等于v加上中間向服務端發送的數據),ack=u+1(這裏需要注意),發送該報文段,服務端進入LAST-ACK狀态
四、 客戶端收到服務端報文後,将tcp頭部ACK置1,ack=w+1,seq=u+1,發送該報文後客戶端進入TIME-WAIT狀态,再等待2MSL時間後進入到CLOSED狀态。
服務端收到确認後也進入到CLOSED狀态。
評論0