コンテンツにスキップ

「WebSocket」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
MoreNet (会話 | 投稿記録)
外部リンクの修正 {{IETF RFC}}
 
(14人の利用者による、間の33版が非表示)
1行目: 1行目:
'''WebSocket'''(ウェブソケット)は、[[コンピュータットワーク|コンピュータ・ネットワーク]]用の通信規格の1つである。[[インターネット]]標準化団体である[[World Wide Web Consortium|W3C]]と[[Internet Engineering Task Force|IETF]]が[[ウェブサーバー]]と[[ウェブブラウザ]]との間の通信のために規定を予定している[[複信|双方向通信]]用の技術規格であり、[[アプリケーションプログラミングインタフェース|API]]はW3CがWebSocket プロトコルはIETFが策定に関与している。プロトコルの仕様は RFC 6455。[[Transmission Control Protocol|TCP]]上で動く
'''WebSocket'''(ウェブソケット)は、単一の[[Transmission Control Protocol|TCP]]コネクション上に[[複信|双方向通信]]のチャンネルを提供する、コンピュータの[[通信プロトコル]]の1つである。WebSocketプロトコルは、[[2011年]]に<nowiki/>{{IETF RFC|6455}}<nowiki/>としてIETFにより標準化された。{{Ill|Web IDL|en|Web IDL}}中のWebSocket [[アプリケーションプログラミングインタフェース|API]]は、当初[[World Wide Web Consortium|W3C]]により標準され、後に[[WHATWG]]に引き継がれている


WebSocketは[[Hypertext Transfer Protocol|HTTP]]とは異なるプロトコルである。ともに[[OSI参照モデル]]のレイヤー7に位置し、レイヤー4のTCPに依存している。両者は異なるプロトコルであるが、{{IETF RFC|6455}}<nowiki/>では、WebSocketは「HTTPプロキシと仲介者をサポートするために、HTTPの443番および80番ポート上で動作するように設計されている」と述べられているように、HTTPプロトコルと互換性がある。互換性を実現するために、WebSocketの[[ハンドシェイク]]は[[HTTP/1.1 Upgradeヘッダー]]を使用し、HTTPプロトコルをWebSocketプロトコルに変更するように実現されている。
== 概要 ==
[[XMLHttpRequest]]の欠点を解決する技術として開発されており、現在の[[Comet]]等に取って代わることを目標としている。


標準仕様は以下のように規定されている。
いわゆる[[Ajax]]アプリケーションではサーバとクライアント間のデータのやり取りが頻繁に発生するが、従来のXMLHttpRequestはあくまでブラウザ側からサーバにデータの送信要求を出す手段に過ぎず、サーバ側からクライアントにデータをプッシュ配信することが難しい。一方Cometではサーバ側からのプッシュ配信が可能なものの、多くの実装では擬似的に双方向通信を行うため通信が発生するごとにTCPの[[ハンドシェイク]]手続きを再度行う必要があるほか、HTTPコネクションを長時間占有するためその間同一サーバに接続する他のアプリケーションの動作に影響を及ぼす可能性があるなど、また別の問題が生じる([[XMLHttpRequest#ロングポーリング]]も参照)。
* [[アプリケーションプログラミングインタフェース|API]]: [https://websockets.spec.whatwg.org/ WebSockets Standard]([https://triple-underscore.github.io/WebSocket-ja.html 非公式な日本語訳])。
* [[通信プロトコル]]: {{IETF RFC|6455}} ([https://triple-underscore.github.io/RFC6455-ja.html 非公式な日本語訳])に加えて[https://fetch.spec.whatwg.org/#websocket-protocol Fetch Standard 6. WebSocket protocol alterations]([https://triple-underscore.github.io/Fetch-ja.html#websocket-protocol 非公式な日本語訳])
** HTTP/2と組み合わせる(HTTP/2ストリーム内でWebSocket通信を行う)場合: {{IETF RFC|8441}}
** HTTP/3と組み合わせる場合: {{IETF RFC|9220}}

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


いわゆる[[Ajax]]アプリケーションでは[[サーバ]][[クライアント (コンピュータ)|クライアント]]間のデータのやり取りが頻繁に発生するが、従来の[[XMLHttpRequest]]はあくまで[[ウェブブラウザ|ブラウザ]]側からサーバにデータの送信要求を出す手段に過ぎず、サーバ側からクライアントにデータをプッシュ配信することが難しい。一方Cometではサーバ側からのプッシュ配信が可能なものの、多くの実装では擬似的に双方向通信を行うため通信が発生するごとに[[Transmission Control Protocol|TCP]]の[[ハンドシェイク]]手続きを再度行う必要があるほか、HTTPコネクションを長時間占有するためその間同一サーバに接続する他のアプリケーションの動作に影響を及ぼす可能性があるなど、また別の問題が生じる([[XMLHttpRequest#ロングポーリング]]も参照)。
これに対しWebSocketでは、サーバとクライアントが一度コネクションを行った後は、必要な通信を全てそのコネクション上で専用のプロトコルを用いて行う。従来の手法に比べると、新たなコネクションを張ることがなくなる・HTTPコネクションとは異なる軽量プロトコルを使うなどの理由により通信ロスが減る、一つのコネクションで全てのデータ送受信が行えるため同一サーバに接続する他のアプリケーションへの影響が少ないなどのメリットがある<ref>[http://gihyo.jp/dev/feature/01/websocket/0001 Jettyで始めるWebSocket超入門 第1回 WebSocket登場までの歴史] - gihyo.jp・2010年7月16日</ref>。


これに対しWebSocketでは、サーバとクライアントが一度コネクションを行った後は、必要な通信を全てそのコネクション上で専用のプロトコルを用いて行う。従来の手法に比べると、新たなコネクションを張ることがなくなる・HTTPコネクションとは異なる軽量[[通信プロトコル|プロトコル]]を使うなどの理由により通信ロスが減る、一つのコネクションで全てのデータ送受信が行えるため同一サーバに接続する他のアプリケーションへの影響が少ないなどのメリットがある<ref>[https://gihyo.jp/dev/feature/01/websocket/0001 Jettyで始めるWebSocket超入門 第1回 WebSocket登場までの歴史] - gihyo.jp・2010年7月16日</ref>。
元々は[[HTML5]]の仕様の一部として策定が進められていたが、後にHTML5からは切り離され、現在は単独のプロトコルとして規格策定作業が進められている。


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


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


<pre>
<pre>
26行目: 32行目:
</pre>
</pre>


サーバ側は以下の応答を返す。
サーバ側は以下の応答を返す。


<pre>
<pre>
36行目: 42行目:
</pre>
</pre>


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


== URIスキーム ==
== URIスキーム ==
WebSocket プロトコルの仕様書は '''ws:''' と '''wss:''' という2つの新しい URI スキームを定義している<ref>[http://www.iana.org/assignments/uri-schemes.html IANA Uniform Resource Identifer (URI) Schemes]</ref>。
WebSocketプロトコルの仕様書は'''ws:''' と '''wss:'''という2つの新しい[[Uniform Resource Identifier|URI]][[スキーム]]を定義している<ref>[https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml IANA Uniform Resource Identifer (URI) Schemes]</ref>。


==実装状況==
==実装状況==
===クライアント===
===クライアント===
クライアント側は、[[Internet Explorer 10]](含むモバイル)、[[Mozilla Firefox]] 6 ([[Firefox for Mobile]] 7)、[[Google Chrome]] 4 (含むモバイル)、[[Safari]] 5 (含む[[iOS (アップル)|iOS]] 4.2以降)、[[Opera]] 12.10(含むモバイル)、[[Android]] 4.4、[[BlackBerry]] 7 (要設定)で実装されている。
クライアント側は、[[Internet Explorer 10]](含むモバイル)、[[Mozilla Firefox]] 6 ([[Firefox for Mobile]] 7)、[[Google Chrome]] 4 (含むモバイル)、[[Safari]] 5(含む[[iOS]] 4.2以降、[[Opera]] 12.10(含むモバイル)、[[Android (オペレーティングシステム)|Android]] 4.4、[[BlackBerry]] 7(要設定で実装されている。


{| class="wikitable"
{| class="wikitable"
65行目: 71行目:
! draft-hixie-thewebsocketprotocol-76<br/>draft-ietf-hybi-thewebsocketprotocol-00
! draft-hixie-thewebsocketprotocol-76<br/>draft-ietf-hybi-thewebsocketprotocol-00
|
|
|4 (無効化)
|4(無効化
|6
|6
|5.0.1
|5.0.1
|11.00 (要設定)<br>Opera Mobileも要設定
|11.00(要設定<br>Opera Mobileも要設定
|
|
|-
|-
87行目: 93行目:
|
|
|-
|-
! RFC 6455
! {{IETF RFC|6455}}
| 10
| 10
| 11
| 11
96行目: 102行目:
|}
|}


ウェブブラウザのプラグインを利用する物
ウェブブラウザの[[プラグイン]]を利用する物
* [[Adobe Flash]] - jWebsocket FlashBridge
* [[Adobe Flash]] - jWebsocket FlashBridge
* [[Silverlight]] - Microsoft WCF WebSockets, CodeProject記事 (SuperWebSocket 利用)<ref>[http://www.codeproject.com/KB/silverlight/WebSocketsSilverlight.aspx WebSockets, WCF, and Silverlight 5 - CodeProject]</ref>
* [[Silverlight]] - Microsoft WCF WebSocketsCodeProject記事(SuperWebSocket利用<ref>[https://www.codeproject.com/Articles/220350/Super-WebSockets-WCF-Silverlight-5 WebSockets, WCF, and Silverlight 5 - CodeProject]</ref>


プロトコル上の <code>Sec-WebSocket-Version:</code> とドラフト番号の対応関係は以下の通り。hybi-04からプロトコル上に対応するドラフト番号が現れるようになった。
プロトコル上の<code>Sec-WebSocket-Version:</code>とドラフト番号の対応関係は以下の通り。hybi-04からプロトコル上に対応するドラフト番号が現れるようになった。
{| class="wikitable"
{| class="wikitable"
|+
|+
122行目: 128行目:
|-
|-
|13
|13
|hybi-13〜17<br>RFC 6455
|hybi-13〜17<br>{{IETF RFC|6455}}
|}
|}


===サーバ===
===サーバ===
* C/C++
* C/C++
** [http://git.warmcat.com/cgi-bin/cgit/libwebsockets/ libwebsockets]
** [https://libwebsockets.org/ libwebsockets]
** [[POCO C++ Libraries]]
** [[POCO C++ Libraries]]
** [http://code.google.com/p/tufao/ Tufão]
** [https://vinipsmaker.github.io/tufao/ Tufão]
** [https://www.boost.org/doc/libs/release/libs/beast/ Boost.Beast]
* Go
* Go
** [http://go.pkgdoc.org/code.google.com/p/go.net/websocket go.net/websocket]
** [https://pkg.go.dev/golang.org/x/net/websocket golang.org/x/net/websocket]
* [[Haskell]]
* [[Haskell]]
** [https://github.com/jaspervdj/websockets websockets]
** [https://github.com/jaspervdj/websockets websockets]
* [[Java]] - [[Java EE]] 7 にて Java API for WebSocket (JSR 356) が追加された
* [[Java]] - [[Jakarta EE|Java EE]] 7 にて Java API for WebSocket (JSR 356) が追加された
** [[Apache Tomcat]] 7
** [[Apache Tomcat]] 7
** [https://github.com/Atmosphere/atmosphere Atmosphere]
** [https://github.com/Atmosphere/atmosphere Atmosphere]
142行目: 149行目:
** [http://jwebsocket.org/ jWebsocket]
** [http://jwebsocket.org/ jWebsocket]
** [https://netty.io/ Netty] 3.3
** [https://netty.io/ Netty] 3.3
* [[.NET Framework]]
* [[.NET]]
** [[ASP.NET Core]]<ref>[https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/websockets?view=aspnetcore-6.0 ASP.NET Core での Websocket のサポート | Microsoft Learn]</ref>
** [https://github.com/statianzo/Fleck Fleck]
** [https://github.com/statianzo/Fleck Fleck]
** [[Internet Information Services]] (IIS) 8, [[ASP.NET]] 4.5
** [[Internet Information Services]] (IIS) 8, [[ASP.NET]] 4.5
** [http://superwebsocket.codeplex.com/ SuperWebSocket]
** [https://github.com/kerryjiang/SuperWebSocket SuperWebSocket]
** [http://xsockets.net XSockets.NET]
* [[Node.js]]
* [[Node.js]]
** [https://github.com/websockets/ws ws: a Node.js WebSocket library]
** [http://socket.io/ Socket.IO]
** [https://socket.io/ Socket.IO]
** [https://github.com/Worlize/WebSocket-Node WebSocket-Node]
** [https://github.com/Worlize/WebSocket-Node WebSocket-Node]
* [[Objective-C]]
* [[Objective-C]]
** [https://github.com/square/SocketRocket SocketRocket]
** [https://github.com/square/SocketRocket SocketRocket]
* [[Perl]]
* [[Perl]]
** [http://mojolicio.us/ Mojolicious]
** [https://mojolicious.org/ Mojolicious]
** [https://github.com/vti/pocketio PocketIO]
** [https://github.com/vti/pocketio PocketIO]
* [[PHP: Hypertext Preprocessor|PHP]]
* [[PHP (プログラミング言語)|PHP]]
** [https://github.com/nicokaiser/php-websocket php-websocket]
** [https://github.com/nicokaiser/php-websocket php-websocket]
* [[Python]]
* [[Python]]
161行目: 169行目:
** [https://github.com/MostAwesomeDude/txWS txWS]
** [https://github.com/MostAwesomeDude/txWS txWS]
* [[Ruby]]
* [[Ruby]]
** [https://github.com/igrigorik/em-websocket EM-WebSocket]
** [https://github.com/imanel/websocket-ruby websocket-ruby]
* [[Scala]]
** [https://www.playframework.com/documentation/ja/2.3.x/ScalaWebSockets play framework2]
* その他
* その他
** [https://github.com/disconnect/apache-websocket apache-websocket]
** [https://github.com/disconnect/apache-websocket apache-websocket]


===歴史的経緯===
===歴史的経緯===
プロトコルは2011年5月の完成を目標に進められていたが<ref>[https://datatracker.ietf.org/wg/hybi/charter/ BiDirectional or Server-Initiated HTTP (hybi) - Charter]</ref>、その期日を過ぎても仕様の改訂は続けられ、2011年7月11日に最終草案のdraft-ietf-hybi-thewebsocketprotocol-10が勧告<ref>[http://www.ietf.org/mail-archive/web/hybi/current/msg07725.html hybi Last Call: <draft-ietf-hybi-thewebsocketprotocol-10.txt> (The WebSocket protocol) to Proposed Standard]</ref>されたが、さらにその後も改訂は続き、2011年9月30日に draft-ietf-hybi-thewebsocketprotocol-17 がリリースされ、それが2011年12月11日に RFC 6455 proposed standard (標準化への提唱)となった。
プロトコルは2011年5月の完成を目標に進められていたが<ref>[https://datatracker.ietf.org/wg/hybi/charter/ BiDirectional or Server-Initiated HTTP (hybi) - Charter]</ref>、その期日を過ぎても仕様の改訂は続けられ、2011年7月11日に最終草案のdraft-ietf-hybi-thewebsocketprotocol-10が勧告<ref>[https://www.ietf.org/mail-archive/web/hybi/current/msg07725.html hybi Last Call: <draft-ietf-hybi-thewebsocketprotocol-10.txt> (The WebSocket protocol) to Proposed Standard]</ref>されたが、さらにその後も改訂は続き、2011年9月30日に draft-ietf-hybi-thewebsocketprotocol-17がリリースされ、それが2011年12月11日に{{IETF RFC|6455}}のproposed standard(標準化への提唱)となった。

2010年11月26日にdraft-ietf-hybi-thewebsocketprotocol-03やそれ以前のWebSocketのプロトコルにセキュリティホールが発見され<ref>[https://www.ietf.org/mail-archive/web/hybi/current/msg04744.html hybi Experiment comparing Upgrade and CONNECT handshakes]</ref>、2010年12月に、一時的に、Firefox 4とOpera 11のWebSocketが無効になり、Chromeはプロトコル改訂よりも先に攻撃コードが出た場合は無効にするとしていた。Opera 11は<code>opera:config#Enable%20WebSockets</code>を開き、設定を有効にすると利用可能。その後、2011年1月11日にdraft-ietf-hybi-thewebsocketprotocol-04が発表され、サーバにアップロード通信する際は[[プロキシ]]を混乱させないために、通信内容を[[排他的論理和|XOR]]でマスキングさせる方法となった。2011年8月16日に再度WebSocketに対応させた、Firefox 6 がリリースされたが、まだ、仕様の改訂が続くという理由から、Firefox 10までは、MozWebSocketと頭にMozがつく形となった<ref>[https://bugzilla.mozilla.org/show_bug.cgi?id=659324 Bug 659324 &ndash; prefix the JS API for WebSockets]</ref>。[[Firefox for Mobile]]は7から対応<ref>[https://dev.mozilla.jp/2011/08/firefox7/ Firefox 7 の主な新機能を紹介します « Mozilla Developer Street (modest)]</ref>。

ウェブブラウザで動作する[[JavaScript]]用の[[アプリケーションプログラミングインタフェース|API]]の策定は、当初[[World Wide Web Consortium|W3C]]で行われていた。その後、[[HTML5]]とともに[[Web Hypertext Application Technology Working Group|WHATWG]]に移ることとなった。


WHATWGでは、当初主にHTML Standard内でWebSocketのAPIが規定していた。その後、2021年に別個の仕様に分離することが提起され<ref>{{Cite web |url=https://github.com/whatwg/meta/issues/202 |title=WebSocket standard creation proposal · Issue #202 · whatwg/meta |website=GitHub |date=2021-02-04 |accessdate=2022-10-03}}</ref>、WebSockets Standardが創設されることとなった。
2010年11月26日にdraft-ietf-hybi-thewebsocketprotocol-03やそれ以前のWebSocketのプロトコルにセキュリティホールが発見され<ref>[http://www.ietf.org/mail-archive/web/hybi/current/msg04744.html hybi Experiment comparing Upgrade and CONNECT handshakes]</ref>、2010年12月に、一時的に、Firefox 4とOpera 11のWebSocketが無効になり、Chromeはプロトコル改訂よりも先に攻撃コードが出た場合は無効にするとしていた。Opera 11 <code>opera:config#Enable%20WebSockets</code> を開き、設定を有効にすると利用可能。その後、2011年1月11日にdraft-ietf-hybi-thewebsocketprotocol-04が発表され、サーバにアップロード通信する際はプロキシを混乱させないために、通信内容を XOR でマスキングさせる方法となった。2011年8月16日に再度WebSocketに対応させた、Firefox 6 がリリースされたが、まだ、仕様の改訂が続くという理由から、Firefox 10 までは、MozWebSocket と頭に Moz がつく形となった<ref>[https://bugzilla.mozilla.org/show_bug.cgi?id=659324 Bug 659324 &ndash; prefix the JS API for WebSockets]</ref>。[[Firefox for Mobile]] 7 から対応<ref>[https://dev.mozilla.jp/2011/08/firefox7/ Firefox 7 の主な新機能を紹介します &laquo; Mozilla Developer Street (modest)]</ref>。


== 関連項目 ==
== 関連項目 ==
* [[Push技術]]
* [[Push技術]]
* [[Comet]]
* [[Comet]]
* [[SPDY]]
* [[gRPC]]


== 参照 ==
== 参照 ==
181行目: 195行目:
== 外部リンク ==
== 外部リンク ==
* [https://datatracker.ietf.org/wg/hybi/charter/ IETF Hypertext-Bidirectional (HyBi) working group]
* [https://datatracker.ietf.org/wg/hybi/charter/ IETF Hypertext-Bidirectional (HyBi) working group]
** RFC 6455
** {{IETF RFC|6455}}
** [http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol The WebSocket protocol] - IETF でのインターネットドラフト
** [https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol The WebSocket protocol] - IETF でのインターネットドラフト
** [http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 The WebSocket protocol (Network Working Group)] - バージョン76にて廃止された Network Working Group の古いバージョン
** [https://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 The WebSocket protocol (Network Working Group)] - バージョン76にて廃止された Network Working Group の古いバージョン
* [https://websockets.spec.whatwg.org/ WebSockets Standard] - WHATWGによるAPIの仕様
* [http://www.w3.org/TR/websockets/ The WebSocket API] - API の W3C 勧告候補
* W3Cの旧式の規定
* [http://ajf.me/websocket WebSocket] - WebSocket ウェブサイト
** [https://www.w3.org/TR/2012/CR-websockets-20120920/ The WebSocket API] W3C Candidate Recommendation 20 September 2012 - API の W3C 勧告候補
* [http://today.java.net/article/2010/04/26/html5-server-push-technologies-part-2 HTML5 Server-Push Technologies, Part 2] - WebSocketを解説
** [https://www.w3.org/TR/2021/NOTE-websockets-20210128/ The WebSocket API] W3C Working Group Note, 28 January 2021 - 最終のワーキンググループノート
* [http://websocketstest.com/ Real-Time Web Test - Does your browser supports WebSockets?]
* {{URL|https://www.websocket.org/}} - WebSocket ウェブサイト
* [https://websocketstest.com/ Real-Time Web Test - Does your browser supports WebSockets?]


{{Internet-stub}}
{{Internet-stub}}


{{W3C標準}}
{{W3C標準}}
{{Template:Web interfaces}}
{{Web interfaces}}


[[Category:ウェブブラウザ]]
[[Category:ウェブブラウザ]]
199行目: 215行目:
[[Category:JavaScript]]
[[Category:JavaScript]]
[[Category:Hypertext Transfer Protocol]]
[[Category:Hypertext Transfer Protocol]]
[[Category:RFC|6455]]

2023年11月21日 (火) 04:21時点における最新版

WebSocket(ウェブソケット)は、単一のTCPコネクション上に双方向通信のチャンネルを提供する、コンピュータの通信プロトコルの1つである。WebSocketプロトコルは、2011年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プロトコルに変更するように実現されている。

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

概要[編集]

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

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

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

プロトコル[編集]

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

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

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(含むモバイル)、Android 4.4、BlackBerry 7(要設定)で実装されている。

実装状況
プロトコル Internet Explorer Mozilla Firefox Google Chrome Safari Opera Android
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 4.4

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

プロトコル上の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月の完成を目標に進められていたが[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]

ウェブブラウザで動作するJavaScript用のAPIの策定は、当初W3Cで行われていた。その後、HTML5とともにWHATWGに移ることとなった。

WHATWGでは、当初主にHTML Standard内でWebSocketのAPIが規定していた。その後、2021年に別個の仕様に分離することが提起され[10]、WebSockets Standardが創設されることとなった。

関連項目[編集]

参照[編集]

外部リンク[編集]