3 つとも同じ HTTP のセマンティクス(メソッド、ヘッダ、ステータスコード)を届けますが、バイトをワイヤ上でどう動かすかが異なります — 各バージョンは前のバージョンのボトルネックを修正します。テーマは、詰まった 1 つのリクエストが他を止める head-of-line(HOL)blocking の除去です。
HTTP/1.1 over TCP one request at a time per connection
conn ──[req A]──[req B]──[req C]──▶ B waits for A (HOL blocking at HTTP layer)
HTTP/2 over TCP many streams multiplexed on ONE connection
conn ══[A|B|C interleaved]══▶ but a lost TCP packet stalls ALL streams
(HOL blocking moves down to TCP)
HTTP/3 over QUIC (UDP) independent streams, per-stream delivery
conn ══[A][B][C]══▶ a lost packet stalls only its own stream
はコネクションごとに一度に 1 リクエストを送ります。ブラウザはホストごとに約 6 本の並列コネクションを開いてこれを回避し、テキストのヘッダは無圧縮で送られます。 は — 単一のコネクション上で多数の並行 — に加え、バイナリフレーミング、ヘッダ圧縮(HPACK)、server push を追加します。しかし依然として TCP 上で動くため、1 つのパケット損失が再送されるまで stream をブロックします:HOL blocking は単に HTTP 層から TCP へと下りただけです。
