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

入門 HTTP ― CAMPHOR- Day 2020 / Introducing HTTP

Honai
March 29, 2020

入門 HTTP ― CAMPHOR- Day 2020 / Introducing HTTP

https://www.honai.me/slides/introducing-http/

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

Honai

March 29, 2020
Tweet

More Decks by Honai

Other Decks in Technology

Transcript

  1. 入門 HTTP

    View Slide

  2. 自己紹介
    @_honai

    View Slide

  3. HTTP、使ってますか

    View Slide

  4. HTTP: Hyper Text Transfer Protocol
    リクエスト
    レスポンス
    この画像が
    ほしいです
    どうぞ
    クライアント
    (スマホ、PC、サーバー)
    サーバー
    (サーバー)
    https://youtube.com/

    View Slide

  5. HTTPの歴史
    ← 現役!

    View Slide

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

    View Slide

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

    View Slide

  8. トークの内容

    View Slide

  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

    View Slide

  10. HTTPの基本要素 ― レスポンス
    HTTP/1.1 200 OK
    Content-Type: text/html; charset=UTF-8
    Content-Length: 1256


    Example Domain
    ...
    HTTP/1.1 200 OK


    ...
    ステータス
    ボディ
    500 Internal Server Error
    404 Not Found

    View Slide

  11. HTTP/1.x
    TCPを使ったテキストベースのシンプルなプロトコル

    View Slide

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

    View Slide

  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
    文字列をエンコード

    View Slide

  14. HTTP/1.0 と HTTP/1.1
    TCPのコネクション
    HTTP/1.0 200 OK
    Content-Type: te…

    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
    バイナリをデコードするとレスポンスの文字列になる
    テキストベースのシンプルなプロトコル

    View Slide

  15. HTTP/1.x の課題 ― 毎回接続すると時間がかかる
    時間
    接続処理
    切断処理
    TCP通信は接続/切断に1RTTかかる

    View Slide

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

    View Slide

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

    View Slide

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


    nginxでサーバーを2つ立てる
    iframeで両方を読み込む

    View Slide

  19. View Slide

  20. TLS と HTTP

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. HTTP/1.x の課題 ― HTTP HoLブロッキング
    リクエストA
    リクエストB
    リクエストC
    HoL (Head of Line) ブロッキング
    待ち行列の先頭が後続を止める
    1つの(重い)リクエストが
    他のリクエストをブロックしてしまう

    View Slide

  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...) ...
    +---------------------------------------------------------------+

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  33. HTTP/2 ― HTTPヘッダーの圧縮

    View Slide

  34. HTTP/2の課題 ― TCP HoLブロッキング
    TCPのパケットロス/再送が
    すべてのストリームをブロックしてしまう
    OS
    アプリケーション
    (TCPソケット)
    FRAME
    FRAME
    FRAME
    FRAME
    FRAME
    FRAME
    ×
    再送
    FRAME
    FRAME
    FRAME
    FRAME
    ロスしたのは 青 のストリーム
    緑 や 橙 のストリームには関係ないが
    TCPの実装上、 青 が再送されるまで
    アプリケーションは処理できない
    (ブラウザ)

    View Slide

  35. HTTP/2の課題 ― 接続までの時間
    TCPとTLSのハンドシェイクで時間がかかる
    TCP接続処理

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. QUIC: UDPベースの多重化されたセキュアな転送プロトコル
    TCP
    TLS
    HTTP/2
    IP
    UDP
    IP
    HTTP/2 *
    独自
    暗号化
    QUIC
    Google版QUIC +
    HTTP/2*
    HTTP/2
    * HTTP/2の機能抜粋版

    View Slide

  40. なぜUDPを使うか
    TCP UDP
    通信の方向 双方向 相手に送るだけ
    誤り/不達の検出 できる できない
    データの順序 保証される 保証されない
    輻輳制御 ある ない
    UDP 1ac508
    UDPを利用し、TCPよりも適したプロトコルを
    (ユーザー空間に)構築する
    機能がシンプルな代わりに、(届けば) 到達速度がはやい
    UDPはTCPと同じように普及している
    UDP 1ac508 UDP 1ac508

    View Slide

  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

    View Slide

  42. QUIC ― HoLブロッキングがない
    パケットロスが起きても
    他のストリームの処理をブロックしない
    OS
    アプリケーション
    (UDPソケット)
    FRAME
    FRAME
    FRAME
    FRAME
    FRAME
    FRAME
    ×
    再送
    FRAME
    FRAME
    FRAME
    FRAME
    (ブラウザ)
    FRAME
    FRAME

    View Slide

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

    View Slide

  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やポートが変わっても処理を継続できる

    View Slide

  45. HTTP/3
    QUICを利用した新しいHTTP

    View Slide

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

    View Slide

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

    View Slide

  48. まとめ

    View Slide

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

    View Slide

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

    View Slide

  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コメント

    View Slide