FIN → ACK → FIN → ACKの4パケット交換でTCP接続を安全に終了するプロセス
4ウェイクローズは、TCP接続を安全に終了するための4パケット交換プロセスです。FIN(終了通知)とACK(確認応答)を双方向でやり取りし、データの取りこぼしなく接続を閉じます。電話を切る場面に例えてみましょう。もし一方的にガチャ切りしたら、相手は「まだ話の途中だったのに」と困りますよね? だからお互いに確認し合ってから電話を切る必要があります。
なぜ4パケットも必要なのでしょうか? TCPは全二重通信(Full-Duplex)、つまりクライアント→サーバー方向とサーバー→クライアント方向の2つの通信路が同時に存在します。各方向を独立して閉じる必要があるため、送信側の終了通知(FIN)と受信側の確認応答(ACK)が2セット、合計4パケットが必要になります。もし2パケットで済ませてしまうと、片方がまだ送りたいデータを持っている場合にデータが失われてしまいます。Webブラウザでタブを閉じたとき、裏側ではこの4パケット交換が行われています。Nginxのようなwebサーバーのアクセスログでは、1秒間に何千回もの4ウェイクローズが実行されています。普段は意識しませんが、インターネット通信の信頼性を支える重要な仕組みです。上のツールで「通常切断(4ウェイ)」シナリオを再生すると、FIN→ACK→FIN→ACKの流れが確認できます。特にクライアントとサーバーの状態(FIN_WAIT_1、CLOSE_WAIT等)がステップごとに変わる点に注目してください。
TCP接続の切断に必要な4つのステップを追いかけます。
TIME_WAITの理由
通常切断 vs RST強制切断