ユーザ用ツール

サイト用ツール


サイドバー

目次

ホーム










.

protocol:websocket


ホーム#プロトコル に戻る

WebSocketで、双方向通信かつリアルタイム通信

WebSocketとは

  • 双方向通信かつリアルタイム
  • HTTPプロトコルではなく、WebSocketプロトコルというWebSocketのために考案された通信方式
  • WebSocket は HTTP 上の相乗りプロトコル
  • 確立済みの HTTP/HTTPS 回線上で、任意長・任意フォーマットデータの双方向通信を実現するもの
  • RFC6445 として IETF で標準化

他のプロトコルとの比較

  • WebSocket は HTTP/2 よりも簡易な実装
  • HTTP/2 が1本の HTTP セッション上で複数の仮想回線を扱えるのに対し、WebSocket の仮想回線は HTTP セッションと 1:1 の関係


双方向通信の歴史

ポーリング(&Ajax)

ポーリングは、定期的にサーバーにリクエストを送り、サーバー側で更新があった際にクライアントに反映する

Ajax

効率のために差分だけ取得する技術
更新したい部分のデータだけをJSONやXMLで受け取ることで、取得するデータの量を削減する

問題

定期的にサーバーにリクエストを投げる仕組みであるため、最新情報がなくてもリクエストしてしまいます。
ポーリングの間隔が短いとサーバー側に負荷がかかってしまう。
ポーリングの間隔が長いと画面が更新するまでに時間がかかってしまう。


ロングポーリング(Cometなど)

ロングポーリングでは、リクエストを送った後、サーバー側は更新があるまでレスポンスを返さず、更新が出た時に初めてレスポンスを返します
その後、データを受け取ったクライアントは再度ロングポーリングのためのリクエストを通信を張り直します。

問題
  • サーバー側で短期間に更新が複数回あると通信を貼り直すまで次の更新を受け取れない
  • 再度通信を張るコストがかかる


Server Sent Events(SSE)

ロングポーリングの問題を解決したプロトコル。
SSEはレスポンスがあっても通信を貼り直すことはせず、その後も通信を使い続ける。

SSEの問題
  • サーバー→クライアント方向には使えるが、クライアント→サーバー方向には使えない
  • HTTP通信を貼り続けるため、CPUの使用量が多い


WebSocketの通信の仕組み

(1)コネクションの確立

クライアント(ブラウザ)からリクエスト
GET /xxx/uri/xxx HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: E4WSEcseoWaaaaaXXXX==
サーバからのレスポンス
HTTP/1.1 101 OK
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: 7eQChgCtQMaaaaaXxxxxx=


(2)双方向通信


参考


protocol/websocket.txt · 最終更新: 2020/12/31 13:11 by kurihara

ページ用ツール