Save 37% off PRO during our Black Friday Sale! »

入門 HTTP ― CAMPHOR- Day 2020 / Introducing HTTP

03d565e037c55da5d503eb5a21dba86b?s=47 Honai
March 29, 2020

入門 HTTP ― CAMPHOR- Day 2020 / Introducing HTTP

1996年のHTTP/1.0制定から24年。Webは目まぐるしい進化を遂げましたが、それを支えた通信プロトコルであるHTTPのコンセプトは、実はあまり変わっていません。 HTTP/1.0から、現在標準化に向けて議論が進められているHTTP/3まで、どのように進化してきたのかでしょうか。 TLSやTCP/UDPなど関連する別レイヤーのプロトコルにも触れながら解説します。

03d565e037c55da5d503eb5a21dba86b?s=128

Honai

March 29, 2020
Tweet

Transcript

  1. 入門 HTTP

  2. 自己紹介 @_honai

  3. HTTP、使ってますか

  4. HTTP: Hyper Text Transfer Protocol リクエスト レスポンス この画像が ほしいです どうぞ

    クライアント (スマホ、PC、サーバー) サーバー (サーバー) https://youtube.com/
  5. HTTPの歴史 ← 現役!

  6. Webアプリをつくる人にとってのHTTP

  7. “再”入門 HTTP Webを支えるHTTPの進化を知ってほしい!

  8. トークの内容

  9. Host: www.example.com Accept: */* HTTPの基本要素 ― リクエスト GET /index.html HTTP/1.1

    Host: www.example.com Accept: */* GET /index.html HTTP/1.1 メソッド パス フィールド名1 値1 ヘッダー フィールド名2 値2 メソッドいろいろ • GET • HEAD • POST • PUT • DELETE • CONNECT • OPTIONS
  10. HTTPの基本要素 ― レスポンス HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length:

    1256 <html> <head> <title>Example Domain</title> ... HTTP/1.1 200 OK <html> <head> <title>... ステータス ボディ 500 Internal Server Error 404 Not Found
  11. HTTP/1.x TCPを使ったテキストベースのシンプルなプロトコル

  12. HTTP/1.0 と HTTP/1.1 TCPのコネクション

  13. HTTP/1.0 と HTTP/1.1 TCPのコネクション GET / HTTP/1.0 TCP 03 a7

    1e 3c TCP 03 a7 1e 3c TCP 03 a7 1e 3c 0111 1011 1101 1011 0001 1001 1010 1010 0101 0000 0001 0101 文字列をエンコード
  14. HTTP/1.0 と HTTP/1.1 TCPのコネクション HTTP/1.0 200 OK Content-Type: te… <html>

    TCP 03 a7 1e 3c TCP 03 a7 1e 3c TCP 03 a7 1e 3c 0111 1011 1101 1011 0001 1001 1010 1010 0101 0000 0001 0101 バイナリをデコードするとレスポンスの文字列になる テキストベースのシンプルなプロトコル
  15. HTTP/1.x の課題 ― 毎回接続すると時間がかかる 時間 接続処理 切断処理 TCP通信は接続/切断に1RTTかかる

  16. HTTP/1.x の課題 ― 毎回接続すると時間がかかる 時間 接続処理 切断処理 リクエスト1 接続処理 切断処理

    リクエスト2 接続処理 切断処理 リクエスト3 リクエスト毎に接続/切断するので遅い
  17. Keep Alive 時間 接続処理 リクエスト1 リクエスト2 リクエスト3 TCPの接続をつなぎっぱなしにして高速化 (タイムアウト等で切断)

  18. Keep Aliveの効果を見てみましょう // nginx.conf server_1 { listen 8001; keepalive_timeout 0;

    } server_2 { listen 8002; keepalive_timeout 65; } // index.html <iframe src="http://localhost:8001" /> <iframe src="http://localhost:8002" /> nginxでサーバーを2つ立てる iframeで両方を読み込む
  19. None
  20. TLS と HTTP

  21. TLS: Transport Layer Security TCP TLS HTTP TCP HTTP http://

    https://
  22. TLSとハンドシェイク TLSで通信するにはハンドシェイクが必要 TLS1.2 フルハンドシェイク 初回接続:2RTT(上図)、再接続:1RTT Client Hello Server Hello Certificate

    Server Key Exchange Client Key Exchange Change Cipher Spec Finished Change Cipher Spec Finished
  23. TLS 1.3 ― 2018年にRFC 8446として公開 フルハンドシェイク: 1RTT HTTPのレイテンシ削減につながった 再接続: 0RTT

  24. HTTP/2 仮想的に多重化されたバイナリベースのプロトコル

  25. HTTP/1.x の課題 ― 輻輳制御の効率が悪い 引用した図を削除しています

  26. HTTP/1.x の課題 ― HTTP HoLブロッキング リクエストA リクエストB リクエストC HoL (Head

    of Line) ブロッキング 待ち行列の先頭が後続を止める 1つの(重い)リクエストが 他のリクエストをブロックしてしまう
  27. HTTP/2 ― バイナリベース TCP・TLSで接続 FRAME HTTP/2 Frame Layout FRAME FRAME

    FRAME FRAME FRAME HTTPをフレームに分解して送受信する 0 1 2 3 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 +-----------------------------------------------+ | Length (24) | +---------------+---------------+---------------+ | Type (8) | Flags (8) | +-+-------------+---------------+-------------------------------+ |R| Stream Identifier (31) | +=+=============================================================+ | Frame Payload (0...) ... +---------------------------------------------------------------+
  28. HTTP/2 ― ストリームによる多重化 ストリームIDを振ることで 仮想的に通信路を多重化する ストリーム1 ストリーム1 ストリーム2 ストリーム2 ストリーム3

    ストリーム3 TCP・TLSで接続 FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME FRAME
  29. HTTP/2 ― 輻輳制御が効率的 1本のTCP接続で帯域を最大限に使える 引用した図を削除しています

  30. HTTP/2 ― HTTP HoLブロッキングを解消 ストリーム1 ストリーム1 ストリーム2 ストリーム2 ストリーム3 ストリーム3

    FRAME FRAME FRAME FRAME FRAME ストリームで並列化 非同期
  31. HTTP/2 ― HTTP HoLブロッキングを解消 ストリーム1 ストリーム1 ストリーム2 ストリーム2 ストリーム3 ストリーム3

    FRAME FRAME FRAME FRAME FRAME ストリームで並列化 非同期
  32. HTTP/2 ― HTTP HoLブロッキングを解消 リクエストは他のリクエストに ブロックされない ストリーム1 ストリーム1 ストリーム2 ストリーム2

    ストリーム3 ストリーム3 FRAME FRAME FRAME FRAME FRAME ストリームで並列化 非同期
  33. HTTP/2 ― HTTPヘッダーの圧縮

  34. HTTP/2の課題 ― TCP HoLブロッキング TCPのパケットロス/再送が すべてのストリームをブロックしてしまう OS アプリケーション (TCPソケット) FRAME

    FRAME FRAME FRAME FRAME FRAME × 再送 FRAME FRAME FRAME FRAME ロスしたのは 青 のストリーム 緑 や 橙 のストリームには関係ないが TCPの実装上、 青 が再送されるまで アプリケーションは処理できない (ブラウザ)
  35. HTTP/2の課題 ― 接続までの時間 TCPとTLSのハンドシェイクで時間がかかる TCP接続処理

  36. HTTP/2の課題 HTTPのレイヤーではどうにもならない! Google 「TCPやめて新しいプロトコル作るわ」

  37. QUIC UDPベースの多重化されたセキュアな転送プロトコル

  38. ChromeでGoogleのサービスにアクセス

  39. QUIC: UDPベースの多重化されたセキュアな転送プロトコル TCP TLS HTTP/2 IP UDP IP HTTP/2 *

    独自 暗号化 QUIC Google版QUIC + HTTP/2* HTTP/2 * HTTP/2の機能抜粋版
  40. なぜUDPを使うか TCP UDP 通信の方向 双方向 相手に送るだけ 誤り/不達の検出 できる できない データの順序

    保証される 保証されない 輻輳制御 ある ない UDP 1ac508 UDPを利用し、TCPよりも適したプロトコルを (ユーザー空間に)構築する 機能がシンプルな代わりに、(届けば) 到達速度がはやい UDPはTCPと同じように普及している UDP 1ac508 UDP 1ac508
  41. QUIC: UDPベースの多重化されたセキュアな転送プロトコル FRAME UDP QUIC FRAME UDP QUIC FRAME UDP

    QUIC FRAME UDP QUIC FRAME UDP QUIC FRAME UDP QUIC FRAME UDP QUIC FRAME UDP QUIC QUIC コネクション ストリーム1 ストリーム2 ストリーム3 QUIC コネクション ストリーム1 ストリーム2 ストリーム3 FRAME FRAME FRAME FRAME FRAME FRAME FRAME
  42. QUIC ― HoLブロッキングがない パケットロスが起きても 他のストリームの処理をブロックしない OS アプリケーション (UDPソケット) FRAME FRAME

    FRAME FRAME FRAME FRAME × 再送 FRAME FRAME FRAME FRAME (ブラウザ) FRAME FRAME
  43. QUIC ― 0-RTT 最短 0-RTT でデータを送れる TCP+TLSの場合は、それぞれにハンドシェイクが必要 QUICはトランスポートとセキュリティを統合したプロトコルであり、 再接続の場合、真に0-RTTで暗号化されたデータを送信可能

  44. QUIC ― Connection Migration Internet 111.333.22.1:65432 111.222.33.4:67890 UDP ID:abc QUIC

    UDP ID:abc QUIC UDP ID:abc QUIC コネクション コネクション ID:abc QUIC ID:abc QUIC ID:abc QUIC IPやポートが変わっても処理を継続できる
  45. HTTP/3 QUICを利用した新しいHTTP

  46. 2つのQUIC UDP IP HTTP/2 独自 暗号化 QUIC Google版QUIC + HTTP/2

    IETF版QUIC + HTTP/3 UDP IP HTTP/3 TLS QUIC
  47. HTTP/3 ― QUICを利用した新しいHTTP HTTP/2 バイナリフォーマット ヘッダー圧縮(HPACK) ストリームによる多重化 サーバープッシュ HTTP/3 QUIC

    バイナリフォーマット ヘッダー圧縮(QPACK) サーバープッシュ ストリームによる多重化 暗号化、輻輳制御、その他 HTTP/2からQUICと重複する機能を除いたもの QUICとともにIETFで議論が進んでいる
  48. まとめ

  49. HTTPの歴史(再掲) 20年以上Webを支えているHTTP/1.1(もちろん現役) HTTPのセマンティックは1.x系から変わっていない

  50. HTTPの進化は「水面下」で Webを支えるHTTPのこれからに注目!

  51. 参考資料 https://tools.ietf.org/html/draft-ietf-quic-http-27 https://tools.ietf.org/html/draft-ietf-quic-transport-27 https://tools.ietf.org/html/draft-ietf-quic-tls-27 https://tools.ietf.org/html/rfc7540 https://hpbn.co/ https://www.iij.ad.jp/dev/tech/techweek/pdf/151111_4.pdf https://docs.google.com/presentation/d/1OASDYIJlgSFg6hRkUjqdKfYTK1ZUk5VMGP3Iv2zQCI8 最後までご視聴ありがとうございました。 質問:#CAMPHOR_Day,

    YouTubeコメント