Top Banner
WebSocket 概要と課題 IEICE 2012 2IA 研究会 BeerTalk 吉野 剛史 Google 1
25
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Janogia20120921 yoshinotakeshi

WebSocket 概要と課題

IEICE 2012 第2回 IA 研究会 BeerTalk

吉野 剛史

Google

1

Page 2: Janogia20120921 yoshinotakeshi

ウェブアプリ・サーバ間通信

• 検索

–結果の随時更新

• メール

–読む

–アーカイブする

–新着通知

• チャット

2

Page 3: Janogia20120921 yoshinotakeshi

HTTP で頑張ってきた

3

Ajax, Comet

XMLHttpRequest

HTTP

TCP/IP

Gmail Gtalk

Page 4: Janogia20120921 yoshinotakeshi

ブラウザ サーバ

• 1 イベント ≒ 1 HTTP リクエスト

–プロキシや API の制約

4

POST /hoge HTTP/1.1 Host: … Cookie: … Accept-Encoding: … … a

‘a’ をタイプ

Page 5: Janogia20120921 yoshinotakeshi

TCP なのに

• 順序非保存

– リクエストにシーケンス番号

• 認証

–毎回 Cookie

• In-flight リクエスト数 ≦ TCP 本数×パイプライン深度

5

Page 6: Janogia20120921 yoshinotakeshi

ブラウザ サーバ

• 太郎くん long poll

• サーバしばし沈黙 …

• 花子さん発言! 太郎くんに送信

6

GET /back_channel HTTP/1.1 …

HTTP/1.1 200 OK … <Hanako> Hello

Page 7: Janogia20120921 yoshinotakeshi

TCP なのに(再び)

• 上下方向それぞれ TCP コネクションを消費

• 毎度 long poll

7

Page 8: Janogia20120921 yoshinotakeshi

今後も HTTP でねばろうか

• Pipelining, Streaming 拡張, etc.

• そろそろ新しい通信手段用意しませんか

8

Page 9: Janogia20120921 yoshinotakeshi

TCP を直に叩ければいいか

• セキュリティ問題

–ポートスキャンなど

• ファイヤーウォール問題

–ポート 80 で HTTP と共存すべき

• HTTP との連携

– Cookie とか

9

Page 10: Janogia20120921 yoshinotakeshi

10

WebSocket

API Protocol

@ W3C, WHATWG @ IETF

RFC 6455

Page 11: Janogia20120921 yoshinotakeshi

シンプルな API

• 接続

• 送信

• 受信ハンドラ登録

11

ws = new WebSocket(“ws://example.com”);

ws.send(“Hello!”);

ws.onmessage = function (e) { console.log(e.data); };

Page 12: Janogia20120921 yoshinotakeshi

コンパクトなプロトコル

• 低オーバーヘッド

• TCP 1本で full duplex

12

hoge send(“hoge”)

ヘッダ

(Opcode, 長さ など)

上り 6バイト 下り 2バイト

ペイロード

4バイト

Page 13: Janogia20120921 yoshinotakeshi

順序保存

• send() 順にサーバへ到着

• サーバの送信順に onmessage 呼び出し

13

Up Up Down Down Left Right

TCP

水の音 飛込む 蛙 や 古池

Page 14: Janogia20120921 yoshinotakeshi

ポート 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 …

Page 15: Janogia20120921 yoshinotakeshi

認証などは確立時に

• Upgrade 時に

– Cookie 送信

– クロスプロトコル攻撃対策

15

URL: … Host: … Cookie: …

TCP connection + TLS

Page 16: Janogia20120921 yoshinotakeshi

In-flight メッセージ 好きなときに好きなだけ

16

ブラウザ サーバ

イベント発生

イベント発生

イベント発生 イベント発生 イベント発生 イベント発生 イベント発生

Page 17: Janogia20120921 yoshinotakeshi

サーバからのデータ 好きなときに好きなだけ

• Long poll 無用

17

ブラウザ サーバ

Page 18: Janogia20120921 yoshinotakeshi

好きにして

18

ブラウザ サーバ

Page 19: Janogia20120921 yoshinotakeshi

多重化

• 現在 1 インスタンス 1 TCP

– Long-lived で idle でもずっと消費

– タブの数だけどんどん増加

• 順序保存より並列性が重要なアプリも

–たくさんはりたい

• 1 TCP に N インスタンスを多重化

–今、拡張仕様書いてます!

19

Page 20: Janogia20120921 yoshinotakeshi

多重化 WebSocket があれば

• Request response

• 非 request response

• 順序保存重視

• 並列性・独立性重視

20

Page 21: Janogia20120921 yoshinotakeshi

対応状況

• Chrome (2009年~)

• Firefox

• Internet Explorer 10

• Opera

• Safari

21

Page 22: Janogia20120921 yoshinotakeshi

使いものになるの?

• Chrome を使った 2009 年の実験

– WebSocket 成功数 ÷ HTTP 成功数

22

Port TLS 成功率

80 No 67%

61985 No 86%

443 Yes 95%

Page 23: Janogia20120921 yoshinotakeshi

L7 のみなさんへ

• HTTP プロキシ

• ファイヤーウォール

• ロードバランサ – HTTP Upgrade に対応

– WebSocket を読んで • バランス

– 多重化をばらす

• フィルタ、DoS ブロック

• Web サーバ – ぜひ実装を

23

Page 24: Janogia20120921 yoshinotakeshi

L3, L4 のみなさんへ

• ロードバランサ

• NAT – Load と TCP 本数があんまり関係なくなる

• Fairness metric の再考

– L4 バランサだけでは traffic が偏る可能性 • L7 まで見る

• Timeout の再考

(Thanks to v6pc)

24

Page 25: Janogia20120921 yoshinotakeshi

WebSocket とは

• (主に)ウェブブラウザのための

• 軽量で

• セキュリティや HTTP との連携を考慮した

• Built-in の

• 双方向通信手法

• トラフィックパターンいろいろ変わるかも

25