TCP的四次揮手

2021-10-08 21:36:29 字數 1259 閱讀 7052

「揮手」是為了終止連線,tcp四次揮手的流程圖如下:

客戶端程式傳送連線釋放報文,並且停止傳送資料。fni=1,seq=u(該值為前面傳輸的資料的最後乙個位元組序號+1)。客戶端進入fin-wait-1終止等待狀態。

伺服器收到連線釋放報文時,向客戶端傳送確認報文。ack=1,seq=v,ack=u+1。服務端進入close-wait關閉等待狀態。此時處於半關閉的狀態,即客戶端已經沒有資料要傳送了,但是服務端還是可以傳送資料給客戶端。這個狀態持續的時間即整個close-wait狀態持續的時間。客戶端收到伺服器確認報文後進入fin-wait-2終止等待狀態,等待伺服器傳送釋放連線報文,這段時間內可以接收伺服器傳送的資料。

伺服器傳送完資料,會向客戶端傳送連線釋放報文。fni=1,ack=1,seq=w,ack=u+1.此時伺服器就進入last-ack最後確認狀態,等待客戶端的最終確認。

客戶端在收到伺服器的連線釋放報文之後,立即發出確認報文。ack=1,seq=u+1,ack=w+1.此時客戶端進入time-wait時間等待狀態,此時tcp連線沒有釋放,等2msl後連線釋放。伺服器收到客戶端傳送的確認報文後,立即關閉連線。

總結:

第一次揮手:客戶端傳送乙個fin,用來關閉客戶端到伺服器的資料傳送,客戶端進入fin_wait_1狀態。

第二次揮手:服務端收到fin後,傳送乙個ack給客戶端,確認序號為收到序號+1,服務端進入close_wait狀態。

第三次揮手:伺服器傳送乙個fin,用來關閉伺服器到客戶端的資料傳送,伺服器進入last_ack狀態。

第四次揮手:客戶端收到fin後,客戶端進入time_wait狀態,接著傳送乙個ack給服務端,確認序號為收到序號+1,服務端進入closed狀態,完成四次揮手。

為什麼會有time_wait狀態???

確保有足夠的時間讓對方收到ack包。如果被動關閉的那端沒有收到ack包,就會觸發被動包重發fin包。

避免新舊連線混淆。有一些路由器會快取ip資料報,如果連線混淆了,那麼這些延遲收到的包可能會跟新連線混在一起。

因為是全雙工通訊,傳送方和接收方都需要fin報文和ack報文。

伺服器出現大量close_wait只有一種情況就是客戶端傳送乙個fin報文之後對方關閉socket連線,我方忙於讀或寫,沒有及時關閉連線。

解決:1.檢查**,特別是釋放資源的**

2.檢查配置,特別是處理請求的執行緒配置

tcp 四次揮手 TCP四次揮手

tcp斷開連線的過程 客戶端傳送fin報文,表明客戶端將不在傳送資料。具體過程 把fin標誌位改為1,序號seq u,之前傳送的資料加1,這裡規定即使不攜帶資料序號也要 1。該過程中客戶端通過close系統呼叫從established狀態進入fin wait 1狀態。第二次揮手 服務端收到客戶端發來...

TCP四次揮手

純給自己看的 發起關閉的一方是客戶端,被動關閉的一方是伺服器。1 客戶端a傳送乙個fin 1,用來關閉客戶a到伺服器b的資料傳送。圖上畫的對,還有乙個seq n 2 伺服器b收到這個fin,它發回乙個ack 1,確認序號ack為收到的序號加1。3 伺服器b關閉與客戶端a的連線,傳送乙個fin 1給客...

TCP四次揮手

四次揮手 1.客戶端程序發出連線釋放報文,並且停止傳送資料。釋放資料報文首部,fin 1,其序列號為seq u 等於前面已經傳送過來的資料的最後乙個位元組的序號加1 此時,客戶端進入fin wait 1 終止等待1 狀態。tcp規定,fin報文段即使不攜帶資料,也要消耗乙個序號。2.伺服器收到連線釋...