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

TCP接続のセットアップ
Web を閲覧したり、電子メールを送信したり、オンライン ゲームをプレイしたりするとき、私たちはその背後にある複雑なネットワーク接続についてあまり考えません。ただし、これらの一見小さな手順によって、サーバーとの間の安定した通信が確保されます。最も重要な手順の 1 つは TCP 接続のセットアップであり、この中心となるのは 3 ウェイ ハンドシェイクです。

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

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

 TCP スリーウェイ ハンドシェイク

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

最初は、クライアントとサーバーの両方が閉じられています。まず、サーバーはポートをアクティブにリッスンし、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 に設定します。次に、クライアントは「回答番号の確認」フィールドに値「server_isn + 1」を入力します。最後に、クライアントはパケットをサーバーに送信します。このパケットはクライアントからサーバーにデータを運ぶことができます。これらの操作が完了すると、クライアントは ESTABLISHED 状態になります。

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

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

なぜ3回握手するのですか? 2回じゃなくて4回?
一般的な答えは、「スリーウェイ ハンドシェイクにより受信と送信の機能が保証されるからです」です。この答えは正しいですが、それは表面的な理由にすぎず、主要な理由を提示するものではありません。以下では、トリプルハンドシェイクの理由を3つの側面から分析し、この問題への理解を深めていきます。

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

理由 1: 過去の重複結合を避ける
一言で言えば、スリーウェイ ハンドシェイクの主な理由は、古い重複した接続の初期化によって引き起こされる混乱を避けることです。複雑なネットワーク環境では、データ パケットの送信が指定された時間どおりに宛先ホストに送信されるとは限らず、ネットワークの混雑などの理由により、古いデータ パケットが先に宛先ホストに到着する可能性があります。これを回避するために、TCP は 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 はスリーウェイ ハンドシェイクを使用して接続を確立し、これらの問題の発生を回避します。

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

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


投稿時刻: 2025 年 1 月 8 日