3ウェイハンドシェイク
TCPで、通信を始める前に3回のやり取りでコネクションを確立する手順。SYN、SYN+ACK、ACKの順にパケットを送り合う。
イマシルちゃんの解説
電話をかけるときって、こんなやり取りをするよね。
「もしもし、聞こえますか?」
「はい、聞こえます。そちらこそ聞こえますか?」
「はい、聞こえます!」
お互いに「自分の声が届く」「相手の声も聞こえる」ことを確かめてから話し始める。
TCPも同じように、3回のやり取りで準備ができたことを確かめてから、データを送り始めるんだ!
より深い解説
定義
3ウェイハンドシェイクは、TCPのコネクションを確立する手順である。クライアントとサーバが、互いに通信できることを確かめ、これから使うシーケンス番号の初期値を伝え合う。
手順
| 順番 | 送る側 → 受ける側 | フラグ | 内容 |
|---|---|---|---|
| 1 | クライアント → サーバ | SYN | 接続したい。こちらのシーケンス番号の初期値は x |
| 2 | サーバ → クライアント | SYN+ACK | 了解(確認応答番号 x+1)。こちらの初期値は y |
| 3 | クライアント → サーバ | ACK | 了解(確認応答番号 y+1) |
3つ目のACKをサーバが受け取った時点で、両方がESTABLISHED(確立済み)の状態になり、データを送れるようになる。
なぜ3回なのか
コネクションは双方向なので、「クライアントからサーバへ」と「サーバからクライアントへ」の両方向について、相手に届くことと、相手の初期シーケンス番号を受け取ったことを確かめる必要がある。本来は4回のやり取りになるところを、2回目でサーバのSYNとACKを1つのパケットにまとめるので、3回で済む。
状態の変化
| 手順 | クライアントの状態 | サーバの状態 |
|---|---|---|
| 開始前 | CLOSED | LISTEN(接続を待っている) |
| SYNを送った後 | SYN-SENT | |
| SYNを受け取り、SYN+ACKを返した後 | SYN-RECEIVED | |
| 3回目のACKの後 | ESTABLISHED | ESTABLISHED |
初期シーケンス番号が乱数である理由
初期シーケンス番号は、毎回予測しにくい値から始める。予測しやすいと、第三者がシーケンス番号を推測して、偽のパケットを正規の通信に割り込ませる攻撃が可能になるためである。
SYNフラッド攻撃との関係
サーバはSYNを受け取ると、コネクションの準備のためにメモリを確保して、3回目のACKを待つ(ハーフオープンの状態)。大量のSYNだけを送りつけてACKを返さないと、サーバのリソースが使い果たされる。これがSYNフラッド攻撃で、対策としてSYN Cookieなどがある。
実際の試験ではここに出る!
- ネットワークスペシャリスト 令和7年度 春期 午前Ⅱ 問11
- ネットワークスペシャリスト 令和7年度 春期 午後Ⅱ 問2
- ネットワークスペシャリスト 令和元年度 秋期 午前Ⅱ 問18
- ネットワークスペシャリスト 令和元年度 秋期 午前Ⅱ 問19