WebSocketはHTTPとどう関係しているか
WebSocketをHTTPを置き換えるものだと考えがちですが、実際にはHTTPリクエストとして始まり、ハンドシェイクが成功して初めて(ステータスコード101で)プロトコルが切り替わります。つまりWebSocketサーバーは最初のHTTPリクエストを正しく処理する必要があり、通常のHTTPしか理解しない一部の古いプロキシや厳格なファイアウォールなどのインフラが、このアップグレードを妨げることがあります。
実運用のWebSocketアプリに追加の仕組みが必要な理由
スマートフォンがWi-Fiからモバイル回線へ切り替わったり、パソコンがスリープ状態になったりすると、基本的なWebSocket接続はどちらの側も気づかないまま静かに切断されることがあります。そのため実際のアプリケーションでは、接続の生死を検知するための定期的なping/pongハートビートフレームや、自動的に回復する再接続処理を組み込むのが一般的です。また、各WebSocket接続はステートレスなHTTPリクエストとは異なり、長時間状態を保持し続けるものであるため、WebSocketサービスを複数のサーバーへスケールさせるには、スティッキーセッションや共有メッセージブローカーなどを用いて、クライアントが常に自分の接続状態を保持しているサーバーへたどり着けるようにする追加の工夫が必要になります。
よくある質問
ファイアウォールでWebSocket接続がブロックされることはありますか?
はい。一部の厳格な社内ネットワークや公共Wi-Fiのファイアウォールは、標準のHTTP・HTTPSポート(80・443)以外への接続やプロトコルアップグレードのリクエストをブロックすることがあります。ただし、ほとんどのWebSocketサービスは通常HTTPSが使う443番ポートをそのまま利用することで、こうした問題を最小限に抑えています。
WebSocketはモバイル環境でも安定して動作しますか?
モバイル回線の切り替え(Wi-Fi⇔セルラー)や、画面が消えてアプリがバックグラウンドに移行したタイミングで接続が切れることがあるため、実務では接続が切れた際に自動的に再接続を試みる処理を合わせて実装するのが一般的です。