【入門編】 TCPコネクション切断プロセス:FIN/ACKとRSTによる終了の違い – ネットワーク基礎とWebセキュリティ実践ガイド

ネットワークの「お別れ」の作法:正常な終了と、怒りの強制終了

ネットワークエンジニアの現場では、サーバーに接続する時よりも「切断する時」の挙動に頭を抱えることがよくあります。

「パケットが届かない」「接続がすぐ切れる」といったトラブルの裏側には、実はTCP/IPというプロトコルが定めた「お別れの作法」が隠されているんです。今日は、通信の終わり方である FIN と RST の違いについて、郵便配達のストーリーを交えて紐解いていきましょう。一歩ずつ、一緒に見ていきましょうね。

—

1. 正常な切断(FIN/ACK)は「丁寧な手紙のやり取り」

まずは、正常な通信の終了プロセスである「4ウェイ・ハンドシェイク」です。これは、お互いに納得した上で「もう用はないね、じゃあね!」と挨拶を交わす、礼儀正しいお別れです。

郵便配達に例えるとこうです。

1. 「もう送るものはないよ(FIN)」:自分(クライアント)から「これでおしまいにしましょう」と手紙を送ります。
2. 「了解、受け取ったよ(ACK)」:相手(サーバー)が「終了の通知を受け取りました」と返事をします。
3. 「じゃあ、私も終わるね(FIN)」:相手も「了解。こっちも閉じるよ」と最後の手紙を送ります。
4. 「さようなら(ACK)」:最後にこちらが返事をして、完全にコネクションが切れます。

このプロセスを踏むことで、お互いのデータがすべて送り終わったことを確認できるのです。非常に安心感がありますよね。

—

2. 異常な切断(RST)は「受話器を叩きつける音」

一方で、RST(リセット)パケットは全く違います。「何らかの異常が発生したから、即座に通信をぶち切る!」という、いわば受話器を叩きつけるような強制終了の合図です。

例えば、こんな状況で発生します。

  • サーバーがクラッシュした。
  • ファイアウォールが「怪しい通信だ!」と判断して遮断した。
  • まだ接続準備ができていないのに、いきなりデータを送りつけた。

RST が飛んでくると、相手は「えっ、何があったの?」と考える間もなく、コネクションが強制的に消滅します。トラブルシューティングでパケットキャプチャ(tcpdump など)を眺めていると、この RST が頻発しているときは「どこかで何かが壊れている」という真っ赤な警告信号なんですよ。

—

3. なぜ存在する? 謎の「TIME_WAIT」状態

FIN による正常な終了の後、クライアント側には TIME_WAIT という状態がしばらく残ります。初学者が一番戸惑うのがこの状態ですよね。「終わったはずなのに、なんでまだ接続が残っているの?」と。

これには深〜い理由があります。「最後の手紙が相手に届いたか確認するため」です。

もし、最後のお別れの挨拶がネットワークの遅延で迷子になっていたら、相手はいつまでも待ってしまいます。そのため、数分間(OSによって異なりますが、通常は数十秒〜数分)だけ「もし相手から再送が来たら反応できるように」待機しているのです。

この TIME_WAIT が大量に溜まると、新しい接続ができなくなる「ポート枯渇」という問題が起きます。

Linuxで確認してみよう

サーバーでどれくらい TIME_WAIT があるか、以下のコマンドで見てみましょう。

# 現在のネットワーク接続状況を確認するコマンド
# TIME_WAITの状態にあるコネクションをカウントします
netstat -an | grep TIME_WAIT | wc -l

もしこの数値が異常に多い場合、ロードバランサーの設定や、アプリケーション側の「接続の使い回し(Keep-Alive)」を検討する必要があります。

—

4. エンジニアとして知っておくべき実務のヒント

現場で「接続が頻繁に切れる」という相談を受けたとき、まずは tcpdump でパケットの様子を確認します。

# 特定のサーバーとの通信をキャプチャする(-i はインターフェース名)
sudo tcpdump -i eth0 host 192.168.1.10

ここで、通信の最後に FIN ではなく RST が見えたら、アプリケーションのバグか、中継しているルーターやファイアウォールによる「タイムアウト切断」を疑います。

特に、クラウド環境やWebアプリケーションの構築では、以下のような設定に注意してみてください。

  • Keep-Aliveの設定:Apache や Nginx の設定で、接続を短時間で切りすぎないようにする。
  • ファイアウォールのセッションタイムアウト:ロードバランサーが通信を「アイドル状態」とみなして、勝手に RST を送っていないか確認する。

—

まとめ:ネットワークは人間関係と同じ

ネットワークの切断プロセスを学ぶことは、人間関係のルールを学ぶことに似ています。

  • FIN/ACK:お互いに「お疲れ様でした」と言い合う、信頼の証。
  • RST:何らかのトラブルで「もう話したくない!」と通信を絶つ、緊急停止ボタン。

パケットの中身を覗いてみると、機械的なやり取りの中に、実は「通信を安全に終わらせるための工夫」が詰まっていることが分かります。

最初は難しく感じるかもしれませんが、パケットを眺めて「ああ、今この手紙が届いたんだな」とイメージできるようになれば、あなたはもう一人前のネットワークエンジニアの入り口に立っていますよ。

次回のトラブルシューティングでは、ぜひこの FIN と RST の波形に注目してみてください。きっと、今まで見えなかったネットワークの「呼吸」が聞こえてくるはずです。

コメント

タイトルとURLをコピーしました