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ウェイハンドシェイクの流れ
- クライアント → サーバー:SYN 「接続したい!初期シーケンス番号はxです」
- サーバー → クライアント:SYN-ACK 「わかった!こちらはyから始めます、xの次(x+1)を待ってるよ」
- クライアント → サーバー: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 793 | TCP(3ウェイハンドシェイクの仕様) |
| RFC 4987 | SYNフラッド攻撃とSYN Cookieの解説 |
| RFC 7413 | TCP Fast Open |
関連用語
- TCP — 3ウェイハンドシェイクを使うプロトコル
- ソケット — 接続確立後に使われる通信端点
- TCP Fast Open — ハンドシェイクを1往復に削減する拡張
- TIME_WAITとCLOSE_WAIT — 接続切断後の待機状態