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: Hyper Text Transfer Protocol リクエスト レスポンス この画像が ほしいです どうぞ

    クライアント (スマホ、PC、サーバー) サーバー (サーバー) https://youtube.com/
  2. 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
  3. 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
  4. 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 文字列をエンコード
  5. 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 バイナリをデコードするとレスポンスの文字列になる テキストベースのシンプルなプロトコル
  6. HTTP/1.x の課題 ― 毎回接続すると時間がかかる 時間 接続処理 切断処理 リクエスト1 接続処理 切断処理

    リクエスト2 接続処理 切断処理 リクエスト3 リクエスト毎に接続/切断するので遅い
  7. 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で両方を読み込む
  8. HTTP/1.x の課題 ― HTTP HoLブロッキング リクエストA リクエストB リクエストC HoL (Head

    of Line) ブロッキング 待ち行列の先頭が後続を止める 1つの(重い)リクエストが 他のリクエストをブロックしてしまう
  9. 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...) ... +---------------------------------------------------------------+
  10. HTTP/2の課題 ― TCP HoLブロッキング TCPのパケットロス/再送が すべてのストリームをブロックしてしまう OS アプリケーション (TCPソケット) FRAME

    FRAME FRAME FRAME FRAME FRAME × 再送 FRAME FRAME FRAME FRAME ロスしたのは 青 のストリーム 緑 や 橙 のストリームには関係ないが TCPの実装上、 青 が再送されるまで アプリケーションは処理できない (ブラウザ)
  11. QUIC: UDPベースの多重化されたセキュアな転送プロトコル TCP TLS HTTP/2 IP UDP IP HTTP/2 *

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

    保証される 保証されない 輻輳制御 ある ない UDP 1ac508 UDPを利用し、TCPよりも適したプロトコルを (ユーザー空間に)構築する 機能がシンプルな代わりに、(届けば) 到達速度がはやい UDPはTCPと同じように普及している UDP 1ac508 UDP 1ac508
  13. 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
  14. 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やポートが変わっても処理を継続できる
  15. HTTP/3 ― QUICを利用した新しいHTTP HTTP/2 バイナリフォーマット ヘッダー圧縮(HPACK) ストリームによる多重化 サーバープッシュ HTTP/3 QUIC

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