TCP狀態轉移

2021-08-11 21:29:30 字數 1507 閱讀 5300

被動開啟(active open):客戶端通過connect發起主動開啟。

客戶端通過connect連線伺服器,客戶端tcp將傳送乙個syn包,告訴伺服器客戶端將在待建立連線傳送資料的初始序列號。(客戶端:closed->syn_sent)

伺服器端必須ack客戶端syn,同時傳送乙個syn,告訴客戶端,伺服器將在待建立連線傳送資料的初始序列號。(伺服器:syn_rcvd)

客戶端必須ack伺服器syn。(客戶端:syn_sent->established)

伺服器接收到客戶端ack。(伺服器:syn_recv->established)

客戶端通過connect連線伺服器,客戶端tcp將傳送乙個syn包,告訴伺服器,客戶端將在待建立連線傳送資料的初始序列號。然後客戶端異常退出。(客戶端:closed->syn_sent,然後突然crash,則退出syn_sent)

伺服器端ack客戶端syn,同時傳送乙個syn,告訴客戶端,伺服器將在待建立連線傳送資料的初始序列號。(伺服器:syn_rcvd)

客戶端找不到伺服器ack+syn對應的syn_sent狀態的socket,則響應rst。(伺服器:syn_rcvd->listen)

客戶端通過connect連線伺服器,客戶端tcp將傳送乙個syn包,告訴伺服器,客戶將在待建立連線傳送資料的初始序列號。(客戶端:closed->syn_sent)

伺服器端收到客戶端syn,響應rst(伺服器:closed)

客戶收到rst。(客戶端:syn_sent->closed)

被動關閉(passive close):接收到fin的對端執行被動關閉。

接收到fin的對端執行被動關閉。首先ack這個收到的fin包。該fin包的接收也作為乙個檔案結束符(eof)傳遞給應用程式(放在已排隊等候該應用程序接收的任何其他資料之後),因為fin包意味著接收端應用程序在相應的連線上再無額外資料可接收。(被動端:established->close_wait,主動端:fin_wait_1->fin_wait_2)

一段時間後,接收到這個eof的應用程序將呼叫close關閉socket。這導致它的tcp也傳送乙個fin包。(被動端:close_wait->last_wait)

接收這個最終fin的執行主動關閉的那一端ack這個fin。(被動端:last_wait->closed,主動端:fin_wait_2->time_wait(2msl之後,time_wait->closed))

接受到fin的對端執行被動關閉。收到fin包之後,被動端呼叫close關閉socket,則fin+ack同時發給主動端。(被動端:established->close_wait->last_ack,主動端:fin_wait_1->time_wait)

接收這個最終fin的執行主動關閉的那一端ack這個fin。(被動端:last_wait->closed,主動端:fin_wait_1->time_wait(2msl之後,time_wait->closed))

中文版《tcp/ip詳解》卷一第18章

我也認為,書中的tcp狀態轉移圖中,syn_rcvd轉移到listen的條件應該是伺服器狀態,而非客戶端狀態。

TCP狀態轉移

tcp狀態轉移,一共存在11個狀態,請看下圖 1.closed 起始點,在超時或者連線關閉時候進入此狀態。2.listen svr端在等待連線過來時候的狀態,svr端為此要呼叫socket,bind,listen函式,就能進入此狀態。此稱為應用程式被動開啟 等待客戶端來連線 3.syn sent 客...

TCP狀態轉移

1 伺服器程式執行,listen監聽之後伺服器進入listen狀態,等待客戶端的連線 2 當伺服器監聽到服務請求 接收到同步報文段 會傳送syn同步報文段和確認報文段,並進入syn rcvd狀態。3 當伺服器接收到客戶端返回的ack確認報文段,伺服器進入established狀態 情況一 4 當伺服...

TCP狀態轉移

tcp狀態轉移,一共存在11個狀態,請看下圖 1.closed 起始點,在超時或者連線關閉時候進入此狀態。2.listen svr端在等待連線過來時候的狀態,svr端為此要呼叫socket,bind,listen函式,就能進入此狀態。此稱為應用程式被動開啟 等待客戶端來連線 3.syn sent 客...