TCPは… ¤ 2つの通信制御がある n フロー制御: 受信者のためにある; Window control n 輻輳制御: ネットワーク全体のためにある; Slow-start 7 0 1 2 3 4 5 6 Sent Sent, waiting for ACK Not sent yet Window … 輻輳制御 (slow start) Speed (cwnd) Time ………
Designs and their goals ¨ コネクションの多重化 ¤ 要素 n Stream: コネクション中の、仮想の”双方向コネクション”。 n Message: 一連のフレームからなる、完全なメッセージ。 n Frame: 最小単位。ヘッダを持ち、ストリーム番号が記されている。 19 frame1 frame2 frame3 … message message stream
要素 n Stream n リクエスト→レスポンスに1往復使ったら (サーバープッシュする場合を除き)閉じる。 n Message n リクエスト、レスポンスは両者とも複数フレームに分割できる n 最後のフレームに END_HEADERS flagが立つ。 n ただし順序入れ替えは無し (ref. HTTP/2 FAQ) n Frame n フレームヘッダは9byte (ref. RFC7540, 書籍と異なるので注意) n Length フィールドが1byte伸びた n Length(24), Type(8), Flags(8), Reserved(1), Stream id.(31) n フレームの種類は下記など n HEADER … ヘッダ用(リクエスト・レスポンスともに使う) § CONTINUATION … ヘッダが分割された場合のフレーム n DATA … データ用 n PUSH_PROMISE … サーバプッシュ用(後述) n SETTINGS … 最大フレーム長など、通信方法の交換に使う。 20
コネクションの多重化 n 1 origin ごとに 1 connection で利用する n Origin: http://www1.example.com/foo/bar n ストリームごとに優先度を付けられる n ただしどう振る舞うかは自由。 「君はこの優先度を使うこともできるし、無視することもできる。」 n つまり:実装によっては、HTMLやCSSを優先、 画像を後回しなど、インテリジェントな制御をしてもよい。 21
コネクションの多重化 n メリット n TCPを確立する遅延を削減 n Slow start n スケーラビリティ向上 n 今まで:多数のコネクションをさばくことがボトルネックだった n 一貫した優先度付け n 同じTCP内なので、優先制御に一貫性がある n TCPを何本も張ると、個別バラバラにフロー制御される n ネットワーク輻輳の緩和 n TCPを複数張ると、互いにかち合う n HoL blockingを低減 n HTTP/1時代の”最適化”を不要に n ドメインシャーディング、ファイル結合、 スプライト、インライン化… 22
コネクションの多重化 n デメリット n Window scaling (window sizeを1Gまで大きくする)が 無効の場合はいまいち n パケットロスの影響が大きい n コネクション全体に影響する n TCP HoLは依然存在する n おさらい: パケットロス/入れ替え時の並び替え待ちのこと n Well, then? n 実験結果では、パケットロス時の悪影響より、 圧縮や優先付けの利点が勝った n パケットの総数が従来のHTTP(1.x)より40%減 n TCPの最適化こそが次なる課題 23
サーバプッシュの実現 n リクエストを受け取る前に、データを送りつけられる 1. まずPUSH_PROMISEを送る(ここでストリームが確立) 2. その後DATAを送る n 待って…ストリーム番号が被らない? n クライアントもサーバもストリームを開始できる… n → クライアントは奇数、サーバは偶数のストリーム番号を使用 28
「平たく」言うと…TLS確立時に中身が何かを伝えることができる n ここで「HTTP2使うで」と伝える ¤ 平文その1 n はじめのHTTP/1リクエスト中にHTTP2-Settingsフィールドを追加 n 返答が101 Switching Protocolsの場合、そこからHTTP/2で通信開始 ¤ 平文その2 n DNSレコードに基づき、いきなりHTTP2通信を開始する n と本にはあるが、当該のDraft*はexpired(死んでいる)… 32 * https://datatracker.ietf.org/doc/draft-lear-httpbis-svcinfo-rr/