WebSocket
作成日:
API web-development real-time-communication protocol
概要
WebSocketに関する知識とメモ
WebSocketとは
WebSocketは、クライアントとサーバー間で双方向のリアルタイム通信を可能にする通信プロトコルです。2011年にRFC 6455として標準化されました。
従来のHTTP通信では、クライアントがリクエストを送信し、サーバーがレスポンスを返すという一方向の通信モデルでした。WebSocketでは、一度接続を確立すると、クライアントとサーバーの両方からいつでもデータを送信できます。
HTTPとの違い
| 観点 | HTTP | WebSocket |
|---|---|---|
| 通信方向 | 一方向(リクエスト→レスポンス) | 双方向 |
| 接続 | リクエストごとに確立 | 永続的な接続を維持 |
| オーバーヘッド | 毎回ヘッダーを送信 | 初回接続後は軽量 |
| リアルタイム性 | ポーリングが必要 | プッシュ通知が可能 |
| プロトコル | http:// / https:// | ws:// / wss:// |
WebSocketの仕組み
ハンドシェイク
WebSocket接続は、HTTPリクエストを使用したハンドシェイクから始まります:
- クライアントがHTTP Upgradeリクエストを送信
- サーバーが101 Switching Protocolsで応答
- 接続がWebSocketプロトコルにアップグレード
通信フロー
クライアント サーバー
| |
|-- HTTP Upgrade Request ----->|
|<-- 101 Switching Protocols --|
| |
|====== WebSocket接続確立 ======|
| |
|<--------- メッセージ -------->|
|<--------- メッセージ -------->|
| (双方向通信) |
| |
WebSocketの特徴
- 低レイテンシ: 接続を維持するため、通信開始のオーバーヘッドが小さい
- 双方向通信: サーバーからクライアントへのプッシュ通知が可能
- 軽量: ヘッダーサイズが小さく、効率的なデータ転送
- 全二重通信: 同時に送受信が可能
主なユースケース
WebSocketは以下のようなリアルタイム性が求められるアプリケーションに適しています:
- チャットアプリケーション: メッセージの即時配信
- ライブ通知: SNSの通知、アラート
- 共同編集: Google Docsのようなリアルタイム共同編集
- オンラインゲーム: プレイヤー間のリアルタイム同期
- 金融データ: 株価、為替レートのリアルタイム更新
- IoTデバイス: センサーデータのストリーミング
代替技術との比較
ポーリング
クライアントが定期的にサーバーにリクエストを送信する方法。
- メリット: 実装が簡単、HTTPのみで実現可能
- デメリット: リソース消費が大きい、リアルタイム性が低い
Server-Sent Events (SSE)
サーバーからクライアントへの一方向プッシュ通信。
- メリット: HTTPベース、自動再接続
- デメリット: サーバー→クライアント方向のみ
WebSocket
- メリット: 双方向、低レイテンシ、軽量
- デメリット: 実装が複雑、ファイアウォール対応が必要な場合がある
| 技術 | 通信方向 | リアルタイム性 | 実装の複雑さ |
|---|---|---|---|
| ポーリング | クライアント→サーバー | 低 | 低 |
| SSE | サーバー→クライアント | 高 | 中 |
| WebSocket | 双方向 | 高 | 高 |
WebSocketを使用するサービス・ライブラリ
- Socket.IO: Node.js向けのリアルタイム通信ライブラリ
- Supabase Realtime: PostgreSQLの変更をリアルタイムで購読
- Firebase Realtime Database: Googleのリアルタイムデータベース
- Pusher: WebSocketを抽象化したサービス
注意点
制限事項
- 共有レンタルサーバーではWebSocketが使用できない場合がある
- プロキシやファイアウォールによりブロックされる可能性
- 接続維持のためサーバーリソースを消費
セキュリティ
- 本番環境では必ず
wss://(WebSocket Secure)を使用 - 認証・認可の仕組みを実装する
- 入力データのバリデーションを行う
関連トピック
参考
このページの内容は概念的な説明にとどめています。 具体的な実装方法については、各フレームワークやライブラリの公式ドキュメントを参照してください。