Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ハイパフォーマンスブラウザネットワーキング 第12章 HTTP2

ハイパフォーマンスブラウザネットワーキング 第12章 HTTP2

Ilya Grigorik著『ハイパフォーマンスブラウザネットワーキング』第12章ベースの、HTTP2解説です。

Takuma Watanabe

January 06, 2016
Tweet

More Decks by Takuma Watanabe

Other Decks in Technology

Transcript

  1. Table of Contents 2 ¨  Did you remember? Lessons on

    TCP(/IP) ¨  Why HTTP/1 is SLOW? ¨  What is HTTP/2? ¨  Difference between HTTP 1 and 2 ¨  History of HTTP/2 ¨  Approaches of HTTP/2 ¨  HTTP/2 with HTTP/1
  2. Table of Contents 3 ¨  Did you remember? Lessons on

    TCP(/IP) ¨  Why HTTP/1 is SLOW? ¨  What is HTTP/2? ¨  Difference between HTTP 1 and 2 ¨  History of HTTP/2 ¨  Approaches of HTTP/2 ¨  HTTP/2 with HTTP/1
  3. Did you remember? Lessons on TCP(/IP) ¨  TCPは… ¤  接続時に3-way

    handshakingをする n  1.5往復かかる ¤  2つの通信制御がある n  フロー制御: 受信者のためにある; Window scaling n  輻輳制御: ネットワーク全体のためにある; Slow-start 5
  4. Did you remember? Lessons on TCP(/IP) ¨  TCPは… ¤  接続時に3-way

    handshakingをする n  1.5往復かかる 6 client server Connection initiation Connection established SYN ACK + SYN ACK Time
  5. フロー制御 (window control) Did you remember? Lessons on TCP(/IP) ¨ 

    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 ………
  6. Head of Line (HoL) blocking Why HTTP/1 is SLOW? ¨ 

    HTTP/1 is slow because… ¤  ヘッダが大きい ¤  1リクエスト毎に1コネクションを張る n  3-way handshaking: 1.5往復分の時間がかかる n  Slow start: 通信速度が遅いうちに切断する ¤  HoL blockingが発生する (コネクション数上限により) 8
  7. Table of Contents 9 ¨  Did you remember? Lessons on

    TCP(/IP) ¨  Why HTTP/1 is SLOW? ¨  What is HTTP/2? ¨  Difference between HTTP 1 and 2 ¨  History of HTTP/2 ¨  Approaches of HTTP/2 ¨  HTTP/2 with HTTP/1
  8. What is HTTP/2? ¨  HTTP/2とは… ¤  HTTP/1の拡張 n  考え方(concept)を変えない n 

    メソッド、ステータスコード、URI、ヘッダのフィールドなど n  性能を変える ¤  (拡張なのに)なぜメジャーバージョンが変わるのか? n  (性能を満たすため)互換性がなくなるため ¤  起源 n  GoogleによるSPDYプロトコルがベース 10
  9. Diff. b/w HTTP/1 and 2 ¨  HTTP/2とHTTP/1との違い ¤  明確な遅延改善を、計測可能なかたちでもたらす ¤ 

    HoL blockingの改善 ¤  多量なコネクションの排除 (=TCP1本のみ) ¨  ほかHTTP/2で成し遂げること ¤  HTTP/1と2の関連(特に中継装置での扱い)を明確にする ¤  何を拡張したか、それはいつ・どのように用いるか を明確にする ¤  HTTP/1への今後の拡張も取り込んでいく 11
  10. History of HTTP/2 ¨  歴史 ¤  2009: Googleがウェブ性能改善のためSPDYを発表 ¤  〜2012:

    Chrome, Firefox, OperaがSPDYサポート       Google, Facebook, Twitterなどでも採用 ¤  2012/3: IETFにてHTTP2.0(現HTTP/2)の提案を公募開始 ¤  2012/11: WG first draft (SPDY v2ベース) ¤  2014/8: WG last call ¤  2014/12: IESGへProposed Standardの審査に提出 ¤  2015/2: IESGがProposed Standardとして承認 ¤  2015/5: RFC7540として発効 c.f. https://en.wikipedia.org/wiki/HTTP/2 12
  11. cf. SPDY ¨  SPDYとは… ¤  Googleで開発され、2009年に発表 ¨  SPDYで掲げられたゴール/ポリシー ¤  page

    load time 50% 削減 ¤  採用にあたり… n  コンテンツ側の変更を不要に n  インフラ変更を不要に ¤  コミュニティと協力して開発 ¤  実世界でのパフォーマンスを収集し検証 13
  12. Table of Contents 14 ¨  Did you remember? Lessons on

    TCP(/IP) ¨  Why HTTP/1 is SLOW? ¨  What is HTTP/2? ¨  Difference between HTTP 1 and 2 ¨  History of HTTP/2 ¨  Approaches of HTTP/2 ¨  HTTP/2 with HTTP/1
  13. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 n  1本のTCPコネクションを使い回す n  コネクション内でストリームを多重化・優先付け ¤  ヘッダ圧縮 ¤  サーバプッシュの実現 ¤  フロー制御 15
  14. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 n  1本のTCPコネクションを使い回す n  コネクション内でストリームを多重化・優先付け ¤  ヘッダ圧縮 ¤  サーバプッシュの実現 ¤  フロー制御 16
  15. HTTP/1での通信 HTTP/2の通信 Approaches of HTTP/2: Designs and their goals ¨ 

    HTTP/2のアプローチ ¤  コネクションの多重化 n  1本のTCPコネクションを使い回す n  コネクション内でストリームを多重化・優先付け 17 TCP1 TCP2 TCP3
  16. メッセージ分割 (called “binary framing layer”) Approaches of HTTP/2: Designs and

    their goals ¨  HTTP/2のアプローチ ¤  コネクションの多重化 n  実現手法: HTTPメッセージを分割する 18 message frame1 HTTP/1 HTTP/2 frame2 frame3 … message
  17. Elements of binary framing layer in HTTP/2 Approaches of HTTP/2:

    Designs and their goals ¨  コネクションの多重化 ¤  要素 n  Stream: コネクション中の、仮想の”双方向コネクション”。 n  Message: 一連のフレームからなる、完全なメッセージ。 n  Frame: 最小単位。ヘッダを持ち、ストリーム番号が記されている。 19 frame1 frame2 frame3 … message message stream
  18. Approaches of HTTP/2: Designs and their goals ¨  コネクションの多重化 ¤ 

    要素 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
  19. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 n  1 origin ごとに 1 connection で利用する n  Origin: http://www1.example.com/foo/bar n  ストリームごとに優先度を付けられる n  ただしどう振る舞うかは自由。 「君はこの優先度を使うこともできるし、無視することもできる。」 n  つまり:実装によっては、HTMLやCSSを優先、 画像を後回しなど、インテリジェントな制御をしてもよい。 21
  20. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 n  メリット n  TCPを確立する遅延を削減 n  Slow start n  スケーラビリティ向上 n  今まで:多数のコネクションをさばくことがボトルネックだった n  一貫した優先度付け n  同じTCP内なので、優先制御に一貫性がある n  TCPを何本も張ると、個別バラバラにフロー制御される n  ネットワーク輻輳の緩和 n  TCPを複数張ると、互いにかち合う n  HoL blockingを低減 n  HTTP/1時代の”最適化”を不要に n  ドメインシャーディング、ファイル結合、 スプライト、インライン化… 22
  21. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 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
  22. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 n  1本のTCPコネクションを使い回す n  コネクション内でストリームを多重化・優先付け ¤  ヘッダ圧縮 ¤  サーバプッシュの実現 ¤  フロー制御 24
  23. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    ヘッダ圧縮 n  前のリクエストと同じ部分を省略する n  下の例では、Request 2では:pathのみ送る。 n  今まで送られたヘッダを記憶しておく必要がある。 25 Request 1 :method :scheme :authority :path user-agent cookie GET https example.com /index.htm Mozilla/5.0 (Macintosh… ID=supercalifragilistic… Request 2 :method :scheme :authority :path user-agent cookie GET https example.com /logo.png Mozilla/5.0 (Macintosh… ID=supercalifragilistic…
  24. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    ヘッダ圧縮 (参考) n  SPDY v2までは zlibで圧縮していた n  2012年にCRIME攻撃*が発見され、廃止に n  (1)圧縮=重複があると削る、 (2)暗号化されていてもペイロードサイズは覗ける、ことを利用した攻 撃。 n  “Fast Holly-wood style decryption”なんて煽る研究者**も… 1.  適当なサイトにJavaScriptを埋め込む 2.  攻撃先(HTTPS)にいい感じにリクエストを送りつける 1.  ※zlib=DEFLATE(=LZ77+Huffman coding←ここがミソ) 3.  リクエスト(暗号化済)パケットのサイズを監視する 4.  平均6リクエストで、クッキー1バイトを盗める! 26 * https://en.wikipedia.org/wiki/CRIME ** https://docs.google.com/presentation/d/11eBmGiHbYcHR9gL5nDyZChu_-lCa2GizeuOfaLU2HOU/edit
  25. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 n  1本のTCPコネクションを使い回す n  コネクション内でストリームを多重化・優先付け ¤  ヘッダ圧縮 ¤  サーバプッシュの実現 ¤  フロー制御 27
  26. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    サーバプッシュの実現 n  リクエストを受け取る前に、データを送りつけられる 1.  まずPUSH_PROMISEを送る(ここでストリームが確立) 2.  その後DATAを送る n  待って…ストリーム番号が被らない? n  クライアントもサーバもストリームを開始できる… n  → クライアントは奇数、サーバは偶数のストリーム番号を使用 28
  27. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    コネクションの多重化 n  1本のTCPコネクションを使い回す n  コネクション内でストリームを多重化・優先付け ¤  ヘッダ圧縮 ¤  サーバプッシュの実現 ¤  フロー制御 29
  28. Approaches of HTTP/2: Designs and their goals ¨  HTTP/2のアプローチ ¤ 

    フロー制御 n  受信者側からのみ制御できる n  WINDOW_UPDATEフレームを送りつける n  End-to-endではない…中間のプロキシなども介入できる n  Stream単位・Connection単位の両方がある 30
  29. Table of Contents 31 ¨  Did you remember? Lessons on

    TCP(/IP) ¨  Why HTTP/1 is SLOW? ¨  What is HTTP/2? ¨  Difference between HTTP 1 and 2 ¨  History of HTTP/2 ¨  Approaches of HTTP/2 ¨  HTTP/2 with HTTP/1
  30. HTTP/2 with HTTP/1 ¨  HTTP/1とHTTP/2との共存 ¤  TLS上 n  TLS拡張であるALPNでHTTP2を使うかHTTP1を使うか決定 n 

    「平たく」言うと…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/
  31. References 33 ¨  I. Grigorik, “High Performance Browser Networking,” O’REILLY,

    2013. ¨  Wikipedia, “HTTP/2”, https://en.wikipedia.org/wiki/HTTP/2, Jan 2015. ¨  IETF HTTP WG, “HTTP/2”, https://http2.github.io/, Jan 2015.