TCP 3 ウェイ ハンドシェイク (SYN、SYN-ACK、ACK)

⚡ スマートサマリー

TCP 3ウェイハンドシェイクは、すべてのTCPセッションの開始時に行われる接続確立の手順です。クライアントとサーバーは、SYN、SYN-ACK、ACKパケットを交換し、シーケンス番号を同期させ、アプリケーションデータが1バイトでも送信される前に、双方の準備が整っていることを確認します。

  • 📨 メッセージの4つのタイプを知っておきましょう。 SYNはTCP接続を開始し、ACKは確認し、SYN-ACKは両方を組み合わせたものであり、FINはTCP接続を終了します。
  • 🔁 以下の3つの手順に従ってください。 クライアントSYN → サーバーSYN-ACK → クライアントACK。セッションは3番目のパケットが到着した後にのみ確立されます。
  • 🔢 シーケンス番号は重要です。 各側が初期シーケンス番号を選択し、相手側はそれに1を加えることで確認応答を行い、バイトストリームの順序を維持します。
  • 🚪 解体計画: データ転送後、TCPはFIN/ACKペアを使用して接続を閉じ、両端のソケットを解放します。
  • 🤖 パケット分析にAIを活用する: AIアシスタントが説明する Wireshark キャプチャを行い、ACKの欠落をフラグ付けし、SYNフラッドや半開き接続を強調表示します。

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

TCPの3ウェイハンドシェイクとは何ですか?

その TCP スリーウェイ ハンドシェイク クライアントとサーバーが使用する手順は TCP/IPネットワーク アプリケーションデータの交換を開始する前に、信頼性の高い接続を確立します。名前が示すように、これは3つのステップで構成され、両側で同期(SYN)パケットと確認応答(ACK)パケットを交換し、使用する初期シーケンス番号について合意します。

ハンドシェイクは、両方のエンドポイントがTCPソケットを対称的に開始、ネゴシエート、および切断できるように設計されています。ハンドシェイクが完了すると、接続は全二重になり、どちらかがセッションを閉じるFINを発行するまで、両側で並行して送受信を行うことができます。

TCPメッセージタイプ

ハンドシェイクとティアダウン中に、4つの制御フラグが繰り返し表示されます。

メッセージ 詳細説明
SYN デバイス間の接続を開始し、シーケンス番号を同期します。
ACK 相手側に対し、前のセグメントが受信されたことを確認する。
SYN-ACK ローカルデバイスからのSYNと、ピアからの以前のSYNに対するACKを組み合わせたメッセージ。
FIN 接続を正常に終了するために使用されます。

TCP XNUMX ウェイ ハンドシェイク プロセス

TCPトラフィックは常に3ウェイハンドシェイクから始まります。クライアントはサーバーとのセッションを要求することで通信を開始します。

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

3者間握手の図。

  • ステップ 1 — SYN: クライアントはSYNフラグを設定したセグメントを送信します。これはサーバーに対して「通信を開始したい」と伝え、初期シーケンス番号を提案するものです。
  • ステップ2 — SYN-ACK: サーバーは、SYNフラグとACKフラグの両方が設定されたセグメントで応答します。ACKはクライアントのSYNを承認し、SYNはサーバー自身の初期シーケンス番号を提案します。
  • ステップ3 — ACK: クライアントは、サーバーのSYN-ACKに対して最終的なACKで応答します。これで接続が確立され、両側で通信を開始できます。 transmitアプリケーションデータを取得します。

実際の例

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

具体的な数列を用いた計算例を以下に示します。

  • ホスト X は、TCP SYN パケットをサーバーに送信して接続を開始します。パケットにはランダムな初期シーケンス番号が含まれています。たとえば、 4321 — これは、ホストXが送信するバイトストリームの開始を示します。
  • サーバーはSYNを受信し、SYN-ACKで応答します。ACK番号はホストXのシーケンス番号を1増やしたものです(4322)、そしてSYNはサーバー自身の初期シーケンス番号を提案します。
  • ホストXは、サーバーのシーケンス番号を1増やした確認応答番号を持つ最終的なACKで応答します。

データ交換が完了すると、TCPはFIN/ACKの4ウェイシーケンスで接続を切断し、両方のエンドポイントがソケットを正常に解放できるようにします。

TCPが3ウェイハンドシェイクを必要とする理由

ハンドシェイクは単なる形式的なものではなく、信頼性の高いバイトストリーム転送に伴う3つの具体的な問題を解決する。

  • シーケンス番号の同期: 両方のピアは相手側の初期シーケンス番号を学習します。TCPはこの番号を使用して、セグメントの損失や順序の乱れを検出します。
  • 接続状態の合意: 3 番目の ACK はサーバーの SYN-ACK が到着したことを確認するので、両方の側が 1 に達するまでどちらの側もデータの送信を開始しません。 設立 でのみ停止させることができます。
  • 重複パケット保護: ランダムな初期シーケンス番号と時間制御されたハンドシェイク状態により、以前のセッションからの古いセグメントが誤って受け入れられるのを防ぎます。

TCPハンドシェイクにおける一般的な問題点

ハンドシェイクは堅牢ですが、識別可能な形で失敗することがあります。ネットワークエンジニアは通常、以下のいずれかを目にします。

  • SYNフラッド攻撃: 悪意のあるクライアントは、SYN-ACKに応答せずに何千ものSYNパケットを送信し、サーバーの接続テーブルを枯渇させます。SYNクッキーは、この攻撃に対する標準的な防御策です。
  • 半開き接続: 3回目のACKが失われると、接続は半開き状態のままになり、最終的にタイムアウトによって解消されます。
  • ファイアウォールまたはNATによる通信途中の切断: ステートフルなミドルボックスが状態を失うと、SYN-ACKパケットがドロップされ、クライアントが再試行を余儀なくされる可能性がある。
  • RSTリセット: サーバーが要求されたポートで待機していない場合、SYN要求に対してRST応答を返し、即座に接続を切断します。

よくあるご質問

2つのメッセージだけでは、両者が初期シーケンス番号に合意し、送信準備が整ったことを証明することはできません。3つ目のACKは、サーバーからのSYN-ACKが到着したことを確認し、データフローが始まる前に両方のエンドポイントがESTABLISHED状態に達したことを保証します。

SYNは、通信を開始し、初期シーケンス番号を提案する単一のフラグです。SYN-ACKは、SYNと相手側からの先行するSYNの確認応答を組み合わせたもので、1つのパケットで同期を完了します。

SYNフラッド攻撃は、ハンドシェイクを完了せずに大量のSYNパケットを送信することでサーバーに過負荷をかけます。半開接続がバックログキューをいっぱいにし、正当なユーザーのアクセスを妨げます。SYNクッキーは、この問題に対する標準的な対策です。

TCPは、FINとACKの交換による4ウェイハンドシェイクで接続を閉じます。各方向の接続は独立して閉じられるため、片方の側がデータの送信を完了した後でも、もう片方の側は送信を完了することができます。

初期シーケンス番号は、各エンドポイントが自身のバイトストリーム用にランダムに選択する32ビットの値です。これは、欠落または重複したセグメントを検出したり、なりすましパケットから防御したりするために使用されるカウンタのシード値となります。

いいえ。UDPはコネクションレス型で、ハンドシェイクなしでデータグラムを送信します。そのためTCPよりも高速で軽量ですが、アプリケーション側で信頼性、順序付け、輻輳制御を自ら処理する必要があります。

AIアシスタントはパケットキャプチャに注釈を付け、transmitsとRSTを翻訳し、SYNフラッドを検出します。 Wireshark 接続問題に関する次の診断手順を、分かりやすい英語に翻訳して推奨します。

はい。AIコーディングアシスタントは、平易な英語のリクエストを Python Scapy または、3ウェイハンドシェイクをトリガーして検査するnetcatスクリプトを作成し、各行について説明して、エンジニアが実行前に確認できるようにします。