ネットワークパケットブローカーTCP接続の重要な謎:トリプルハンドシェイクの必要性を解明

TCP接続のセットアップ
ウェブを閲覧したり、メールを送信したり、オンラインゲームをプレイしたりする時、その背後にある複雑なネットワーク接続について意識することはあまりありません。しかし、一見小さなこれらのステップこそが、私たちとサーバー間の安定した通信を保証しているのです。最も重要なステップの一つがTCP接続の確立であり、その中核を成すのが3ウェイハンドシェイクです。

この記事では、3ウェイハンドシェイクの原理、プロセス、そして重要性について詳しく説明します。3ウェイハンドシェイクが必要な理由、接続の安定性と信頼性を確保する仕組み、そしてデータ転送における重要性について、段階的に解説します。3ウェイハンドシェイクを深く理解することで、ネットワーク通信の基盤となるメカニズムをより深く理解し、TCP接続の信頼性をより明確に理解できるようになります。

TCP 3ウェイハンドシェイクプロセスと状態遷移
TCPはコネクション指向のトランスポートプロトコルであり、データ送信前にコネクションの確立を必要とします。このコネクション確立プロセスは、3ウェイハンドシェイクによって行われます。

 TCP 3ウェイハンドシェイク

各接続で送信される TCP パケットを詳しく見てみましょう。

初期状態では、クライアントとサーバーは両方ともCLOSED状態です。サーバーはまずポートをアクティブにリッスンし、LISTEN状態になります。これは、サーバーを起動する必要があることを意味します。次に、クライアントはWebページへのアクセスを開始する準備が整います。サーバーとの接続を確立する必要があります。最初の接続パケットの形式は次のとおりです。

 SYNパケット

クライアントが接続を開始すると、ランダムな初期シーケンス番号(client_isn)を生成し、TCPヘッダーの「シーケンス番号」フィールドに挿入します。同時に、クライアントはSYNフラグの位置を1に設定し、送信パケットがSYNパケットであることを示します。クライアントは、最初のSYNパケットをサーバーに送信することで、サーバーとの接続を確立する意思を示します。このパケットには、アプリケーション層のデータ(つまり、送信データ)は含まれません。この時点で、クライアントのステータスはSYN-SENTとマークされます。

SYN+ACKパケット

サーバーはクライアントからSYNパケットを受信すると、自身のシリアル番号(server_isn)をランダムに初期化し、その番号をTCPヘッダーの「シリアル番号」フィールドに入力します。次に、サーバーは「確認応答番号」フィールドにclient_isn + 1を入力し、SYNビットとACKビットの両方を1に設定します。最後に、サーバーはアプリケーション層のデータ(およびサーバーが送信するデータ)を含まないパケットをクライアントに送信します。この時点で、サーバーはSYN-RCVD状態にあります。

ACKパケット

クライアントはサーバーからパケットを受信すると、最終応答パケットに応答するために以下の最適化を実行する必要があります。まず、クライアントは応答パケットのTCPヘッダーのACKビットを1に設定します。次に、クライアントは「Confirm answer number」フィールドにserver_isn + 1の値を入力します。最後に、クライアントはパケットをサーバーに送信します。このパケットは、クライアントからサーバーへのデータを伝送できます。これらの操作が完了すると、クライアントはESTABLISHED状態になります。

サーバーはクライアントからの応答パケットを受信すると、ESTABLISHED 状態に切り替わります。

上記のプロセスからわかるように、3ウェイハンドシェイクを実行する際、3番目のハンドシェイクではデータの送受信が許可されますが、最初の2つのハンドシェイクではデータの送受信が許可されません。これは面接でよく聞かれる質問です。3ウェイハンドシェイクが完了すると、双方ともESTABLISHED状態になり、接続が正常に確立されたことを示します。この時点で、クライアントとサーバーは相互にデータの送受信を開始できます。

なぜ握手は3回?2回ではなく、4回?
よくある答えは「3ウェイハンドシェイクは送受信の能力を保証するからだ」です。この答えは正しいのですが、それは表面的な理由に過ぎず、根本的な理由を示していません。以下では、この問題への理解を深めるために、3つの側面からトリプルハンドシェイクの理由を分析していきます。

3ウェイハンドシェイクは、歴史的に繰り返される接続の初期化を効果的に回避できる(主な理由)
3 ウェイ ハンドシェイクにより、両方の当事者が信頼できる初期シーケンス番号を受信したことを保証します。
3 ウェイ ハンドシェイクにより、リソースの無駄を回避できます。

理由1: 過去の重複結合を避ける
簡単に言えば、3ウェイハンドシェイクの主な目的は、古い接続の初期化による混乱を避けることです。複雑なネットワーク環境では、データパケットの送信が必ずしも指定された時間通りに宛先ホストに送信されるわけではなく、ネットワークの混雑などにより、古いデータパケットが先に宛先ホストに到着してしまうこともあります。これを回避するため、TCPは3ウェイハンドシェイクを用いて接続を確立します。

3ウェイハンドシェイクは過去の重複接続を回避します

ネットワーク輻輳などの状況で、クライアントが複数の SYN 接続確立パケットを連続して送信すると、次のようなことが起こる可能性があります。

1- 古い SYN パケットは、最新の SYN パケットよりも先にサーバーに到着します。
2- サーバーは古い SYN パケットを受信した後、クライアントに SYN + ACK パケットを返信します。
3- クライアントは SYN + ACK パケットを受信すると、自身のコンテキストに従って接続が履歴接続 (シーケンス番号の期限切れまたはタイムアウト) であると判断し、接続を中止するために RST パケットをサーバーに送信します。

2ウェイハンドシェイク接続では、現在の接続が過去の接続であるかどうかを判断する方法はありません。3ウェイハンドシェイクでは、クライアントは3番目のパケットを送信する準備ができたときのコンテキストに基づいて、現在の接続が過去の接続であるかどうかを判断できます。

1- 履歴接続の場合(シーケンス番号の有効期限が切れているかタイムアウト)、3 番目のハンドシェイクによって送信されるパケットは、履歴接続を中止するための RST パケットです。
2- 過去の接続でない場合、3 回目に送信されるパケットは ACK パケットであり、通信する 2 つの当事者は接続を正常に確立します。

したがって、TCP が 3 ウェイ ハンドシェイクを使用する主な理由は、過去の接続を防ぐために接続を初期化するためです。

理由2: 双方の初期シーケンス番号を同期させるため
TCPプロトコルの両側は、信頼性の高い伝送を確保するための重要な要素であるシーケンス番号を維持する必要があります。シーケンス番号はTCP接続において重要な役割を果たします。シーケンス番号には以下の役割があります。

受信者は重複データを排除し、データの正確性を確保できます。

受信側は、シーケンス番号の順序でパケットを受信して​​、データの整合性を確保できます。

● シーケンス番号により相手が受信したデータパケットを識別できるため、信頼性の高いデータ伝送が可能になります。

したがって、TCP接続を確立すると、クライアントは初期シーケンス番号を含むSYNパケットを送信し、サーバーにクライアントのSYNパケットの受信成功を示すACKパケットの応答を要求します。その後、サーバーは初期シーケンス番号を含むSYNパケットをクライアントに送信し、クライアントからの応答を一度だけ待機することで、初期シーケンス番号が確実に同期されていることを確認します。

双方の初期シリアル番号を同期する

双方の初期シーケンス番号を確実に同期させるために4ウェイハンドシェイクも可能ですが、2番目と3番目のステップを1つのステップに統合して3ウェイハンドシェイクにすることもできます。ただし、2つのハンドシェイクでは、一方の当事者の初期シーケンス番号がもう一方の当事者に正常に受信されることは保証されますが、双方の初期シーケンス番号が確実に受信されるという保証はありません。したがって、TCP接続の安定性と信頼性を確保するには、3ウェイハンドシェイクが最適な選択肢です。

理由3:リソースの無駄を避ける
「2回のハンドシェイク」のみの場合、クライアントのSYN要求がネットワーク内でブロックされると、クライアントはサーバーから送信されたACKパケットを受信できず、SYNが再送信されます。しかし、3回目のハンドシェイクがないため、サーバーはクライアントが接続を確立するためのACK確認応答を受信したかどうかを判断できません。そのため、サーバーは各SYN要求を受信した後にのみ、積極的に接続を確立できます。これは以下のようになります。

リソースの無駄:クライアントのSYNリクエストがブロックされ、複数のSYNパケットが繰り返し送信される場合、サーバーはリクエスト受信後に複数の冗長な無効な接続を確立します。これは、サーバーリソースの無駄な浪費につながります。

メッセージの滞留:3回目のハンドシェイクがないため、サーバーはクライアントが接続を確立するためのACK応答を正しく受信したかどうかを把握できません。その結果、メッセージがネットワーク上で滞留すると、クライアントはSYNリクエストを何度も送信し続け、サーバーは常に新しい接続を確立することになります。これにより、ネットワークの輻輳と遅延が増加し、ネットワーク全体のパフォーマンスに悪影響を及ぼします。

資源の無駄を避ける

したがって、ネットワーク接続の安定性と信頼性を確保するために、TCP は 3 ウェイ ハンドシェイクを使用して接続を確立し、これらの問題の発生を回避します。

まとめ
そのネットワークパケットブローカーTCP接続の確立は、3ウェイハンドシェイクによって行われます。3ウェイハンドシェイクでは、まずクライアントがSYNフラグ付きのパケットをサーバーに送信し、接続を確立したいことを示します。クライアントからの要求を受信すると、サーバーはSYNフラグとACKフラグ付きのパケットをクライアントに返信し、接続要求を受け入れたことを示します。また、サーバー自身の初期シーケンス番号も送信します。最後に、クライアントはACKフラグ付きでサーバーに返信し、接続が正常に確立されたことを示します。こうして、両者はESTABLISHED状態になり、相互にデータの送信を開始できます。

一般に、TCP 接続を確立するための 3 ウェイ ハンドシェイク プロセスは、接続の安定性と信頼性を確保し、過去の接続による混乱やリソースの浪費を回避し、両方の当事者がデータを受信および送信できることを保証するように設計されています。


投稿日時: 2025年1月8日