コンテンツにスキップ

WebSocket

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。MoreNet (会話 | 投稿記録) による 2012年11月11日 (日) 06:01個人設定で未設定ならUTC)時点の版 (→‎サーバー)であり、現在の版とは大きく異なる場合があります。

WebSocket(ウェブソケット)は、コンピュータ・ネットワーク用の通信規格の1つである。インターネットの標準化団体であるW3CIETFウェブサーバーウェブブラウザとの間の通信のために規定を予定している双方向通信用の技術規格であり、APIはW3Cが、WebSocket プロトコルはIETFが策定に関与している。プロトコルの仕様は RFC 6455TCP上で動く。

概要

XMLHttpRequestの欠点を解決する技術として開発されており、現在のComet等に取って代わることを目標としている。

いわゆるAjaxアプリケーションではサーバとクライアント間のデータのやり取りが頻繁に発生するが、従来のXMLHttpRequestはあくまでブラウザ側からサーバにデータの送信要求を出す手段に過ぎず、サーバ側からクライアントにデータをプッシュ配信することが難しい。一方Cometではサーバ側からのプッシュ配信が可能なものの、多くの実装では擬似的に双方向通信を行うため通信が発生するごとにTCPのハンドシェイク手続きを再度行う必要があるほか、HTTPコネクションを長時間占有するためその間同一サーバに接続する他のアプリケーションの動作に影響を及ぼす可能性があるなど、また別の問題が生じる(XMLHttpRequest#ロングポーリングも参照)。

これに対しWebSocketでは、サーバとクライアントが一度コネクションを行った後は、必要な通信を全てそのコネクション上で専用のプロトコルを用いて行う。従来の手法に比べると、新たなコネクションを張ることがなくなる・HTTPコネクションとは異なる軽量プロトコルを使うなどの理由により通信ロスが減る、一つのコネクションで全てのデータ送受信が行えるため同一サーバに接続する他のアプリケーションへの影響が少ないなどのメリットがある。[1]

元々はHTML5の仕様の一部として策定が進められていたが、後にHTML5からは切り離され、現在は単独のプロトコルとして規格策定作業が進められている。

プロトコル

WebSocketの接続を確立するために、クライアント側はまずハンドシェイク要求を送る。そして、サーバー側はハンドシェイク応答を返す。以下がその例である。

ウェブブラウザが以下の要求をサーバー側に送る:

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/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

ハンドシェイクはHTTPの様であるが、厳密には異なる。サーバー側は最初HTTPの要求として解釈し、そして、WebSocketへと切り替える。

URIスキーム

WebSocket プロトコルの仕様書は ws:wss: という2つの新しい URI スキームを定義している[2]

実装状況

クライアント

クライアント側は、Internet Explorer 10Mozilla Firefox 6 (Firefox for Mobile 7)、Google Chrome 4 (含むモバイル版)、Safari 5 (含むiOS 4.2以降)、Opera 12.10、BlackBerry 7 (要設定)で実装されている。主要ブラウザでは実装していないのは Android Browser のみ(Android 4.1現在)。

実装状況
プロトコル Internet Explorer Mozilla Firefox Google Chrome Safari Opera
draft-hixie-thewebsocketprotocol-75 4 5.0.0
draft-hixie-thewebsocketprotocol-76
draft-ietf-hybi-thewebsocketprotocol-00
4 (無効化) 6 5.0.1 11.00 (要設定)
Opera Mobileも要設定
draft-ietf-hybi-thewebsocketprotocol-07 6
draft-ietf-hybi-thewebsocketprotocol-10 7 14
RFC 6455 10 11 16 6 12.10

ウェブブラウザのプラグインを利用する物

プロトコル上の Sec-WebSocket-Version: とドラフト番号の対応関係は以下の通り。hybi-04からプロトコル上に対応するドラフト番号が現れるようになった。

Sec-WebSocket-Version: ドラフト番号
4 hybi-04
5 hybi-05
6 hybi-06
7 hybi-07
8 hybi-08〜12
13 hybi-13〜17
RFC 6455

サーバー

歴史的経緯

プロトコルは、2011年5月の完成を目標に進められていたが[4]、その期日を過ぎても仕様の改訂は続けられ、2011年7月11日に最終草案のdraft-ietf-hybi-thewebsocketprotocol-10が勧告[5]されたが、さらにその後も改訂は続き、2011年9月30日に draft-ietf-hybi-thewebsocketprotocol-17 がリリースされ、それが、2011年12月11日に RFC 6455 の proposed standard (標準化への提唱)となった。

2010年11月26日にdraft-ietf-hybi-thewebsocketprotocol-03やそれ以前のWebSocketのプロトコルにセキュリティホールが発見され[6]、2010年12月に、一時的に、Firefox 4とOpera 11のWebSocketが無効になり、Chromeはプロトコル改訂よりも先に攻撃コードが出た場合は無効にするとしていた。Opera 11 は opera:config#Enable%20WebSockets を開き、設定を有効にすると利用可能。その後、2011年1月11日にdraft-ietf-hybi-thewebsocketprotocol-04が発表され、サーバーにアップロード通信する際はプロキシを混乱させないために、通信内容を XOR でマスキングさせる方法となった。2011年8月16日に再度WebSocketに対応させた、Firefox 6 がリリースされたが、まだ、仕様の改訂が続くという理由から、Firefox 10 までは、MozWebSocket と頭に Moz がつく形となった[7]Firefox for Mobile は 7 から対応[8]

関連項目

参照

外部リンク