読者です 読者をやめる 読者になる 読者になる

chromeに実装されたSPDY/3.1について

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