3ウェイハンドシェイク
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回で済む。
状態の変化
| 手順 | クライアントの状態 | サーバの状態 |
|---|---|---|
| 開始前 | CLOSED | LISTEN(接続を待っている) |
| SYNを送った後 | SYN-SENT | |
| SYNを受け取り、SYN+ACKを返した後 | SYN-RECEIVED | |
| 3回目のACKの後 | ESTABLISHED | ESTABLISHED |
初期シーケンス番号が乱数である理由
初期シーケンス番号は、毎回予測しにくい値から始める。予測しやすいと、第三者がシーケンス番号を推測して、偽のパケットを正規の通信に割り込ませる攻撃が可能になるためである。
SYNフラッド攻撃との関係
サーバはSYNを受け取ると、コネクションの準備のためにメモリを確保して、3回目のACKを待つ(ハーフオープンの状態)。大量のSYNだけを送りつけてACKを返さないと、サーバのリソースが使い果たされる。これがSYNフラッド攻撃で、対策としてSYN Cookieなどがある。