互動式網路協定教材 · 離線單檔

TCP 連線狀態機

看見封包怎麼走,也看見 Client 與 Server 的狀態怎麼變。

狀態 STATE每一端在某一刻各有一個 TCP 狀態。
事件 EVENT送出或收到 SYN、ACK、FIN、RST。
轉換 TRANSITION事件發生後,依規則進入下一狀態。

選擇情境

主機 A

Client

目前狀態
CLOSED
主動開啟連線的一端
封包傳遞方向會顯示在這裡
主機 B

Server

目前狀態
LISTEN
被動開啟,等待連線
準備開始

從兩端的初始狀態開始

按「下一步」觀察封包流動與雙側狀態變化。

0 / 3

讀懂這個狀態機

左右是兩個各自獨立的有限狀態機。封包是事件;同一個封包送出與抵達時,兩端可有不同的狀態。教學動畫將一次傳送與接收合成一步,方便在投影上觀察。

正常關閉時,先送 FIN 的一端依序走過 FIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT → CLOSED;另一端經過 CLOSE-WAIT → LAST-ACK → CLOSED。TIME-WAIT 在標準狀態圖中等待 2×MSL;本動畫以一步表示計時完成,不代表實際只需幾秒。

標準狀態一覽

CLOSEDLISTENSYN-SENTSYN-RECEIVEDESTABLISHEDFIN-WAIT-1FIN-WAIT-2CLOSE-WAITCLOSINGLAST-ACKTIME-WAIT

CLOSING 用於雙方幾乎同時送出 FIN 的情況;四次揮手範例不會經過它。CLOSED 在標準狀態圖中是概念上的狀態。

原圖片與標準 TCP FSM 有什麼不同?

原圖標示/說法標準表示教學說明
EMPTYCLOSED、LISTEN尚未連線的主動端是 CLOSED;被動開啟後等待 SYN 的端點是 LISTEN,不能合成 EMPTY。
SYN-SENT、SYN_RECEIVEDSYN-SENT、SYN-RECEIVED標準名稱使用連字號;兩者分別代表已送 SYN、已收 SYN 且送出 SYN/ACK。
ESTABLISHMENTESTABLISHED已建立連線的 TCP 狀態名稱是 ESTABLISHED。
FIN_WAITFIN-WAIT-1、FIN-WAIT-2送出 FIN 後與收到 FIN 的 ACK 後,是兩個不同狀態。
BOTH_CLOSECLOSING 或 TIME-WAIT 等BOTH_CLOSE 不是標準狀態;同時關閉可進入 CLOSING,正常主動關閉會進入 TIME-WAIT。
RST 一律轉 CLOSE_WAIT有效 RST 通常中止連線此說法不正確。RST 的接收處理依目前狀態與封包有效性而定,不能視作 FIN 或固定轉到 CLOSE-WAIT。

原圖把 Client 與 Server 的路徑畫在同一張圖中,也略去了部分狀態與條件。本教材以兩端同步視角重畫常見路徑;它是教學示意,沒有模擬重傳、序號視窗和所有例外分支。