WebSocketとは
WebSocketは、単一のTCP接続上で全二重(フルデュプレックス)の双方向通信チャネルを提供する通信プロトコルです。厳密なリクエスト・レスポンスパターンに従うHTTPとは異なり、WebSocketでは接続確立後にクライアントとサーバーがそれぞれ任意のタイミングで独立してメッセージを送信できます。
WebSocketプロトコルは、URLスキーム`ws://`(暗号化なし)および`wss://`(暗号化あり、HTTPSに相当)によって識別されます。それぞれポート80および443で動作するため、プロキシやファイアウォールを含む既存のWebインフラと互換性があります。
アップグレードハンドシェイク
WebSocket接続は通常のHTTPリクエストとして開始されます。クライアントは、サーバーに対して接続をWebSocketにアップグレードするよう要求する特別なヘッダー付きのHTTPリクエストを送信します。この処理をアップグレードハンドシェイクと呼びます。
最初のリクエストのHTTPアップグレードの内容は以下のとおりです:
サーバーは`101 Switching Protocols`ステータスコードを返して、プロトコルのアップグレードを確認します。このハンドシェイクの後は、基盤となるTCP接続がオープンのまま維持され、両者は接続を再確立することなく自由にメッセージを交換できます。
覚えておくべき主要なヘッダー:
- `Upgrade: websocket`および`Connection: Upgrade`はプロトコルの切り替え意図を示します。- `Sec-WebSocket-Key`はランダムに生成されたbase64エンコード値で、サーバーがリクエストを受信したことを証明するために使用します。- `Sec-WebSocket-Version: 13`はプロトコルのバージョンを指定します。
HTTPとWebSocketのアーキテクチャの違い
HTTPは1リクエスト・1レスポンスのサイクルで動作します。各やり取りにはクライアントからの新しいリクエストが必要で、サーバーはクライアントが先に要求しない限りデータを送信できません。このモデルはシンプルですが、チャットアプリ、ライブ通知、共同編集などのリアルタイム機能には非効率です。
WebSocketは永続的な接続を維持することでこの問題を解決します。ハンドシェイク後は、新しいデータが利用可能になったタイミングでサーバーがクライアントに更新をプッシュでき、クライアントはポーリングを待たずにメッセージを送信できます。
通信フローの簡単な比較は以下のとおりです:
パフォーマンスの考慮事項
WebSocketの主なパフォーマンス上の利点は、反復する接続オーバーヘッドを排除できる点にあります。HTTPポーリングでは、サーバーに新しい情報がなくても、すべてのリクエストが完全なヘッダーデータ(通常500〜800バイト)を運びます。WebSocketでは、最初のハンドシェイクの後、ほとんどのフレームで2〜6バイトという小さなフレームヘッダーのみを伝送します。
このため、WebSocketは次のような用途で大幅に効率的になります:
- メッセージが双方向に頻繁にやり取りされるチャットアプリケーション。- リアルタイムで変化するデータを表示するライブダッシュボード。- 低遅延の状態同期が必要なマルチプレイヤーゲーム。- 複数ユーザーが共有コンテンツを編集する共同編集ツール。
ただし、WebSocketはすべてのシナリオに最適とは限りません。単純な一回限りのデータ取得、静的コンテンツ配信、REST API呼び出しは従来のHTTPの方が適しています。
よくある落とし穴と誤解
よくある間違いは、WebSocketがHTTPを完全に置き換えると考えることです。実際の多くのアプリケーションでは両方を併用しています。初期ページロード、認証、REST APIにはHTTPを使用し、本当に双方向プッシュが必要なリアルタイムチャネルにのみWebSocketを使用します。
もう一つの誤解は、WebSocketが自動的にセキュリティを提供するというものです。HTTPと同様に、伝送中のデータを保護するには`wss://`(TLS暗号化)を使用する必要があります。暗号化されていない`ws://`接続は、平文HTTPと同様に脆弱です。
最後に、接続管理が重要です。WebSocket接続は、ネットワーク中断、プロキシのタイムアウト、サーバーの再起動などにより切断される可能性があります。本番環境のアプリケーションでは、クライアント側に再接続ロジックを実装し、デッドコネクションを検出するためのハートビート機構(ping/pongフレーム)を設ける必要があります。
まとめ
WebSocketは、最初のHTTP接続を永続的な全二重チャネルにアップグレードすることで、リアルタイムの双方向通信を可能にします。アップグレードハンドシェイクでは特定のヘッダーが使用され、サーバーは`101 Switching Protocols`を返します。確立後は、クライアントとサーバーの双方が最小限のオーバーヘッドで独立してデータを送信でき、リアルタイム機能に最適な選択肢となります。WebSocketはHTTPを置き換えるのではなく補完するものであること、そして本番実装には適切な暗号化、再接続処理、接続の健全性監視が必要であることを覚えておいてください。
レッスンのチェックポイント