Chrome Canary BuildでSPDY/3.1が実装された。
SPDY/3.1を試してみる
Chromeの起動オプションで「--enable-spdy31」を指定することで、SPDY/3.1が有効になる。
openssl s_serverでNPNにspdy/3.1を設定して通信すると、ちゃんとSPDY/3.1で通信してることが、chrome://net-internals/#spdyにて確認できる。
SPDY/3.1の変更点
SPDY/3.1の変更点はフロー制御の機能追加である。
今までストリーム単位のフロー制御しか行えなかったが、セッション単位のフロー制御が行えるようになった。
具体的には、WINDOW UPDATEフレームではDelta-Window-Sizeを適応する対象としてStream-IDを指定するが、ここでStream-IDに0を設定していた場合はセッションのフロー制御として処理を行うようである。
該当ソース
spdy_session.ccの該当部分ぽいところ
使用してるプロトコルによって、フロー制御の種類を選択する(spdy_session.ccの432行目から)
if (protocol >= kProtoSPDY31) { flow_control_state_ = FLOW_CONTROL_STREAM_AND_SESSION; session_send_window_size_ = kSpdySessionInitialWindowSize; session_recv_window_size_ = kSpdySessionInitialWindowSize; } else if (protocol >= kProtoSPDY3) { flow_control_state_ = FLOW_CONTROL_STREAM; } else { flow_control_state_ = FLOW_CONTROL_NONE; }
WINDOW_UPDATEフレーム受信時に、指定されたStream-IDが0(kSessionFlowControlStreamIdは0である)であればセッションのフロー制御として、そうでなければ指定されたストリームのフロー制御として処理してる部分(spdy_session.ccの1771行目から)
if (stream_id == kSessionFlowControlStreamId) { IncreaseSendWindowSize(static_cast<int32>(delta_window_size)); } else { scoped_refptr<SpdyStream> stream = active_streams_[stream_id]; CHECK_EQ(stream->stream_id(), stream_id); CHECK(!stream->cancelled()); stream->IncreaseSendWindowSize(static_cast<int32>(delta_window_size)); }