WebSocket(ウェブソケット)
全二重HTTP代替プロトコル(RFC 6455)。ws://wss://・HTTP Upgrade handshake・binary/text frame・Ping/Pong・subprotocol・Socket.IO 4.8・µWebSockets・ws(Node)・starlette.websockets(FastAPI)・uWebSockets.js・Tungstenite(Rust)・Hono WebSocket 2026年主要ライブラリ、Pub/Sub+WebRTC signaling定番。
概要
WebSocket(ウェブソケット)は、RFC 6455 で定義された全二重通信プロトコルである。HTTP の Upgrade ヘッダーを使って接続を確立し、以降は TCP のストリーム上でテキストまたはバイナリフレームを送受信する。ブラウザとサーバ間のリアルタイム通信を実現し、チャット、ゲーム、IoT など多岐にわたるアプリケーションで採用されている。
主な特徴・仕組み
- Upgrade Handshake:ws:// または wss:// で開始し、HTTP から WebSocket へ切り替える。
- フレーム形式:テキストフレーム(最大 16KB)とバイナリフレーム(最大 64KB)を送受信。
- Ping/Pong:接続の健全性を確認するためのハートビート。
- サブプロトコル:Socket.IO 4.8、µWebSockets、uWebSockets.js などが実装。
- TLS 1.3:wss:// で暗号化通信を行い、レイテンシは 1.2ms 程度。
スペック/製品比較表
| ライブラリ | バージョン | 最大同時接続 | レイテンシ | スループット | 主な特徴 |
|---|---|---|---|---|---|
| Socket.IO | 4.8.0 | 100,000 | 3.5ms | 5Gbps | イベント駆動 |
| uWebSockets.js | 20.0 | 1,000,000 | 1.2ms | 10Gbps | 高速 C++ |
| µWebSockets | 0.18 | 200,000 | 2.0ms | 6Gbps | 軽量 |
| Tungstenite | 0.18 | 50,000 | 4.0ms | 4Gbps | Rust |
| Hono | 3.0 | 30,000 | 5.5ms | 3Gbps | Deno/Node |
具体例・対応製品
- Node.js v18.12:標準モジュール
wsで WebSocket を扱える。 - Starlette 0.26:Python の非同期フレームワークで
starlette.websocketsが利用可能。 - FastAPI:Starlette をベースにし、
fastapi.websocketsで簡易実装。 - uWebSockets.js v20.0:C++ バックエンドで 1,000,000 同時接続を実現。
- Tungstenite v0.18:Rust で安全かつ高速な実装。
自作PCでの選び方・注意点
- CPU は 2.5GHz 以上のデュアルコアで、スレッド数が多いほどスループットが向上。
- メモリは 8GB 以上推奨。
- ネットワークカードは 10Gbps 以上の PCIe 4.0 x16 を選択。
- TLS 1.3 をサポートするハードウェアアクセラレーションを備えたカードが望ましい。
- バッファサイズ:64KB を確保し、フレーム破損を防止。
- レイテンシ:1.2ms 未満を目指す。
- アップグレードタイム:200µs 以内に完了するハードウェアが有利。
- 電源:650W 以上の 80+ Gold 以上を推奨。
- 冷却:CPU とネットワークカードの熱を抑えるために 120mm ファンを設置。
- OS:Linux 5.15 以上で、カーネルの TCP スタックが最適化されていること。
関連用語との違い
- HTTP/2:単方向ストリームであり、全二重通信は不可。
- MQTT:軽量メッセージングプロトコルで、サブスクライブ/パブリッシュが中心。
- WebRTC:ピアツーピア通信で、シグナリングに WebSocket を利用するケースが多い。
- SignalR:Microsoft のリアルタイムライブラリで、WebSocket を内部で使用。
よくある質問
Q1. WebSocket はブラウザ以外でも使える?
A1. はい。Node.js の ws、Python の websockets、Rust の Tungstenite など、サーバ側で実装可能。
Q2. TLS 1.3 でレイテンシが増えるのはなぜ?
A2. 暗号化処理が追加されるが、ハードウェアアクセラレーションにより 1.2ms 以内に抑えられる。
Q3. 1,000,000 同時接続を実現するには?
A3. uWebSockets.js のような高性能ライブラリと、10Gbps PCIe 4.0 x16 のネットワークカードを組み合わせる。
まとめ
WebSocket は、HTTP の Upgrade を経て全二重通信を実現するプロトコルである。2025年に登場した Socket.IO 4.8 と 2026年に改良された uWebSockets.js は、最大同時接続数 1,000,000 を実現し、レイテンシは 1.2ms 程度。自作PCでの構築では、CPU、メモリ、ネットワークカード、TLS アクセラレーションを重視し、バッファサイズやアップグレードタイムを最適化することが鍵となる。次世代のリアルタイムアプリケーションを開発する際は、これらの要素を総合的に検討し、最適なライブラリとハードウェアを選択することが重要である。