通信のハンドシェイクとは?3way・4way・TLSの違いなどを解説!

ネットワークの仕組みを学んでいると、「ハンドシェイク」という言葉を目にすることがあります。

「3wayハンドシェイク」「4wayハンドシェイク」「TLSハンドシェイク」など、似た名前も出てくるため、何が違うのか迷う方もいるのではないでしょうか。

この記事では、通信のハンドシェイクについて、以下の内容を会話の例を交えてわかりやすく説明します。

  • ハンドシェイクの意味
  • 3wayハンドシェイクの役割と流れ
  • 4wayハンドシェイクの役割と流れ
  • TLSハンドシェイクの役割とTCPとの関係

ハンドシェイクとは?

ハンドシェイクとは?

ハンドシェイクとは、通信する相手と情報をやり取りし、通信の準備や条件などを確認・調整する手順です。

簡単にいうと、通信相手と交わす「準備はできていますか?」という確認です。

例えば、TCPで接続を始めるときのやり取りは、次のような会話をイメージするとわかりやすくなります。

  1. 自分 → 相手:「通信を始めてもいい?」
  2. 相手 → 自分:「いいよ。こちらからも通信を始めていい?」
  3. 自分 → 相手:「いいよ!」

このように、お互いに確認してから通信を始めます。この3回のやり取りが、後ほど説明する「3wayハンドシェイク」です。

ハンドシェイクには、このほかにも暗号化の準備をするものや、通信の終了を確認するものがあります。目的に応じて、確認する内容や手順が異なります。

英語の「handshake」には「握手」という意味があります。人が会話を始める前にあいさつを交わすように、コンピューター同士も、本格的なデータのやり取りに入る前に準備を整えます。

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

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

3wayハンドシェイクとは、TCPで接続を確立するときに行う、3回のやり取りです。「スリーウェイハンドシェイク」と読みます。

TCPは、データの順序を管理したり、届かなかったデータを再送したりする通信の仕組みです。そのTCPでデータをやり取りする前に、お互いの通信の準備を整えます。

イメージとしては、通信を始めるための「よろしくお願いします」という確認です。

3wayハンドシェイクの流れ

ブラウザーからサーバーへ接続する場合を、先ほどの会話に当てはめてみましょう。

順番方向会話のイメージ
①ブラウザー → サーバー「通信を始めてもいい?」
②サーバー → ブラウザー「いいよ。こちらからも通信を始めていい?」
③ブラウザー → サーバー「いいよ!」

最後の返事があることで、サーバー側も、自分の返事がブラウザーに届いたことを確認できます。この3回のやり取りで接続を確立します。

実際には、日本語の会話ではなく、SYN → SYN+ACK → ACKという制御情報をやり取りします。SYNは接続開始時の番号の同期、ACKは受け取ったことの確認に使います。

ここでは、細かい名前を覚えるよりも、「一方的に送信を始めず、お互いに確認して接続を作る」と理解すれば十分です。

4wayハンドシェイクとは?

4wayハンドシェイクとは?

TCPの4wayハンドシェイクとは、接続を正常に終了するときに行う、代表的な4回のやり取りです。「フォーウェイハンドシェイク」と読みます。

3wayハンドシェイクが通信を始めるための確認なら、4wayハンドシェイクは、通信を終えるための「こちらは送り終わりました」という確認です。

4wayハンドシェイクの流れ

ブラウザー側から接続の終了を始める場合は、次のような流れになります。

順番方向会話のイメージ
①ブラウザー → サーバー「こちらから送るデータは、もうありません」
②サーバー → ブラウザー「わかりました」
③サーバー → ブラウザー「こちらから送るデータも、もうありません」
④ブラウザー → サーバー「わかりました」

実際には、送信の終了を伝えるFINと、それを受け取ったことを確認するACKを使います。基本的な並びは、FIN → ACK → FIN → ACKです。

なぜ終了するときは4回なの?

片方が送り終わっても、もう片方には送るデータが残っている場合があるためです。

例えば、ブラウザーが「こちらから送るデータは、もうありません」と伝えても、サーバーは残りのデータを送信しているかもしれません。そのため、まず終了の通知を受け取ったことを返し、自分も送り終わってから、改めて終了を伝えます。

「相手が送り終わったこと」と「自分も送り終わったこと」を、それぞれ確認すると考えるとわかりやすくなります。

終了通知と返事をまとめて送る場合などもあるため、必ず4回になるわけではありません。ここでは、TCPの正常な終了の代表例として押さえておきましょう。

TLSハンドシェイクとは?

TLSハンドシェイクとは?

TLSハンドシェイクとは、通信相手の確認や暗号化の取り決めを行い、安全にデータをやり取りするための準備をする手順です。

TLSは、通信の盗聴や改ざんなどを防ぐための仕組みです。WebサイトをHTTPSで利用するときにも使われます。

例えば、ログイン画面でパスワードを送る場合、サーバーに接続できるだけでは十分ではありません。接続先を確認し、通信内容を保護して送る必要があります。

その準備を行うのが、TLSハンドシェイクです。

TLSハンドシェイクの流れ

一般的なHTTPSの接続で行う準備を、会話風に表すと次のようになります。

  1. ブラウザー:「このような暗号化の方式に対応しています」
  2. サーバー:「では、この方式を使いましょう。こちらがサーバーの証明書です」
  3. ブラウザー:「証明書などを確認し、通信を保護する準備を進めます」

これは役割をつかむためのイメージです。実際には、TLSのバージョンなどに応じたメッセージを使って、主に次のことを行います。

  • 暗号化の方式を決める:双方が対応している方式から、使用するものを選ぶ。
  • 通信相手を確認する:一般的なHTTPSでは、ブラウザーが証明書などを使ってサーバーを認証する。
  • 暗号化に使う鍵を用意する:通信内容を保護するために必要な鍵を確立する。

証明書は、接続先のドメイン名などを確認するための、身分証明書のようなものです。ブラウザーは、証明書の有効期限や、信頼できる発行元につながるかなども確認します。

ここでは、「どの方式で暗号化するか」「接続先を信頼できるか」「通信を保護する鍵をどう用意するか」を確認・調整する手順と理解しましょう。

TLSハンドシェイクの具体的な手順は、TLS 1.2やTLS 1.3といったバージョンや、以前の接続情報を再利用するかどうかによって異なります。

3way・4way・TLSハンドシェイクの違い

3つの違いは、「何のために行うか」で整理するとわかりやすくなります。

種類目的簡単にいうと
3wayハンドシェイクTCPの接続を確立する「通信を始めましょう」という確認
4wayハンドシェイクTCPの接続を正常に終了する「お互いに送り終わりました」という確認
TLSハンドシェイク暗号化通信の準備をする「相手や暗号化の方式を確認しましょう」という取り決め

TCPとTLSは役割が異なるため、同じ通信で両方のハンドシェイクを行うことがあります。

例えば、TCPを使うHTTPS通信で新しく接続する場合、基本的には次の順番で進みます。

  1. 3wayハンドシェイクで、TCPの接続を作る。
  2. TLSハンドシェイクで、暗号化通信の準備をする。
  3. Webページのデータなどを、暗号化してやり取りする。

接続を閉じる際には、TLSの終了通知に加えて、TCPでも4wayハンドシェイクなどの終了処理を行います。

本記事のまとめ

この記事では「通信のハンドシェイク」について、以下の内容を説明しました。

  • ハンドシェイクは、通信相手と確認や取り決めを行う手順である。
  • 3wayハンドシェイクは、3回のやり取りでTCPの接続を確立する。
  • TCPの4wayハンドシェイクは、お互いの送信終了を確認する代表的な流れである。
  • TLSハンドシェイクは、相手の認証や暗号化の取り決めなどを行い、通信を保護する準備をする。

お読みいただきありがとうございました。

スポンサーリンク