メインコンテンツまでスキップ

附属書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, 最大セグメント生存時間) を待機します
  • 目的:
    1. 最終ACKがリモートに到達することを保証
    2. 古いセグメントが新しい接続に干渉することを防止

主要な状態遷移

接続確立 (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が必要なのか?

  1. 信頼性のあるクローズを保証:

    • 最終ACKが失われた場合、リモートはFINを再送信します
    • TIME-WAIT状態は再送信されたFINに応答できることを保証します
  2. 古い接続の干渉を防止:

    • 遅延した古いセグメントがネットワークに存在する可能性があります
    • 2MSLを待機することで、古いセグメントがネットワークから消えることを保証します
    • 古いセグメントが新しい接続によって有効なデータと誤認されることを防ぎます

2MSL時間:

  • MSL (Maximum Segment Lifetime, 最大セグメント生存時間): セグメントがネットワーク内で生存できる最大時間
  • 通常MSL = 2分
  • したがってTIME-WAIT = 2MSL = 4分
  • 一部の実装ではより短い時間を使用します (例: 30秒または60秒)

注: 完全な状態遷移ロジックと境界ケースの処理については、RFC 9293の完全な仕様を参照してください。