WEB PROTOCOL

TCP 3ウェイハンドシェイク(3-Way Handshake)

SYN → SYN-ACK → ACKの3パケット交換でTCP接続を確立するプロセス

INTERACTIVE VISUALIZATION
SYN
SYN-ACK
ACK
プロトコル
TCP
3-Way Handshake
Client
CLOSED
クライアント状態
Server
LISTEN
サーバー状態
進捗
1 / 8
初期状態
シナリオ
標準的なSYN → SYN-ACK → ACKの3ウェイハンドシェイクで接続を確立します
ステップ1 / 8
自動再生で3ウェイハンドシェイクの流れを順番に確認できます
クライアントとサーバーが通信開始前の状態です。
クライアントはCLOSED、サーバーはLISTEN状態で接続を待ち受けています
接続状態
ClientCLOSED
接続なし
ServerLISTEN
接続待ち受け中
解説

📌
3ウェイハンドシェイクとは

3ウェイハンドシェイクは、TCP接続を確立するための3つのパケット交換プロセスです。電話に例えると、①「もしもし」→ ②「はい、聞こえます」→ ③「了解、話しましょう」という3回のやり取りです。 この3回の確認により、双方が「送信できる」「受信できる」ことを確認してから通信を開始します。SYN(同期要求)→ SYN-ACK(同期応答+確認応答)→ ACK(確認応答) の順にパケットが交換されます。上のツールで「通常の接続確立」シナリオを再生すると、クライアントとサーバーの状態遷移が確認できます。

📌
特徴

  • 🤝双方向の合意クライアントとサーバーの両方が接続に同意してから通信を開始します。一方的に送りつけるのではなく、相手の準備ができているかを確認するため、信頼性の高い通信が実現します。
  • 🔢シーケンス番号の同期ハンドシェイク中に初期シーケンス番号(ISN)を交換します。この番号が以降のデータ通信の基準となり、パケットの順序管理や重複検出に使われます。
  • 🔁再送メカニズムパケットが届かない場合、指数バックオフで再送されます。最初は1秒、次は2秒、4秒と待機時間を倍にしていきます。「SYNタイムアウト」シナリオで動作を確認できます。
  • 📊状態遷移の管理クライアントとサーバーはそれぞれCLOSED → SYN_SENT/SYN_RECEIVED → ESTABLISHEDと状態が遷移します。各状態で適切なパケットのみ受け付けることで、不正な接続を防ぎます。

📌
ユースケース

🌐 Webページの読み込み
ブラウザがサーバーに接続するとき、まず3ウェイハンドシェイクでTCP接続を確立してからHTTPリクエストを送信します
🔒 HTTPS/TLS接続
TLSハンドシェイクの前にTCP接続が必要です。3ウェイハンドシェイク → TLSハンドシェイク → 暗号化通信の順に進みます
📡 API呼び出し
RESTやGraphQLなどのAPI通信は、TCPの信頼性が必要なため、接続確立にハンドシェイクが行われます
📧 メール送受信
SMTP、IMAP、POP3などのメールプロトコルもTCP上で動作するため、3ウェイハンドシェイクから始まります

📌
用語解説

SYN(Synchronize)
= 同期要求パケット
接続を開始したい側が最初に送るパケットです。「通信を始めたい」という意思表示と、初期シーケンス番号(ISN)を含みます。 SYNフラグがセットされたTCPセグメントです。
ClientSYNS
SYN-ACK(Synchronize-Acknowledge)
= 同期応答パケット
サーバーがSYNに対して返すパケットです。「あなたのSYNを受け取りました(ACK)。こちらも接続したいです(SYN)」という2つの意味を持ちます。
CSYN-ACKServer
ACK(Acknowledge)
= 確認応答パケット
クライアントがSYN-ACKに対して返す最後のパケットです。「あなたのSYN-ACKを受け取りました」という確認応答です。 これで双方の接続が確立(ESTABLISHED)されます。
ClientACKS
接続状態(Connection State)
= TCP接続のライフサイクル
TCPの各端はCLOSED、LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHEDなどの状態を持ちます。 ハンドシェイクの進行に伴って状態が遷移し、両端がESTABLISHEDになれば通信可能です。
CLOSEDSYN_SENTESTABLISHED

📌
接続確立の手順

TCP接続の確立に必要な3つのステップを追いかけます。

1
SYN: クライアントが接続要求
クライアントがSYNパケットを送信し、初期シーケンス番号を通知します。クライアントの状態はSYN_SENTに変わります。
2
SYN-ACK: サーバーが応答
サーバーがSYNを受け取り、SYN-ACKパケットで応答します。サーバーの初期シーケンス番号も含まれます。サーバーの状態はSYN_RECEIVEDに変わります。
3
ACK: クライアントが確認
クライアントがACKパケットを送信し、接続が確立されます。双方がESTABLISHED状態になり、データ通信が可能になります。
SYNSYN-ACKACK3パケットで接続確立

📌
接続終了(4ウェイクローズ)

TCP接続の終了は4つのパケット交換で行われます。 上のツールで「接続の終了(4ウェイ)」シナリオを選択すると、全過程が確認できます。

1
FIN: クライアントが終了要求
クライアントがFINパケットを送信し、「これ以上送るデータはありません」と通知します。
2
ACK: サーバーが確認
サーバーがFINに対するACKを返し、「終了要求を受け取りました」と応答します。
3
FIN: サーバーも終了通知
サーバーもFINを送信し、「こちらも送るデータはありません」と通知します。
4
ACK: クライアントが最終確認
クライアントがACKを返し、TIME_WAIT状態に入ります。一定時間後に完全にCLOSEDになります。
TIME_WAIT:クライアントは最後のACKを送った後、2MSL(Maximum Segment Lifetime × 2、通常60秒〜120秒)の間待機します。 これは、最後のACKが失われた場合にサーバーがFINを再送できるようにするためです。

関連コンテンツ

TCP/IP

TCP/IP

TCPとIPの役割分担、パケット分割から順序通りの組み立てまでの流れを可視化

TCPコネクション切断

TCPコネクション切断

4ウェイハンドシェイク(FIN/ACK)によるTCP接続の切断フローを可視化

TCPフロー制御

TCPフロー制御

スライディングウィンドウ、スロースタート、AIMDによるTCPの流量制御メカニズムを可視化

HTTP通信

HTTP通信

ブラウザとサーバー間のHTTPリクエスト/レスポンスの仕組みを可視化

TLSハンドシェイク

TLSハンドシェイク

HTTPSで安全に通信するためのTLSハンドシェイクの仕組みを可視化

DNS名前解決

DNS名前解決

ドメイン名からIPアドレスへの階層的な問い合わせの流れを可視化