MENU

WebSocket — ブラウザとサーバが常時双方向で対話する仕組み

WebSocket アイキャッチ
WebSocket

WebSocketは、HTTPで確立したコネクションを「Upgrade」してそのまま双方向のフルデュプレックス通信に切り替える、リアルタイムWeb向けのプロトコルです。2011年12月にIETFのRFC 6455として標準化され、W3C側のJavaScript APIと合わせて主要ブラウザに実装されました。チャット、株価ティッカー、共同編集、オンラインゲーム、IoTダッシュボードなど、「サーバからもクライアントへ随時情報を送りたい」用途で、ポーリングや長時間接続に代わる事実上の標準となっています。

目次

この記事の目次

  1. HTTPからのUpgradeで開始
  2. ポーリングからの解放
  3. RFC 6455までの歴史
  4. 代表的なユースケース
  5. まとめ

HTTPからのUpgradeで開始

HTTPからのUpgradeで開始

WebSocket通信は、最初はHTTP/1.1のGETリクエストとして開始されます。クライアントはUpgrade: websocketConnection: Upgradeヘッダ、Sec-WebSocket-Keyにランダム値を載せて送り、サーバはこれを受けて101 Switching Protocolsを返し、同じTCPコネクションをWebSocketプロトコルに切り替えます。

切り替え後はHTTPではなく、ヘッダが最小2バイトのバイナリフレーム形式で通信します。テキスト・バイナリ・Close・Ping・Pongなどのフレームタイプがあり、サーバ・クライアントどちらからでも非同期にメッセージを送れます。ws://(平文)とwss://(TLS上)の2つのURIスキームがあり、現代では実質wssしか使われません。ポート番号は通常80番と443番で、既存のHTTPインフラ(プロキシ、LB、ファイアウォール)と同じ経路を通せるのが大きな利点です。

ポーリングからの解放

ポーリングからの解放

WebSocket登場以前、ブラウザがサーバからリアルタイムにデータを受け取るには、数百ms~数秒ごとにAjaxでHTTPを叩く「短ポーリング」や、応答を意図的に保留する「長ポーリング(Comet)」、サーバ→ブラウザ片方向のServer-Sent Events(SSE)などを組み合わせるしかありませんでした。どれもHTTPヘッダのオーバーヘッドや実装の複雑さが大きく、スケーラビリティに難がありました。

WebSocketは1本のTCPコネクションを開きっぱなしで、2バイトヘッダのフレームをやり取りするだけなので、毎回のHTTPヘッダ送信が不要となりオーバーヘッドが桁違いに小さくなります。サーバから即時通知できるため、チャットの新着メッセージや株価更新を遅延なく届けられ、双方向対称なので「クライアントが送って、サーバが受けて、サーバが返す」というRPC的やり取りも自然に書けます。現代のリアルタイムWeb機能のほぼ全てが、WebSocketの上に成り立っています。

RFC 6455までの歴史

RFC 6455までの歴史

WebSocketの設計はGoogle、Apple、Mozilla、Microsoftらが参加するWHATWGで2008年頃から議論が始まりました。当時はHTML5の一部として「Web Sockets API」が提案され、ブラウザ側のJavaScript APIが先に実装されました。しかし2010年、初期実装にあったセキュリティ問題(プロキシ汚染攻撃)が指摘され、各ブラウザは一時的に無効化を余儀なくされます。

問題を解決するためにフレームマスキングなどのセキュリティ機構が追加され、2011年12月、IETFのIan Fette編集によりRFC 6455として正式版が公開されました。JavaScript API側はW3Cで2012年に勧告となり、Chrome、Firefox、Safari、IE10以降の全主要ブラウザで利用可能になりました。Socket.IOのようなフォールバック付きライブラリが先行普及していたこともあり、APIが整った直後から幅広い採用が進みました。

代表的なユースケース

代表的なユースケース

WebSocketのもっとも分かりやすい用途はチャットアプリです。SlackやDiscordはWebSocketを使って新着メッセージを即時にブラウザへ届け、入力中インジケータも双方向通信で実現しています。ライブ配信のコメント欄やSNSの通知バッジも同じ仕組みで、サーバ側はpub/subで配信、クライアント側はWebSocketで受信、という設計が一般的です。

金融系では証券会社や暗号資産取引所が、株価や板情報をWebSocketで配信するのが標準になりました。Google DocsやNotion、Figma、Miroなどの共同編集ツールは、編集差分をWebSocketで全参加者へ即時に届け、CRDTやOTで競合を解消します。オンラインゲームのロビーや、IoTセンサーから集めたデータをダッシュボードへ即時反映する用途でも広く使われており、「サーバから随時情報を流したい」全領域で第一選択肢となるプロトコルです。

まとめ

WebSocketはRFC 6455として2011年に標準化され、HTTPのUpgradeを利用してフルデュプレックス通信を実現する技術です。ポーリングに代わるリアルタイムWebの主役として、チャットから共同編集まで幅広い領域で使われています。HTTP/2やHTTP/3が普及した現在も、双方向対称通信の手段としてWebSocketは欠かせない存在です。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次