WebSocket
WebSocket(ウェブソケット)は、コンピュータ・ネットワーク用の通信規格の1つである。インターネットの標準化団体であるW3CとIETFがウェブサーバーとウェブブラウザとの間の通信のために規定を予定している双方向通信用の技術規格であり、APIはW3Cが、WebSocket プロトコルはIETFが策定に関与している。プロトコルの仕様は RFC 6455。TCP上で動く。
概要
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 10(含むモバイル)、Mozilla Firefox 6 (Firefox for Mobile 7)、Google Chrome 4 (含むモバイル)、Safari 5 (含むiOS 4.2以降)、Opera 12.10(含むモバイル)、BlackBerry 7 (要設定)で実装されている。主要ブラウザでは実装していないのは Android Browser のみ(Android 4.2現在)。
プロトコル | 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 |
ウェブブラウザのプラグインを利用する物
- Adobe Flash - jWebsocket FlashBridge
- Silverlight - Microsoft WCF WebSockets, CodeProject記事 (SuperWebSocket 利用)[3]
プロトコル上の 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 |
サーバー
- C/C++
- Go
- Haskell
- Java - Java EE 7 にて Java API for WebSocket が追加予定
- Apache Tomcat 7
- Atmosphere
- GlassFish 3.1, Grizzly
- JBoss 7
- Jetty 7
- jWebsocket
- Netty 3.3
- .NET Framework
- Fleck
- Internet Information Services (IIS) 8, ASP.NET 4.5
- SuperWebSocket
- XSockets.NET
- Node.js
- Objective-C
- Perl
- PHP
- Python
- Ruby
- その他
歴史的経緯
プロトコルは、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]。
関連項目
参照
- ^ Jettyで始めるWebSocket超入門 第1回 WebSocket登場までの歴史 - gihyo.jp・2010年7月16日
- ^ IANA Uniform Resource Identifer (URI) Schemes
- ^ WebSockets, WCF, and Silverlight 5 - CodeProject
- ^ BiDirectional or Server-Initiated HTTP (hybi) - Charter
- ^ hybi Last Call: <draft-ietf-hybi-thewebsocketprotocol-10.txt> (The WebSocket protocol) to Proposed Standard
- ^ hybi Experiment comparing Upgrade and CONNECT handshakes
- ^ Bug 659324 – prefix the JS API for WebSockets
- ^ Firefox 7 の主な新機能を紹介します « Mozilla Developer Street (modest)
外部リンク
- IETF Hypertext-Bidirectional (HyBi) working group
- RFC 6455
- The WebSocket protocol - IETF でのインターネットドラフト
- The WebSocket protocol (Network Working Group) - バージョン76にて廃止された Network Working Group の古いバージョン
- The WebSocket API - API の W3C 勧告候補
- WebSocket - WebSocket ウェブサイト
- HTML5 Server-Push Technologies, Part 2 - WebSocketを解説
- Real-Time Web Test - Does your browser supports WebSockets?