More Related Content
PPTX
PDF
PDF
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥 PDF
PDF
Hadoop book-2nd-ch3-update PDF
Richard high performance fuzzing ja PDF
PDF
What's hot
PDF
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説 PDF
AutoDock_vina_japanese_ver.2.0 PDF
AutoDock_vina_japanese_ver.3.0 PPTX
RLSを用いたマルチテナント実装 for Django PDF
PDF
Rails SQL Injection Examplesの紹介 PDF
#mailerstudy 02 暗号入門 (2012-02-22更新) PPTX
PPT
PDF
TAM 新人ディレクター システムスキルアップ プログラム第2回「システム案件のヒアリング」 PPTX
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応) PDF
PDF
Viewers also liked
PDF
Hokkaido.cap #osc11do Wiresharkを使いこなそう! PDF
Speed matters, So why is your site so slow? PDF
IIJmio meeting 14 IIJmioタイプAとSIMフリー端末について PPTX
ウェブを速くするためにDeNAがやっていること - HTTP/2と、さらにその先 PDF
ISOC-JP/JPNIC IETF95 報告会 ネットワーク計測関連WG報告 PDF
IIJmio meeting 14 みおふぉん教室「格安スマホの選び方2017」 PDF
IIJmio meeting 14 SIMロックについて PDF
IIJmio meeting 14 IIJmio Updates 2016/10~2017/01 Similar to SPDYの話
PDF
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう PDF
Kyoto Tycoon Guide in Japanese PDF
法政大学情報科学部 2012年度コンピュータネットワーク-第11回授業-Web公開用 PDF
PDF
PDF
PDF
『どうする?どうやる? データセンター間ネット ワーク』 - 802.1aq(SPB)/TRILL@JANOG29 PDF
PDF
PDF
PDF
L2 over L3 ecnaspsulations PPT
PDF
Node.js で SPDYのベンチマーク体験サイトを作りました KEY
PDF
PDF
「Tiのソケットで待ってる」Titanium Nagoya Chatroom Vol.2 PDF
法政大学情報科学部 2012年度コンピュータネットワーク-第8回授業-Web公開用 PPTX
PDF
KEY
More from shigeki_ohtsu
PDF
PDF
PDF
PDF
PDF
Node-v0.12のTLSを256倍使いこなす方法 PDF
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話 PPTX
PDF
Technical Overview of QUIC PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する PPTX
node-gypを使ったネイティブモジュールの作成 PDF
HTTP/2.0がもたらすWebサービスの進化(後半) PDF
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t PPTX
httpbis interim とhttp2.0相互接続試験の話 PDF
PDF
httpbis interim@チューリッヒ レポート PDF
PDF
第43回HTML5とか勉強会 SPDY/QUICデモ PDF
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験) SPDYの話
- 1.
SPDY の話
IIJ 大津繁樹 (@jovi0608)
2012年7月5日
HTML5とか勉強会番外編
- ブラウザとサーバの間を考えよう-
- 2.
自己紹介
• 大津 繁樹(@jovi0608,https://github.com/shigeki)
• 所属: インターネットイニシアティブ(IIJ)
アプリケーション開発部 戦略的開発室
• HTML5/Node.js/Kinect 等流行もの担当
• 最近は Node.js コアの開発やってます。
- 3.
- 4.
SPDYを巡る動き
2009/11 spdy/1ドラフト公開、 spdy-dev開始
2010/01 TLS NPN拡張 I-Dリリース
2011/01 Google サービスの90%がSPDY化完了
2011/04 node-spdyリリース
2011/12 FireFox11 開発版に SPDY実装
2012/01 HTTP/2.0の議論開始(現在3案提示中)
2012/03 Jetty SPDYサポート, twitter SPDY化開始
2012/04 Apache 向け mod_spdy正式リリース
2012/05 339 SSL証明書がSPDY化(netcraft調査)
2012/05 F5 Big-IPで SPDYサポート
2012/06 nginxで SPDYサポート
- 5.
SPDYの状況
• 仕様
–spdy/3リリース, spdy/4議論開始(DNS・証明書プッシュ、
Proxy設定)
– HTTP/2.0議論開始 (MSも類似仕様を提出)
• 実装
– Chrome: spdy/2実装済(Ver4から) spdy/3試験中
– Android3.0以降の標準ブラウザでもサポート
– FireFox: 13から default有効(spdy/2)
– MS IE/Apple Safari ? Opera から仕様フィードバックが来
た
• 効果測定
– Google のベンチ(2009/11 ラボ環境25サイト約2倍)
– Google のベンチ (Chrome for Androidで1.3倍)
– Jetty のベンチ 245msec 早くなった。
– Akamai のベンチ 4.5%早いだけ
- 6.
最近のトピック(Chrome Secure
Proxy)
Chromeを「Amazon Silk もどき」に、
ChromeとProxyサーバ間をSPDYでつなぐ
実際にデモ
引用元 SPDY & Secure Proxy Support in Google Chrome by Ilya Grigorik
http://www.igvita.com/2012/06/25/spdy-and-secure-proxy-support-in-
google-chrome/
- 7.
- 8.
- 9.
SPDYの特徴
(Google I/O 2012セッション資料より引用)
• 常にTLSの上で動作
• ヘッダ圧縮をする
• バイナリーのフレーム
• フルデュプレックス、優先ストリームが
ある
• サーバプッシュが可能
• TCP接続が1つだけ
• 少ないパケットですむ
• 既存コンテンツを変える必要はない
引用元 Google I/O 2012 SPDY It's Here!: http://r2---
bru02t11.c.bigcache.googleapis.com/io2012/presentations/live%20to%20website/1201.pdf
- 10.
SPDYに向かないこと
(Google I/O 2012セッション資料より引用)
• 3rd partyドメインのリソースを多用してい
るサイト
– それぞれのサイトへの接続オーバヘッドが発
生
• 極めて少ないリソースで作られているサ
イト
– コネクション再利用の機会がなく効果が薄い。
• パケットロスが多発しているリンク
– RTTが大きくて、パケットロスが多発している
引用元 Google I/O 2012 SPDY It's Here!: http://r2---
ところでは HTTPよりも性能が悪くなる。
bru02t11.c.bigcache.googleapis.com/io2012/presentations/live%20to%20website/1201.pdf
- 11.
SPDY フレームの種類と役割
Data Frames Control Frames
1. SYN_STREAM
2. SYN_REPLY
3. RST_STREAM
4. SETTINGS
5. NOOP( spdy/3で廃止)
HTTPリクエスト・レ 6. PING
7. GOAWAY
スポンスボディの送 8. HEADERS
受信などで使う 9. WINDOW_UPDATE
10. CREDENTIAL
HTTPリクエスト・レスポンスヘッダ
の送受信に使う
その他SPDY通信制御情報のやり取り
に使う
- 12.
単純なSPDYのストリームフロー
SSLハンドシェイク
NPN (Next Protocol Negotiation) を
使って SPDY 利用バージョンを交換
SYN_STREAM
HTTPリクエストヘッダ情報を送信
SYN_REPLY
HTTPレスポンスヘッダ情報を送信
クライアント DATA Frame サーバー
HTTPレスポンスボディを送信
GOAWAY
SPDYストリーム利用停止を通知
SSLのTCPセッションは1つ
- 13.
SYN_STREAM (spdy/3)
0 12 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1 version 1 type
Flags Length ServerPush時
サーバ:偶数
クライアント:
のクライアン
X Stream-ID ト
奇数
X Associated-To-Stream-ID のストリームID
Pri Unused Slot Number of Name/Value pairs (32bit)
Number of Name/Value pairs
優先度
Length of name (32bit)
0-7
Name (string)
Length of value (32bit)
Value (string)
Flags
ServerPush時 0x01 FLAG_FIN
圧縮データ
はUNIDIRECTION 0x02 FLAG_UNIDIRECTIONAL
- 14.
SYN_REPLY (spdy/3)
0 12 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1 version 2
Flags Length
X Stream-ID
Number of Name/Value pairs
Length of name
Name
Length of value
Value
Flags
0x01 FLAG_FIN
圧縮データ
- 15.
Data frames (spdy/3)
01 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
0 Stream-ID
Flags Length
Data
Flags
0x01 FLAG_FIN
0x02 FLAG_COMPRESS
- 16.
Server Push とは、
HTTPリクエスト この間にサーバ
SYN_STREAM が先読みレスポ
UNIDIRECTIONAL
で ンスとデータを
assosicate-stream SYN_STREAM 送りまくる
が必須
キャッ DATA Frame
シュ
SYN_STREAM
クライアント
キャッ サーバー
DATA Frame
シュ
SYN_REPLY
HTTPレスポンス
DATA Frame
- 17.
Server Push とは、(コードで見ると)
varserver = spdy.createServer(options, function(req, res) {
if (//push//.test(req.url)) {
var header = {'content-type' : 'image/png', 'content-length': image_stat.size};
for(var i = 0; i < maximg; i++) {
var imageurl = '/images/hoge-' + i + '.png';
res.push(imageurl, header, function(err,stream) {
if(err) return;
stream.end(image);
}); リクエストイベントの後、レスポンス送信の前にストリーム
をクライアントに送る必要がある。
}
var content = getContent();
res.writeHead(200, {'Content-Type': 'text/html', 'Content-Length':
Buffer.byteLength(content)});
res.end(content);
}
});
- 18.
- 19.
Navigation Timing APIで見るSPDY
DOMComplete
DOMContentLoaded
/onLoad loadEventEnd
DOMLoading
DNS TCP HTTP DOM DOM onLoad
解決 接続 Request/ 処理時間#1 処理時間#2 (通常の
処理 Response (同期) (非同期・並列) JS処理)
DNS解決: SPDY/SSL ともに同じだろう
TCP: SSL のハンドシェイクは同じだが、再利用前提のSPDYは効果が高
い。
HTTPリクエスト・レスポンス: ヘッダ圧縮の分だけSPDYの効果が高い。
Server Push の影響も現れるだろう。
DOM処理(同期):SPDY/SSLともに同じだが Server Push の影響がここで
現れるだろう。
DOM処理(非同期): イメージのダウンロードなどSPDY効果が一番現
れる。
- 20.
単純なベンチ結果(10iter.)
上から、SSL, SPDY/2, SPDY/2+push
画像100枚 SPDY/SSL=1.12, SPDY+push/SSL=1.48
画像500枚 SPDY/SSL=1.15, SPDY+push/SSL=0.85
実際にベンチをデモしてみます。 Chrome 22.0 Canary
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
spdylayを使ってSPDYの中身を見る
www.google.com サーバ編(その1)
$ ./examples/spdycat -v https://www.google.com
NPNでプロトコル情報の交換
[ 0.012] NPN select next protocol: the remote server offers:
* spdy/3
* spdy/2
* http/1.1
NPN selected the protocol: spdy/3
google サーバから SDPYの設定情報が送られてくる
[ 0.018] recv SETTINGS frame <version=3, flags=0, length=20>
(niv=2)
[4(1):100]
[7(0):12288]
4: SETTINGS_MAX_CONCURRENT_STREAMS 最大同時アクティブなストリーム数
7: SETTINGS_INITIAL_WINDOW_SIZE ストリームの初期ウィンドウサイズ(バイト)
- 27.
spdylayを使ってSPDYの中身を見る
www.google.com サーバ編 (その2)
SYN_STREAMを使ってHTTPリクエストヘッダ情報をサーバに送信
[ 0.018] send SYN_STREAM frame <version=3, flags=1, length=106>
(stream_id=1, assoc_stream_id=0, pri=3)
:host: www.google.com
:method: GET
:path: /
:scheme: https
:version: HTTP/1.1
accept: */*
user-agent: spdylay/0.2.0
- 28.
spdylayを使ってSPDYの中身を見る
www.google.com サーバ編 (その3)
SYN_REPLY でHTTPレスポンスヘッダ情報がサーバから送られてくる
[ 0.057] recv SYN_REPLY frame <version=3, flags=0, length=558>
(stream_id=1)
:status: 302 Found
:version: HTTP/1.1
cache-control: private
content-length: 222
content-type: text/html; charset=UTF-8
date: Thu, 17 May 2012 01:24:23 GMT
location: https://www.google.co.jp/
server: gws
(以下略)
- 29.
spdylayを使ってSPDYの中身を見る
www.google.com サーバ編 (その4)
Dataフレーム でHTTPレスポンスボディがサーバから送られてくる
<HTML><HEAD><meta http-equiv="content-type"
content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>
[ 0.058] recv DATA frame (stream_id=1, flags=1, length=222)
SPDY終了
[ 0.058] send GOAWAY frame <version=3, flags=0, length=8>
(last_good_stream_id=0
- 30.
spdylayを使ってSPDYの中身を見る
Chrome ブラウザ編 (その1)
./examples/spdyd --htdocs=. -v 3000 ./foo-key.pem ./foo-cert.pem
NPNでプロトコル情報の決定
[id=1] [ 5.046] closed
The negotiated next protocol: spdy/3
SYN_STREAMを使ってHTTPリクエストヘッダ情報がChromeから送られてくる
[id=2] [ 5.051] recv SYN_STREAM frame <version=3, flags=1, length=250>
(stream_id=1, assoc_stream_id=0, pri=0)
:host: unixjp:3000
:method: GET
:path: /
:scheme: https
:version: HTTP/1.1
accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-charset: Shift_JIS,utf-8;q=0.7,*;q=0.3
(以下略)
- 31.
spdylayを使ってSPDYの中身を見る
Chrome ブラウザ編 (その2)
サーバからSETTINGSによって同時ストリーム数の設定
[id=2] [ 5.052] send SETTINGS frame <version=3, flags=0, length=12>
(niv=1)
[4(0):100]
SYN_REPLY でHTTPレスポンスヘッダ情報を Chrome に送る
[id=2] [ 5.052] send SYN_REPLY frame <version=3, flags=0, length=109>
(stream_id=1)
:status: 200 OK
:version: HTTP/1.1
cache-control: max-age=3600
content-length: 40
date: Thu, 17 May 2012 02:40:28 GMT
last-modified: Mon, 14 May 2012 20:34:32 GMT
server: spdyd spdylay/0.2.0
- 32.
spdylayを使ってSPDYの中身を見る
Chrome ブラウザ編 (その3)
データフレームでレスポンスボディを送信
最後のデータフレームは flag 1 (FLAG_FIN) を使ってストリームを
終了させてます。
[id=2] [ 5.052] send DATA frame (stream_id=1, flags=0, length=40)
[id=2] [ 5.053] send DATA frame (stream_id=1, flags=1, length=0)
[id=2] [ 5.053] stream_id=1 closed
- 33.
spdylayを使ってSPDYの中身を見る
Chrome ブラウザ編 (その4)
Chrome が favicon.ico を取りに来てるリクエスト
[id=2] [ 5.094] recv SYN_STREAM frame <version=3, flags=1, length=39>
(stream_id=3, assoc_stream_id=0, pri=1)
:host: unixjp:3000
:method: GET
:path: /favicon.ico
:scheme: https
:version: HTTP/1.1
accept: */*
accept-charset: Shift_JIS,utf-8;q=0.7,*;q=0.3
accept-encoding: gzip,deflate,sdch
accept-language: en-US,en;q=0.8
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5
(KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5
- 34.
spdylayを使ってSPDYの中身を見る
Chrome ブラウザ編 (その5)
favicon なんて用意していないので404を返す SYN_REPLY
[id=2] [ 5.095] send SYN_REPLY frame <version=3, flags=0, length=33>
(stream_id=3)
:status: 404 Not Found
:version: HTTP/1.1
content-encoding: gzip
date: Thu, 17 May 2012 02:40:28 GMT
server: spdyd spdylay/0.2.0
最後に Chrome から PING で SPDY の生存確認をしています。
[id=2] [ 6.048] recv PING frame <version=3, flags=0, length=4>
(unique_id=1)
[id=2] [ 6.048] send PING frame <version=3, flags=0, length=4>
(unique_id=1)