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

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

本稿では、スリーウェイハンドシェイクの原理、プロセス、そして重要性について詳しく解説します。段階を追って、スリーウェイハンドシェイクが必要な理由、接続の安定性と信頼性をどのように確保するのか、そしてデータ転送にとってどれほど重要なのかを説明します。スリーウェイハンドシェイクをより深く理解することで、ネットワーク通信の基盤となるメカニズムをより深く理解し、TCP接続の信頼性についてより明確な見通しを得ることができるでしょう。

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

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

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

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

 SYNパケット

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

SYN+ACKパケット

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

ACKパケット

クライアントはサーバーからパケットを受信すると、最終応答パケットに応答するために以下の最適化処理を実行する必要があります。まず、クライアントは応答パケットのTCPヘッダーのACKビットを1に設定します。次に、「確認応答番号」フィールドに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日