WebSocket 概要と課題 IEICE 2012 第2回 IA 研究会 BeerTalk 吉野 剛史 Google 1
Jun 27, 2015
WebSocket 概要と課題
IEICE 2012 第2回 IA 研究会 BeerTalk
吉野 剛史
1
ウェブアプリ・サーバ間通信
• 検索
–結果の随時更新
• メール
–読む
–アーカイブする
–新着通知
• チャット
2
HTTP で頑張ってきた
3
Ajax, Comet
XMLHttpRequest
HTTP
TCP/IP
Gmail Gtalk
ブラウザ サーバ
• 1 イベント ≒ 1 HTTP リクエスト
–プロキシや API の制約
4
POST /hoge HTTP/1.1 Host: … Cookie: … Accept-Encoding: … … a
‘a’ をタイプ
TCP なのに
• 順序非保存
– リクエストにシーケンス番号
• 認証
–毎回 Cookie
• In-flight リクエスト数 ≦ TCP 本数×パイプライン深度
5
ブラウザ サーバ
• 太郎くん long poll
• サーバしばし沈黙 …
• 花子さん発言! 太郎くんに送信
6
GET /back_channel HTTP/1.1 …
HTTP/1.1 200 OK … <Hanako> Hello
TCP なのに(再び)
• 上下方向それぞれ TCP コネクションを消費
• 毎度 long poll
7
今後も HTTP でねばろうか
• Pipelining, Streaming 拡張, etc.
• そろそろ新しい通信手段用意しませんか
8
TCP を直に叩ければいいか
• セキュリティ問題
–ポートスキャンなど
• ファイヤーウォール問題
–ポート 80 で HTTP と共存すべき
• HTTP との連携
– Cookie とか
9
10
WebSocket
API Protocol
@ W3C, WHATWG @ IETF
RFC 6455
シンプルな API
• 接続
• 送信
• 受信ハンドラ登録
11
ws = new WebSocket(“ws://example.com”);
ws.send(“Hello!”);
ws.onmessage = function (e) { console.log(e.data); };
コンパクトなプロトコル
• 低オーバーヘッド
• TCP 1本で full duplex
12
hoge send(“hoge”)
ヘッダ
(Opcode, 長さ など)
上り 6バイト 下り 2バイト
ペイロード
4バイト
順序保存
• send() 順にサーバへ到着
• サーバの送信順に onmessage 呼び出し
13
Up Up Down Down Left Right
TCP
水の音 飛込む 蛙 や 古池
ポート 80 で HTTP と共存
• HTTP Upgrade が来たら
• 以降は WebSocket
14
GET /ws HTTP/1.1 Connection: Upgrade Upgrade: websocket …
サーバ クライアント
HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket …
認証などは確立時に
• Upgrade 時に
– Cookie 送信
– クロスプロトコル攻撃対策
15
URL: … Host: … Cookie: …
TCP connection + TLS
In-flight メッセージ 好きなときに好きなだけ
16
ブラウザ サーバ
イベント発生
イベント発生
イベント発生 イベント発生 イベント発生 イベント発生 イベント発生
サーバからのデータ 好きなときに好きなだけ
• Long poll 無用
17
ブラウザ サーバ
好きにして
18
ブラウザ サーバ
多重化
• 現在 1 インスタンス 1 TCP
– Long-lived で idle でもずっと消費
– タブの数だけどんどん増加
• 順序保存より並列性が重要なアプリも
–たくさんはりたい
• 1 TCP に N インスタンスを多重化
–今、拡張仕様書いてます!
19
多重化 WebSocket があれば
• Request response
• 非 request response
• 順序保存重視
• 並列性・独立性重視
20
対応状況
• Chrome (2009年~)
• Firefox
• Internet Explorer 10
• Opera
• Safari
21
使いものになるの?
• Chrome を使った 2009 年の実験
– WebSocket 成功数 ÷ HTTP 成功数
22
Port TLS 成功率
80 No 67%
61985 No 86%
443 Yes 95%
L7 のみなさんへ
• HTTP プロキシ
• ファイヤーウォール
• ロードバランサ – HTTP Upgrade に対応
– WebSocket を読んで • バランス
– 多重化をばらす
• フィルタ、DoS ブロック
• Web サーバ – ぜひ実装を
23
L3, L4 のみなさんへ
• ロードバランサ
• NAT – Load と TCP 本数があんまり関係なくなる
• Fairness metric の再考
– L4 バランサだけでは traffic が偏る可能性 • L7 まで見る
• Timeout の再考
(Thanks to v6pc)
24
WebSocket とは
• (主に)ウェブブラウザのための
• 軽量で
• セキュリティや HTTP との連携を考慮した
• Built-in の
• 双方向通信手法
• トラフィックパターンいろいろ変わるかも
25