WebSocket (RFC 6455)(ウェブソケット)
IETF 2011年12月標準化の双方向Web 通信プロトコル。HTTP Upgrade Handshake からTCP上で全二重通信、リアルタイムWeb アプリの定番。
概要
WebSocket はIETF が2011年12月にRFC 6455 として標準化、W3C が同時にWebSocket API 公開した双方向Web 通信プロトコル。HTTP 1.1 Upgrade Handshake (HTTP Upgrade: websocket) でHTTP 接続をWebSocket にアップグレード、その後TCP上で全二重 (Full Duplex) ・低遅延・小オーバーヘッド (フレーム最小2 byte) で双方向通信を実現する、リアルタイムWeb アプリの定番プロトコル。
WebSocket Upgrade Handshake
クライアント → サーバ:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
サーバ → クライアント:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
→ WebSocket 接続確立・以後フレーム送受信
WebSocket 主要機能
| 機能 | 内容 |
|---|---|
| トランスポート | TCP (Port 80 / 443) |
| 接続方式 | HTTP Upgrade Handshake |
| Full Duplex | あり |
| バイナリ / テキスト | 両方サポート |
| フレームサイズ | 最小2 byte (HTTP/1 50-200 byte 比軽量) |
| ping / pong | あり (Keep-Alive) |
| Close Frame | あり (4 byte code + reason) |
| Subprotocol | あり (Sec-WebSocket-Protocol) |
| Extensions | あり (compression 等) |
| 暗号化 | wss:// (TLS) |
WebSocket vs HTTP Polling
リアルタイム通信のアプローチ比較:
| 手法 | レイテンシ | サーバ負荷 | 帯域効率 |
|---|---|---|---|
| HTTP Long Polling | 1-10s | 高 | 低 |
| HTTP Short Polling | 0.5-5s | 極高 | 極低 |
| HTTP Server-Sent Events | <1s | 中 | 中 |
| WebSocket | <100ms | 低 | 高 |
| QUIC + HTTP/3 | <50ms | 低 | 高 |
主要採用
| サービス | 用途 |
|---|---|
| Slack | リアルタイムメッセージ |
| Discord | チャット・音声 / Voice接続 |
| Notion | リアルタイム共同編集 |
| Google Docs | リアルタイム共同編集 (旧) |
| Trading Platforms | 株価・為替リアルタイム |
| MMORPG | プレイヤ状態同期 |
| Zoom / WebRTC signal | 接続制御 |
| Twitch / YouTube | チャット |
| GitHub | リアルタイム通知 |
主要ライブラリ
| 言語 | ライブラリ |
|---|---|
| JavaScript (Browser) | ネイティブWebSocket API |
| Node.js | ws / socket.io |
| Python | websockets / asyncio |
| Go | gorilla/websocket / nhooyr |
| Java | Spring WebSocket / Jetty |
| C# | .NET WebSocket / SignalR |
| Rust | tokio-tungstenite |
Socket.IO
WebSocket 上の高水準ライブラリ (2010-):
- 自動Fallback (HTTP Polling 経由)
- Room / Namespace 機能
- Acknowledgement
- Auto Reconnection
- 利用大手: Slack初期 / Microsoft Office / Trello
WebSocket より使いやすいAPI で、Node.js + Socket.IO は WebRTC / WebSocket アプリの定番。
WebSocket セキュリティ
| 脅威 | 対策 |
|---|---|
| 中間者攻撃 | wss:// (TLS 強制) |
| Cross-Site Hijacking | Sec-WebSocket-Key 検証 |
| Origin Header Bypass | Origin 検証 |
| Permission Header | CORS 対応 |
| DoS 攻撃 | Rate Limiting・接続数制限 |
| ハンドシェイクFlood | 認証要求 |
関連用語との違い
- vs HTTP: 単方向Request/Response / 双方向
- vs SSE (Server-Sent Events): 双方向 / サーバ→クライアント片方向
- vs WebRTC: WebSocket はサーバ経由 / WebRTC は P2P
- vs gRPC: WebSocket は単独メッセージ / gRPC は構造化Streaming
FAQ
Q1: HTTP/2 で WebSocket 不要? A: HTTP/2 Stream 多重化はあるが、双方向Push はWebSocket / SSE が依然有利。HTTP/2 over WebSocket (RFC 8441) も存在。
Q2: HTTP/3 / QUIC で? A: QUIC は Stream 多重化標準・WebSocket over HTTP/3 (RFC 9220・2022年6月) で QUIC ベースのWebSocket 可能。新規実装は HTTP/3 + Stream 優位。
Q3: 接続数上限? A: ブラウザは1 オリジンあたり6 並列が伝統的制限 (HTTP/1.1 同様)・WebSocket は別カウントで余裕あり。サーバ側は数万-数十万同時接続可能 (Linux epoll + 効率実装)。