インターネットの「握手」をのぞいてみよう:TCP 3ウェイ・ハンドシェイクの秘密
ネットワークエンジニアの道へようこそ!日々、僕たちが何気なくWebサイトを閲覧したり、メッセージを送受信したりできるのは、このデジタル世界の裏側で、無数の「会話のルール」が完璧に守られているからです。
そのルールの筆頭がTCP(Transmission Control Protocol)。今日は、通信を始める前の大切な儀式、「3ウェイ・ハンドシェイク」について、まるで対面で会話するように紐解いていきましょう。
—
なぜ「握手」が必要なの?
WebブラウザからWebサーバーへ接続する時、いきなり大量のデータを送りつけたらどうなるでしょう?相手が準備できていなければ、データは迷子になってしまいますよね。
だからこそ、通信の前に「今から話すよ!聞こえる?」「うん、聞こえてるよ!」「わかった、じゃあ始めるよ!」という3段階の握手(ハンドシェイク)が必要なんです。これを専門用語で「3ウェイ・ハンドシェイク」と呼びます。
郵便配達に例えてみよう
このやり取り、実は「手紙のやり取り」に非常に似ています。
1. SYN(同期要求): あなたが相手に「手紙のやり取りを始めたいから、準備してね!」と白紙のノートを送るイメージです。この時、あなたが「このページから書き始めるよ」という開始番号(ISN)を伝えます。
2. SYN-ACK(応答と同期): 相手は「了解!こっちも準備できたよ。あなたのノートの開始番号は受け取った。僕のノートの開始番号はここから始めるね」と返します。
3. ACK(確認応答): あなたは「ありがとう!じゃあ、これからの通信はこの番号でやり取りしようね」と、相手の開始番号を受け取ったことを伝えます。
これで、双方が「どの番号からデータを数え始めるか」を合意できたので、晴れて信頼できる通信のスタートです。
—
パケットが駆け巡るリアルな現場
エンジニアとして現場に出ると、この「3ウェイ・ハンドシェイク」の裏側を覗きたくなる瞬間が必ず訪れます。そんな時、一番頼りになる相棒が tcpdump です。
実際にサーバーでパケットをキャプチャすると、こんなログが見えてきます。
# 特定のポートへの通信を監視するコマンド例
# -i any: 全てのインターフェースを対象にする
# port 80: HTTP通信のみを表示
sudo tcpdump -i any port 80 -n
# 出力結果のイメージ
# IP 192.168.1.5.49152 > 192.168.1.10.80: Flags [S], seq 12345... (SYN)
# IP 192.168.1.10.80 > 192.168.1.5.49152: Flags [S.], seq 67890, ack 12346... (SYN-ACK)
# IP 192.168.1.5.49152 > 192.168.1.10.80: Flags [.], ack 67891... (ACK)
この seq(シーケンス番号)と ack(確認応答番号)の数字が、さっきの「ノートのページ番号」に相当します。[S] が SYN、[S.] が SYN-ACK、[.] が ACK を表していますね。現場では、この数字のズレやパケットの欠落を見ることで、「なぜサイトが開かないのか?」という謎を解き明かしていくのです。
—
エンジニアとしての視点:セキュリティの観点から
最近のゼロトラスト環境では、この「握手」の瞬間を狙った攻撃にも注意が必要です。例えば、SYN パケットだけを大量に送りつけてサーバーの応答待ち状態をパンクさせる「SYNフラッド攻撃」なんてものがあります。
初学者の方は、まず以下のコマンドで、自分のマシンの状態を確認する習慣をつけるのがおすすめです。
# 現在のコネクション状態を確認するコマンド
# TIME_WAIT や SYN_RECV が異常に増えていないかチェックします
netstat -ant | grep ESTABLISHED
ESTABLISHED(確立済み)という文字を見ると、「今日も元気にネットワークが繋がっているな」と少し安心できるはずです。
最後に:一歩ずつ理解していきましょう
OSI参照モデルの第4層、トランスポート層で起きているこのダンスは、ネットワークの基本中の基本です。最初は「何の話?」と思うかもしれませんが、tcpdump で実際のパケットの流れを眺めてみると、「ああ、本当に会話しているんだ!」と感動するはずです。
ネットワークエンジニアの仕事は、目に見えないパケットの「声」を聞く仕事です。ぜひ、今日から少しだけ、ブラウザの向こう側で繰り広げられる「握手」に思いを馳せてみてくださいね。
皆さんのインフラライフが、より快適で安全なものになりますように!
コメント