質問: これから新たにWebsocketを利用したwebサイトを作成しようとしているのですが、 従来(本来?)のサーバーは一問一答で、クライアントからの要求に対してのみ応答しますが、(ポーリングなどを除く)Websocketを利用することで、サーバーからの情報のプッシュを行えるというのがWebsocketであるという程度の知識しかありません。 色々と検索してみると、httpをupgradeすることでhttpの枠組みを飛び出し、双方向通信を可能にする(大分省略しています)ようなことを書かれているものもあれば、httpとは別の仮のサーバーを構築して、、、的なことを書かれていたりします。 私の今の認識ではhttpでの通信とは別のWebsocket専用のサーバーをupgradeすることで使用できるようになり、そのサーバーではサーバーからのプッシュもできるよ、ポートもWebsocket専用のポートを使用するよといった感じなのですが、大きな勘違いをしている気がしてなりません。 Websocketとは具体的にはこういうものだよといったご説明をいただければ助かります。
回答: こんにちは。 WebSocketについて質問者様の理解で正しいと思うのですが、フォローくらいの意味で回答させていただこうと思います。 結論を書くと ・WebSocket用のサーバーを立てなければいけない ・WebSocket用のクライアントを使わなければいけない と言う部分はその通りなのですが、以下のようなプロトコルになっている為に、既存のHTTPの枠組みの上に成り立っていることで、HTTPの延長のように捉えることができます。 WebSocketでの送受信の開始 1. WebSocketクライアントは、**HTTPリクエスト※**で、「WebSocket使うよ」との付帯情報をHTTPリクエスト中に追加してサーバーに送信します。 ※**HTTPリクエスト**と言うことが重要です。 2. WebSocketサーバーは、クライアントからの「WebSocket使うよ」情報を認識してHTTPレスポンスで「OKです。今後、このコネクションでWebSocketプロトコルで通信できます」と返信します。一般的なHTTP通信ではこの後コネクションを切断しますが、切断しません。 3. WebSocketクライアントはWebSocket用の送受信を続行する。コネクションは切断されていないので、WebSocketサーバー側から能動的な送信(プッシュ)もできる。 とのようなことになっています。 upgradeとか単語が出てくるので混乱するのですが、HTTPリクエストのヘッダーフィールドに"upgrade"があって、値として"websocket"とセットしてあります。これを含むフィールドをサーバー側が見ることで、WebSocketか、またはこれまでのHTTPかをサーバー側が判断することができます。クライアントが「WebSocketプロトコルにアップグレードしますよ。」と宣言しているとでも取ればよいでしょうか。 対して 「WebSocketクライアント + 通常のHTTPサーバー」の構成であれば、例えばTCP80番ポート(HTTP)でWebSocketクライアントが「"WebSocket使うよ"HTTPリクエスト」を出してもサーバーが認識できないのでそれで終わります。WebSocketクライアントもHTTPレスポンスを見ることで「あ、サーバーが対応していないな。」と認識することができます。 WebSocketのサンプルプログラムなどではポート番号として8000等を使うことがありますが、これがwell-knownポート HTTP80番やHTTPS443番なら一般的なファイアウォールであれば開いていて、WebSocket用のポートをそれに合わせれば好都合です。 WebSocket関連の記事はサーバーとプロトコルの意識が混同していることもあって理解しづらかったりしますが、分けて考えると良いです。サーバーとクライアントは実装がたくさんあって混乱し易いので、先にプロトコル部分を簡単にでも理解すると整理できるかと。 過去の記事ですが、以下が分かり易いと思います。 WebSocketについて調べてみた。 上記の記事から紹介されていますが、以下もおすすめです。 Windows 8 と WebSocket プロトコル あとはやはりRFCでしょうか。 The WebSocket Protocol 非公式なようですが、日本語訳がこちら。(翻訳者様に感謝) WebSocket プロトコル RFC 6455, The WebSocket Protocol