「WebSocket」の版間の差分
m →実装状況 |
|||
77行目: | 77行目: | ||
|- |
|- |
||
! draft-ietf-hybi-thewebsocketprotocol-05 |
! draft-ietf-hybi-thewebsocketprotocol-05 |
||
| HTML5 Labs |
|||
| HTML5Labs |
|||
| |
| |
||
| |
| |
2011年2月26日 (土) 05:36時点における版
WebSocket(ウェブソケット)は、コンピュータ・ネットワーク用の通信規格の1つである。インターネットの標準化団体であるW3CとIETFがウェブサーバーとウェブブラウザとの間の通信のために規定を予定している双方向通信用の技術規格であり、APIはW3Cが、WebSocket プロトコルはIETFが策定に関与している。TCP上で動く。
概要
XMLHttpRequestの欠点を解決する技術として開発されており、現在のComet等に取って代わることを目標としている。
いわゆるAjaxアプリケーションではサーバとクライアント間のデータのやり取りが頻繁に発生するが、従来のXMLHttpRequestはあくまでブラウザ側からサーバにデータの送信要求を出す手段に過ぎず、サーバ側からクライアントにデータをプッシュ配信することが難しい。一方Cometではサーバ側からのプッシュ配信が可能なものの、多くの実装では擬似的に双方向通信を行うため通信が発生するごとにTCPのハンドシェイク手続きを再度行う必要があるほか、HTTPコネクションを長時間占有するためその間同一サーバに接続する他のアプリケーションの動作に影響を及ぼす可能性があるなど、また別の問題が生じる(XMLHttpRequest#ロングポーリングも参照)。
これに対しWebSocketでは、サーバとクライアントが一度コネクションを行った後は、必要な通信を全てそのコネクション上で専用のプロトコルを用いて行う。従来の手法に比べると、新たなコネクションを張ることがなくなる・HTTPコネクションとは異なる軽量プロトコルを使うなどの理由により通信ロスが減る、一つのコネクションで全てのデータ送受信が行えるため同一サーバに接続する他のアプリケーションへの影響が少ないなどのメリットがある。[1]。
元々はHTML5の仕様の一部として策定が進められていたが、後にHTML5からは切り離され、現在は単独のプロトコルとして規格策定作業が進められている。
プロトコル
WebSocketの接続を確立するために、クライアント側はまずハンドシェイク要求を送る。そして、サーバー側はハンドシェイク応答を返す。以下がその例である。(注:この例は、最新のプロトコルを反映していません)
ウェブブラウザが以下の要求をサーバー側に送る:
GET /demo HTTP/1.1
Host: example.com
Connection: Upgrade
Sec-WebSocket-Key2: 12998 5 Y3 1 .P00
Sec-WebSocket-Protocol: sample
Upgrade: WebSocket
Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5
Origin: http://example.com
^n:ds[4U
サーバー側は以下の応答を返す。
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Location: ws://example.com/demo
Sec-WebSocket-Protocol: sample
8jKS'y:G*Co,Wxa-
ハンドシェイクはHTTPの様であるが、実際は異なる。サーバー側は最初HTTPの要求として解釈し、そして、WebSocketへと切り替える。
URIスキーム
WebSocket プロトコルの仕様書は ws: と wss: という2つの新しい URI スキームを定義している[2]。
実装状況
2010年10月現在、プロトコル仕様は、互換性なくドラフトが改訂されている状態で、各ブラウザ・サーバーはそれを追いかけている状態である。そのため、全てのサーバーが全てのブラウザと通信できるわけではない。プロキシやロードバランサーなどのHTTPを解釈する機器も対応が必要である。
クライアント側は、Mozilla Firefox 4、Google Chrome 4、Safari 5 (含むiOS 4.2以降)、Opera 11以降[3]で実装されている。Internet Explorer は HTML5Labs で対応版が公開されている[4]。ただし、対応するプロトコルのバージョン(ドラフト番号)がブラウザにより異なり、またプロトコル自体も不安定な状態のため、「WebSocket対応」をうたっていても通信相手のサーバによっては利用不可能な場合がある。
2010年11月26日にdraft-ietf-hybi-thewebsocketprotocol-03やそれ以前のWebSocketのプロトコルにセキュリティホールが発見され[5]、2010年12月現在、一時的に、Firefox 4とOpera 11のWebSocketが無効になっており、Chromeはプロトコル改訂よりも先に攻撃コードが出た場合は無効にする予定。その後、2011年1月11日にdraft-ietf-hybi-thewebsocketprotocol-04が発表され、サーバーにアップロード通信する際はプロキシを混乱させないために、通信内容を XOR でマスキングさせる方法となった。
プロトコル | 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.0 beta (無効中) | 6 | 5.0.1 | 11.00 (無効中) | |
draft-ietf-hybi-thewebsocketprotocol-05 | HTML5 Labs |
プロトコルは、2011年5月の完成を目標に進められている[6]。
関連項目
参照
- ^ Jettyで始めるWebSocket超入門 第1回 WebSocket登場までの歴史 - gihyo.jp・2010年7月16日
- ^ IANA Uniform Resource Identifer (URI) Schemes
- ^ WebSockets in Opera - Opera Core Concerns・2010年10月11日
- ^ HTML5Labs - Home
- ^ [hybi Experiment comparing Upgrade and CONNECT handshakes]
- ^ BiDirectional or Server-Initiated HTTP (hybi) - Charter
外部リンク
- IETF Hypertext-Bidirectional (HyBi) working group
- The WebSocket protocol - IETF でのインターネットドラフト
- The WebSocket protocol (Network Working Group) - バージョン76にて廃止された Network Working Group の古いバージョン
- The WebSocket API - API の W3C 草案
- WebSockets.org - WebSocket のためのウェブサイト
- HTML5 Server-Push Technologies, Part 2 - WebSocketを解説