FIG-060

WebSocket — かけっぱなしの糸電話

Web 2026.06.26 公開 読了 約10分

ふつうのHTTPは「聞かれたら答える」だけの一問一答です。クライアントがリクエストして、サーバーが返したら、その通話は切れます。だからサーバーの側から「新着があったよ」と話しかけることができません。チャットや通知をHTTPだけで作ると、クライアントが「何かない?」と何度も聞きに行く(ポーリング)はめになります。

WebSocketは、最初に一度だけHTTPで「この線、つなぎっぱなしにしていい?」と交渉(ハンドシェイク)し、OKが出たらかけっぱなしの糸電話に切り替えます。以降はどちらからでも、いつでもメッセージを流せます。下の図1で、まず線をつなぎ、それから双方向に送ってみてください。

WEBSOCKET — ハンドシェイクで線を張り、双方向に流す
💻 クライアント ブラウザ
🖥️ サーバー ws://…
未接続(CLOSED)
READY
まずは「接続する」を押す
WebSocketは、いきなり双方向通信を始めるのではなく、最初に1回だけHTTPで「アップグレード」を交渉します。接続が確立(OPEN)してから、はじめて双方向にメッセージを送れます。
MESSAGE LOG
まだメッセージはありません。
図1 — 一度つないだ線の上を、クライアント発・サーバー発の両方が流れる

「つなぎっぱなし」だからサーバーから話しかけられる

最初のハンドシェイクは、ただのHTTPリクエストです。クライアントが Upgrade: websocket というヘッダ付きでお願いし、サーバーが 101 Switching Protocols を返すと、そのTCP接続をHTTPからWebSocketへ「乗り換え」ます。ここから先は、リクエスト/レスポンスの型を捨てて、同じ1本の線で双方向にデータを流せるようになります。

この「つなぎっぱなし」が効くのは、サーバー発の通知です。ポーリングでは、クライアントが聞きに来るまで新着を渡せず、間隔を短くすればムダな通信が増え、長くすれば遅れます。WebSocketなら、イベントが起きた瞬間にサーバーから pushできるので、チャット・株価・通知・オンライン対戦のようなリアルタイム用途にぴったりです。図1の「サーバーからプッシュ」を押すと、クライアントが何も要求していないのにメッセージが届くのが分かります。

用語ミニ辞書
ハンドシェイク
HTTPの Upgrade 要求と 101 応答で、接続をWebSocketへ乗り換える最初の交渉。
全二重
送受信を同時にできる通信。WebSocketは1本の接続で双方向に流せる。
ポーリング
クライアントが定期的に「新着ある?」と聞きに行く方式。ムダか遅延が避けにくい。
サーバープッシュ
要求を待たず、サーバー側の都合でクライアントへ送りつけること。

まとめ

WebSocketは、最初の1回だけHTTPで交渉して線を張り、あとは双方向に流しっぱなしにする仕組みです。一問一答のHTTPと違い、サーバーからいつでも話しかけられるのが最大の価値。「毎回つなぎ直して聞きに行く」のをやめて「つなぎっぱなしの糸電話」にする――この一手で、リアルタイムなやり取りが自然に書けるようになります。