tcp三次握手和time wait

2021-08-26 07:34:13 字數 1257 閱讀 1679

第一次握手:建立連線時,客戶端傳送syn包和乙個隨機序列號seq=x到伺服器,並進入syn_send狀態,等待伺服器進行確認。(syn,同 步序列編號)。第二次握手,伺服器收到syn包,必須確認客戶的syn,然後伺服器傳送乙個ack=1, syn=1, seq=y的隨機數和ack=x+1的確認數的包傳送回去。第三次握手是客戶端收到伺服器端的syn+ack包,然後向伺服器端傳送確認包 ack=y+1, seq=x+1, ack=1,客戶端和伺服器端進入established狀態,完成三次握手。具體圖示如下:

這裡多說一點,既然提到了連線時的三次握手,就順便把斷開連線時的四次揮手也複習一下。首先客戶端主動傳送fin=1,seq=u,它等於前面已傳 送過去的最後乙個位元組的序號加1.這是a進入fin-wait-1狀態,等待b的確認。b收到連線後立即發出確認,確認號是ack=u+1,而這個報文段 自己的序號是v,等於b前面已傳送過的資料的最後乙個位元組的序號加1.然後b即進入close-wait狀態。因而a到b的這個鏈結現在已經斷開了,這時 的tcp連線處於半關閉狀態,即a已經沒有資料需要傳送了。但b若傳送資料,a還是要接受的。a收到來自b的確認之後就進入了fin-wait-2狀態等 待b發出連線釋放報文段。若b已經沒有要向a傳送資料,其應用程序就通知tcp釋放連線。這是b發出的連線釋放報文段必須使用fin=1.現在假定b的序 號為w,b還必須重複上次已傳送過的確認號ack=u+1.這時b就進入了last-ack狀態,等待a確認。a在收到b的連線釋放之後必須對此發出確 認。在確認號中把ack置1,確認號ack=w+1,而自己的序號是seq=u+1。接著a進入time-wait狀態。為了保證b可以收到確認釋放報文 段。如上圖:

是不是所有執行主動關閉的socket都會進入time_wait狀態呢?

有沒有什麼情況使主動關閉的socket直接進入closed狀態呢?

主動關閉的一方在傳送最後乙個 ack 後

就會進入 time_wait 狀態 停留2msl(max segment lifetime)時間

這個是tcp/ip必不可少的,也就是「解決」不了的。

也就是tcp/ip設計者本來是這麼設計的

主要有兩個原因

1。防止上一次連線中的包,迷路後重新出現,影響新連線

(經過2msl,上一次連線中所有的重複包都會消失)

2。可靠的關閉tcp連線

在主動關閉方傳送的最後乙個 ack(fin) ,有可能丟失,這時被動方會重新發

fin, 如果這時主動方處於 closed 狀態 ,就會響應 rst 而不是 ack。所以

主動方要處於 time_wait 狀態,而不能是 closed 。

tcp三次握手 TCP 三次握手總結

tcp特點概述 tcp segment structure 段結構 step2 server host receives syn,replie with syn ack segment 答覆syn ack報文段 step3 client receives synack,replies with ac...

TCP 三次握手

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

TCP三次握手

1.伺服器準備好接受外來連線。passive open 被動開啟 需呼叫 socket bind listen 函式來完成。2.客戶端通過呼叫 connect 主動開啟 active open 這使得客戶 tcp傳送乙個 syn 表示同步 分節,這個分節告訴伺服器,客戶端將在待建立的連線中傳送的資料...