TCP的三次握手以及四次揮手

2021-08-24 18:09:22 字數 1287 閱讀 7337

tcp協議是傳輸層的乙個重要協議,在正常情況下,tcp要經過三次握手建立連線,四次揮手斷開連線

伺服器端狀態轉換:

closed->listen :伺服器端呼叫listen後進入listen狀態,等待客戶端連線

syn rcvd->established:服務端一旦收到客戶端的確認報文,就進入established狀態,就可以進行讀寫資料了

established->close wait:當客戶端主動關閉連線,伺服器會收到結束報文段,伺服器返回確認報文段並進入closed wait狀態

close wait->last ack:進入close wait後說明伺服器準備關閉連線(需要處理完之前的資料),當伺服器真正呼叫close關閉連線時,會向客戶端傳送fin,此時伺服器進入last ack狀態,等待最後乙個ack到來(這個ack是客戶端確認收到了fin)

last ack->closed:伺服器收到了對方的ack,徹底關閉連線

客戶端狀態轉換:

closed->syn_sent:客戶端呼叫connect,傳送同步報文段

syn_sent->established:connect呼叫成功,則進入established狀態,並開始讀寫資料

established->fin_wait_1:客戶端主動呼叫close時,向伺服器傳送結束報文段,同時進入fin_wait_1

fin_wait_1->fin_wait_2:客戶端收到伺服器的結束報文段的確認,則進入fin_wait_2,開始等待伺服器的結束報文段

fin_wait_2->time_wait:客戶端收到伺服器發來的結束報文段,進入time_wait,並發出last_ack

time_wait->closed:客戶端等待乙個2msl(報文最大生存時間)的時間,才會進入closed狀態

這裡要重點理解下客戶端的time_wait狀態:

tcp協議規定,主動關閉連線的一方要處於time_wait狀態,等待兩個msl的時間後才能回到closed狀態

msl是tcp報文的最大生存時間,因此time_wait持續存在2msl的話就能保證在兩個傳輸方向上的尚未被接收的或遲到的報文段都已經消失(否則伺服器立刻重啟,**到上乙個程序遲到的資料,但這種資料可能是錯誤的資料)

同時也是在理論上保證了乙個報文的可靠到達(假設最後乙個ack丟失,那麼伺服器會再重發乙個fin,這時雖然客戶端的程序不在了,但是tcp連線還在,仍然可以重發last_ack);

這也是為什麼time_wait的時間是2msl。

tcp三次握手 以及四次揮手

首先client端傳送連線請求報文,server段接受連線後回覆ack報文,並為這次連線分配資源。client端接收到ack報文後也向server段發生ack報文,並分配資源,這樣tcp連線就建立了。那如何斷開連線呢?簡單的過程如下 注意 中斷連線端可以是client端,也可以是server端。假設...

TCP三次握手 四次揮手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手 四次揮手

服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...