3ウェイハンドシェイク

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

TCPで、通信を始める前に3回のやり取りでコネクションを確立する手順。SYN、SYN+ACK、ACKの順にパケットを送り合う。

イマシルちゃんの解説

3ウェイハンドシェイクは、TCPで通信の接続を確立する手順だよ。
送るデータの順序を管理するため、両者はシーケンス番号をどの値から始めるか伝え合うんだ。
まず接続する側がSYNを送り、自分の開始番号を知らせるよ。
相手はその番号を受け取った返事と、自分の開始番号をSYN+ACKで返すの。
最後に接続する側がACKを返すことで、相手の開始番号を受け取ったと伝えるんだ。
こうして両方向の番号を確認しておくと、この後のデータがどこまで届いたかを確かめながら通信できるよ。

より深い解説

定義

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などがある。

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

ネットワークスペシャリスト

午前Ⅱ
午後Ⅱ

この用語が出てくる記事

↑