WebSocket

作成日:
API web-development real-time-communication protocol

概要

WebSocketに関する知識とメモ

WebSocketとは

WebSocketは、クライアントとサーバー間で双方向のリアルタイム通信を可能にする通信プロトコルです。2011年にRFC 6455として標準化されました。

従来のHTTP通信では、クライアントがリクエストを送信し、サーバーがレスポンスを返すという一方向の通信モデルでした。WebSocketでは、一度接続を確立すると、クライアントとサーバーの両方からいつでもデータを送信できます。

HTTPとの違い

観点HTTPWebSocket
通信方向一方向(リクエスト→レスポンス)双方向
接続リクエストごとに確立永続的な接続を維持
オーバーヘッド毎回ヘッダーを送信初回接続後は軽量
リアルタイム性ポーリングが必要プッシュ通知が可能
プロトコルhttp:// / https://ws:// / wss://

WebSocketの仕組み

ハンドシェイク

WebSocket接続は、HTTPリクエストを使用したハンドシェイクから始まります:

  1. クライアントがHTTP Upgradeリクエストを送信
  2. サーバーが101 Switching Protocolsで応答
  3. 接続が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)を使用
  • 認証・認可の仕組みを実装する
  • 入力データのバリデーションを行う

関連トピック

  • REST API - 従来のHTTPベースのAPI
  • GraphQL - サブスクリプションでリアルタイム通信をサポート
  • Supabase - WebSocketベースのRealtime機能を提供

参考

このページの内容は概念的な説明にとどめています。 具体的な実装方法については、各フレームワークやライブラリの公式ドキュメントを参照してください。