操作して学ぶ

WebSocketハンドシェイク可視化

WebSocket はふつうの HTTP リクエストで始まり101 Switching Protocols を境に全二重通信へ「昇格」します。 その確立からフレームのやり取り、そして Close までを1ステップずつ追えます。 メッセージの色はフェーズ(HTTPハンドシェイク/データフレーム/制御フレーム)を表します。

クライアントブラウザ等サーバーWSサーバー▼ ここから WebSocket(全二重)1. Upgrade リクエスト(HTTP GET)2. 101 Switching Protocols3. テキストフレーム送信4. サーバーからプッシュ5. Ping(キープアライブ)6. Pong(応答)7. Close フレーム8. Close 応答
HTTP ハンドシェイクデータフレーム制御フレーム
1 / 8
HTTP ハンドシェイククライアントサーバー

1. Upgrade リクエスト(HTTP GET)

GET /chat HTTP/1.1Upgrade: websocketConnection: UpgradeSec-WebSocket-Key: (ランダム base64)Sec-WebSocket-Version: 13

WebSocket は普通の HTTP GET で始まる。だから 80/443 の同じポートを使え、既存のプロキシやファイアウォールを通り抜けられる。

要点Sec-WebSocket-Key はランダムな値で、認証ではない。「この応答が本当にこの握手への返事か」を確かめるための合図。

押さえどころ

  • なぜ HTTP で始めるのか。既存の 80/443 ポート・プロキシ・認証の仕組みをそのまま再利用できるから。専用ポートを開けずに、ファイアウォールを通り抜けられる。
  • 101 で「昇格」する。同じ TCP 接続が WebSocket に切り替わり、以降は HTTP のリクエスト/レスポンスではなくフレーム単位の通信になる。
  • 全二重が主眼。HTTP は「リクエスト → レスポンス」の交互だが、WebSocket は両者がいつでも送れる。サーバーからのリアルタイムなプッシュが可能になる。
  • マスクはセキュリティではない。クライアント → サーバーのフレームは必ずマスク(XOR)される。これは経路上のプロキシがフレームを HTTP と誤解してキャッシュを汚す攻撃を防ぐための仕組み。
  • Ping/Pong と Close。制御フレームで死活監視をし、終了はいきなり切らず Close フレームを交換してからクリーンに閉じる。

双方向のやり取りが要るならWebSocket。サーバー → クライアントの一方向で十分なら、HTTP のまま使える Server-Sent Events(SSE)のほうが軽く済みます。用途で選び分けます。