「送った?届いた?」を確実にする約束事。TCPスリーウェイ・ハンドシェイクの全貌
こんにちは!ネットワークの世界へようこそ。
普段、私たちがブラウザでWebサイトを見たり、チャットアプリでメッセージを送ったりするとき、画面の裏側ではものすごい勢いでパケットという「手紙」が飛び交っています。
でも、インターネットは意外と「適当な場所」なんです。送った手紙が途中で迷子になったり、順番が入れ替わったりするのは日常茶飯事。そこで登場するのが、通信の信頼性を守るための番人、TCPです。
今回は、通信を始める前の「お互いの挨拶」、通称スリーウェイ・ハンドシェイクを、郵便配達のストーリーになぞらえて紐解いていきましょう。
—
1. なぜ「握手(ハンドシェイク)」が必要なの?
現実世界で考えてみてください。あなたが大切な友人に手紙を出すとき、いきなり用件だけ書いて送りますか?
「元気?今からこれを送るから、受け取ってくれる?」と確認してから、相手が「いいよ、準備できてるよ」と答えてくれる。この確認があって初めて、安心して中身を送れますよね。
TCPも全く同じです。データを送り出す前に、「今から送るよ!」「準備OK!」「了解、じゃあ送るね!」という3回の往復を行うことで、通信路を確立します。これがスリーウェイ・ハンドシェイクです。
—
2. 3回のステップと、サーバーの「心の変化」
パケットが飛ぶとき、サーバーの中では「状態(ステート)」が刻一刻と変化しています。この遷移こそが、ネットワークの挙動を追うための最重要ポイントです!
【Step 1】SYN:君と話したい!
クライアントからサーバーへ「ねえ、通信を始めよう!」という手紙(パケット)が届きます。これがSYN(Synchronize:同期)です。
- サーバーの状態:
LISTEN(来るべき通信を今か今かと待ち構えている状態) - 変化:
SYNを受け取ると、サーバーは「お、誰か来たぞ!」と認識します。
【Step 2】SYN-ACK:いいよ、僕も準備するね!
サーバーは、クライアントに「了解!僕も準備するから、君も準備してね」という返事(SYN-ACK)を返します。
- サーバーの状態:
SYN_RCVD(SYNを受け取って、返事をした状態)
【Step 3】ACK:わかった、始めるよ!
最後にクライアントが「わかった、じゃあ始めるよ!」とACK(Acknowledgment:承認)を送ります。これで握手完了。
- サーバーの状態:
ESTABLISHED(ようやく「確立」!ここからデータの本送りが始まります)
—
3. 実践:サーバーのステートをのぞいてみよう
理論だけではつまらないですよね。実際にLinuxサーバーで、どんな状態で通信が待機しているかを確認してみましょう。ssコマンド(または昔ながらのnetstat)を使うのが一番の近道です。
# 現在のネットワーク接続状況を確認するコマンド
# -t: TCPを表示
# -l: 待ち受け(LISTEN)状態を表示
# -n: ポート番号を数値で表示(名前解決しないので速い!)
ss -tln
# 出力結果のイメージ
# State Recv-Q Send-Q Local Address:Port Peer Address:Port
# LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
このLISTENという表示、まさに「いつでも握手できますよ!」というサーバーの意思表示なんです。
トラブルシューティングのヒント
もし、サーバー側でSYN_RECV(SYN_RCVDの別表記)が異常に増えていたら要注意!これは「悪意のあるユーザーが大量に挨拶だけ送ってきて、後の返事を無視している(SYNフラッド攻撃)」の可能性が高いです。インフラエンジニアとしては、ここを監視して「通信が確立されない不審な待ち行列」を見抜くのが腕の見せ所です。
—
4. 最後に:なぜ「3回」なのか?
「2回じゃダメなの?」とよく聞かれます。
もし2回だと、サーバーが「準備OK!」と送ったあとに、その手紙が途中で消えてしまった場合、クライアントは「届いたのかどうか」一生分かりませんよね。
3回目にクライアントからACKが戻ることで、「お互いに、相手が受け取ったことを確認できた」という事実が確定します。この「確実さ」への執念が、信頼性の高いTCPというプロトコルを支えているんです。
—
まとめ:ネットワークは「思いやり」でできている
いかがでしたか?
LISTEN:静かに待機SYN→SYN-ACK→ACK:段階的な信頼の構築ESTABLISHED:信頼に基づく会話の開始
これらが一瞬で繰り返されることで、私たちは快適にインターネットを楽しめています。次にブラウザを開くとき、裏側で繰り広げられるこのドラマを少しだけ想像してみてください。ネットワークの世界が、少しだけ身近に感じられるはずです!
もし「もっとパケットの中身を見てみたい!」と思ったら、ぜひtcpdumpやWiresharkといったツールを使って、実際に流れるパケットを眺めてみてください。画面の向こう側の「生の呼吸」が聞こえてきますよ。
それでは、また次の記事でお会いしましょう!Happy Hacking!
コメント