【てぃーしーぴーはんどしぇいく】

TCPハンドシェイク とは?

最終更新:
💡 3段階のやり取りで、TCP接続の出発点をそろえる

TCP接続を確立し、双方の初期シーケンス番号を同期するための手順。一般的にはSYN、SYNとACK、ACKの3段階を交換するため、3ウェイハンドシェイクと呼ばれる。

📌 このページのポイント
TCP:双方の初期番号を同期する クライアント サーバー ① SYN:seq=100 ② SYN+ACK seq=300、ack=101 ③ ACK:ack=301 SYN+ACKを受信 接続確立 最後のACKを受信 接続確立 下へ進むほど、時間が経過
一般的な接続開始の例。数字は説明用。SYNは番号を一つ使う。矢印は送信から受信を表し、両端の接続確立の時点は異なる。再送や同時開始などは省略。
ひよこ ひよこ
なぜ3回やり取りするの?
ペンギン先生 ペンギン先生
一般的には、クライアントがSYNで自分の初期シーケンス番号を送り、サーバーがSYNとACKで自分の番号と受信確認を返す。最後にクライアントがACKでサーバーの番号を確認するよ。双方の出発点を同期するんだ。
ひよこ ひよこ
ACKの番号はどう決まるの?
ペンギン先生 ペンギン先生
例えばクライアントの最初の番号が100、サーバーが300なら、SYNへの確認番号はそれぞれ101と301になるよ。SYNはシーケンス番号を一つ使うので、受け取った番号に1を足した値で確認するんだ。
ひよこ ひよこ
接続には必ず1.5往復かかるの?
ペンギン先生 ペンギン先生
どちらから、どの時点まで測るかで変わるよ。損失や処理時間を無視すれば、クライアントがSYNとACKを受け取るのは約1往復後。最後のACKがサーバーへ届くのは、その後さらに片道分。再送があればもっと時間がかかるんだ。
ひよこ ひよこ
これで安全な相手だと分かる?
ペンギン先生 ペンギン先生
TCPの基本手順は暗号化や相手の身元の認証を行わないよ。アプリケーションの通信内容を保護するには、TLSなどの別の仕組みを組み合わせる。接続できることと、相手を信頼できることは分けて考えよう。
ひよこ ひよこ
SYNフラッドって、この手順と関係があるの?
ペンギン先生 ペンギン先生
大量の接続要求で、確立途中の接続を管理する資源を消費させる攻撃だよ。SYN Cookieのように、途中の状態をサーバーの応答番号へ符号化する対策もある。対応や有効化の条件は実装・設定を確認する必要があるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「TCPハンドシェイク」って出てきたら「TCP接続を始めるため、双方の出発点を確認する3段階のやり取り」と思えばだいたいOK!
📖 おまけ:英語の意味
「TCP Three-Way Handshake」 = TCPの3方向の握手
💬 handshakeは「握手」。通信の開始時に情報を交換する手順を握手にたとえた言葉だよ。人の身元確認や暗号化まで意味するものではないんだ。

参考資料

← 用語集にもどる