spdyの中身を見てみよう
TRANSCRIPT
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
圧縮データ