ネットワークの「お別れ」の作法:正常な終了と、怒りの強制終了
ネットワークエンジニアの現場では、サーバーに接続する時よりも「切断する時」の挙動に頭を抱えることがよくあります。
「パケットが届かない」「接続がすぐ切れる」といったトラブルの裏側には、実は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 の波形に注目してみてください。きっと、今まで見えなかったネットワークの「呼吸」が聞こえてくるはずです。
コメント