WebSocketとは
WebSocketは、クライアントと
サーバー間で持続的な双方向通信を可能にする
通信プロトコルです。従来のHTTP通信とは異なり、一度接続を確立すると、その接続を維持したままリアルタイムなデータの送受信を効率的に行うことができます。
WebSocketの仕組み
WebSocketは、単一のTCPコネクション上に双方向通信のチャンネルを確立します。これにより、
サーバーからクライアントへのプッシュ通知や、クライアントからの即時的なデータ送信が可能です。WebSocketプロトコルは、RFC 6455としてIETFにより標準化され、Web IDL中のWebSocket APIは、当初W3Cで標準化され、その後WHATWGに引き継がれました。
HTTPとの関係
WebSocketはHTTPとは異なるプロトコルですが、HTTPの443番や80番ポート上で動作するように設計されており、HTTPプロトコルとの互換性を持っています。WebSocketのハンドシェイクはHTTP/1.1 Upgradeヘッダーを使用して、プロトコルを切り替えることで実現されています。
標準仕様
WebSocketの標準仕様は、以下のドキュメントで規定されています。
WebSocketの利点
従来の
Ajaxアプリケーションでは、クライアントから
サーバーへのデータ送信要求が中心であり、
サーバーからのプッシュ配信は困難でした。Cometなどの技術ではプッシュ配信が可能でしたが、TCPハンドシェイクの繰り返しやHTTPコネクションの占有といった問題がありました。
WebSocketは、これらの問題を解決します。一度コネクションを確立すると、そのコネクション上で軽量な専用プロトコルを用いて通信を行うため、新たなコネクションの確立が不要になり、通信ロスが減少します。また、一つのコネクションで全てのデータ送受信を行うため、同一
サーバーに接続する他のアプリケーションへの影響も少なくなります。
プロトコルの詳細
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スキームを定義しています。
実装状況
WebSocketは、主要なブラウザやプラットフォームで幅広く実装されています。
クライアント側の実装例
WebSocketは多くのプログラミング言語やフレームワークで利用できます。
- - C/C++: libwebsockets, POCO C++ Libraries, Tufão, Boost.Beast
- - Go: golang.org/x/net/websocket
- - Haskell: websockets
- - Java: Java API for WebSocket (JSR 356), Apache Tomcat, Atmosphere, GlassFish, JBoss, Jetty, jWebsocket, Netty
- - .NET: ASP.NET Core, Fleck, IIS, SuperWebSocket
- - Node.js: ws, 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
歴史的経緯
WebSocketプロトコルは、2011年5月の完成を目指して開発が進められましたが、仕様の改訂が繰り返されました。2011年12月11日にRFC 6455として標準化されました。
初期のプロトコルにはセキュリティホールが発見され、一時的に一部のブラウザで無効化されましたが、その後セキュリティ対策が施された新しいバージョンがリリースされました。WebSocketのAPIは、当初W3Cで策定されていましたが、後にWHATWGに移管され、WebSockets Standardとして独立した仕様になりました。
関連技術
外部リンク