ついにRFCに登場!Webサーバとの双方向通信を実現する「WebSocket」

杉山貴章(オングス)
2012-01-06 09:00:00
  • このエントリーをはてなブックマークに追加

WebSocketによる通信

 WebSocketの場合、一度コネクションが確立してからはそのコネクションを利用して独自のプロトコルで通信が行われる。リクエスト/レスポンスのたびにHTTPのコネクションを張るAjaxやCometとはその点が決定的に異なる。

 WebSocketでは、通信時に指定するURLは、プロトコル部分に「http:」ではなく「ws:」または「wss:」を使用する。コネクションの確立(ハンドシェイク)にはHTTPヘッダが利用されるので、サーバは最初はHTTPの接続リクエストとして処理するが、それ以降はWebSocketプロトコルを利用するように切り替えられる。ハンドシェイクの際にブラウザからサーバに送られるヘッダは次のような形式になる。

ハンドシェイクの際にブラウザから送られるリクエスト・ヘッダの例(出典:The WebSocket Protocol

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

 HTTPヘッダのUpgradeフィールドを利用して使用するプロトコルの変更が行われる仕組みになっていることが分かる。Hostフィールドには接続先、Sec-WebSocket-Keyにはハンドシェイク・レスポンスを得るためのキー、Sec-WebSocket-Protocolフィールドには使用するサブプロトコルを指定する。これに対して、サーバからは次のようなレスポンス・ヘッダが返される。Sec-WebSocket-AcceptはSec-WebSocket-Keyの値を元に生成されたものとなる。

サーバから返されるレスポンス・ヘッダの例(出典:The WebSocket Protocol

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

 コネクションが確立した後は、独自のデータフレームを利用して通信を行う(データフレームに関してはRFC 6455のSection 5を参照)。HTTPのように通信のたびにハンドシェイクを行う必要がないためオーバーヘッドが少なく、またヘッダも小さいことから通信量を削減できる。通信は双方向に行うことが可能で、ブラウザからのリクエストに対する応答だけでなく、サーバからのプッシュ配信もできるようになっている。また、データフレームは乱数によるマスクを行うことでspoofingなどの攻撃への耐性を確保している。

WebSocketにアクセスするための「The WebSocket API」

  • コメント(2件)
#1 m11m   2012-01-06 20:23:50
>>(これをポーリングと呼ぶ)
呼びません。
#2 builder編集部   2012-01-06 21:50:42
m11m 様

builder編集部です。ご指摘、ありがとうございました。

「ポーリング」についてですが、ご指摘の通り誤りでしたので、下記の通り修正いたしました。

修正前:
Cometは、サーバ側でリクエストに対する保留状態を作っておき(これをポーリングと呼ぶ)、任意のタイミングでレスポンスを返すという方法によってプッシュ配信を実現する。

修正後:
サーバ側でリクエストに対する保留状態を作っておき、任意のタイミングでレスポンスを返すという方法によってプッシュ配信を実現する(この方式を「ロングポーリング」と呼ぶ)。

この度はご迷惑をおかけしまして、誠に申し訳ございませんでした。
今後もご愛読頂ければ幸いです。よろしくお願いいたします。
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]