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

TCPの3ウェイハンドシェイクとは何ですか?
その TCP スリーウェイ ハンドシェイク クライアントとサーバーが使用する手順は TCP/IPネットワーク アプリケーションデータの交換を開始する前に、信頼性の高い接続を確立します。名前が示すように、これは3つのステップで構成され、両側で同期(SYN)パケットと確認応答(ACK)パケットを交換し、使用する初期シーケンス番号について合意します。
ハンドシェイクは、両方のエンドポイントがTCPソケットを対称的に開始、ネゴシエート、および切断できるように設計されています。ハンドシェイクが完了すると、接続は全二重になり、どちらかがセッションを閉じるFINを発行するまで、両側で並行して送受信を行うことができます。
TCPメッセージタイプ
ハンドシェイクとティアダウン中に、4つの制御フラグが繰り返し表示されます。
| メッセージ | 詳細説明 |
|---|---|
| SYN | デバイス間の接続を開始し、シーケンス番号を同期します。 |
| ACK | 相手側に対し、前のセグメントが受信されたことを確認する。 |
| SYN-ACK | ローカルデバイスからのSYNと、ピアからの以前のSYNに対するACKを組み合わせたメッセージ。 |
| FIN | 接続を正常に終了するために使用されます。 |
TCP XNUMX ウェイ ハンドシェイク プロセス
TCPトラフィックは常に3ウェイハンドシェイクから始まります。クライアントはサーバーとのセッションを要求することで通信を開始します。
3者間握手の図。
- ステップ 1 — SYN: クライアントはSYNフラグを設定したセグメントを送信します。これはサーバーに対して「通信を開始したい」と伝え、初期シーケンス番号を提案するものです。
- ステップ2 — SYN-ACK: サーバーは、SYNフラグとACKフラグの両方が設定されたセグメントで応答します。ACKはクライアントのSYNを承認し、SYNはサーバー自身の初期シーケンス番号を提案します。
- ステップ3 — ACK: クライアントは、サーバーのSYN-ACKに対して最終的なACKで応答します。これで接続が確立され、両側で通信を開始できます。 transmitアプリケーションデータを取得します。
実際の例
具体的な数列を用いた計算例を以下に示します。
- ホスト 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応答を返し、即座に接続を切断します。


