メインコンテンツまでスキップ

1. Introduction (はじめに)

WebSocketプロトコル (WebSocket Protocol) は、単一のTCP接続上でクライアントとサーバー間の全二重通信 (Full-Duplex Communication) を実現します。このプロトコルは、オープニングハンドシェイク (Opening Handshake) と、その後のTCP上に階層化された基本的なメッセージフレーミング (Message Framing) で構成されます。

本仕様の目標は、複数のHTTP接続を開くこと(例えば、XMLHttpRequestや <iframe> と長時間ポーリング (Long Polling) を使用すること)に依存しない、サーバーとの双方向通信を必要とするブラウザベースのアプリケーションにメカニズムを提供することです。

1.1 Background (背景)

歴史的に、クライアントとサーバー間の双方向通信を必要とするWebアプリケーション(例えば、インスタントメッセージングやゲームアプリケーション)を作成するには、サーバーの更新をポーリングすると同時に、別個のHTTP呼び出しとして上りの通知を送信するために、HTTPを乱用する必要がありました。

これにより、さまざまな問題が発生します:

  • サーバーは各クライアントに対して多数の異なる基礎的なTCP接続を使用することを強いられます:クライアントへの情報送信用に1つ、各着信メッセージ用に新しい接続
  • 各クライアントからサーバーへのメッセージにHTTPヘッダーがあるため、ワイヤープロトコル (Wire Protocol) のオーバーヘッドが高い
  • クライアント側のスクリプトは、応答を追跡するために、送信接続から受信接続へのマッピングを維持することを強いられます

より簡単な解決策は、双方向のトラフィックに単一のTCP接続を使用することです。これがWebSocketプロトコルが提供するものです。WebSocket APIと組み合わせることで、Webページからリモートサーバーへの双方向通信のためのHTTPポーリングの代替手段を提供します。

1.2 Protocol Overview (プロトコル概要)

プロトコルには2つの部分があります:ハンドシェイク (Handshake) とデータ転送 (Data Transfer)。

クライアントからのハンドシェイクは次のようになります:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

サーバーからのハンドシェイクは次のようになります:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

ハンドシェイクの重要なポイント:

  • クライアントリクエストは有効なHTTPアップグレードリクエスト (HTTP Upgrade Request) です
  • 複数のWebSocket固有のヘッダーが追加されます
  • サーバーはステータスコード101で応答します

接続が確立されると、クライアントとサーバーはいつでも双方向でデータを送受信できます。

1.3 Design Philosophy (設計思想)

WebSocketプロトコルは、以下の原則に基づいて設計されています:

  1. ストリームベースではなくフレームベースのプロトコル: フレームベースのプロトコル (Frame-based Protocol) により、メタデータを各フレームに関連付けることができ、プロトコルがアプリケーション層へのメッセージ境界 (Message Boundaries) を保持することができます
  2. オリジンモデル: セキュリティを確保するためにブラウザのオリジンモデル (Origin Model) を使用します
  3. 単一TCP接続: HTTPポート80と443で動作するため
  4. HTTPから独立: ハンドシェイクはHTTPサーバーによってアップグレードリクエストとして解釈されますが、プロトコル自体は独立しています
  5. 拡張性: 拡張とサブプロトコルメカニズムを通じて将来の拡張をサポートします

1.4 Security Model (セキュリティモデル)

WebSocketプロトコルは、Webブラウザで一般的に使用されるオリジンモデル (Origin Model) を使用します。このプロトコルには、サーバーが特定のオリジンからのWebSocket接続を受け入れるかどうかを決定するために使用できるオリジンヘッダーフィールド (Origin Header Field) が含まれています。

さらに:

  • TLS暗号化接続(wss://)の使用が推奨されます
  • クライアントからサーバーへのフレームはマスク処理 (Masking) されなければなりません
  • プロトコルには、キャッシュポイズニング (Cache Poisoning) を防ぐためのフレームタイプ、オペコード (Opcode) などが含まれています

参考リンク