TCP 3-way ハンドシェイク
TCP 接続を確立するための 3 段階の手順で、SYN → SYN-ACK → ACK の順で行われる
ネットワーク
TCP 3-way ハンドシェイクとは
TCP 3-way ハンドシェイクは、TCP 接続を確立するための 3 段階の手順で、クライアントとサーバーが互いの通信能力を確認する。全ての HTTP/HTTPS 通信の前に行われる。
3 つのステップ
3 つのステップを図で示す。
クライアント → SYN (接続要求) → サーバー
クライアント ← SYN-ACK (要求承認) ← サーバー
クライアント → ACK (承認確認) → サーバー
→ 接続確立、データ送信開始
| ステップ | 送信者 | フラグ | 説明 |
|---|---|---|---|
| 1 | クライアント | SYN | 「接続したい」 |
| 2 | サーバー | SYN-ACK | 「OK、こちらも接続したい」 |
| 3 | クライアント | ACK | 「了解」 |
HTTPS の場合
HTTPS の場合を図で示す。
TCP 3-way ハンドシェイク (1 RTT)
↓
TLS ハンドシェイク (1〜2 RTT)
↓
HTTP リクエスト/レスポンス
→ 合計 2〜3 RTT が必要
レイテンシへの影響
レイテンシへの影響を図で示す。
東京 → 東京 (同一リージョン): RTT ≈ 1ms
→ 3-way ハンドシェイク ≈ 1.5ms
東京 → バージニア (クロスリージョン): RTT ≈ 150ms
→ 3-way ハンドシェイク ≈ 225ms
→ TLS を含めると ≈ 450ms (データ送信前)
接続の再利用 (Keep-Alive)
接続の再利用 (Keep-Alive) を図で示す。
❌ 毎回接続を確立:
リクエスト 1: ハンドシェイク (1.5ms) + データ (10ms)
リクエスト 2: ハンドシェイク (1.5ms) + データ (10ms)
合計: 23ms
✅ Keep-Alive で接続を再利用:
リクエスト 1: ハンドシェイク (1.5ms) + データ (10ms)
リクエスト 2: データ (10ms) ← ハンドシェイク不要
合計: 21.5ms
HTTP/2 は 1 つの接続で複数のリクエストを多重化する。
SYN Flood 攻撃
SYN Flood 攻撃を図で示す。
攻撃者が大量の SYN パケットを送信
→ サーバーが SYN-ACK を返して待機
→ ACK が来ない → 接続テーブルが溢れる
→ 正規のユーザーが接続できない
対策: AWS Shield が自動的に SYN Flood を検出・緩和
接続の終了 (4-way ハンドシェイク)
接続の終了 (4-way ハンドシェイク) を図で示す。
クライアント → FIN → サーバー
クライアント ← ACK ← サーバー
クライアント ← FIN ← サーバー
クライアント → ACK → サーバー
→ 接続終了
TCP 3-way ハンドシェイクの理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
関連する記事
技術書の速読術 - 必要な情報を素早く見つける読み方
技術書の速読は「文字を速く読む」ことではなく「読まなくていい部分を見極めて飛ばす」こと。目的別の読み方と速読の 5 ステップを紹介します。
技術書の読む順番戦略 - 複数冊を組み合わせて理解を加速させる
技術書を 1 冊ずつ読むのではなく、複数冊を戦略的に組み合わせることで理解の深さと速度を飛躍的に高める方法を解説します。
機械学習・AI 本ガイド - エンジニアが読むべき技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルートと ML 本の賞味期限の見極め方を解説します。