WebSocket
[Wikipedia|▼Menu]

WebSocket(ウェブソケット)は、単一のTCPコネクション上に双方向通信のチャンネルを提供する、コンピュータの通信プロトコルの1つである。WebSocketプロトコルは、2011年に.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation.cs-ja1 q,.mw-parser-output .citation.cs-ja2 q{quotes:"「""」""『""』"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free a,.mw-parser-output .citation .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited a,.mw-parser-output .id-lock-registration a,.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription a,.mw-parser-output .citation .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:#d33}.mw-parser-output .cs1-visible-error{color:#d33}.mw-parser-output .cs1-maint{display:none;color:#3a3;margin-left:0.3em}.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}RFC 6455としてIETFにより標準化された。Web IDL(英語版)中のWebSocket APIは、当初W3Cにより標準され、後にWHATWGに引き継がれている。

WebSocketはHTTPとは異なるプロトコルである。ともにOSI参照モデルのレイヤー7に位置し、レイヤー4のTCPに依存している。両者は異なるプロトコルであるが、RFC 6455では、WebSocketは「HTTPプロキシと仲介者をサポートするために、HTTPの443番および80番ポート上で動作するように設計されている」と述べられているように、HTTPプロトコルと互換性がある。互換性を実現するために、WebSocketのハンドシェイクHTTP/1.1 Upgradeヘッダーを使用し、HTTPプロトコルをWebSocketプロトコルに変更するように実現されている。

標準仕様は以下のように規定されている。

API: WebSockets Standard(非公式な日本語訳)。

通信プロトコル: RFC 6455 (非公式な日本語訳)に加えてFetch Standard 6. WebSocket protocol alterations(非公式な日本語訳)

HTTP/2と組み合わせる(HTTP/2ストリーム内でWebSocket通信を行う)場合: RFC 8441

HTTP/3と組み合わせる場合: RFC 9220


概要

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

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

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

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

ウェブブラウザが以下の要求をサーバ側に送る:GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Origin: http://example.comSec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13

サーバ側は以下の応答を返す。HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-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(含むモバイル)、Android 4.4、BlackBerry 7(要設定)で実装されている。

実装状況プロトコルInternet ExplorerMozilla FirefoxGoogle ChromeSafariOperaAndroid
draft-hixie-thewebsocketprotocol-7545.0.0
draft-hixie-thewebsocketprotocol-76
draft-ietf-hybi-thewebsocketprotocol-004(無効化)65.0.111.00(要設定)
Opera Mobileも要設定
draft-ietf-hybi-thewebsocketprotocol-076
draft-ietf-hybi-thewebsocketprotocol-10714
RFC 6455101116612.104.4

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

Adobe Flash - jWebsocket FlashBridge

Silverlight - Microsoft WCF WebSockets、CodeProject記事(SuperWebSocket利用)[3]

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

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

サーバ

C/C++

libwebsockets


POCO C++ Libraries

Tufao

Boost.Beast


Go

golang.org/x/net/websocket


Haskell

websockets


Java - Java EE 7 にて Java API for WebSocket (JSR 356) が追加された

Apache Tomcat 7

Atmosphere

GlassFish 3.1, ⇒Grizzly

JBoss 7

Jetty 7

jWebsocket

Netty 3.3


.NET

ASP.NET Core[4]

Fleck

Internet Information Services (IIS) 8, ASP.NET 4.5

SuperWebSocket


Node.js

ws: a Node.js WebSocket library

Socket.IO

WebSocket-Node


Objective-C

SocketRocket


Perl

Mojolicious

PocketIO


PHP

php-websocket


Python

WebSocket-for-Python

txWS


Ruby

websocket-ruby


Scala

play framework2


その他

apache-websocket


歴史的経緯

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

2010年11月26日にdraft-ietf-hybi-thewebsocketprotocol-03やそれ以前のWebSocketのプロトコルにセキュリティホールが発見され[7]、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がつく形となった[8]Firefox for Mobileは7から対応[9]


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:31 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef