TCP(Transmission Control Protocol)の通信は、単にデータを送り出すだけではなく、通信相手との信頼関係を構築し、正確かつ安全にデータをやり取りするための手順が整えられています。
その最初のステップが「3Wayハンドシェイク」と呼ばれるコネクション確立のプロセスです。

3Wayハンドシェイクを理解することで、TCPの高い信頼性について学ぶことができます。
ネットワーク通信の世界では、通信相手が確実にデータを受け取れる状態にあるかどうかを確認せずに送信を行うと、データの欠損や順序の乱れ、セキュリティ上の問題などが発生する可能性があります。
3Wayハンドシェイクは、これらのリスクを未然に防ぎ、双方向の同期をとったうえで安全に通信を始めるための重要なメカニズムです。



ふむふむ、3Wayハンドシェイクについて気になってきました!
この記事では、この3Wayハンドシェイクの具体的な仕組みや手順について、丁寧に解説していきます。
3Wayハンドシェイクによるコネクションの確立
TCPの接続は、信頼性を確保するために「3Wayハンドシェイク」と呼ばれる3段階の手順を経て確立されます。
この仕組みによって、通信を始める前に送信側と受信側の両方が接続状態にあることを確認し合い、それぞれの初期シーケンス番号を交換することで、以降のデータ送受信を円滑に行えるようになります。



TCPでは接続を開始する際も丁寧な手順を取っているんですね。
また、これによりデータの重複や欠落、順序の乱れといった通信トラブルを未然に防ぐ役割も果たしています。



イメージしやすいような例を挙げてみましょう。
たとえば、あなたがスマートフォンでWebサイトを開こうとする場面を想像してください。
アプリが「これから通信を始めます」とサーバに信号を送り、サーバが「OK、準備できています」と返し、アプリが「じゃあ通信開始します」と返答して初めて、データのやりとりがスタートします。
このとき、
①スマホが「このサイトにつなぎたいんだけど、大丈夫?」と最初に挨拶(SYN)を送ります。
②サーバが「わかった、つなげるよ。君のリクエストも受け取ったよ。こっちもつなぎたい(SYN-ACK)」と返事をします。
③スマホが「ありがとう、じゃあデータをやり取りしよう(ACK)」と最後の合図を送り、通信が始まります。
このやりとりによって、スマホとサーバの間で「お互いに通信可能だ」と確認し合い、安全にデータをやりとりできる準備が整うのです。



これら3段階のやりとりについて、詳しく見ていきましょう。
ステップ1:SYN(同期)
クライアント(通信の開始者)は、サーバ(受信側)に対して接続要求の意思を示すSYNフラグを立てたパケットを送信します。
このパケットには、クライアントが設定した初期シーケンス番号(ISN:Initial Sequence Number)も含まれています。
この番号は、通信時に送信データの順序を管理するための基準として使われる重要な情報です。
TCPでは、このISNを起点にして、送信するすべてのデータに対してシーケンス番号を付与していくことで、順序の保証と再送処理が可能になります。


このステップは「はじめまして」と名乗るようなものです。クライアントは「自分はシーケンス番号10000から始めたい」と伝えることで、後続するデータの順序を示し、整合性のある通信の準備を始めます。
ステップ2:SYN-ACK(同期+確認応答)
サーバはクライアントからのSYNパケットを受信すると、その内容を確認し、自らの通信開始の意思を示すと同時に、SYNフラグとACKフラグの両方を立てたSYN-ACKパケットを返信します。
ACKフラグが示す確認応答番号には、クライアントが提示したISNに1を加えた値が含まれています。
※なぜ「1を加える」のでしょうか?
これは、TCPではSYNやFINなどの制御フラグを持つパケットも1バイト分の仮想的なデータとみなされ、シーケンス番号の進行に含まれるためです。
サーバがACK番号に「クライアントのISN+1」を指定することで、「SYNは受け取ったよ、次はその次のバイトからデータを送ってね」と明確に伝えるのです。


また、このSYN-ACKパケットにはサーバ自身のISNも含まれています。
これは「こちらはシーケンス番号20000から通信を開始するよ」と伝える意味があり、今後の双方向通信のための準備として不可欠な情報です。
このように、双方向でシーケンス番号を交換することにより、互いにデータの順序を正確に把握できるようになります。
ステップ3:ACK(確認応答)
クライアントは、サーバからのSYN-ACKパケットを受信したあと、最終ステップとしてACKフラグを立てたパケットをサーバに送信します。
このACKパケットには、サーバが提示したISNに1を加えた確認応答番号が含まれており、「あなたのSYNも受け取ったよ、次はその続きからデータを送ってください」という合図になります。


この時点で、クライアントとサーバは互いの通信準備が完了したことを確認し、ようやくデータの送受信がスタートできる状態になります。
この3段階すべてが無事完了して初めて、TCPのコネクションは「確立された」とみなされます。



途中のどのステップでも失敗すれば接続は成立せず、再試行や切断処理が行われることになります。



3つのステップが全部正常に完了しないと、コネクションが確立されないんですね。



すごく丁寧にやりとりしていて、TCPの信頼性の高さが伝わってきました。
このように、3Wayハンドシェイクは単なる「接続開始」以上の意味を持ち、信頼性・順序性・双方向性の保証に不可欠なステップとなっているのです。
セキュリティ面での役割:SYN Flood攻撃への対策
3Wayハンドシェイクは、接続前に通信相手の意思を確認する役割を果たすため、外部からの不正な接続要求をフィルタリングする第一関門となります。



この仕組みにより、信頼性のある通信のみを許可し、不審な接続からネットワークを守る基本的な防御ラインとなっています。
しかし、この手続きを悪用した「SYN Flood攻撃」では、大量のSYNパケットだけを送信してサーバのリソースを占有する手法が取られます。



世の中には悪いことを考える人もいるんですね!
攻撃者は、SYNを送った後にACKを返さず、意図的に3Wayハンドシェイクを未完了のまま放置します。
この状態は「半開(Half-Open)接続」と呼ばれ、サーバ側は未完了の接続を管理し続ける必要があり、大量のSYNが届くと接続待機キューが溢れてしまいます。



結果として、正規のクライアントが接続できない状態に陥り、サービス停止(DoS)が発生します。



これは大変だ……!
このような攻撃への対策としては、以下のような仕組みが用いられます。
- SYN Cookie:サーバがリソースを割り当てる前に、暗号的に生成された確認情報(クッキー)をクライアントに送り返し、正規のACK応答があるまで接続情報を保持しないようにします。これにより、無駄なリソース消費を防ぎます。
- ファイアウォールやIPS/IDSの活用:不正なSYNリクエストを検出し、ルールに基づいて遮断します。異常なトラフィックの増加を監視することで、攻撃の兆候を素早く察知することが可能です。
- バックログキューの拡張やタイムアウト短縮:OSレベルでSYN受信待ちキューの容量を増やしたり、未完了接続の保持時間を短縮することで、リソースの効率的な運用を図ります。
このように、3Wayハンドシェイクは通信の信頼性を確保するだけでなく、セキュリティの観点からも極めて重要な役割を担っています。
特に外部からの攻撃にさらされやすいWebサーバやAPIエンドポイントなどでは、SYN Flood対策を含む堅牢な接続管理が欠かせません。
まとめ
3Wayハンドシェイクは、TCP通信の信頼性を支える非常に重要なプロセスです。
この手順を通じて、通信の開始前に送信側と受信側が接続状態を確認し合い、データ送信に適した環境を構築します。



これにより、意図しないデータの送信や受信エラーを防ぎ、スムーズな通信の準備が整うのです。



3Wayハンドシェイクによって、信頼性の高い通信が実現することがわかりました!
また、初期シーケンス番号の交換を行うことで、データの順序が適切に管理されるようになり、必要に応じた再送制御も機能します。
仮にパケットがネットワーク上で失われた場合でも、再送処理により正確なデータ伝達が保証されるのです。
このように、3WayハンドシェイクはTCPの高い信頼性を支える土台として不可欠な仕組みといえるでしょう。