WebSocketってなんだ?

リアルタイムにコミュニケーションできる何かが作りたくなりまして、最近よく聞くような気がするWebSocketというやつに手を出してみようと思いました。

ちょっと調べてみると、socket.ioとかNode.jsとか知らないことが多いし、そもそも負荷とかどうなんだろうと疑問は絶えない感じなので、少しずつまとめていきたいと思います。

WebSocket.org | Demos

ここにWebSocketのデモとかたくさんあります!

WebSocketはHTTPの双方向版

少し調べた結果「WebSocketはHTTPの双方向版」と言えるのかなと分かりました。

HTTPは、クライアントがサーバにリクエストを送った時にしか、サーバからデータを取得することができません。つまり、クライアントが能動的で、サーバは受動的にしか動くことができません。

WebSocketは、常にコネクションを維持することで、サーバからもクライアントからも能動的にデータを送受信することができます。

HTTPはプッシュ通知ができない

サーバが受動的にしか動けないことの何がいけないかといえば、プッシュ通知ができないことです。ユーザーの誰かによってサーバのデータが更新されても、他のユーザーに即座に伝えることができません。

チャットアプリのようなものが良い例だと思います。誰かが書き込みをしても、その時点では他のユーザーはその更新を知るすべはありません。昔むかし、ブラウザ上でチャットをしていた時は、自分で「リロード」ボタンを連打していたのを思い出します。

プッシュ通知もどきを実装するためには、大量のリクエスト

HTTPのみを使って、更新をできるだけリアルタイムに取得することを考えると、一定間隔でサーバに問い合わせする必要ができます。たとえば、5秒に1回、サーバに更新があるかを問い合わせれば、最大5秒程度の遅延でほぼリアルタイムな更新を取得することができます。

でも、最大5秒の遅延があったら、オンライン格闘ゲームのような応用はできませんし、その遅延を縮めるためには、膨大なリクエストをサーバに送り続けなければなりません。

WebSocketは接続しっぱなしにする

WebSocketはHTTPとよく似たリクエストで、サーバとの接続を確立します。確立された接続は、しばらく維持され、その間で双方向な通信ができます。サーバ側が能動的にデータを送信することもできるので、本当の意味でのプッシュ通知が実現できます。

WebSocketは接続しっぱなしなので、コネクションの専有時間は当然長いのですが、必要な時以外は処理が走らないので用途によってはむしろ低負荷になる、ということです。

WebSocketは「数秒以下の遅延が必要なリアルタイム通信」で使う!

遅延が10秒くらいあっても良い応用では、あえてWebSocketを使わなくても済みますが、数秒以下の遅延が必要な場合はHTTPを使う方がコストが大きくなってしまいます。そういうわけで、ざっくり調べたところでは、遅延を数秒以下に抑えたい場合には、WebSocketという選択肢が出てくるのかな、と感じました。

参考

WebSocket – Wikipedia

リクエストの例など載っています。ほぼHTTPのようなリクエストを送信しますが、以下の1行で、サーバはWebSocketと判定します。

Upgrade: websocket

したがって、リクエストの経路のどこかで、この1行が除去されてしまうと通常のHTTPとして処理されてしまいます。

初心者にも分かる Node.js と WebSocket についての解釈まとめ

WebSocketの説明については、このページが一番分かりやすいと思いました。擬似的な双方向通信Cometの説明なども分かりやすいです。

About katty0324

2 comments

Leave a Reply

Scroll To Top