🌐 TCP/IPの3ウェイハンドシェイクって、一体なんなのさ?
ねぇ、インターネットってさ、普段何気なく使ってるけど、その裏側にはすっごく賢い仕組みがいっぱい動いてるんだよ!
特に、TCP/IPっていう通信のルールの中で、「3ウェイハンドシェイク」っていうのがあってさ。
これ、Webサイトを見たり、メールを送ったりするときに、君のパソコンとサーバーが最初に「これから通信するぞ!」って合図を送り合う、大切な儀式なんだ。
「でもさ、なんで3回もやり取りするの? 2回じゃダメなの?」って思ったことない?
今日はその素朴な疑問を、友達に語りかけるみたいに楽しく掘り下げていこうよ!
まずは基本の流れを確認しよう!
簡単に言うと、3ウェイハンドシェイクはこんな感じで進むんだ。
- 1回目:SYN(同期)
- 2回目:SYN+ACK(同期と確認応答)
- 3回目:ACK(確認応答)
クライアント「ねぇサーバーさん、通信したいんだけど、準備OK?」
サーバー「OKだよ!君の言ってること分かったよ。じゃあ、私の準備もOKだけど、君は私の準備がOKってこと、分かった?」
クライアント「うん、分かったよ!お互い準備OKだね!じゃあ、始めよう!」
…と、こんな感じの「会話」が光の速さで行われているわけ。
面白いよね!
🤔 なんで「3回」必要なの? 2回じゃダメなの?
ここが本題! 2回じゃダメな理由、実はめちゃくちゃ奥深いんだ。
✨ 理由その1:お互いの準備状況をしっかり確認する!
まず一番分かりやすい理由から。
TCPっていうのは、データを「確実に」届けるためのプロトコルなんだ。だから、通信を始める前に、お互いがちゃんとデータを送受信できる状態なのかを確かめる必要がある。
- 双方向通信の確認:クライアントからサーバーへ、そしてサーバーからクライアントへ、両方向の通信路が確立できることを確認するんだ。
- シーケンス番号の交換:これがめちゃくちゃ重要!
データを送るときって、順番がバラバラにならないように「これは1番目のデータ、これは2番目のデータ」って番号を振るんだけど、その最初の番号(初期シーケンス番号)をお互いに交換し合うんだ。
この初期シーケンス番号は、セキュリティのためにランダムに決められるんだよ。
もし2回で終わると、片方が相手のシーケンス番号を受け取ったことを確認できないまま通信が始まっちゃう可能性があるんだ。
👻 理由その2:過去の「幽霊パケット」を排除する!
さあ、ここからが一番ディープで面白い理由だよ!
これは、「ネットワークの遅延によって発生する可能性のある問題を避けるため」なんだ。
想像してみてほしい。
もし2回で接続が確立するとしたら…
- クライアント(A) → サーバー(B): SYN (seq=X) 「接続したいです!」
- サーバー(B) → クライアント(A): SYN+ACK (seq=Y, ack=X+1) 「OKです!あなたのSYNも受け取りました!」
この時点でサーバー(B)は「接続確立!」って思っちゃうとするよね。
でも、もし2回目のSYN+ACKがネットワークの混雑でクライアント(A)に届かなかったら?
クライアント(A)は、SYN+ACKが来ないからもう一度SYNを送るか、諦めて接続を閉じちゃうかもしれない。
一方で、サーバー(B)は接続が確立されたと思って、リソース(メモリとか)を無駄に確保し続けちゃうことになる。
もっとやっかいなのは、昔送ったSYNパケットが、すっごく遅れてサーバーに届くケース。
例えば、以前クライアント(A)がサーバー(B)に接続しようとしてSYNを送ったけど、何らかの理由でそのSYNがめちゃくちゃ遅延して、もうその接続自体はとっくに終わってるとするよね。
その遅延した古いSYNパケットが、今になってサーバー(B)に届いたらどうなる?
- 遅延SYN → サーバー(B): SYN (古いシーケンス番号)
- サーバー(B) → クライアント(A): SYN+ACK (この古いSYNに対する応答)
もしここで2回で接続完了だとしたら、サーバー(B)は「ああ、接続が確立した!」って思って、新しい接続リソースを確保してしまう。
でもクライアント(A)は、そんな古いSYNに対するSYN+ACKなんて受け取っても無視するか、そもそも新しい接続なんか求めてないんだ。
これじゃ、サーバーは無駄な接続を確立しちゃうし、混乱のもとだよね。
そこで、3回目の登場だよ!
- クライアント(A) → サーバー(B): ACK (ack=Y+1) 「サーバーさんのSYN+ACK、ちゃんと受け取ったよ!これで完璧!」
この3回目のACKがあることで、サーバー(B)は「クライアント(A)が自分のSYN+ACKを正しく受け取り、そして自分も接続の準備ができたと理解している」という確証を得られるんだ。
これによって、遅延した古いSYNパケットによる誤った接続確立を防ぐことができるんだよ!
つまり、過去の「幽霊パケット」によって、今の通信が邪魔されるのを防いでいるってわけ。
賢いよね!
まとめ:3回は無駄じゃない、完璧なバランスなんだ!
どうだった?
たかが3回のやり取り、されど3回のやり取りだよね!
TCPの3ウェイハンドシェイクは、単に「接続します」って挨拶するだけじゃなくて、
- お互いの準備状況とシーケンス番号を確実に同期する
- ネットワークの遅延によって起こりうる問題を回避し、信頼性を高める
っていう、すっごく深い意味があるんだ。
この3回という回数は、信頼性と効率性の間で、まさに完璧なバランスを取っているんだね。
普段意識しないけど、こんな賢い仕組みがインターネットを支えてるって、本当に感動しちゃうよね!
プロトコルの設計って、奥が深くて面白いんだよ!
足👣跡