TCP四次揮手

2021-09-25 02:38:05 字數 1956 閱讀 5192

tcp的連線釋放

tcp連線釋放的過程比較複雜。資料傳輸結束後,通訊的雙方都可釋放連線。其釋放過程需要傳送四個包,因此稱為四次揮手。客戶端和伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()命令即可觸發揮手操作。

第一次揮手:首先客戶端和伺服器都處於established狀態。客戶端a先向其tcp傳送連線釋放報文段,並停止再傳送資料,主動關閉tcp連線。a把連線釋放的報文段首部的終止控制位fin置為1,其序號為seq=u,它等於前面已傳送過的資料的最後乙個位元組的序號加1。這時,客戶端a進入fin-wait(終止等待1)狀態,等待伺服器端b的確定。此時,fin報文段即使不攜帶資料,也要消耗掉乙個序號。

第二次揮手:伺服器端b收到連線釋放報文段後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等於前面已傳送過的資料的最後乙個位元組的序號加1。然後b就進入close-wait(關閉等待)狀態。tcp伺服器程序這時應通知高層應用程序,因而從a到b這個方向的連線就釋放了,這時的tcp連線處於半關閉(half-close)狀態,即a已經沒有資料要傳送了,但b若要傳送資料,a仍要接收。也就是說,從b到a這個方向的連線並未關閉,這個狀態可能會持續一段時間。

第三次揮手:a收到來自b的確認後,就進入fin-wait2狀態,等待b發出的連線釋放報文段。若b已經沒有要向a傳送的資料,其應用程序就通知tcp釋放連線。這時b發出的連線釋放報文段必須使fin=1。現在假定b的序號為w(在關閉狀態b可能又傳送了一些資料)。b還必須重複上次已經 傳送過的確認號ack=u+1。這時b就進入last-ack(最後確認)狀態,等待a的確認。

第四次揮手:a在收到b的連線釋放報文段後,必須對此發出確認。在確認報文段中把ack置為1,確認號ack=w+1,而自己的序號是seq=u+1(前面傳送過的fin報文段要消耗乙個序號)。然後進入到time-wait(時間等待)狀態。但是,現在tcp連線還沒有釋放掉。必須經過時間等待計時器(time-wait timer)設定的2msl後,a才進入到closed狀態。時間msl(maximum segment lifetime)叫做最長報文段壽命,rfc793建議設為2分鐘。但是對於現在的網路來說,msl=2分鐘可能太長了。因此tcp允許不同的實現可根據具體的情況使用更小的msl值。因此,從a進入到time-wait狀態後,要經過4分鐘才能進入到closed狀態,才能開始建立下乙個新的連線。當a撤銷相應的傳輸控制塊tcb後,就結束了此次的tcp連線。

為什麼客戶端a需要在time-wait狀態等待2msl的時間呢?

一是為了保證客戶端a傳送的最後乙個ack報文段能夠到達b。這個ack報文段有可能丟失,因而使處在last-ack狀態的b收不到對方已傳送的fin+ack報文段的確認。b會超時重傳這個fin+ack報文段,而a就能在2msl時間內收到這個重傳的fin+ack報文段。接著a再重傳一次確認,重新啟動2msl計時器。最後,a和b都正常進入到closed狀態。如果a在time-wait狀態下不等待一段時間,而是在傳送完ack報文段後立即釋放連線,那麼就無法收到b重傳的fin+ack報文段,因而也不會再傳送一次確認報文段。這樣,b就無法按照正常步驟進入到closed狀態。

二是防止「已失效的連線請求報文段」出現在本連線中。a在傳送完最後乙個ack報文段後,再經過時間2msl,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣就可以使下乙個新的連線中不會出現這種舊的連線請求報文段。b只要收到了a發出的確認,就進入closed狀態。同樣,b在撤銷相應的傳輸控制塊(tcb)後,就結束了這次的tcp連線。b結束tcp連線的時間要比a早一些。

通俗舉例來講就是:

a→b:我不愛你了

b→a:知道了,但是請讓我最後再愛你一次

b→a:我也不愛你了

a→b:知道了

若是三次揮手:

a→b:我不愛你了

b→a:知道了,好巧,我也不愛你了

a→b:知道了

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