3ウェイハンドシェイク

読み:すりーうぇいはんどしぇいく / 英語表記:three-way handshake

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回で済む。

状態の変化

手順クライアントの状態サーバの状態
開始前CLOSEDLISTEN(接続を待っている)
SYNを送った後SYN-SENT
SYNを受け取り、SYN+ACKを返した後SYN-RECEIVED
3回目のACKの後ESTABLISHEDESTABLISHED

初期シーケンス番号が乱数である理由

初期シーケンス番号は、毎回予測しにくい値から始める。予測しやすいと、第三者がシーケンス番号を推測して、偽のパケットを正規の通信に割り込ませる攻撃が可能になるためである。

SYNフラッド攻撃との関係

サーバはSYNを受け取ると、コネクションの準備のためにメモリを確保して、3回目のACKを待つ(ハーフオープンの状態)。大量のSYNだけを送りつけてACKを返さないと、サーバのリソースが使い果たされる。これがSYNフラッド攻撃で、対策としてSYN Cookieなどがある。

実際の試験ではここに出る!

この用語が出てくる記事

↑