附属書A. TCP接続状態図 (TCP Connection State Diagram)
本附属書では、TCP接続の状態遷移を詳細に図示します。
TCP状態遷移図
+---------+
| CLOSED |
+---------+
|
(passive OPEN)
|
v
+---------+
| LISTEN |
+---------+
(rcv SYN) | ^ (CLOSE)
| |
v |
+---------+
|SYN RCVD|
+---------+
(rcv ACK)|
|
(active OPEN) v
+---------+ +---------+
|SYN SENT |<---->| ESTAB |
+---------+ +---------+
| |
| (CLOSE/FIN)
| |
| v
| +---------+
| |FIN WAIT1|
| +---------+
| (rcv ACK) |
| |
| v
| +---------+
| |FIN WAIT2|
| +---------+
| (rcv FIN) |
| |
| v
| +---------+
| |TIME WAIT|
| +---------+
| (timeout) |
| |
| v
| +---------+
+---------->| CLOSED |
+---------+
同時クローズ: パッシブクローズ:
FIN WAIT1 --rcv FIN--> CLOSING ESTABLISHED --rcv FIN--> CLOSE WAIT
CLOSING --rcv ACK--> TIME WAIT CLOSE WAIT --CLOSE--> LAST ACK
LAST ACK --rcv ACK--> CLOSED
状態の説明
CLOSED (クローズド)
- TCB (Transmission Control Block, 伝送制御ブロック) が存在しないことを表す架空の状態、したがって接続なし
- これはすべての接続の開始点と終了点です
LISTEN (リスン)
- サーバーが任意のリモートTCPからの接続要求を待機している状態
- パッシブオープン状態
SYN-SENT (SYN送信済み)
- クライアントがSYNを送信した後、一致する接続要求を待機している状態
- アクティブオープン状態
SYN-RECEIVED (SYN受信済み)
- サーバーがSYNを受信してSYN-ACKを送信した後、ACKを待機している状態
- 3ウェイハンドシェイクの中間状態
ESTABLISHED (確立済み)
- 接続が確立され、データ転送が可能な状態
- これはデータ転送フェーズ中の通常の状態です
FIN-WAIT-1 (FIN待機1)
- アクティブクローザーがリモートからのACKまたはFINを待機している状態
- 接続終了の最初の状態
FIN-WAIT-2 (FIN待機2)
- 送信したFINに対するACKを受信した後、リモートからのFINを待機している状態
- ローカル側はこれ以上データを送信しないが、まだ受信可能であることを示します
CLOSE-WAIT (クローズ待機)
- パッシブクローザーがFINを受信した後、ローカルアプリケーションのクローズを待機している状態
- この時点でまだデータを送信できます
CLOSING (クロージング)
- 同時クローズ中の状態
- リモートからのFINのACKを待機している状態
LAST-ACK (最終ACK)
- パッシブクローザーがFINを送信した後、ACKを待機している状態
- ACKを受信した後、直接CLOSEDに移行します
TIME-WAIT (時間待機)
- アクティブクローザーがリモートからFINを受信してACKを送信した後、この状態に入ります
- 2MSL (Maximum Segment Lifetime, 最大セグメント生存時間) を待機します
- 目的:
- 最終ACKがリモートに到達することを保証
- 古いセグメントが新しい接続に干渉することを防止
主要な状態遷移
接続確立 (3ウェイハンドシェイク)
CLOSED --> (active open) --> SYN-SENT
SYN-SENT --> (receive SYN-ACK) --> ESTABLISHED
CLOSED --> (passive open) --> LISTEN
LISTEN --> (receive SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (receive ACK) --> ESTABLISHED
接続終了 (4ウェイハンドシェイク)
アクティブクローズ:
ESTABLISHED --> (send FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (receive ACK) --> FIN-WAIT-2
FIN-WAIT-2 --> (receive FIN) --> TIME-WAIT
TIME-WAIT --> (2MSL timeout) --> CLOSED
パッシブクローズ:
ESTABLISHED --> (receive FIN) --> CLOSE-WAIT
CLOSE-WAIT --> (application close) --> LAST-ACK
LAST-ACK --> (receive ACK) --> CLOSED
同時オープン
CLOSED --> (send SYN) --> SYN-SENT
SYN-SENT --> (receive SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (receive ACK) --> ESTABLISHED
同時クローズ
ESTABLISHED --> (send FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (receive FIN) --> CLOSING
CLOSING --> (receive ACK) --> TIME-WAIT
TIME-WAIT --> (2MSL timeout) --> CLOSED
TIME-WAIT状態の重要性
なぜTIME-WAITが必要なのか?
-
信頼性のあるクローズを保証:
- 最終ACKが失われた場合、リモートはFINを再送信します
- TIME-WAIT状態は再送信されたFINに応答できることを保証します
-
古い接続の干渉を防止:
- 遅延した古いセグメントがネットワークに存在する可能性があります
- 2MSLを待機することで、古いセグメントがネットワークから消えることを保証します
- 古いセグメントが新しい接続によって有効なデータと誤認されることを防ぎます
2MSL時間:
- MSL (Maximum Segment Lifetime, 最大セグメント生存時間): セグメントがネットワーク内で生存できる最大時間
- 通常MSL = 2分
- したがってTIME-WAIT = 2MSL = 4分
- 一部の実装ではより短い時間を使用します (例: 30秒または60秒)
注: 完全な状態遷移ロジックと境界ケースの処理については、RFC 9293の完全な仕様を参照してください。