TCPの状態遷移

読み:てぃーしーぴーのじょうたいせんい / 英語表記:TCP connection states

TCPのコネクションが、接続の準備から終了までの間にとる状態の移り変わり。LISTEN、ESTABLISHED、TIME-WAITなど、接続がない状態を含めて11の状態が定められている。

イマシルちゃんの解説

TCPでは、通信相手との論理的な接続をコネクションというよ。
それぞれの機器は、接続を待っているのか、データをやり取りできるのか、終了処理の途中なのかを状態として管理するんだ。
この状態の移り変わりが、TCPの状態遷移だよ。
たとえば接続要求を待つ状態はLISTENで、接続が確立するとESTABLISHEDになり、データを送受信できるの。
状態は相手から届く要求や確認応答だけでなく、アプリケーションの操作や待ち時間の経過によっても変わるよ。
今の状態に応じて次の処理を決めることで、接続の開始から終了までを手順に沿って進められるんだ。

より深い解説

定義

TCPは、コネクションごとに状態を持ち、送受信したセグメント(SYN、ACK、FINなど)に応じて状態を変える。状態の一覧はTCPの仕様(RFC 9293)で定められている。

接続するときの状態

状態誰が意味
CLOSED両方コネクションがない
LISTENサーバ接続要求(SYN)が来るのを待っている。サーバのプログラムがポートを開いて待ち受けている状態
SYN-SENTクライアントSYNを送り、相手からのSYN+ACKを待っている
SYN-RECEIVEDサーバSYNを受け取ってSYN+ACKを返し、最後のACKを待っている
ESTABLISHED両方コネクションが確立し、データを送受信できる

サーバがクライアントからのSYNを受け付けるのはLISTENの状態のときである。

切断するときの状態

先にFINを送った側を「能動的に閉じる側」、FINを受け取った側を「受動的に閉じる側」という。

状態誰が意味
FIN-WAIT-1能動的に閉じる側FINを送り、そのACKを待っている
FIN-WAIT-2能動的に閉じる側FINへのACKを受け取り、相手からのFINを待っている
CLOSE-WAIT受動的に閉じる側FINを受け取った。自分のアプリケーションが閉じるのを待っている
LAST-ACK受動的に閉じる側自分もFINを送り、そのACKを待っている
TIME-WAIT能動的に閉じる側最後のACKを送り、一定時間待っている
CLOSING両方双方がほぼ同時にFINを送ったときの状態

TIME-WAITで待つ理由

TIME-WAITでは、セグメントがネットワーク上に残りうる最大時間(MSL)の2倍の時間だけ待つ。理由は2つある。

  1. 最後に送ったACKが失われ、相手がFINを再送してきたときに、ACKを送り直せるようにするため
  2. 古いコネクションの遅れて届いたセグメントが、同じポート番号を使う新しいコネクションに紛れ込むのを防ぐため

トラブルシューティングでの使い方

netstat や ss コマンドで、コネクションごとの状態を確認できる。

実際の試験ではここに出る!全5問

ネットワークスペシャリスト

午前Ⅱ

この用語が出てくる記事

↑