📌
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セグメントです。
SYN-ACK(Synchronize-Acknowledge)
= 同期応答パケット
サーバーがSYNに対して返すパケットです。「あなたのSYNを受け取りました(ACK)。こちらも接続したいです(SYN)」という2つの意味を持ちます。
ACK(Acknowledge)
= 確認応答パケット
クライアントがSYN-ACKに対して返す最後のパケットです。「あなたのSYN-ACKを受け取りました」という確認応答です。 これで双方の接続が確立(ESTABLISHED)されます。
接続状態(Connection State)
= TCP接続のライフサイクル
TCPの各端はCLOSED、LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHEDなどの状態を持ちます。 ハンドシェイクの進行に伴って状態が遷移し、両端がESTABLISHEDになれば通信可能です。
📌
接続確立の手順TCP接続の確立に必要な3つのステップを追いかけます。
1
SYN: クライアントが接続要求
クライアントがSYNパケットを送信し、初期シーケンス番号を通知します。クライアントの状態はSYN_SENTに変わります。
2
SYN-ACK: サーバーが応答
サーバーがSYNを受け取り、SYN-ACKパケットで応答します。サーバーの初期シーケンス番号も含まれます。サーバーの状態はSYN_RECEIVEDに変わります。
3
ACK: クライアントが確認
クライアントがACKパケットを送信し、接続が確立されます。双方がESTABLISHED状態になり、データ通信が可能になります。
📌
接続終了(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を再送できるようにするためです。