結論/要点まとめ
- ハンドシェイクとは、通信を始める前に機器同士が「これから通信しますよ」と確認し合う事前の挨拶(握手)のこと。
- もっとも代表的なのがTCPの3ウェイハンドシェイクで、SYN → SYN/ACK → ACKの3回のやり取りでコネクションを確立する。
- HTTPS通信では、TCPの握手のあとにTLSハンドシェイクが続き、暗号化の準備を整える。両者は別の段階の握手で役割が異なる。
- この握手の仕組みを悪用したのがSYNフラッド攻撃で、半端な握手を大量に送りつけてサーバーを機能不全にする。
Webサイトを開いたりファイルを送ったりするとき、機器はいきなりデータを送り始めるわけではありません。まず「相手はちゃんと聞ける状態か」を確かめる短いやり取りを行います。これがハンドシェイクです。この記事では、日常の握手のイメージから始めて、TCPの3ウェイハンドシェイク、TLSハンドシェイク、そしてセキュリティとの関わりまでを、図解を交えてわかりやすく解説します。
ハンドシェイクとは?「通信を始める前の握手」
一言でいうと:通信の準備を整える事前確認
ハンドシェイク(handshake)とは、2つの機器が本格的なデータ通信を始める前に、通信できる状態かどうかを確認し、通信の条件をすり合わせるためのやり取りを指します。日本語では「握手」と直訳されます。
人が初対面であいさつと握手を交わしてから会話を始めるように、コンピュータも「これから通信します」「了解、準備できています」といった合図を交換してから、本番のデータをやり取りします。
ここがポイント
ハンドシェイクはデータ本体を送る前の準備段階です。ここで相手の応答や通信条件を確認しておくことで、その後の通信を確実かつ効率的に進められます。
なぜ「握手」と呼ばれるのか
人間の握手は「敵意はありません」「あなたを認識しました」という合意の合図です。ネットワークのハンドシェイクも同じで、お互いの存在を確認し、通信のルールに合意する行為です。この振る舞いが握手に似ているため、この名前が使われています。
なぜハンドシェイクが必要なのか
相手が応答できる状態か確認する
通信相手のサーバーが停止していたり、混雑していたりすると、データを送っても受け取ってもらえません。ハンドシェイクで先に「応答できるか」を確認しておけば、無駄なデータ送信を避けられます。
通信条件(パラメータ)をすり合わせる
通信を始めるには、データの順番を管理する番号や、一度に送れるデータ量、暗号化の方式など、いくつかの取り決めが必要です。ハンドシェイクの段階でこれらを交換し合意しておくことで、双方が同じルールで通信できるようになります。
- 相手が起動していて応答できるかを確認する
- 通信の開始番号(シーケンス番号)を共有する
- 一度に送受信できるデータ量などの条件を決める
- (暗号化通信の場合)暗号方式や鍵を決める
TCPの3ウェイハンドシェイク(最も基本的な握手)
「ハンドシェイク」という言葉で真っ先に挙げられるのが、TCPの3ウェイハンドシェイクです。TCPは信頼性の高い通信を担うプロトコルで、通信を始める前に必ずこの3回の握手でコネクション(論理的な通信路)を確立します。
SYN → SYN/ACK → ACK の3ステップ
クライアント(例:ブラウザ)とサーバーは、次の3つのパケットを順番にやり取りします。
SYN(接続要求)
クライアント → サーバー。「通信を始めたい」という要求を送る。
→
SYN/ACK(要求の受理+接続要求)
サーバー → クライアント。「了解、こちらも準備できた」と応答する。
→
ACK(受理の確認)
クライアント → サーバー。「確認した、通信を始めよう」と応じる。
この3回のやり取りが完了すると、コネクションが確立され、ここから実際のデータ通信が始まります。3回で完結するため「3ウェイ(three-way)ハンドシェイク」と呼ばれます。
各ステップの役割(表)
| 順番 | 送信方向 | フラグ | 意味 |
|---|---|---|---|
| 1 | クライアント → サーバー | SYN | 通信を開始したいという要求 |
| 2 | サーバー → クライアント | SYN + ACK | 要求を受理し、自分側の接続も要求 |
| 3 | クライアント → サーバー | ACK | 受理を確認しコネクション確立 |
SYNは「Synchronize(同期)」、ACKは「Acknowledge(確認応答)」の略です。
シーケンス番号とは
3ウェイハンドシェイクでは、単に握手するだけでなく、シーケンス番号(順序番号)という値も交換します。これは送るデータの順番を管理するための番号で、通信の途中でデータが欠けたり順序が入れ替わったりしても、正しく組み立て直せるようにするためのものです。ハンドシェイクの段階で開始番号を双方で共有しておくことで、以降の通信の信頼性が保たれます。
通信終了時の4ウェイハンドシェイク
通信を始めるときが3ウェイなのに対し、通信を終えるときは4回のやり取り(4ウェイハンドシェイク)を行います。終了は双方向で行う必要があり、FINとACKを互いにやり取りしてコネクションを閉じます。開始時と終了時で回数が異なる点は、試験でもよく問われるポイントです。
TLS/SSLハンドシェイク(暗号化のための握手)
HTTPS通信(鍵マークの付いた安全な通信)では、TCPの3ウェイハンドシェイクだけでは終わりません。その後にTLSハンドシェイクという別の握手が続き、通信を暗号化するための準備を行います。TLSは、以前SSLと呼ばれていた仕組みの後継で、現在の主流です。
TLSハンドシェイクで決めること
TLSハンドシェイクでは、主に次のようなことを取り決めます。
- どの暗号方式(暗号スイート)を使うか
- 通信相手が本物かを確認するためのサーバー証明書の検証
- 実際の暗号化に使う共通鍵を安全に共有すること
大まかな流れ
クライアントが対応可能な暗号方式を提示し、サーバーが方式を選んで証明書を提示、双方で鍵を共有してから暗号化通信に切り替わる、という流れです。この握手が完了して初めて、盗聴されても内容がわからない安全な通信が始まります。
つまり
HTTPSでは、TCPの握手(土台の接続)→TLSの握手(暗号化の準備)という2段階の握手を経てから、実際のWebページのデータがやり取りされます。
TCPハンドシェイクとTLSハンドシェイクの違い(比較表)
2つのハンドシェイクは混同されがちですが、目的も担当する層も異なります。違いを整理しておきましょう。
| 項目 | TCP 3ウェイハンドシェイク | TLSハンドシェイク |
|---|---|---|
| 目的 | 通信路(コネクション)の確立 | 通信内容の暗号化の準備 |
| 主なやり取り | SYN・ACK | 暗号方式の合意・証明書検証・鍵共有 |
| 実行の順番 | 先(土台) | 後(TCPの上) |
| 担当する層 | トランスポート層 | トランスポート層とアプリ層の間 |
| 暗号化 | しない | する |
TCPハンドシェイクは「回線をつなぐ」、TLSハンドシェイクは「その回線で安全に話す準備をする」とイメージすると分かりやすいです。
ハンドシェイクとセキュリティ:SYNフラッド攻撃
ハンドシェイクの仕組みは、悪用されることもあります。代表例がSYNフラッド攻撃で、3ウェイハンドシェイクの性質を突いたサービス妨害(DoS)攻撃の一種です。
攻撃の仕組み
攻撃者は大量のSYN(接続要求)だけをサーバーに送りつけ、サーバーがSYN/ACKで応答したあとに続くはずのACKをわざと返しません。サーバーは「まだ握手が完了していない接続」を保持したまま待ち続け、これが大量に積み重なると、正規の利用者の接続を受け付けられなくなります。
主な対策
- SYN Cookieを用いて、握手完了まで接続情報を保持しない仕組みにする
- ファイアウォールやIPS/IDSで異常なSYNの流入を検知・遮断する
- 接続待ちの上限やタイムアウトを適切に設定する
その他のハンドシェイク
ハンドシェイクはTCP/TLS以外の場面でも登場する、汎用的な概念です。
Wi-Fi(無線LAN)の接続時
無線LANでアクセスポイントに接続する際にも、暗号化のための鍵を交換するハンドシェイクが行われます。WPA2で使われる4ウェイハンドシェイクなどが代表例で、正しいパスワードを持つ端末だけが接続できるよう認証と鍵共有を行います。
モデム・シリアル通信での利用
機器同士の速度や送受信のタイミングを合わせる制御も、広い意味でハンドシェイクと呼ばれます。送る側と受け取る側のペースを合わせ、データの取りこぼしを防ぐ役割を持ちます。フロー制御と呼ばれる仕組みの一部です。
TCPの状態遷移(ハンドシェイク中に何が起きているか)
3ウェイハンドシェイクの間、TCPは内部で状態(ステート)を少しずつ変化させています。この状態遷移は基本情報技術者試験やネットワークスペシャリスト試験でも問われるポイントです。主な状態を握手の流れに沿って見てみましょう。
| 状態 | どちら側 | 意味 |
|---|---|---|
| LISTEN | サーバー | 接続要求を待ち受けている状態 |
| SYN-SENT | クライアント | SYNを送り、応答を待っている状態 |
| SYN-RECEIVED | サーバー | SYNを受け取りSYN/ACKを返した状態 |
| ESTABLISHED | 双方 | 握手が完了しデータ通信できる状態 |
| TIME-WAIT | 切断側 | 終了処理後、遅延パケットに備えて一定時間待つ状態 |
最終的に双方がESTABLISHEDになった瞬間から、実際のデータ通信が始まります。
ハンドシェイクと通信速度の関係
ハンドシェイクは通信の信頼性を支える一方で、やり取りの回数が増えるほど通信開始までに時間がかかります。表示速度を気にするWeb運用では、この「握手のコスト」を知っておくと役立ちます。
RTT(往復遅延)とは
RTT(Round Trip Time)とは、データを送ってから応答が返ってくるまでの往復時間のことです。3ウェイハンドシェイクは1往復(1 RTT)、その後のTLSハンドシェイクはさらに往復が必要になるため、遠いサーバーほど通信開始が遅くなります。
ハンドシェイクを速くする技術
この遅延を減らすため、握手を簡略化・統合する技術が登場しています。
| 技術 | 対象 | 効果 |
|---|---|---|
| TLS 1.3 | TLSハンドシェイク | 1往復で完了。再接続時は0往復(0-RTT)も可能 |
| TCP Fast Open | TCPハンドシェイク | 2回目以降の接続でデータ送信を前倒しできる |
| QUIC(HTTP/3) | TCP+TLSを統合 | 接続確立と暗号化の握手をまとめ、大幅に高速化 |
QUICはUDPを土台にしつつ、信頼性と暗号化を独自に実現する新しい仕組みで、HTTP/3で採用されています。
ハンドシェイクを実際に確認する方法
ハンドシェイクは目に見えませんが、ツールを使えば実際のやり取りを観察できます。学習や動作確認に役立つ代表的な方法を紹介します。
curlで通信の流れを見る
コマンド一つで、接続からTLS握手、証明書の情報までを段階的に表示できます。
curl -v https://example.com
出力の中に、TCP接続の確立やTLSハンドシェイク(使用された暗号方式・証明書)に関する行が表示されます。
Wiresharkでパケットを観察する
パケットキャプチャツールのWiresharkを使うと、SYN・SYN/ACK・ACKの3つのパケットを実際に目で確認できます。次のような表示フィルタを使うと、握手だけを抽出できます。
tcp.flags.syn == 1
SYNフラグの立ったパケットだけを絞り込めるため、3ウェイハンドシェイクの開始を見つけやすくなります。
用語・略語の早見表
ハンドシェイク周辺でよく登場する略語をまとめました。意味を押さえておくと、他の記事や試験問題を読むときにも役立ちます。
| 略語 | 正式名称 | 意味 |
|---|---|---|
| SYN | Synchronize | 接続開始の同期要求 |
| ACK | Acknowledge | 受信したことの確認応答 |
| FIN | Finish | 接続終了の要求 |
| TCP | Transmission Control Protocol | 信頼性の高い通信を担うプロトコル |
| TLS | Transport Layer Security | 通信を暗号化する仕組み(SSLの後継) |
| RTT | Round Trip Time | データ往復にかかる時間 |
よくある質問(FAQ)
ハンドシェイクとコネクションの違いは何ですか?
ハンドシェイクは通信を始めるための「やり取り(手順)」を指し、コネクションはその結果として確立される「論理的な通信路」を指します。3ウェイハンドシェイクという手順を経て、コネクションが確立される、という関係です。
なぜ握手は3回なのですか?2回では足りませんか?
双方が「相手にデータが届き、相手も準備できている」ことを互いに確認するには3回のやり取りが必要です。2回だと、要求を出した側は相手の準備を確認できても、応答した側は自分の応答が相手に届いたかを確認できません。3回目のACKで、双方向の到達確認が完成します。
SSLハンドシェイクとTLSハンドシェイクは同じものですか?
ほぼ同じ役割を指します。SSLはTLSの前身にあたる古い規格で、現在は安全性の理由から使われず、TLSが主流です。慣習的に「SSL」と呼ばれることが多いですが、実際に動いているのはTLSであるケースがほとんどです。
UDPにもハンドシェイクはありますか?
UDPは高速性を優先するプロトコルで、TCPのような事前のハンドシェイクは行いません。コネクションを確立せずにデータを送るため、信頼性より速度が求められる動画配信やオンラインゲームなどで使われます。
まとめ
ハンドシェイクは、通信を始める前に機器同士が交わす「握手(事前の挨拶)」であり、通信を確実に進めるための土台となる仕組みです。最後に要点を振り返ります。
- ハンドシェイクは、本格的な通信の前に応答確認と条件のすり合わせを行うやり取り。
- TCPの3ウェイハンドシェイクはSYN → SYN/ACK → ACKでコネクションを確立する。
- HTTPSではTCPの握手のあとにTLSハンドシェイクが続き、暗号化の準備を整える。
- この仕組みを悪用したのがSYNフラッド攻撃で、対策も含めて理解しておきたい。
「握手してから話し始める」というシンプルなイメージを押さえておけば、TCPからTLS、Wi-Fiまで、さまざまな場面のハンドシェイクを同じ考え方で理解できます。
研究をシェア!
