ハンドシェイク
Handshake
「ハンドシェイク(Handshake)」とは、通信を行う2つのコンピュータや機器が、実際のデータのやり取りを開始する前に、お互いの状態や通信条件(ルール)を確認し合い、接続を確立する手順のことです。人間が会話の前に握手を交わすように、安全で確実な通信のための「事前準備」にあたります。
🐾 猫で例えると?
鼻を近づけて相手の様子を確かめる2匹は、本題の前に準備を合わせるハンドシェイクのイメージです。ただし、何を確認するかは、通信の手順や約束事であるプロトコル次第です。TCPの接続開始と、TLSの証明書による相手の確認・暗号方式の合意は別の手順です。TCPの握手だけでは相手の身元を認証しません。
💻 IT現場における「ハンドシェイク」とは?
ITインフラやWeb開発の現場において、ハンドシェイクはTCP/IP通信やSSL/TLS(HTTPS)通信の根幹をなす非常に重要なプロセスです。単に「回線が繋がった」というだけでなく、「どのバージョンの暗号化方式を使うか」「データの送受信サイズはどれくらいにするか」といった細かいルールを両者で取り決める役割を持っています。
この事前の交渉(ネゴシエーション)が失敗すると、物理的にネットワークが繋がっていても通信エラー(Connection RefusedやTimeoutなど)が発生します。そのため、通信トラブルが起きた際は「ハンドシェイクが正常に完了しているか」を確認するのがエンジニアの定石です。
⚠️ ハンドシェイクの仕組みとメリット
代表例がTCPの3ウェイ・ハンドシェイクです。両側のシーケンス番号などを確認し、接続状態を作ります。接続が成立しても、その後の障害がなくなるわけではありません。
TCPの3ウェイ・ハンドシェイクの流れ
通常の例では、クライアントがSYN、サーバーがSYN+ACK、クライアントがACKを送ります。これは3つのメッセージであり、3往復ではありません。TCPの準備が整ったあと、HTTPSではTLSの交渉も必要になります。
// TCP 3ウェイ・ハンドシェイクのやり取り(イメージ)
Client -> [SYN] -> Server (「繋いでもいい?」)
Server -> [SYN, ACK] -> Client (「いいよ!そっちも準備OK?」)
Client -> [ACK] -> Server (「OK!よろしく!」)
// ここから初めて実際のデータ(HTTPリクエスト等)が送信される SYNの応答がない場合、相手の停止、途中のフィルタ、経路やパケットロスなど複数の原因が考えられます。TCPはつながるのにTLSで失敗するなら、証明書や対応プロトコルを調べるなど、どの段階まで進んだかで切り分けます。
🛠️ ハンドシェイクに関する技術的ポイントと注意点
ネットワークトラブルの調査や、Webサイトのパフォーマンス改善を行う際は、このハンドシェイクの仕組みを理解しておくことが不可欠です。
- 通信遅延(レイテンシ)に注意: セキュリティの高いSSL/TLSハンドシェイクは、暗号鍵の生成など複雑な計算と複数回のやり取りを伴うため、通信の確立までに時間がかかります。これがWebサイトの表示速度低下の原因になることもあります。
- セッション再利用による高速化: 毎回初めからフルで挨拶(ハンドシェイク)をしていると遅くなるため、一度仲良くなった(接続した)相手の情報を記憶し、2回目以降のハンドシェイクを省略・短縮する技術(TLSセッション再開など)を導入すると表示速度の改善に効果的です。
- ログやパケットの確認: 「サイトに繋がらない」という障害時は、Wiresharkなどのパケットキャプチャツールを使い、「3ウェイ・ハンドシェイクのどこで失敗しているか(SYNへの応答がない等)」を確認するのがネットワークエンジニアの基本スキルです。
猫たちの挨拶にも段階があるように、通信にも接続の準備、暗号の交渉、アプリの要求があります。「つながらない」を一括りにせず、どの挨拶で止まったかを確かめましょう。