WebSocket

読み:うぇぶそけっと / 英語表記: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のヘッダーを毎回送らないため小さい

使われる場面

ほかの方式との比較

方式内容
ポーリングクライアントが、一定間隔でサーバに問い合わせる。更新がなくても通信が発生する
ロングポーリングサーバが、更新があるまで応答を保留する。更新のたびに接続し直す
Server-Sent Eventsサーバからクライアントへの一方向の送信
WebSocket1本の接続で、双方向にいつでも送れる

実際の試験ではここに出る!

↑