TCP四次揮手

2021-09-09 06:24:50 字數 1148 閱讀 7543

之前分析了tcp的在客戶端和服務端建立連線時的三次握手,那麼順便也學習下tcp的四次揮手吧!

我們就直接開始分析通訊過程吧!

第一次揮手:當客戶端已經不需要向服務端傳送資料時(即請求斷開連線),客戶端先傳送乙個fin(fin=1,seq=u)給服務端,來告訴服務端它已經完成了想要的通訊,並請求斷開連線,此時客戶端處於fin-wait狀態。

第二次揮手:客戶端收到了服務端的fin包,然後它給客戶端返回乙個ack(fin=1,ack=1,seq=w,ack=u+1)包,來告訴客戶端它已經收到了斷開連線的請求,此時服務端處於close-wait,客戶端收到服務端的ack包後處於fin-wait-2的狀態。

第三次揮手:由於此時服務端還是處於close-wait(等待關閉)的狀態,所以服務端傳送乙個fin+ack(fin=1,ack=1,seq=w,ack=u+1)包給客戶端,伺服器要關閉和客戶端的連線,然後服務端置於last-ack狀態。

第四次揮手:客戶端收到服務端的fin包,確認無誤後,給服務端傳送乙個ack(ack=1,seq=u+1,ack=w+1)包來告知服務端,客戶端已經收到了服務端的關閉連線的請求,然後把客戶端置於time-wait狀態,服務端收到客戶端的ack包後,關閉連線。客戶端在等待2msl之後未收到服務端的請求後,會認為服務端收到了客戶端的確認關閉的ack包,並關閉連線。

以下列舉幾個有用的知識點:

什麼是2msl?

msl即maximum segment lifetime,也就是報文最大生存時間,引用《tcp/ip詳解》中的話:「它(msl)是任何報文段被丟棄前在網路內的最長時間。」那麼,2msl也就是這個時間的2倍。其實我覺得沒必要把這個msl的確切含義搞明白,你所需要明白的是,當tcp連線完成四個報文段的交換時,主動關閉的一方將繼續等待一定時間(2-4分鐘),即使兩端的應用程式結束

為什麼需要2msl?

1、為了保證客戶端傳送的最後乙個ack報文段能夠到達服務端。這個ack報文段有可能丟失,因而使處在last-ack狀態的服務端收不到對已傳送的fin +ack報文段的確認。服務端會超時重傳這個fin+ack報文段,而客戶端就能在2msl時間內收到這個重傳的ack+fin報文段。接著客戶端重傳一次確認包。

2、就是防止之前已失效的連線請求報文段出現在本連線中,客戶端在傳送完最後乙個ack報文段後,再經過2msl,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。

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.伺服器收到連線釋...