インターネットを利用してWebサイトを閲覧したり、メールを送受信したりする際、その裏側ではネットワークプロトコルが複雑に機能しています。

データを欠落させることなく確実に相手に届けるために、TCP(Transmission Control Protocol)というプロトコルが広く利用されています。

このTCP通信を開始する際に、送信側と受信側の間で意思疎通を図る重要な手順が「3ウェイハンドシェイク」です。

本記事では、3ウェイハンドシェイクの仕組みや重要性、具体的なプロセスについて詳しく解説します。

3ウェイハンドシェイクとは?

3ウェイハンドシェイクとは、TCPを用いて通信を開始する前に、クライアントとサーバーの間で合意を形成するプロセスを指します。

このプロセスは、名前の通り「3回のやり取り」によって成立します。

ネットワーク通信において、データの送信側と受信側が互いに通信可能であることを確認するために行われます。

TCPは信頼性の高い通信を提供するプロトコルであり、この3ウェイハンドシェイクはその信頼性を担保するための第一歩となります。

もしこの手順を踏まずにデータを送り始めると、相手が準備できていなかった場合にデータが失われるリスクがあります。

そのため、3ウェイハンドシェイクはインターネット通信の基盤を支える非常に重要な仕組みといえます。

TCP通信における信頼性の重要性

ネットワーク上では、パケットの損失や遅延、順序の入れ替わりといったトラブルが頻繁に発生します。

UDP(User Datagram Protocol)のように、確認応答を行わずに一方的にデータを送り付けるプロトコルも存在します。

しかし、Web閲覧(HTTP/HTTPS)やファイル転送(FTP)、メールの送受信(SMTP/POP)などでは、データの正確性が最優先されます。

TCPは、データの欠落が発生した際に再送を行う仕組みを持っており、それを支えるのが接続の状態管理です。

3ウェイハンドシェイクを行うことで、双方がこれから通信を開始するという「共通の認識」を持つことができます。

これにより、コネクション型の通信が確立され、安定したデータの送受信が可能になります。

3ウェイハンドシェイクの3つのステップ

3ウェイハンドシェイクの具体的な流れについて、ステップごとに見ていきましょう。

一般的に、通信を開始しようとする側を「クライアント」、待ち受ける側を「サーバー」と呼びます。

Step 1:SYN(接続要求)

最初に、クライアントからサーバーに対して接続のリクエストを送信します。

このとき送信されるパケットには、TCPヘッダ内のSYN(Synchronize)フラグがセットされています。

SYNフラグは、シーケンス番号の同期を求めるためのものです。

クライアントは自身で生成した初期シーケンス番号(ISN)をパケットに含めて送信します。

この状態のクライアントは、サーバーからの返答を待つ「SYN-SENT」状態となります。

Step 2:SYN+ACK(許可と要求)

クライアントからのSYNパケットを受け取ったサーバーは、その要求を許可する返答を返します。

このパケットには、ACK(Acknowledgment)フラグとSYNフラグの両方がセットされています。

ACKは「クライアントからのSYNを受け取ったこと」を示し、SYNは「サーバー側からも接続の同期を求めること」を示します。

サーバーも自身の初期シーケンス番号を生成し、クライアントへ送信します。

また、サーバーはクライアントから受け取ったシーケンス番号に1を加えた値を、確認応答番号として送り返します。

この時のサーバーの状態は「SYN-RECEIVED」と呼ばれます。

Step 3:ACK(確認応答)

最後に、サーバーからの返答を受け取ったクライアントが、最終的な確認パケットを送信します。

このパケットにはACKフラグのみがセットされています。

クライアントは、サーバーから送られてきたシーケンス番号に1を加えた値を確認応答番号としてセットします。

このパケットがサーバーに到達した時点で、クライアントとサーバーの両方が「ESTABLISHED」という状態になります。

これによってコネクションが確立され、実際のデータ(ペイロード)の転送が開始できる状態が整います。

3ウェイハンドシェイクの流れをまとめた表

各ステップでのフラグの状態と動作を整理すると、以下のようになります。

ステップ送信者フラグ主な内容
第1ステップクライアントSYN接続リクエストと初期シーケンス番号の送信
第2ステップサーバーSYN + ACKリクエストの承認とサーバー側からの同期要求
第3ステップクライアントACKサーバー側の同期要求に対する最終確認

シーケンス番号と確認応答番号の役割

3ウェイハンドシェイクの中でやり取りされる「シーケンス番号」と「確認応答番号」は、TCP通信の要です。

シーケンス番号は、送信するデータが全体のどの位置にあるのかを示す番号です。

確認応答番号(ACK番号)は、「次に受信したいデータの番号」を相手に伝えるためのものです。

3ウェイハンドシェイクでは、この番号を互いに交換することで、データの「抜け漏れ」がないかをチェックする準備を整えます。

初期シーケンス番号が固定ではなくランダムな数値から始まるのは、セッションハイジャックなどの攻撃を防ぐためのセキュリティ上の配慮でもあります。

なぜ「3回」のやり取りが必要なのか?

通信を確立するために、なぜ2回や4回ではなく、3回のやり取りが行われるのでしょうか。

もし2回(SYNとSYN-ACKのみ)で通信を成立させた場合、サーバー側はクライアントがSYN-ACKを受け取ったかどうかを知ることができません。

ネットワークの遅延により古いSYNパケットが遅れて届いた場合、サーバーが勝手にコネクションを確立してしまうリスクが生じます。

3回のステップを踏むことで、送信側と受信側の双方が、相手の「送信能力」と「受信能力」の両方を確認できます。

この「双方向の確認」が完了して初めて、信頼できる通信路が完成したとみなされるのです。

4ウェイハンドシェイク(通信の終了)

接続を開始する手順が3ウェイハンドシェイクであるのに対し、接続を終了する手順は「4ウェイハンドシェイク」と呼ばれます。

終了時には、データの送信を終えた側からFIN(Finish)フラグが送信されます。

終了の手順が4回になる理由は、双方向の通信をそれぞれ独立して閉じる必要があるためです。

一方が送信を終了しても、もう一方がまだデータを送信している可能性があるからです。

開始時だけでなく終了時にも丁寧な手順を踏むことで、データの整合性が最後まで保たれます。

3ウェイハンドシェイクに関連するセキュリティ:SYN Flood攻撃

3ウェイハンドシェイクの仕組みを悪用したサイバー攻撃に「SYN Flood(シン・フラッド)攻撃」があります。

これは、攻撃者が大量のSYNパケットをサーバーに送り付け、意図的に3ステップ目を完了させない攻撃手法です。

サーバー側は第3ステップのACKを待つために、ハーフオープンと呼ばれる状態でリソースを確保し続けます。

大量のハーフオープン接続が蓄積されると、サーバーのメモリや接続テーブルがいっぱいになり、正規のユーザーが接続できなくなります。

現代のOSやネットワーク機器では、SYN Cookie(シン・クッキー)などの技術を用いて、この攻撃を防御する仕組みが備わっています。

TCP通信の状態遷移(ステート)

3ウェイハンドシェイク中、サーバーとクライアントの状態は刻一刻と変化します。

トラブルシューティングを行う際、現在の接続がどのステートにあるかを確認することは非常に有効です。

例えば、LinuxやWindowsのコマンドラインでnetstatコマンドを使用すると、接続状態を確認できます。

Shell
# 接続状態を確認するコマンド例
netstat -an | grep TCP
実行結果
TCP    192.168.1.10:50000     203.0.113.1:443       ESTABLISHED
TCP    192.168.1.10:50001     203.0.113.5:80        SYN_SENT

このように、ESTABLISHEDであれば3ウェイハンドシェイクが成功し、通信が行われていることを示します。

一方で、SYN_SENTのまま長時間止まっている場合は、サーバーからの応答が届いていないネットワークトラブルが推測されます。

3ウェイハンドシェイクのデメリットと最適化

3ウェイハンドシェイクは信頼性を高めますが、一方で「遅延(レイテンシ)」の原因にもなります。

データ本体を送り始める前に必ず往復のやり取りが発生するため、特に低速な回線や物理的に距離の離れた通信では無視できない時間となります。

この課題を解決するために、近年ではいくつかの最適化技術が登場しています。

TCP Fast Open (TFO)

TCP Fast Openは、過去に接続したことがあるクライアントとサーバーの間で、3ウェイハンドシェイクの最中にデータを送信し始める技術です。

初回の接続時に「クッキー」を発行しておくことで、次回以降のSYNパケットにデータを含めることが可能になります。

これにより、1往復分の時間を短縮でき、Webサイトの表示速度などが向上します。

QUICとUDPの台頭

最新の通信プロトコルであるQUIC(HTTP/3のベース)では、TCPそのものを使わずにUDP上で信頼性を構築しています。

QUICでは接続確立と暗号化(TLS)のハンドシェイクを同時に行うことで、TCP+TLSよりも遥かに高速な接続開始を実現しています。

3ウェイハンドシェイクという伝統的な手法は、現代の高速化ニーズに合わせて進化を続けているのです。

通信トラブルとハンドシェイクの失敗原因

システム開発やインフラ運用において、3ウェイハンドシェイクが完了しない問題に直面することがあります。

よくある原因の一つは、ファイアウォールによるパケットの遮断です。

サーバー側で特定のポートが開放されていない場合、SYNパケットが破棄(ドロップ)されるか、拒否(リセット)されます。

また、ネットワーク経路上のルーティングの不備により、SYN-ACKパケットがクライアントに戻ってこないケースも考えられます。

パケットキャプチャツールである「Wireshark」などを使用すると、どのステップで通信が止まっているかを可視化できます。

「SYN」は出ているが「SYN-ACK」が返ってこないのか、それとも「ACK」がサーバーに届いていないのかを切り分けることが解決の近道です。

OSI参照モデルにおけるTCPのレイヤー

3ウェイハンドシェイクを深く理解するためには、OSI参照モデルにおける位置付けを知っておくことも大切です。

TCPは、第4層である「トランスポート層」に属するプロトコルです。

第3層のネットワーク層(IP)がパケットを相手の住所まで届ける役割を担い、第4層のTCPがその通信の品質や順序を管理します。

つまり、3ウェイハンドシェイクは「住所に荷物を届ける前に、電話で受け取り可能か確認する」ような手続きと言えます。

この階層構造があるおかげで、アプリケーション側はネットワークの詳細を気にすることなく、確実にデータが届くことを前提としたプログラムを書くことができます。

まとめ

3ウェイハンドシェイクは、現代のインターネット通信において「信頼性」を確保するための極めて重要なプロセスです。

SYN、SYN+ACK、ACKという3段階のやり取りによって、送信側と受信側が互いに通信準備が整ったことを確認します。

この仕組みがあるからこそ、私たちはデータの欠落を心配することなくWebサイトを閲覧したり、ファイルをダウンロードしたりすることができます。

一方で、接続確立のオーバーヘッドやセキュリティリスクといった側面も持ち合わせており、TCP Fast OpenやQUICといった新しい技術による改良も進んでいます。

ネットワークの基礎知識として、この3ウェイハンドシェイクの流れと各フラグの意味を理解しておくことは、ITエンジニアにとって大きな武器となるでしょう。

まずは自分のパソコンから送信されているパケットの状態を確認し、理論と実際の動きを結びつけて理解を深めてみてください。