spdyの中身を見てみよう

22
SPDY のののののののの • IIJ のののの • ohtsu ののの iij.ad.jp 2012 の 5 の 17 の

Upload: shigekiohtsu

Post on 20-Aug-2015

5.987 views

Category:

Technology


1 download

TRANSCRIPT

SPDY の中身を見てみる

• IIJ 大津繁樹• ohtsu あっと iij.ad.jp

2012 年 5 月 17 日

Data Frames Control Frames

1. SYN_STREAM2. SYN_REPLY3. RST_STREAM4. SETTINGS5. NOOP( spdy/3 で廃止 )6. PING7. GOAWAY8. HEADERS9. WINDOW_UPDATE• CREDENTIAL

SPDY フレームの種類と役割

HTTP リクエスト・レスポンスヘッダの送受信に使う

HTTP リクエスト・レスポンスボディの送受信などで使う

その他 SPDY 通信制御情報のやり取りに使う

SSL ハンドシェイク

SYN_STREAM

SYN_REPLY

DATA Frame

GOAWAY

クライアント サーバー

NPN (Next Protocol Negotiation) を使って SPDY 利用バージョンを交換

HTTP リクエストヘッダ情報を送信

HTTP レスポンスヘッダ情報を送信

HTTP レスポンスボディを送信

SPDY ストリーム利用停止を通知

単純な SPDYのストリームフロー

spdylay を使って SPDY の中身を見るwww.google.com サーバ編 (その1)$ ./examples/spdycat -v https://www.google.com

[ 0.012] NPN select next protocol: the remote server offers: * spdy/3 * spdy/2 * http/1.1 NPN selected the protocol: spdy/3

[ 0.018] recv SETTINGS frame <version=3, flags=0, length=20> (niv=2) [4(1):100] [7(0):12288]

NPN でプロトコル情報の交換

google サーバから SDPY の設定情報が送られてくる

4: SETTINGS_MAX_CONCURRENT_STREAMS 最大同時アクティブなストリーム数 7: SETTINGS_INITIAL_WINDOW_SIZE ストリームの初期ウィンドウサイズ(バイト)

spdylay を使って SPDY の中身を見るwww.google.com サーバ編 (その 2 )

[ 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

SYN_STREAM を使って HTTP リクエストヘッダ情報をサーバに送信

spdylay を使って SPDY の中身を見るwww.google.com サーバ編 (その 3 )

[ 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 ( 以下略)

SYN_REPLY で HTTP レスポンスヘッダ情報がサーバから送られてくる

spdylay を使って SPDY の中身を見るwww.google.com サーバ編 (その 4 )

<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)

[ 0.058] send GOAWAY frame <version=3, flags=0, length=8> (last_good_stream_id=0

Data フレーム で HTTP レスポンスボディがサーバから送られてくる

SPDY 終了

spdylay を使って SPDY の中身を見るChrome ブラウザ編 (その 1 )

./examples/spdyd --htdocs=. -v 3000 ./foo-key.pem ./foo-cert.pem

[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 ( 以下略 )

[id=1] [ 5.046] closedThe negotiated next protocol: spdy/3

NPN でプロトコル情報の決定

SYN_STREAM を使って HTTP リクエストヘッダ情報が Chrome から送られてくる

spdylay を使って SPDY の中身を見るChrome ブラウザ編 (その 2 )

[id=2] [ 5.052] send SETTINGS frame <version=3, flags=0, length=12> (niv=1) [4(0):100]

[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

サーバから SETTINGS によって同時ストリーム数の設定

SYN_REPLY で HTTP レスポンスヘッダ情報を Chrome に送る

spdylay を使って SPDY の中身を見るChrome ブラウザ編 (その 3 )

[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

データフレームでレスポンスボディを送信最後のデータフレームは flag 1 (FLAG_FIN) を使ってストリームを終了させてます。

[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

spdylay を使って SPDY の中身を見るChrome ブラウザ編 (その 4 )

Chrome が favicon.ico を取りに来てるリクエスト

spdylay を使って SPDY の中身を見るChrome ブラウザ編 (その 5 )

[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)

[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

favicon なんて用意していないので 404 を返す SYN_REPLY

最後に Chrome から PING で SPDY の生存確認をしています。

0 1 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

1 version Type

Flags Length

Data

Control frames

0 1 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

Data frames

Flags

0x01 FLAG_FIN

0x02 FLAG_COMPRESS

0 1 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

1 version 1

Flags Length

X Stream-ID

X Associated-To-Stream-ID

Pri Unused Slot Number of Name/Value pairs (32bit)

Number of Name/Value pairs

Length of name (32bit)

Name (string)

Length of value (32bit)

Value (string)

SYN_STREAM

Flags

0x01 FLAG_FIN

0x02 FLAG_UNIDIRECTIONAL圧縮データ

0 1 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

1 version 2

Flags Length

X Stream-ID

Number of Name/Value pairs

Length of name

Name

Length of value

Value

SYN_REPLY

Flags

0x01 FLAG_FIN

圧縮データ

0 1 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

1 version 3

0 (flags) 8 (length)

X Stream-ID

Status Code

RST_STREAM

Satus code

1 PROTOCOL_ERROR 7 FLOW_CONTROL_ERROR

2 INVALID_STREAM 8 STREAM_ALREADY_CLOSED

3 REFUSED_STREAM 9 STREAM_IN_USE

4 UNSUPPORTED_VERSION 10 INVALID_CREDENTIALS

5 CANCEL 11 FRAME_TOO_LARGE

6 INTERNAL_ERROR

0 1 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

1 version 4

Flags Length

Number of entries

ID.flags ID

Value

SETTINGS

ID

1 SETTINGS_UPLOAD_BANDWIDTH 5 SETTINGS_CURRENT_CWND

2 SETTINGS_DOWNLOAD_BANDWIDTH 6 SETTINGS_DOWNLOAD_RETRANS_RATE

3 SETTINGS_ROUND_TRIP_TIME 7 SETTINGS_INITAL_WINDOW_SIZE

4 SETTINGS_MAX_CONCURRENT_STREAM 8 SETTINGS_CLIENT_CERTIFICATE_VECTOR_SIZE

Flags

0x01 FLAG_SETTING_CLEAR_SETTINGS

ID.flags

0x01 FLAG_SETTINGS_PERSIST_VALUE

0x02 FLAG_SETTINGS_PERSISTED

0 1 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

1 version 6

0 (flags) 4 (length)

32-bit ID

PING

0 1 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

1 version 7

0 (flags) 8 (length)

X Last-good-stream-ID

Status code

GOAWAY

Status code

0 OK

1 PROTOCOL_ERROR

11 INTERNAL_ERRRO

0 1 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

1 version 8

Flags Length

X Stream-ID

Number of Name/Value pairs

Length of name

Name

Length of value

Value

HEADERS

Flags

0x01 FLAG_FIN

圧縮データ

0 1 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

1 version 9

0 (flags) 8 (length)

X Stream-ID

X Delta-Window-Size

WINDOW_UPDATE