WebSocket — かけっぱなしの糸電話
ふつうのHTTPは「聞かれたら答える」だけの一問一答です。クライアントがリクエストして、サーバーが返したら、その通話は切れます。だからサーバーの側から「新着があったよ」と話しかけることができません。チャットや通知をHTTPだけで作ると、クライアントが「何かない?」と何度も聞きに行く(ポーリング)はめになります。
WebSocketは、最初に一度だけHTTPで「この線、つなぎっぱなしにしていい?」と交渉(ハンドシェイク)し、OKが出たらかけっぱなしの糸電話に切り替えます。以降はどちらからでも、いつでもメッセージを流せます。下の図1で、まず線をつなぎ、それから双方向に送ってみてください。
「つなぎっぱなし」だからサーバーから話しかけられる
最初のハンドシェイクは、ただのHTTPリクエストです。クライアントが Upgrade: websocket というヘッダ付きでお願いし、サーバーが 101 Switching Protocols を返すと、そのTCP接続をHTTPからWebSocketへ「乗り換え」ます。ここから先は、リクエスト/レスポンスの型を捨てて、同じ1本の線で双方向にデータを流せるようになります。
この「つなぎっぱなし」が効くのは、サーバー発の通知です。ポーリングでは、クライアントが聞きに来るまで新着を渡せず、間隔を短くすればムダな通信が増え、長くすれば遅れます。WebSocketなら、イベントが起きた瞬間にサーバーから pushできるので、チャット・株価・通知・オンライン対戦のようなリアルタイム用途にぴったりです。図1の「サーバーからプッシュ」を押すと、クライアントが何も要求していないのにメッセージが届くのが分かります。
- ハンドシェイク
- HTTPの Upgrade 要求と 101 応答で、接続をWebSocketへ乗り換える最初の交渉。
- 全二重
- 送受信を同時にできる通信。WebSocketは1本の接続で双方向に流せる。
- ポーリング
- クライアントが定期的に「新着ある?」と聞きに行く方式。ムダか遅延が避けにくい。
- サーバープッシュ
- 要求を待たず、サーバー側の都合でクライアントへ送りつけること。
まとめ
WebSocketは、最初の1回だけHTTPで交渉して線を張り、あとは双方向に流しっぱなしにする仕組みです。一問一答のHTTPと違い、サーバーからいつでも話しかけられるのが最大の価値。「毎回つなぎ直して聞きに行く」のをやめて「つなぎっぱなしの糸電話」にする――この一手で、リアルタイムなやり取りが自然に書けるようになります。