3way handshakeについて調べてみた
3ウェイハンドシェイクの歴史:信頼性ある通信の礎
TCP/IPにおける信頼性の高い接続確立の仕組みである3ウェイハンドシェイク (3-way handshake) は、インターネットの黎明期に、ネットワーク内で発生しうる「古い重複パケット」問題を解決するために考案されました。その基本的な概念は、電子メールの発明者としても知られるレイ・トムリンソン (Ray Tomlinson) によって考案され、1981年9月に発行された RFC 793 でTCPの標準仕様として正式に定義されました。
なぜ「3ウェイ」が必要だったのか?
通信の約束事を決める際、単純な「要求」と「承諾」の2ステップ(2ウェイハンドシェイク)では不十分なケースがありました。特に、ネットワークが不安定でパケットが遅延したり、複製されたりする可能性がある環境では、深刻な問題が発生します。
古い重複パケット問題:
この問題は、過去の接続で送信されたパケット(SYNパケット)がネットワーク内で非常に長く遅延し、同じポート番号を使った新しい接続が開始された後に相手に届いてしまうというシナリオです。もし2ウェイハンドシェイクであれば、受信側はこの古いパケットを新しい接続要求と誤認してしまい、意図しない「半開き(half-open)」の接続を確立してしまいます。送信側は何も送っていないのに、受信側だけが接続が開いたと思い込み、リソースを無駄に消費する状態に陥るのです。
この問題を解決するために、3ウェイハンドシェイクが導入されました。
3ウェイハンドシェイクの確立
3ウェイハンドシェイクは、以下の3つのステップで構成され、お互いの「最初のシーケンス番号(Initial Sequence Number - ISN)」を確実に交換・確認することで、前述の問題を防ぎます。
-
SYN(シンクロナイズ):
- クライアントがサーバーに対し、接続を開始したい旨を伝えるためにSYNパケットを送信します。このパケットには、クライアントが生成したランダムな初期シーケンス番号(ISN)が含まれています。
クライアント -> サーバー : 「接続したいです。私の最初の番号は X です。」
-
SYN-ACK(シンクロナイズ-アクノリッジ):
- サーバーはクライアントからのSYNパケットを受け取ると、接続を許可するSYN-ACKパケットを返します。このパケットには、サーバー自身が生成したISNと、クライアントのISNに1を加えた確認応答番号(ACK)が含まれます。
サーバー -> クライアント : 「いいですよ。私の最初の番号は Y です。あなたの番号 X+1 をお待ちしています。」
-
ACK(アクノリッジ):
- クライアントはサーバーからのSYN-ACKパケットを受け取り、最後にサーバーのISNに1を加えたACKパケットを送信します。これにより、クライアントもサーバーからの接続要求を承諾したことになります。
クライアント -> サーバー : 「了解しました。あなたの番号 Y+1 をお待ちしています。」
この3番目のACKで、双方の接続が確立され、データの送受信が開始されます。この手順により、たとえ古いSYNパケットがサーバーに届いても、クライアントが3番目のACKを返すことはないため、意図しない接続が確立されることはありません。
その後の発展
3ウェイハンドシェイクの基本的な仕組みは、考案されてから現在に至るまで、TCPの根幹として変わっていません。TCP/IPの設計者たちは、タイマーを利用した別の方式なども検討しましたが、様々なネットワーク環境における堅牢性と確実性から、この3ウェイハンドシェイク方式を採用しました。今日、私たちが利用するほぼ全てのインターネット通信(Webサイトの閲覧、メールの送受信、ファイルのダウンロードなど)は、この信頼性の高い接続確立手順の上に成り立っています。
Discussion