TCP/UDPの仕組み

3ウェイハンドシェイク すりーうぇいはんどしぇいく

3ウェイハンドシェイクSYNACKTCP接続コネクション確立
3ウェイハンドシェイクについて教えて

簡単に言うとこんな感じ!

TCP接続を始める前の「よろしくね確認」が3回のやりとりのことだよ。「繋いでいい?」→「いいよ、そっちも大丈夫?」→「大丈夫!」って感じで、双方向通信の準備を確認し合うんだ!


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

3ウェイハンドシェイク(Three-Way Handshake)は、TCPが通信を開始する際に行う接続確立の手順です。クライアントとサーバーが3回のパケット交換によって「双方が送受信できる状態」を確認し合います。

この手順が「3ウェイ(3回)」なのは、以下の3つのパケット交換が行われるためです:SYN(同期)→ SYN-ACK(同期確認)→ ACK(確認)。この順序は必ず守られ、どちらかが応答しなければ接続は確立されません。

3ウェイハンドシェイクによって、両端の初期シーケンス番号(ISN: Initial Sequence Number)を交換し、以降の通信でデータの順序保証と再送制御ができる状態が整います。


3ウェイハンドシェイクの流れ

3ウェイハンドシェイク クライアント サーバー ① SYN(seq=x) 「接続したい!シーケンス番号はxから始めます」 ② SYN-ACK(seq=y, ack=x+1) 「OKです!こちらのシーケンス番号はyから始めます」 ③ ACK(ack=y+1) 「確認しました。接続確立!」
  1. クライアント → サーバー:SYN 「接続したい!初期シーケンス番号はxです」
  2. サーバー → クライアント:SYN-ACK 「わかった!こちらはyから始めます、xの次(x+1)を待ってるよ」
  3. クライアント → サーバー:ACK 「確認!yの次(y+1)を待ってます」

この3回のやりとりで接続確立。以降はデータ転送が行われます。


歴史と背景

  • 1981年:RFC 793でTCPと3ウェイハンドシェイクが標準化
  • 2004年SYNフラッド攻撃(半完成の接続を大量に作る攻撃)への対策としてSYN Cookieが普及
  • 2014年TCP Fast Open(TFO)によって、初回接続のハンドシェイクを削減する拡張が実用化
  • 2020年代QUIC(HTTP/3)では0-RTTまたは1-RTTで接続確立できるよう設計が進化

SYNフラッド攻撃と対策

SYNフラッド攻撃はDDoS攻撃の一種で、大量のSYNパケットをサーバーに送りつけ、サーバーのリソースを枯渇させます。SYN-ACKを送ったまま3のACKが来ない「半開き接続」がサーバーのメモリを占有します。

対策:SYN Cookie(クッキー)をサーバーが生成し、ACKが来るまでメモリを使わない方式が広く採用されています。


接続切断の4ウェイハンドシェイク

接続確立は3回ですが、切断は4回のやりとりが必要です。FIN(終了)→ ACK → FIN → ACKの順で、それぞれの方向の通信を独立して終了させます。


関連する規格・RFC

規格・RFC番号内容
RFC 793TCP(3ウェイハンドシェイクの仕様)
RFC 4987SYNフラッド攻撃とSYN Cookieの解説
RFC 7413TCP Fast Open

関連用語

  • TCP — 3ウェイハンドシェイクを使うプロトコル
  • ソケット — 接続確立後に使われる通信端点
  • TCP Fast Open — ハンドシェイクを1往復に削減する拡張
  • TIME_WAITとCLOSE_WAIT — 接続切断後の待機状態