ネットワークの仕組みを学んでいると、「ハンドシェイク」という言葉を目にすることがあります。
「3wayハンドシェイク」「4wayハンドシェイク」「TLSハンドシェイク」など、似た名前も出てくるため、何が違うのか迷う方もいるのではないでしょうか。
この記事では、通信のハンドシェイクについて、以下の内容を会話の例を交えてわかりやすく説明します。
- ハンドシェイクの意味
- 3wayハンドシェイクの役割と流れ
- 4wayハンドシェイクの役割と流れ
- TLSハンドシェイクの役割とTCPとの関係
ハンドシェイクとは?

ハンドシェイクとは、通信する相手と情報をやり取りし、通信の準備や条件などを確認・調整する手順です。
簡単にいうと、通信相手と交わす「準備はできていますか?」という確認です。
例えば、TCPで接続を始めるときのやり取りは、次のような会話をイメージするとわかりやすくなります。
- 自分 → 相手:「通信を始めてもいい?」
- 相手 → 自分:「いいよ。こちらからも通信を始めていい?」
- 自分 → 相手:「いいよ!」
このように、お互いに確認してから通信を始めます。この3回のやり取りが、後ほど説明する「3wayハンドシェイク」です。
ハンドシェイクには、このほかにも暗号化の準備をするものや、通信の終了を確認するものがあります。目的に応じて、確認する内容や手順が異なります。
英語の「handshake」には「握手」という意味があります。人が会話を始める前にあいさつを交わすように、コンピューター同士も、本格的なデータのやり取りに入る前に準備を整えます。
3wayハンドシェイクとは?

3wayハンドシェイクとは、TCPで接続を確立するときに行う、3回のやり取りです。「スリーウェイハンドシェイク」と読みます。
TCPは、データの順序を管理したり、届かなかったデータを再送したりする通信の仕組みです。そのTCPでデータをやり取りする前に、お互いの通信の準備を整えます。
イメージとしては、通信を始めるための「よろしくお願いします」という確認です。
3wayハンドシェイクの流れ
ブラウザーからサーバーへ接続する場合を、先ほどの会話に当てはめてみましょう。
| 順番 | 方向 | 会話のイメージ |
| ① | ブラウザー → サーバー | 「通信を始めてもいい?」 |
| ② | サーバー → ブラウザー | 「いいよ。こちらからも通信を始めていい?」 |
| ③ | ブラウザー → サーバー | 「いいよ!」 |
最後の返事があることで、サーバー側も、自分の返事がブラウザーに届いたことを確認できます。この3回のやり取りで接続を確立します。
実際には、日本語の会話ではなく、SYN → SYN+ACK → ACKという制御情報をやり取りします。SYNは接続開始時の番号の同期、ACKは受け取ったことの確認に使います。
ここでは、細かい名前を覚えるよりも、「一方的に送信を始めず、お互いに確認して接続を作る」と理解すれば十分です。
4wayハンドシェイクとは?

TCPの4wayハンドシェイクとは、接続を正常に終了するときに行う、代表的な4回のやり取りです。「フォーウェイハンドシェイク」と読みます。
3wayハンドシェイクが通信を始めるための確認なら、4wayハンドシェイクは、通信を終えるための「こちらは送り終わりました」という確認です。
4wayハンドシェイクの流れ
ブラウザー側から接続の終了を始める場合は、次のような流れになります。
| 順番 | 方向 | 会話のイメージ |
| ① | ブラウザー → サーバー | 「こちらから送るデータは、もうありません」 |
| ② | サーバー → ブラウザー | 「わかりました」 |
| ③ | サーバー → ブラウザー | 「こちらから送るデータも、もうありません」 |
| ④ | ブラウザー → サーバー | 「わかりました」 |
実際には、送信の終了を伝えるFINと、それを受け取ったことを確認するACKを使います。基本的な並びは、FIN → ACK → FIN → ACKです。
なぜ終了するときは4回なの?
片方が送り終わっても、もう片方には送るデータが残っている場合があるためです。
例えば、ブラウザーが「こちらから送るデータは、もうありません」と伝えても、サーバーは残りのデータを送信しているかもしれません。そのため、まず終了の通知を受け取ったことを返し、自分も送り終わってから、改めて終了を伝えます。
「相手が送り終わったこと」と「自分も送り終わったこと」を、それぞれ確認すると考えるとわかりやすくなります。
終了通知と返事をまとめて送る場合などもあるため、必ず4回になるわけではありません。ここでは、TCPの正常な終了の代表例として押さえておきましょう。
TLSハンドシェイクとは?

TLSハンドシェイクとは、通信相手の確認や暗号化の取り決めを行い、安全にデータをやり取りするための準備をする手順です。
TLSは、通信の盗聴や改ざんなどを防ぐための仕組みです。WebサイトをHTTPSで利用するときにも使われます。
例えば、ログイン画面でパスワードを送る場合、サーバーに接続できるだけでは十分ではありません。接続先を確認し、通信内容を保護して送る必要があります。
その準備を行うのが、TLSハンドシェイクです。
TLSハンドシェイクの流れ
一般的なHTTPSの接続で行う準備を、会話風に表すと次のようになります。
- ブラウザー:「このような暗号化の方式に対応しています」
- サーバー:「では、この方式を使いましょう。こちらがサーバーの証明書です」
- ブラウザー:「証明書などを確認し、通信を保護する準備を進めます」
これは役割をつかむためのイメージです。実際には、TLSのバージョンなどに応じたメッセージを使って、主に次のことを行います。
- 暗号化の方式を決める:双方が対応している方式から、使用するものを選ぶ。
- 通信相手を確認する:一般的なHTTPSでは、ブラウザーが証明書などを使ってサーバーを認証する。
- 暗号化に使う鍵を用意する:通信内容を保護するために必要な鍵を確立する。
証明書は、接続先のドメイン名などを確認するための、身分証明書のようなものです。ブラウザーは、証明書の有効期限や、信頼できる発行元につながるかなども確認します。
ここでは、「どの方式で暗号化するか」「接続先を信頼できるか」「通信を保護する鍵をどう用意するか」を確認・調整する手順と理解しましょう。
TLSハンドシェイクの具体的な手順は、TLS 1.2やTLS 1.3といったバージョンや、以前の接続情報を再利用するかどうかによって異なります。
3way・4way・TLSハンドシェイクの違い
3つの違いは、「何のために行うか」で整理するとわかりやすくなります。
| 種類 | 目的 | 簡単にいうと |
| 3wayハンドシェイク | TCPの接続を確立する | 「通信を始めましょう」という確認 |
| 4wayハンドシェイク | TCPの接続を正常に終了する | 「お互いに送り終わりました」という確認 |
| TLSハンドシェイク | 暗号化通信の準備をする | 「相手や暗号化の方式を確認しましょう」という取り決め |
TCPとTLSは役割が異なるため、同じ通信で両方のハンドシェイクを行うことがあります。
例えば、TCPを使うHTTPS通信で新しく接続する場合、基本的には次の順番で進みます。
- 3wayハンドシェイクで、TCPの接続を作る。
- TLSハンドシェイクで、暗号化通信の準備をする。
- Webページのデータなどを、暗号化してやり取りする。
接続を閉じる際には、TLSの終了通知に加えて、TCPでも4wayハンドシェイクなどの終了処理を行います。
本記事のまとめ
この記事では「通信のハンドシェイク」について、以下の内容を説明しました。
- ハンドシェイクは、通信相手と確認や取り決めを行う手順である。
- 3wayハンドシェイクは、3回のやり取りでTCPの接続を確立する。
- TCPの4wayハンドシェイクは、お互いの送信終了を確認する代表的な流れである。
- TLSハンドシェイクは、相手の認証や暗号化の取り決めなどを行い、通信を保護する準備をする。
お読みいただきありがとうございました。