WebSocket
WebブラウザとWebサーバの間で、1本のTCPコネクションを保ったまま、双方向にいつでもデータを送り合えるようにするプロトコル。通信はHTTPのGETメソッドによるハンドシェイクで始まり、その後WebSocketの通信に切り替わる。
イマシルちゃんの解説
ふつうのWebは、ブラウザが「ちょうだい」って頼んで、サーバが「はい、どうぞ」って返す、の繰り返しなんだ。
サーバのほうから、勝手に話しかけることはできないんだよ。
でも、チャットやゲームみたいに、相手からの知らせをすぐに受け取りたいときは困るよね。
そこで、最初にHTTPで「これからは電話みたいに、つなぎっぱなしで話そうよ」って約束して、
そのあとは、どっちからでも好きなときに話せるようにするんだ!
より深い解説
定義
WebSocketは、RFC 6455で定められた、Webで双方向の通信を行うためのプロトコルである。最初にHTTPで接続を切り替える要求(アップグレード)を行い、サーバが受け入れると、同じTCPコネクションの上で、WebSocketのフレームを使って、クライアントとサーバのどちらからでもデータを送れるようになる。
ハンドシェイク
(クライアント → サーバ)
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
(サーバ → クライアント)
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
サーバが ステータスコード 101(Switching Protocols)を返すと、以降はWebSocketの通信になる。
特徴
| 項目 | 内容 |
|---|---|
| URIのスキーム | ws(暗号化なし)、wss(TLSで暗号化) |
| ポート番号 | HTTP、HTTPSと同じ80番、443番を使う。既存のファイアウォールやプロキシを通りやすい |
| 接続を始める側 | クライアント(ブラウザ)。サーバから接続を始めることはできない |
| 接続後の通信 | 双方向。サーバからクライアントへ、いつでもデータを送れる(プッシュ) |
| データの形式 | テキスト(UTF-8)またはバイナリのフレーム。XMLである必要はない |
| オーバーヘッド | 接続後は、HTTPのヘッダーを毎回送らないため小さい |
使われる場面
- チャット、通知
- オンラインゲーム、共同編集
- 株価などのリアルタイムの表示
- IoT機器の監視画面
ほかの方式との比較
| 方式 | 内容 |
|---|---|
| ポーリング | クライアントが、一定間隔でサーバに問い合わせる。更新がなくても通信が発生する |
| ロングポーリング | サーバが、更新があるまで応答を保留する。更新のたびに接続し直す |
| Server-Sent Events | サーバからクライアントへの一方向の送信 |
| WebSocket | 1本の接続で、双方向にいつでも送れる |