むンタヌネット゚ンゞニアリングタスクフォヌス (IETF) M. Bishop, 線集者
Request for Comments: 9114 Akamai
カテゎリ: 暙準化トラック 2022幎6月
ISSN: 2070-1721

HTTP/3


芁玄

QUIC トランスポヌトプロトコルは、ストリヌム倚重化、ストリヌムごずのフロヌ制埡、䜎遅延の接続確立など、HTTP のトランスポヌトずしお望たしいいく぀かの機胜を備えおいたす。本曞は QUIC 䞊での HTTP セマンティクスのマッピングを蚘述したす。本曞はたた、QUIC に包含される HTTP/2 の機胜を特定し、HTTP/2 の拡匵を HTTP/3 に移怍する方法を説明したす。

このメモのステヌタス

これはむンタヌネット暙準トラックの文曞です。

この文曞はむンタヌネット゚ンゞニアリングタスクフォヌス (IETF) の成果物です。IETF コミュニティのコンセンサスを衚しおいたす。公開審査を受け、むンタヌネット゚ンゞニアリング指導グルヌプ (IESG) によっお公開が承認されおいたす。むンタヌネット暙準に関する詳现は RFC 7841 のセクション 2 を参照しおください。

この文曞の珟圚の状態、蚂正情報 (errata)、およびフィヌドバックの提䟛方法に関する情報は https://www.rfc-editor.org/info/rfc9114 で入手できたす。

Copyright Notice

Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.


1. ã¯ã˜ã‚ã«

HTTP セマンティクス ([HTTP]) は、むンタヌネット䞊の幅広いサヌビスで䜿甚されたす。これらのセマンティクスは䞻に HTTP/1.1 ず HTTP/2 で利甚されおきたした。HTTP/1.1 はさたざたなトランスポヌトおよびセッション局䞊で䜿甚されおきた䞀方、HTTP/2 は䞻に TLS over TCP 䞊で䜿甚されおきたした。HTTP/3 は新しいトランスポヌトプロトコルである QUIC 䞊で同じセマンティクスをサポヌトしたす。

1.1. HTTP の以前のバヌゞョン

HTTP/1.1 ([HTTP/1.1]) は、空癜で区切られたテキストフィヌルドを甚いお HTTP メッセヌゞを䌝達したす。これらの亀換は人間が読みやすい䞀方で、メッセヌゞ圢匏に空癜を甚いるこずはパヌスの耇雑性ずバリアント挙動に察する過床の寛容さを招きたす。

HTTP/1.1 は倚重化レむダヌを含たないため、耇数の TCP 接続が䞊列にリク゚ストを凊理するために甚いられるこずがよくありたす。しかし、TCP は耇数接続間で茻茳制埡を共有しないため、これは茻茳制埡ずネットワヌク効率に悪圱響を及がしたす。

HTTP/2 ([HTTP/2]) は、トランスポヌト局を倉曎せずにレむテンシを改善するためにバむナリフレヌミングず倚重化レむダヌを導入したした。しかし、HTTP/2 の倚重化の䞊列性が TCP の損倱回埩メカニズムに芋えないため、パケットの喪倱や順序の乱れが発生するず、その損倱パケットに盎接圱響を受けおいないトランザクションであっおもアクティブなすべおのトランザクションが停滞するこずになりたす。

1.2. QUIC ぞの委譲

QUIC トランスポヌトプロトコルは、HTTP/2 フレヌミング局が提䟛するものず類䌌したストリヌム倚重化およびストリヌムごずのフロヌ制埡を組み蟌みたす。ストリヌムレベルでの信頌性ず接続党䜓での茻茳制埡を提䟛するこずにより、QUIC は TCP マッピングず比范しお HTTP の性胜を改善する胜力を持ちたす。QUIC はたたトランスポヌト局で TLS 1.3 ([TLS]) を組み蟌み、TCP 䞊で TLS を動䜜させる堎合ず同等の機密性ず完党性を提䟛し぀぀、TCP Fast Open ([TFO]) による接続確立遅延の改善も提䟛したす。

本曞は HTTP/3 を定矩したすQUIC トランスポヌトプロトコル䞊での HTTP セマンティクスのマッピングであり、HTTP/2 の蚭蚈を倧いに螏襲しおいたす。HTTP/3 はデヌタの機密性および完党性保護、ピア認蚌、およびストリヌムごずに順序通りでの信頌できる配信を提䟛するために QUIC に䟝存したす。ストリヌムのラむフタむムやフロヌ制埡の問題を QUIC に委譲し぀぀、各ストリヌム䞊で HTTP/2 のフレヌミングに類䌌したバむナリフレヌミングを䜿甚したす。いく぀かの HTTP/2 機胜は QUIC に包含され、他の機胜は QUIC 䞊に実装されたす。

QUIC は [QUIC-TRANSPORT] に蚘述されおいたす。HTTP/2 の完党な蚘述に぀いおは [HTTP/2] を参照しおください。


2. HTTP/3 プロトコル抂芁

HTTP/3 は、QUIC トランスポヌトプロトコルず HTTP/2 に類䌌した内郚フレヌミング局を甚いお HTTP セマンティクスのためのトランスポヌトを提䟛したす。

クラむアントが特定の゚ンドポむントに HTTP/3 サヌバが存圚するこずを知るず、QUIC 接続を開きたす。QUIC はプロトコルネゎシ゚ヌション、ストリヌムベヌスの倚重化、およびフロヌ制埡を提䟛したす。HTTP/3 ゚ンドポむントの怜出は Section 3.1 に蚘述されおいたす。

各ストリヌム内で、HTTP/3 通信の基本単䜍はフレヌムですSection 7.2。各フレヌムタむプは異なる目的を持ちたす。䟋えば、HEADERS および DATA フレヌムは HTTP リク゚ストずレスポンスの基瀎を圢成したすSection 4.1。接続党䜓に適甚されるフレヌムは専甚の control stream 䞊で䌝達されたす。

リク゚ストの倚重化は QUIC のストリヌム抜象を甚いお行われたす。これは Section 2 ず [QUIC-TRANSPORT] に蚘述されおいたす。各リク゚スト・レスポンス察は単䞀の QUIC ストリヌムを消費したす。ストリヌムは互いに独立しおいるため、あるストリヌムがブロックされたりパケット損倱が発生しおも、他のストリヌムの進行を劚げるこずはありたせん。

サヌバプッシュは HTTP/2 ([HTTP/2]) で導入されたむンタラクションモヌドであり、サヌバがクラむアントが行うであろうリク゚ストを事前に想定しおリク゚スト・レスポンス亀換をクラむアントにプッシュするこずを蚱したす。これはネットワヌク䜿甚量ず朜圚的なレむテンシ短瞮をトレヌドオフしたす。サヌバプッシュを管理するために、PUSH_PROMISE (PUSH_PROMISE), MAX_PUSH_ID (MAX_PUSH_ID), CANCEL_PUSH (CANCEL_PUSH) などの耇数の HTTP/3 フレヌムが甚いられたす。

HTTP/2 ず同様に、芁求および応答フィヌルドは送信のために圧瞮されたす。HPACK ([HPACK]) は圧瞮されたフィヌルドセクションの順序通りの送信に䟝存しおおりこれは QUIC が保蚌しない、そのため HTTP/3 では HPACK を QPACK ([QPACK]) に眮き換えたす。QPACK はフィヌルドテヌブル状態を倉曎および远跡するための別個の䞀方向ストリヌムを䜿甚し、゚ンコヌドされたフィヌルドセクションはテヌブルの状態を参照するのみでそれを倉曎したせん。

2.1. æ–‡æ›žã®æ§‹æˆ

以䞋のセクションは HTTP/3 接続のラむフサむクルの詳现な抂芁を提䟛したす

  • "Connection Setup and Management" (Section 3) は HTTP/3 ゚ンドポむントの怜出方法ず HTTP/3 接続の確立方法を扱いたす。
  • "Expressing HTTP Semantics in HTTP/3" (Section 4) はフレヌムを甚いお HTTP セマンティクスがどのように衚珟されるかを説明したす。
  • "Connection Closure" (Section 5) は HTTP/3 接続がどのように優雅にたたは突然終了されるかを説明したす。

ワむダプロトコルの詳现ずトランスポヌトずの盞互䜜甚は埌続のセクションで説明されたす

  • "Stream Mapping and Usage" (Section 6) は QUIC ストリヌムの䜿甚方法を説明したす。
  • "HTTP Framing Layer" (Section 7) はほずんどのストリヌムで䜿甚されるフレヌムを説明したす。
  • "Error Handling" (Section 8) は、特定のストリヌム䞊たたは接続党䜓に察しお゚ラヌ条件がどのように凊理され衚珟されるかを説明したす。

远加のリ゜ヌスは最終セクションで提䟛されたす

  • "Extensions to HTTP/3" (Section 9) は将来の文曞でどのように新しい機胜が远加できるかを説明したす。
  • HTTP/2 ず HTTP/3 のより詳现な比范は Appendix A にありたす。

2.2. æ…£äŸ‹ãšç”šèªž

この文曞でのキヌワヌド "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", および "OPTIONAL" は、それらがすべお倧文字で珟れる堎合に限り、BCP 14 に蚘茉されおいるように解釈されたす。[RFC2119] [RFC8174]

この文曞は可倉長敎数゚ンコヌディングを [QUIC-TRANSPORT] から䜿甚したす。

以䞋の甚語が䜿甚されたす

abort:
接続たたはストリヌムの突然の終了。゚ラヌ条件による堎合がありたす。
client:
HTTP/3 接続を開始する゚ンドポむント。クラむアントは HTTP リク゚ストを送信し、HTTP レスポンスを受信したす。
connection:
QUIC をトランスポヌトプロトコルずしお䜿甚する、二぀の゚ンドポむント間のトランスポヌト局の接続。
connection error
:
HTTP/3 接続党䜓に圱響を䞎える゚ラヌ。
endpoint:
接続のクラむアントたたはサヌバのいずれか。
frame:
HTTP/3 におけるストリヌム䞊の通信の最小単䜍で、ヘッダずフレヌムタむプに埓っお構造化された可倉長のバむト列から成りたす。
この文曞ず [QUIC-TRANSPORT] の䞡方に「frame」ず呌ばれるプロトコル芁玠が存圚したす。[QUIC-TRANSPORT] からのフレヌムが参照される堎合、フレヌム名は "QUIC" で前眮されたす。䟋えば "QUIC CONNECTION_CLOSE frames" のようになりたす。この前眮がない参照は Section 7.2 で定矩されたフレヌムを指したす。
HTTP/3 connection:
合意されたアプリケヌションプロトコルが HTTP/3 である QUIC 接続。
peer:
゚ンドポむント。特定の゚ンドポむントに぀いお議論する際、"peer" は議論の䞻䜓に察しおリモヌトにある゚ンドポむントを指したす。
receiver:
フレヌムを受信しおいる゚ンドポむント。
sender:
フレヌムを送信しおいる゚ンドポむント。
server:
HTTP/3 接続を受け入れる゚ンドポむント。サヌバは HTTP リク゚ストを受信し、HTTP レスポンスを送信したす。
stream:
QUIC トランスポヌトが提䟛する双方向たたは䞀方向のバむトストリヌム。すべおのストリヌムは HTTP/3 接続内で「HTTP/3 ストリヌム」ず芋なせたすが、HTTP/3 内では耇数のストリヌムタむプが定矩されおいたす。
stream error
:
個々のストリヌム䞊のアプリケヌションレベルの゚ラヌ。

"content" ずいう甚語は Section 6.4 の [HTTP] で定矩されおいたす。

最埌に、"resource", "message", "user agent", "origin server", "gateway", "intermediary", "proxy", および "tunnel" の甚語は Section 3 の [HTTP] で定矩されおいたす。

本曞のパケット図は、フィヌルドの順序ずサむズを瀺すために Section 1.3 の圢匏を䜿甚したす参照[QUIC-TRANSPORT]。


3. æŽ¥ç¶šã®èš­å®šãšç®¡ç†

3.1. HTTP/3 ゚ンドポむントの怜出

HTTP は「暩嚁あるレスポンスauthoritative response」の抂念に䟝存したすこれは、タヌゲット URI に識別されるオリゞンサヌバによっおたたはその指瀺でレスポンスメッセヌゞが生成された時点でのタヌゲットリ゜ヌスの状態を考慮しお、そのリク゚ストに察しお最も適切であるず刀断されたレスポンスです。HTTP URI の暩嚁あるサヌバの䜍眮特定は Section 4.3 の [HTTP] で議論されおいたす。

"https" スキヌムは、クラむアントがその URI の authority コンポヌネントで識別されたホストに察しお信頌できるずみなす蚌明曞の所有を暩限ず関連付けたす。TLS ハンドシェむクでサヌバ蚌明曞を受け取った際、クラむアントは Section 4.3.4 のプロセスを甚いおその蚌明曞が URI のオリゞンサヌバに察しお蚱容できるマッチであるこずを怜蚌しなければなりたせん。もし蚌明曞が URI のオリゞンサヌバに関しお怜蚌できない堎合、クラむアントは圓該サヌバをそのオリゞンに察する暩嚁あるサヌバず芋なしおはなりたせん。

クラむアントは、ホスト識別子を IP アドレスに解決し、指定されたポヌトぞのそのアドレスに察しお QUIC 接続を確立し䞊蚘のサヌバ蚌明曞の怜蚌を含む、その保護された接続䞊で圓該 URI をタヌゲットずする HTTP/3 リク゚ストメッセヌゞをサヌバに送信するこずで、"https" URI のリ゜ヌスぞのアクセスを詊みるこずができたすこの動䜜は MAY です。HTTP/3 を遞択するための他のメカニズムが䜿甚されない限り、トヌクン "h3" は TLS ハンドシェむク䞭の Application-Layer Protocol Negotiation (ALPN; 参照 [RFC7301]) 拡匵で䜿甚されたす。

接続性の問題䟋UDP のブロックは QUIC 接続の確立倱敗をもたらす可胜性があるため、クラむアントはこの堎合に TCP ベヌスの HTTP の䜿甚を詊みるべきですSHOULD。

サヌバは任意の UDP ポヌトで HTTP/3 を提䟛しおもよくMAY、代替サヌビス広告は垞に明瀺的なポヌトを含み、URI は明瀺的ポヌトかスキヌムに関連付けられたデフォルトポヌトのいずれかを含みたす。

3.1.1. HTTP Alternative Services

HTTP オリゞンは Alt-Svc HTTP レスポンスヘッダフィヌルドたたは HTTP/2 の ALTSVC フレヌム ([ALTSVC]) を通じお "h3" ALPN トヌクンを䜿甚しお等䟡の HTTP/3 ゚ンドポむントの可甚性を広告するこずができたす。

䟋えば、オリゞンは HTTP レスポンス内で次のヘッダフィヌルドを含めるこずにより、同じホスト名の UDP ポヌト 50781 で HTTP/3 が利甚可胜であるこずを瀺すこずができたす

Alt-Svc: h3=":50781"

HTTP/3 サポヌトを瀺す Alt-Svc レコヌドを受信したクラむアントは、瀺されたホストずポヌトに察しお QUIC 接続の確立を詊みるこずができたすMAYこの接続が成功すれば、クラむアントは本曞で蚘述されたマッピングを甚いお HTTP リク゚ストを送信できたす。

3.1.2. ä»–のスキヌム

HTTP はトランスポヌトプロトコルから独立しおいたすが、"http" スキヌムは暩嚁を、指定されたポヌトで TCP 接続を受け入れる胜力ず関連付けたす。HTTP/3 は TCP を䜿甚しないため、"http" URI で識別されるリ゜ヌスの暩嚁あるサヌバぞ盎接アクセスするために HTTP/3 を䜿甚するこずはできたせん。ただし、[ALTSVC] のようなプロトコル拡匵は、暩嚁あるサヌバが他のサヌビスHTTP/3 で到達可胜であるかもしれないを識別するこずを蚱したす。

"https" でないスキヌムのオリゞンに察しおリク゚ストを行う前に、クラむアントはサヌバがそのスキヌムでの提䟛を望んでいるこずを確認しなければなりたせんMUST。"http" スキヌムのオリゞンに察しおこれを達成する実隓的方法は [RFC8164] に蚘述されおいたす。将来的にさたざたなスキヌムのための他のメカニズムが定矩される可胜性がありたす。

3.2. æŽ¥ç¶šã®ç¢ºç«‹

HTTP/3 は基盀ずなるトランスポヌトずしお QUIC バヌゞョン 1 に䟝存したす。他の QUIC トランスポヌトバヌゞョンを HTTP/3 ず共に䜿甚するこずは将来の仕様で定矩されうるMAY。

QUIC バヌゞョン 1 はハンドシェむクプロトコルずしお TLS バヌゞョン 1.3 以䞊を䜿甚したす。HTTP/3 クラむアントは TLS ハンドシェむク䞭にサヌバぞのタヌゲットホストを瀺す仕組みをサポヌトしなければなりたせんMUST。サヌバがドメむン名で識別される堎合[DNS-TERMS]、クラむアントは Server Name Indication (SNI; [RFC6066]) TLS 拡匵を送信しなければなりたせんMUST、代替のホスト指瀺メカニズムが䜿われない限り。

QUIC 接続の確立は [QUIC-TRANSPORT] に蚘述されおいる通りです。接続確立䞭に、HTTP/3 サポヌトは TLS ハンドシェむクで ALPN トヌクン "h3" を遞択するこずで瀺されたす。その他のアプリケヌション局プロトコルのサポヌトが同じハンドシェむクで提䟛されるこずがあり埗たすMAY。

コア QUIC プロトコルに関する接続レベルのオプションは初期の暗号ハンドシェむクで蚭定されたすが、HTTP/3 固有の蚭定は SETTINGS フレヌムで䌝達されたす。QUIC 接続が確立された埌、各゚ンドポむントはそれぞれの HTTP control stream の初期フレヌムずしお SETTINGS フレヌムを送信しなければなりたせんMUST。

3.3. æŽ¥ç¶šã®å†åˆ©ç”š

HTTP/3 接続は耇数のリク゚ストにわたっお持続したす。最高のパフォヌマンスのため、クラむアントは远加のサヌバずの通信が䞍芁であるず刀断されるたで䟋えばナヌザが特定のりェブペヌゞから離れるずき接続を閉じないこずが期埅されたす、たたはサヌバが接続を閉じるたで保持したす。

䞀床サヌバ゚ンドポむントぞの接続が存圚するず、その接続は耇数の異なる URI authority コンポヌネントを持぀リク゚ストに再利甚されるこずがありたすMAY。新しいオリゞンのために既存接続を䜿甚するには、クラむアントはサヌバが新しいオリゞンに提瀺した蚌明曞を Section 4.3.4 のプロセスを甚いお怜蚌しなければなりたせんMUST。これはクラむアントがサヌバ蚌明曞ずその蚌明曞を怜蚌するために必芁な远加情報を保持する必芁があるこずを意味したすそうしないクラむアントは接続を远加のオリゞンで再利甚するこずができたせん。

蚌明曞が䜕らかの理由で新しいオリゞンに察しお受け入れられない堎合、接続は再利甚しおはならずMUST NOT、新しいオリゞンのために新しい接続を確立すべきですSHOULD。蚌明曞の怜蚌が倱敗する理由がその接続に関連付けられた他のオリゞンにも圓おはたる可胜性がある堎合、クラむアントはそれらのオリゞンに察しおもサヌバ蚌明曞を再怜蚌すべきですSHOULD。䟋えば、蚌明曞の怜蚌が有効期限切れや倱効のために倱敗した堎合、その蚌明曞が暩限確立に䜿甚された他のすべおのオリゞンも無効にされるかもしれたせん。

クラむアントは䞎えられた IP アドレスず UDP ポヌトに察しお耇数の HTTP/3 接続を開いおはならないSHOULD NOT。ここで IP アドレスずポヌトは URI、遞択された代替サヌビス[ALTSVC]、蚭定されたプロキシ、たたはそれらの名前解決に由来する可胜性がありたす。クラむアントは異なるトランスポヌト或いは TLS 構成を甚いるこずで同じ IP アドレスず UDP ポヌトに耇数の HTTP/3 接続を開くこずができたすMAYが、同䞀の構成で耇数の接続を䜜成するこずは避けるべきですSHOULD。

サヌバは可胜な限り長く HTTP/3 接続を維持するこずが奚励されたすが、必芁に応じおアむドル接続を終了するこずが蚱可されたす。いずれかの゚ンドポむントが HTTP/3 接続を閉じるこずを遞択する堎合、終了する゚ンドポむントはたず GOAWAY フレヌムSection 5.2を送信するべきですSHOULD。これにより䞡゚ンドポむントは以前に送信されたフレヌムが凊理されたかどうかを確実に刀断し、必芁な残䜜業を優雅に完了たたは終了できたす。

サヌバが特定のオリゞンに察しおクラむアントが接続を再利甚するこずを望たない堎合、サヌバはリク゚ストに察しお 421 (Misdirected Request) ステヌタスコヌドを返すこずで、そのリク゚ストに察しお暩嚁がないこずを瀺すこずができたす詳现は Section 7.4 の [HTTP] を参照しおください。


4. HTTP/3 における HTTP セマンティクスの衚珟

4.1. HTTP メッセヌゞのフレヌミング

クラむアントは リク゚ストストリヌム 䞊で HTTP リク゚ストを送信したす。これはクラむアントが開始する双方向の QUIC ストリヌムですSection 6.1 を参照。クラむアントは特定のストリヌム䞊で単䞀のリク゚ストのみを送信しなければなりたせんMUST。サヌバは同じストリヌム䞊で 0 個以䞊の䞭間的な HTTP レスポンスを送信し、その埌に単䞀の最終 HTTP レスポンスを送信したす。䞭間応答ず最終応答の説明は Section 15 の [HTTP] を参照しおください。

プッシュされた応答はサヌバが開始する䞀方向の QUIC ストリヌム䞊で送信されたすSection 6.2.2 を参照。サヌバは通垞の応答ず同様に、0 個以䞊の䞭間的な HTTP レスポンスに続いお単䞀の最終 HTTP レスポンスを送信したす。プッシュの詳现は Section 4.6 を参照しおください。

あるストリヌム䞊で耇数のリク゚ストを受信した堎合、あるいは最終 HTTP レスポンスの埌に远加の HTTP レスポンスを受信した堎合は、それを 䞍正malformed ずしお扱わなければなりたせんMUST。

HTTP メッセヌゞリク゚ストたたはレスポンスは次の芁玠で構成されたす

  1. メッセヌゞ制埡デヌタを含むヘッダセクションを単䞀の HEADERS フレヌムずしお送信するこず、
  2. 存圚する堎合コンテンツを䞀連の DATA フレヌムずしお送信するこず任意、および
  3. 存圚する堎合トレヌラセクションを単䞀の HEADERS フレヌムずしお送信するこず任意。

ヘッダおよびトレヌラセクションの説明は Section 6.3 および Section 6.5 の [HTTP] を参照しおください。コンテンツは Section 6.4 に蚘述されおいたす。

フレヌムの䞍正な順序の受信は、接続゚ラヌ ずしお扱わなければなりたせんMUST。特に、いかなる HEADERS フレヌムの前に DATA フレヌムが来るこず、たたはトレヌリングの HEADERS フレヌムの埌に HEADERS や DATA フレヌムが来るこずは無効ず芋なされたす。他のフレヌムタむプ、特に䞍明なフレヌムタむプに぀いおはそれぞれの芏則に埓っお蚱容される堎合がありたす。詳现は Section 9 を参照しおください。

サヌバは応答メッセヌゞのフレヌムの前、埌、たたはそれらずむンタヌリヌブしお 1 個以䞊の PUSH_PROMISE フレヌムを送信するこずができたすMAY。これらの PUSH_PROMISE フレヌムは応答の䞀郚ではありたせん。詳现は Section 4.6 を参照しおください。PUSH_PROMISE フレヌムは プッシュストリヌム 䞊で蚱可されおいたせん。もしプッシュされた応答が PUSH_PROMISE フレヌムを含む堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

䞍明なタむプのフレヌムSection 9 を含む、および予玄されたフレヌムSection 7.2.8は、芁求たたは プッシュストリヌム 䞊で、ここで説明される他のフレヌムの前埌たたはむンタヌリヌブしお送信されるこずができたすMAY。

HEADERS および PUSH_PROMISE フレヌムは QPACK 動的テヌブルぞの曎新を参照するこずがありたす。これらの曎新はメッセヌゞ亀換の盎接の䞀郚ではありたせんが、メッセヌゞを消費する前に受信および凊理されなければなりたせん。詳现は Section 4.2 を参照しおください。

転送笊号化Transfer codingsSection 7 の説明は HTTP/3 では定矩されおいたせん。Transfer-Encoding ヘッダフィヌルドは䜿甚しおはなりたせんMUST NOT。

応答が耇数のメッセヌゞで構成され埗るのは、同䞀のリク゚ストに察しお 1 個以䞊の䞭間応答1xxSection 15.2 を参照が最終応答に先行する堎合に限られたすこの堎合にのみ。䞭間応答はコンテンツやトレヌラセクションを含みたせんMAY はここでは䞍芁。

HTTP のリク゚スト/レスポンス亀換はクラむアント開始の双方向 QUIC ストリヌムを完党に消費したす。リク゚ストを送信した埌、クラむアントは送信偎のストリヌムを閉じなければなりたせんMUST。CONNECT メ゜ッドを䜿甚する堎合Section 4.4 を参照を陀き、クラむアントはレスポンスを受信するこずに䟝存しおストリヌムのクロヌズを行っおはなりたせんMUST NOT。最終レスポンスを送信した埌、サヌバは送信偎のストリヌムを閉じなければなりたせんMUST。この時点で QUIC ストリヌムは完党に閉じられたす。

ストリヌムが閉じられるず、それは最終 HTTP メッセヌゞの終了を瀺したす。メッセヌゞによっおは倧きいか無限であるため、゚ンドポむントはメッセヌゞの䞀郚が十分に受信されお凊理を進められるようになった時点で郚分的な HTTP メッセヌゞの凊理を開始すべきですSHOULD。もしクラむアント開始ストリヌムが HTTP メッセヌゞの十分な郚分を受信せずに終了した堎合、サヌバぱラヌコヌド H3_REQUEST_INCOMPLETE で応答ストリヌムを䞭止すべきですSHOULD。

サヌバは、応答が未送信のリク゚スト郚分に䟝存しない堎合、クラむアントがリク゚スト党䜓を送信する前に完党な応答を送信するこずができたす。サヌバが残りのリク゚ストを受け取る必芁がない堎合、サヌバは リク゚ストストリヌム の読み取りを䞭止し、完党な応答を送信し、送信偎をクリヌンに閉じるこずができたす。このずきクラむアントに察しおストリヌムの送信を停止するよう芁求する際にぱラヌコヌド H3_NO_ERROR を䜿甚するこずが掚奚されたすSHOULD。クラむアントは、リク゚ストが突然終了した結果ずしお完党な応答を砎棄しおはなりたせんMUST NOT。ただし、クラむアントは他の理由で任意に応答を砎棄するこずはできたす。もしサヌバが郚分的たたは完党な応答を送信したがリク゚ストの読み取りを䞭止しなかった堎合、クラむアントはリク゚ストのコンテンツの送信を続け、通垞どおりストリヌムを閉じるべきですSHOULD。

4.1.1. ãƒªã‚¯ã‚šã‚¹ãƒˆã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«ãšæ‹’吊

䞀床 リク゚ストストリヌム が開かれるず、いずれの゚ンドポむントもそのリク゚ストをキャンセルするこずができたすMAY。クラむアントはもはや応答に関心がない堎合にリク゚ストをキャンセルし、サヌバは応答できないか応答しないこずを遞択した堎合にリク゚ストをキャンセルしたす。可胜であれば、サヌバはリク゚ストの凊理を既に開始しおいる堎合にはリク゚ストをキャンセルするよりも適切なステヌタスコヌドを䌎う HTTP レスポンスを送信するこずが掚奚されたすRECOMMENDED。

実装は、ストリヌム䞊でただ開いおいる方向を突然終了するこずでリク゚ストをキャンセルすべきですSHOULD。そのためには、実装はストリヌムの送信郚分をリセットし、受信郚分の読み取りを䞭止したす。詳现は Section 2.4 の [QUIC-TRANSPORT] を参照しおください。

サヌバが䜕らかのアプリケヌション凊理を行わずにリク゚ストをキャンセルした堎合、そのリク゚ストは「拒吊されたrejected」ず芋なされたす。サヌバは応答ストリヌムを゚ラヌコヌド H3_REQUEST_REJECTED で䞭止するこずが掚奚されたすSHOULD。ここで「凊理されたprocessed」ずは、ストリヌムからの䞀郚のデヌタが䞊䜍゜フトりェア局に枡され、その結果ずしお䜕らかの動䜜が行われた可胜性があるこずを意味したす。クラむアントはサヌバによっお拒吊されたリク゚ストを、たるで䞀床も送信されなかったかのように取り扱い、埌で再詊行できるようにしおよいです。

サヌバは郚分的たたは完党に凊理されたリク゚ストに察しお H3_REQUEST_REJECTED を䜿甚しおはなりたせんMUST NOT。サヌバが郚分的な凊理の埌に応答を攟棄する堎合、応答ストリヌムを゚ラヌコヌド H3_REQUEST_CANCELLED で䞭止するこずが掚奚されたすSHOULD。

クラむアントはリク゚ストをキャンセルする際に゚ラヌコヌド H3_REQUEST_CANCELLED を䜿甚するべきですSHOULD。この゚ラヌコヌドを受け取ったサヌバは、凊理が行われおいない堎合に限り、応答を突然終了するために゚ラヌコヌド H3_REQUEST_REJECTED を䜿甚しおもよいですMAY。クラむアントは、サヌバがストリヌムの閉鎖をこの゚ラヌコヌドで芁求した堎合を陀き、H3_REQUEST_REJECTED ゚ラヌコヌドを䜿甚しおはなりたせんMUST NOT。

ストリヌムが完党な応答を受信した埌にキャンセルされた堎合、クラむアントはキャンセルを無芖しお応答を利甚するこずができたすMAY。しかし、郚分的な応答を受信した埌にストリヌムがキャンセルされた堎合、その応答は䜿甚すべきではありたせんSHOULD NOT。GET、PUT、DELETE のような冪等な操䜜のみが安党に再詊行できるため、クラむアントはメ゜ッドに䟝存せずリク゚ストの意味が冪等であるこずを知る手段や、元のリク゚ストが適甚されなかったこずを怜出する手段がない限り、非冪等メ゜ッドを自動的に再詊行しおはなりたせんSHOULD NOT。詳现は Section 9.2.2 を参照しおください。

4.1.2. äžæ­£ãªãƒªã‚¯ã‚šã‚¹ãƒˆãŠã‚ˆã³ãƒ¬ã‚¹ãƒãƒ³ã‚¹

䞍正なmalformedリク゚ストたたはレスポンスずは、フレヌムの䞊び自䜓は有効であっおも、以䞋の理由により無効ずなるものを指したす

  • 犁止されたフィヌルドや擬䌌ヘッダフィヌルドが存圚するこず、
  • 必須の擬䌌ヘッダフィヌルドが欠劂しおいるこず、
  • 擬䌌ヘッダフィヌルドの倀が無効であるこず、
  • 擬䌌ヘッダフィヌルドが通垞のヘッダの埌に存圚するこず、
  • HTTP メッセヌゞの順序が無効であるこず、
  • 倧文字のフィヌルド名が含たれおいるこず、たたは
  • フィヌルド名や倀に無効な文字が含たれおいるこず。

Content-Length ヘッダフィヌルドを含む堎合にコンテンツを持぀ず定矩されるリク゚ストたたはレスポンスは、受信した DATA フレヌム長の合蚈が Content-Length ヘッダの倀ず䞀臎しない堎合、䞍正ずなりたす。コンテンツを決しお持たないず定矩されるレスポンスは、Content-Length が存圚しおも DATA フレヌムに実際のコンテンツが含たれおいなくおも非れロの Content-Length を持぀こずができたす。

HTTP リク゚ストたたはレスポンスを凊理するむンタヌミディアリトンネルずしお動䜜しおいないものは、䞍正なリク゚ストやレスポンスを転送しおはなりたせんMUST NOT。怜出された䞍正なリク゚ストやレスポンスは、ストリヌム゚ラヌずしお扱わなければなりたせんMUST。その皮類は H3_MESSAGE_ERROR です。

䞍正なリク゚ストに察しお、サヌバはストリヌムを閉じたりリセットする前に゚ラヌを瀺す HTTP レスポンスを送信するこずができたすMAY。クラむアントは䞍正なレスポンスを受け入れおはなりたせんMUST NOT。これらの芁件は HTTP に察する䞀般的な攻撃から保護するこずを目的ずしおおり、寛容にするず実装が脆匱性にさらされる可胜性があるため、意図的に厳栌になっおいたす。

4.2. HTTP フィヌルド

HTTP メッセヌゞは "HTTP フィヌルド" ず呌ばれるキヌ・バリュヌの列ずしおメタデヌタを運びたす。詳现は Section 6.3 および Section 6.5 の [HTTP] を参照しおください。登録された HTTP フィヌルドの䞀芧は IANA の "Hypertext Transfer Protocol (HTTP) Field Name Registry"<https://www.iana.org/assignments/http-fields/>で参照できたす。HTTP/2 ず同様に、HTTP/3 ではフィヌルド名で䜿甚できる文字、Connection ヘッダフィヌルド、擬䌌ヘッダフィヌルドに関しお远加の考慮事項がありたす。

フィヌルド名は ASCII 文字の郚分集合を含む文字列です。HTTP フィヌルド名ず倀の性質に぀いおは Section 5.1 を参照しおください。フィヌルド名の文字ぱンコヌドの前に小文字に倉換されなければなりたせんMUST。フィヌルド名に倧文字が含たれるリク゚ストたたはレスポンスは䞍正ず芋なされたすmalformedMUST。

HTTP/3 は Connection ヘッダフィヌルドを接続固有のフィヌルドを瀺すために䜿甚したせん。本プロトコルでは接続固有のメタデヌタは他の手段で䌝達されたす。゚ンドポむントは接続固有のフィヌルドを含む HTTP/3 フィヌルドセクションを生成しおはなりたせんMUST NOT。接続固有のフィヌルドを含むメッセヌゞは䞍正ずしお扱われたすMUST。

ただし䟋倖ずしお TE ヘッダフィヌルドは HTTP/3 リク゚ストヘッダに含たれおもよくMAY、存圚する堎合は "trailers" 以倖の倀を含んではなりたせんMUST NOT。

HTTP/1.x メッセヌゞを HTTP/3 に倉換するむンタヌミディアリは、Connection 固有のヘッダフィヌルドを削陀しなければなりたせんSection 7.6.1 を参照。削陀しないず、他の HTTP/3 ゚ンドポむントによっおそのメッセヌゞは䞍正ずしお扱われたす。

4.2.1. ãƒ•ィヌルドの圧瞮

[QPACK] は、゚ンコヌダが圧瞮によるヘッドオブラむンブロッキングの皋床を制埡できるようにした HPACK の倉皮を蚘述しおいたす。これにより゚ンコヌダは圧瞮効率ず遅延ずをバランスできたす。HTTP/3 はヘッダおよびトレヌラセクションヘッダセクションに含たれる制埡デヌタを含むの圧瞮に QPACK を䜿甚したす。

より良い圧瞮効率を可胜にするため、Cookie ヘッダフィヌルド[COOKIES]は圧瞮前に耇数のフィヌルド行に分割され埗たす各行は 1 個以䞊の cookie-pair を含む。もし展開されたフィヌルドセクションが耇数の cookie フィヌルド行を含む堎合、これらは HTTP/2 や HTTP/3 以倖の文脈䟋えば HTTP/1.1 接続や汎甚の HTTP サヌバアプリケヌションに枡す前に、2 バむト区切り "; "ASCII 0x3b, 0x20 を甚いお単䞀のバむト列に連結されなければなりたせんMUST。

4.2.2. ãƒ˜ãƒƒãƒ€ã‚µã‚€ã‚ºã®åˆ¶çŽ„

HTTP/3 実装は個々の HTTP メッセヌゞで受け入れるヘッダの最倧サむズに制限を課すこずができたすMAY。受信したヘッダセクションが自分の蚱容するサむズを超えるサヌバは、HTTP 431 (Request Header Fields Too Large) ステヌタスコヌドを返すこずができたす[RFC6585]。クラむアントは凊理できない応答を砎棄するこずができたす。フィヌルドリストのサむズは、名前ず倀のバむト長の合蚈に加えお各フィヌルドごずに 32 バむトのオヌバヌヘッドを含む、非圧瞮サむズに基づいお蚈算されたす。

実装がこの限界をピアに通知したい堎合、SETTINGS_MAX_FIELD_SECTION_SIZE パラメヌタずしおバむト数で䌝えるこずができたす。このパラメヌタを受け取った実装は、瀺されたサむズを超える HTTP メッセヌゞヘッダを送信しおはならないSHOULD NOTずされたす。なぜならピアはそれを凊理するのを拒吊する可胜性が高いためです。ただし、HTTP メッセヌゞはオリゞンサヌバに到達する前に 1 個以䞊のむンタヌミディアリを経由する可胜性がありたす詳现は Section 3.7 を参照。この制限はメッセヌゞを凊理する各実装ごずに個別に適甚されるため、この制限未満のメッセヌゞが必ずしも受理されるずは限りたせん。

4.3. HTTP 制埡デヌタ

HTTP/2 ず同様に、HTTP/3 もフィヌルド名が : 文字ASCII 0x3aで始たる擬䌌ヘッダフィヌルドの列を䜿甚したす。これらの擬䌌ヘッダフィヌルドはメッセヌゞ制埡デヌタを䌝達したす。詳现は Section 6.2 を参照しおください。

擬䌌ヘッダフィヌルドは HTTP フィヌルドではありたせん。゚ンドポむントは本曞で定矩されたもの以倖の擬䌌ヘッダフィヌルドを生成しおはなりたせんMUST NOT。ただし、拡匵によりこの制限の修正が亀枉され埗るこずがありたす。詳现は Section 9 を参照しおください。

擬䌌ヘッダフィヌルドはそれが定矩されおいる文脈でのみ有効です。リク゚スト甚に定矩された擬䌌ヘッダフィヌルドはレスポンスに珟れおはならずMUST NOT、レスポンス甚に定矩された擬䌌ヘッダフィヌルドはリク゚ストに珟れおはなりたせんMUST NOT。擬䌌ヘッダフィヌルドはトレヌラセクションに珟れおはなりたせんMUST NOT。定矩されおいないか無効な擬䌌ヘッダフィヌルドを含むリク゚ストやレスポンスは䞍正ずしお扱わなければなりたせんMUST。

すべおの擬䌌ヘッダフィヌルドは通垞のヘッダフィヌルドより前にヘッダセクション内に珟れなければなりたせんMUST。ヘッダセクション内で通垞のヘッダの埌に擬䌌ヘッダフィヌルドが珟れるリク゚ストたたはレスポンスは䞍正ずしお扱われたすMUST。

4.3.1. ãƒªã‚¯ã‚šã‚¹ãƒˆæ“¬äŒŒãƒ˜ãƒƒãƒ€ãƒ•ィヌルド

リク゚ストに察しお以䞋の擬䌌ヘッダフィヌルドが定矩されおいたす

":method":
HTTP メ゜ッドを含みたすSection 9 の説明を参照。
":scheme":
タヌゲット URI のスキヌム郚分を含みたすSection 3.1 を参照。
:scheme 擬䌌ヘッダは "http" および "https" に限定されたせん。プロキシやゲヌトりェむは非 HTTP スキヌムのリク゚ストを倉換し、HTTP を甚いお非 HTTP サヌビスずやり取りできるようにするこずができたす。
:scheme が "https" 以倖のスキヌムを瀺す堎合の指針は Section 3.1.2 を参照しおください。
":authority":
タヌゲット URI のオヌ゜リティ郚分を含みたすSection 3.2 を参照。オヌ゜リティは "http" たたは "https" のスキヌムの URI に察しおは廃止された userinfo サブコンポヌネントを含んではなりたせんMUST NOT。
HTTP/1.1 のリク゚スト行を正確に再珟するために、この擬䌌ヘッダはメ゜ッド固有の圢匏のリク゚ストタヌゲットを持぀ HTTP/1.1 から倉換する際には省略しなければなりたせんMUST。クラむアントが盎接 HTTP/3 リク゚ストを生成する堎合、Host ヘッダの代わりに :authority 擬䌌ヘッダを䜿甚するこずが掚奚されたすSHOULD。HTTP/3 リク゚ストを HTTP/1.1 に倉換するむンタヌミディアリは、Host フィヌルドがリク゚ストに存圚しない堎合、:authority 擬䌌ヘッダの倀をコピヌしお Host フィヌルドを䜜成しなければなりたせんMUST。
":path":
タヌゲット URI のパスおよびク゚リ郚分を含みたす"path-absolute" ず、任意で ? ずその埌に "query" を続ける圢匏を含む詳现は RFC 3986 の該圓セクションを参照。
この擬䌌ヘッダは "http" や "https" の URI に察しお空であっおはなりたせん。もしパス成分を含たない "http" や "https" の URI がある堎合、倀ずしお / を含めなければなりたせん。OPTIONS リク゚ストでパス成分が含たれない堎合は、:path 擬䌌ヘッダに * を含めたす。

すべおの HTTP/3 リク゚ストは、CONNECT リク゚ストを陀き、:method、:scheme、および :path 擬䌌ヘッダフィヌルドをそれぞれ正確に 1 ぀ず぀含たなければなりたせんMUST。

:scheme 擬䌌ヘッダが必須のオヌ゜リティ成分を持぀スキヌム"http" や "https" を含むを瀺す堎合、リク゚ストは :authority 擬䌌ヘッダたたは Host ヘッダフィヌルドのいずれかを含たなければなりたせんMUST。これらのフィヌルドが存圚する堎合、空であっおはなりたせんMUST NOT。䞡方存圚する堎合は同じ倀でなければなりたせんMUST。もしスキヌムが必須のオヌ゜リティ成分を持たず、リク゚ストタヌゲットにそれが提䟛されおいない堎合、リク゚ストは :authority 擬䌌ヘッダや Host ヘッダを含んではなりたせんMUST NOT。

必須の擬䌌ヘッダを省略したり、その擬䌌ヘッダの倀が無効である HTTP リク゚ストは䞍正ず芋なされたすmalformed。

HTTP/3 は HTTP/1.1 のリク゚スト行に含たれるバヌゞョン識別子を運ぶ方法を定矩しおいたせん。HTTP/3 リク゚ストは暗黙的にプロトコルバヌゞョン "3.0" を持ちたす。

4.3.2. ãƒ¬ã‚¹ãƒãƒ³ã‚¹æ“¬äŒŒãƒ˜ãƒƒãƒ€ãƒ•ィヌルド

レスポンスに察しおは、HTTP ステヌタスコヌドを運ぶ単䞀の ":status" 擬䌌ヘッダフィヌルドが定矩されおいたすSection 15 を参照。この擬䌌ヘッダフィヌルドはすべおのレスポンスに含めなければなりたせんMUST。含たれおいない堎合、そのレスポンスは䞍正ず芋なされたすmalformed。

HTTP/3 は HTTP/1.1 のステヌタス行に含たれるバヌゞョンや理由句を運ぶ方法を定矩しおいたせん。HTTP/3 レスポンスは暗黙的にプロトコルバヌゞョン "3.0" を持ちたす。

4.4. CONNECT メ゜ッド

CONNECT メ゜ッドは受信者に察しおリク゚ストタヌゲットで識別される宛先オリゞンサヌバぞのトンネルを確立するよう芁求したす。詳现は Section 9.3.6 を参照しおください。䞻に HTTP プロキシで、オリゞンサヌバずの TLS セッションを確立し "https" リ゜ヌスずやり取りする目的で䜿甚されたす。

HTTP/1.x では CONNECT は党 HTTP 接続をリモヌトホストぞのトンネルに倉換するために䜿われたす。HTTP/2 および HTTP/3 では CONNECT メ゜ッドは単䞀のストリヌム䞊でトンネルを確立するために䜿甚されたす。

CONNECT リク゚ストは次のように構築しなければなりたせんMUST

  • :method 擬䌌ヘッダフィヌルドは "CONNECT" に蚭定するこず
  • :scheme および :path 擬䌌ヘッダフィヌルドは省略するこず
  • :authority 擬䌌ヘッダフィヌルドは接続先のホストずポヌトを含むこずCONNECT リク゚ストの request-target の authority-form に盞圓

リク゚ストストリヌム は、転送されるデヌタを運ぶためにリク゚ストの終わりでも開いたたたにしおおかなければなりたせん。これらの制限に埓わない CONNECT リク゚ストは䞍正ですmalformed。

CONNECT をサポヌトするプロキシは :authority 擬䌌ヘッダで識別されたサヌバに察しお TCP 接続を確立したす。接続が成功するず、プロキシはクラむアントに察しお 2xx 系のステヌタスコヌドを含む HEADERS フレヌムを送信したす定矩は Section 15.3 を参照。

ストリヌム䞊のすべおの DATA フレヌムは TCP 接続䞊で送受信されるデヌタに察応したす。クラむアントが送信する任意の DATA フレヌムのペむロヌドはプロキシによっお TCP サヌバぞ転送され、TCP サヌバから受信したデヌタはプロキシによっお DATA フレヌムにパッケヌゞされおクラむアントぞ送られたす。TCP セグメントのサむズず数が HTTP の DATA フレヌムや QUIC ストリヌムフレヌムのサむズず数に予枬可胜に察応するずは限らないこずに泚意しおください。

CONNECT メ゜ッドが完了した埌、そのストリヌム䞊では DATA フレヌムのみが送信可胜です。拡匵が明瀺的に蚱可する堎合に限り拡匵フレヌムを䜿甚できたす。その他の既知のフレヌムタむプを受信した堎合は、接続゚ラヌずしお扱われ、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

TCP 接続はどちらのピアによっおも閉じられ埗たす。クラむアントが リク゚ストストリヌム を終了するずすなわちプロキシでの受信ストリヌムが "Data Recvd" 状態になるず、プロキシは TCP サヌバぞの接続で FIN ビットを蚭定したす。プロキシが FIN ビットを含むパケットを受信するず、クラむアントぞ送る送信ストリヌムを閉じたす。片方向で半クロヌズのたたの TCP 接続は無効ではありたせんが、サヌバによっおは適切に扱われないこずが倚いため、クラむアントはただ CONNECT の察象からデヌタを受信するこずを期埅しおいる間に送信偎のストリヌムを閉じるべきではありたせんSHOULD NOT。

TCP の 接続゚ラヌ はストリヌムを突然終了するこずで通知されたす。プロキシは TCP 接続䞊のあらゆる゚ラヌRST ビットを含む TCP セグメントの受信を含むを ストリヌム゚ラヌ ずしお扱い、タむプは H3_CONNECT_ERROR ずしたす。

逆に、プロキシがストリヌムや QUIC 接続に゚ラヌを怜出した堎合、TCP 接続を閉じなければなりたせんMUST。クラむアントがストリヌムをリセットしたり読み取りを䞭止したこずをプロキシが怜出した堎合も、プロキシは TCP 接続を閉じなければなりたせんMUST。もしクラむアントによっおストリヌムがリセットされたり読み取りが䞭止された堎合、プロキシは可胜ならばストリヌムの他方向に぀いおも同じ操䜜を行っお䞡方向をキャンセルするこずが掚奚されたすSHOULD。これらの堎合、基盀ずなる TCP 実装が蚱すならば、プロキシは RST ビットを立おた TCP セグメントを送信するこずが掚奚されたすSHOULD。

CONNECT は任意のサヌバぞのトンネルを䜜成するため、CONNECT をサポヌトするプロキシはその䜿甚を既知のポヌトの集合たたは安党なリク゚ストタヌゲットのリストに制限するこずが掚奚されたすSHOULD。詳现は Section 9.3.6 を参照しおください。

4.5. HTTP アップグレヌド

HTTP/3 は HTTP Upgrade の仕組みをサポヌトしたせん詳现は Section 7.8 を参照。たた 101 (Switching Protocols) 情報ステヌタスコヌドもサポヌトしたせんSection 15.2.2 を参照。

4.6. ã‚µãƒŒãƒãƒŒãƒ—ッシュ

サヌバヌプッシュは、サヌバがクラむアントが行うであろうリク゚ストを予枬しおリク゚スト・レスポンス亀換をクラむアントぞプッシュするこずを蚱すむンタラクションモヌドです。これはネットワヌク䜿甚量ず朜圚的なレむテンシ利埗ずのトレヌドオフです。HTTP/3 のサヌバヌプッシュは Section 8.2 に蚘述されたものに類䌌しおいたすが、異なるメカニズムを䜿甚したす。

各サヌバヌプッシュにはサヌバによっお䞀意な push ID が割り圓おられたす。push ID は HTTP/3 接続のラむフタむムを通じお様々な文脈でそのプッシュを参照するために䜿甚されたす。

push ID 空間は 0 から始たり、MAX_PUSH_ID フレヌムで蚭定される最倧倀で終わりたす。特に、クラむアントが MAX_PUSH_ID フレヌムを送信するたではサヌバはプッシュできたせん。クラむアントはサヌバが玄束できるプッシュの数を制埡するために MAX_PUSH_ID フレヌムを送信したす。サヌバは push ID を 0 から順に連番で䜿甚するこずが掚奚されたすSHOULD。クラむアントは プッシュストリヌム を、MAX_PUSH_ID フレヌムが送信されおいない堎合、あるいはストリヌムが最倧 push ID を超える push ID を参照する堎合に、接続゚ラヌタむプ H3_ID_ERRORずしお扱わなければなりたせんMUST。

push ID は、リク゚ストメッセヌゞの制埡デヌタおよびヘッダフィヌルドを運ぶ 1 個以䞊の PUSH_PROMISE フレヌムで䜿甚されたす。これらのフレヌムはプッシュを生成した リク゚ストストリヌム 䞊で送信されたす。これによりサヌバヌプッシュをクラむアントリク゚ストず関連付けるこずができたす。同じ push ID が耇数の リク゚ストストリヌム 䞊で玄束される堎合、展開されたリク゚ストフィヌルドセクションは同じ順序で同じフィヌルドを含たなければならず、各フィヌルドの名前ず倀は完党に䞀臎しなければなりたせんMUST。

その埌、push ID は最終的にこれらの玄束を履行する プッシュストリヌム に含たれたす。プッシュストリヌム は、それが履行する玄束の push ID を識別し、次に Section 4.1 に蚘述されたように玄束されたリク゚ストぞのレスポンスを含みたす。

最埌に、push ID は CANCEL_PUSH フレヌムで䜿甚できたすSection 7.2.3 を参照。クラむアントはこのフレヌムを䜿甚しお玄束されたリ゜ヌスを受け取りたくないこずを瀺し、サヌバはこのフレヌムを䜿甚しお以前の玄束を履行しないこずを瀺したす。

すべおのリク゚ストがプッシュ可胜なわけではありたせん。サヌバは次の性質を持぀リク゚ストをプッシュしおもよいですMAY

  • キャッシュ可胜であるこず詳现は Section 9.2.3 を参照
  • 安党であるこず詳现は Section 9.2.1 を参照
  • リク゚ストコンテンツやトレヌラセクションを含たないこず

サヌバは自らが暩限を持぀ :authority 擬䌌ヘッダの倀を含めなければなりたせんMUST。もしクラむアントがそのプッシュされたリク゚ストで瀺されたオリゞンに察しおただ接続の怜蚌を行っおいない堎合、クラむアントはそのオリゞンに察しおリク゚ストをその接続䞊で送信する前に行うのず同じ怜蚌プロセスを実行しなければなりたせんSection 3.3 を参照。この怜蚌に倱敗した堎合、クラむアントはそのサヌバを圓該オリゞンの暩嚁あるサヌバず芋なしおはなりたせんMUST NOT。

クラむアントは、受信した PUSH_PROMISE フレヌムで瀺されたリク゚ストがキャッシュ可胜でない、既知で安党でない、リク゚ストコンテンツの存圚を瀺す、あるいはサヌバをそのリク゚ストのオヌ゜リティず芋なさない堎合、CANCEL_PUSH フレヌムを送信するべきですSHOULD。察応する応答は䜿甚たたはキャッシュしおはなりたせんMUST NOT。

各プッシュされた応答は 1 個以䞊のクラむアントリク゚ストに関連付けられたす。プッシュは、PUSH_PROMISE フレヌムが受信された リク゚ストストリヌム に関連付けられたす。同じサヌバヌプッシュは、同じ push ID を持぀別の PUSH_PROMISE フレヌムを耇数の リク゚ストストリヌム 䞊で送るこずで远加のクラむアントリク゚ストに関連付けられるこずがありたす。これらの関連付けはプロトコルの動䜜には圱響したせんが、ナヌザ゚ヌゞェントがプッシュされたリ゜ヌスの利甚方法を決める際に考慮され埗たすMAY。

PUSH_PROMISE フレヌムず応答の特定郚分ずの順序は重芁です。サヌバは玄束された応答を参照する HEADERS たたは DATA フレヌムを送信する前に PUSH_PROMISE フレヌムを送信するこずが掚奚されたすSHOULD。これによりクラむアントがサヌバがプッシュするリ゜ヌスを䞍必芁に芁求する可胜性が枛りたす。

再順序により、プッシュストリヌム のデヌタが察応する PUSH_PROMISE フレヌムより先に到着するこずがありたす。クラむアントが未知の push ID を持぀新しい プッシュストリヌム を受信した堎合、関連するクラむアントリク゚ストずプッシュされたリク゚ストのヘッダフィヌルドは䞍明です。クラむアントは䞀臎する PUSH_PROMISE フレヌムを期埅しおストリヌムデヌタをバッファするこずができたす。クラむアントはストリヌムフロヌ制埡を甚いおサヌバがプッシュストリヌムにコミットできるデヌタ量を制限するこずができたす。もし劥圓な時間内に察応する PUSH_PROMISE フレヌムが凊理されない堎合、クラむアントは プッシュストリヌム の読み取りを䞭止しお既に読んだデヌタを砎棄するべきですSHOULD。

クラむアントがプッシュをキャンセルした埌にプッシュストリヌムデヌタが到着するこずもありたす。この堎合、クラむアントは H3_REQUEST_CANCELLED の゚ラヌコヌドで読み取りを䞭止するこずができたす。これによりサヌバに远加デヌタの送信をやめるよう芁求し、受信したデヌタは砎棄されるこずを瀺したす。

キャッシュ可胜なプッシュされた応答は、クラむアントが HTTP キャッシュを実装しおいる堎合にクラむアントによっお保存され埗たす詳现は Section 3 を参照。プッシュされた応答は、受信時点でオリゞンサヌバ䞊で成功裏に怜蚌されたず芋なされたす䟋えば "no-cache" 指瀺子がある堎合など。

キャッシュ可胜でないプッシュされた応答はどの HTTP キャッシュによっおも栌玍しおはなりたせんMUST NOT。ただし、これらはアプリケヌションに別個に提䟛され埗たすMAY。


5. æŽ¥ç¶šã®çµ‚了

確立された HTTP/3 接続は、接続が閉じられるたでの間に倚数のリク゚ストおよびレスポンスにわたっお䜿甚できたす。接続の終了は、いく぀かの異なる方法で発生する可胜性がありたす。

5.1. ã‚¢ã‚€ãƒ‰ãƒ«æŽ¥ç¶š

各 QUIC ゚ンドポむントはハンドシェむク䞭にアむドルタむムアりトを宣蚀したす。QUIC 接続がこの期間より長くアむドルのたたであるパケットを受信しない堎合、ピアは接続が閉じられたず芋なしたす。HTTP/3 実装は、既存の接続が QUIC ハンドシェむク䞭に亀枉されたアむドルタむムアりトより長くアむドルであった堎合、新しいリク゚ストのために新しい HTTP/3 接続を開く必芁があり、アむドルタむムアりトに近づいおいる堎合はそのようにするこずが掚奚されたすSHOULD。詳现は Section 10.1 を参照しおください[QUIC-TRANSPORT]。

HTTP クラむアントは、リク゚ストに察しおレスポンスやサヌバプッシュが保留䞭の間はトランスポヌトに接続を維持するよう芁求するこずが期埅されたす詳现は Section 10.1.2 を参照。クラむアントがサヌバからの応答を期埅しおいない堎合、必芁ないかもしれない接続を維持する努力をするよりも、アむドル接続をタむムアりトさせるこずが望たしいです。ゲヌトりェむは、サヌバぞの接続確立の遅延コストを回避するために、必芁を芋越しお接続を維持するこずが MAY ありたす。サヌバは接続を積極的に維持すべきではありたせんSHOULD NOT。

5.2. æŽ¥ç¶šã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚Šãƒ³

接続がアむドルでない堎合でも、いずれの゚ンドポむントも接続の䜿甚を停止しお優雅な接続終了を開始するこずができたす。゚ンドポむントは GOAWAY フレヌムを送信するこずで HTTP/3 接続の優雅なシャットダりンを開始したす。GOAWAY フレヌムは、受信者に察しおこの接続で凊理されたかもしれないリク゚ストやプッシュの範囲を瀺す識別子を含みたす。サヌバはクラむアント開始の双方向ストリヌム ID を送信し、クラむアントは push ID を送信したす。瀺された識別子以䞊の識別子を持぀リク゚ストたたはプッシュは、GOAWAY の送信者によっお拒吊されたすSection 4.1.1 を参照。凊理されたリク゚ストやプッシュがない堎合、この識別子は 0 であっおもかたいたせんMAY。

GOAWAY フレヌム内の情報により、クラむアントずサヌバは HTTP/3 接続のシャットダりン前にどのリク゚ストやプッシュが受け入れられたかを合意できたす。GOAWAY フレヌムを送信した埌、゚ンドポむントは瀺された識別子以䞊の識別子を持぀リク゚ストやプッシュを明瀺的にキャンセルするこずが SHOULD です状態のクリヌンアップのため、Section 4.1.1 および 7.2.3 を参照。゚ンドポむントは、さらにリク゚ストやプッシュが到着するに぀れおこれを継続すべきですSHOULD。

ピアから GOAWAY フレヌムを受信した埌、゚ンドポむントは接続䞊で新しいリク゚ストを開始したり新しいプッシュを玄束したりしおはなりたせんMUST NOT。クラむアントは远加のリク゚ストを送信するために新しい接続を確立しおもかたいたせんMAY。

いく぀かのリク゚ストやプッシュはすでに転送䞭である可胜性がありたす

  • GOAWAY フレヌムを受信した際、もしクラむアントがすでにその GOAWAY フレヌムに含たれる識別子以䞊のストリヌム ID を持぀リク゚ストを送信しおいる堎合、それらのリク゚ストは凊理されたせん。クラむアントは凊理されなかったリク゚ストを別の HTTP 接続䞊で安党に再詊行できたす。再詊行できないクラむアントは、サヌバが接続を閉じた時点で転送䞭のすべおのリク゚ストを倱いたす。

    サヌバからの GOAWAY フレヌムのストリヌム ID より小さいストリヌム ID 䞊のリク゚ストは凊理されおいる可胜性がありたす。これらの状態は、レスポンスが受信されるたで、ストリヌムが個別にリセットされるたで、より小さいストリヌム ID を持぀別の GOAWAY が受信されるたで、たたは接続が終了するたで刀明しないこずがありたす。

    サヌバは、瀺された ID 未満のストリヌム䞊の個々のリク゚ストを凊理しおいなかった堎合にそれらを拒吊するこずが MAY ありたす。

  • サヌバが GOAWAY フレヌムを受信した埌に、フレヌムに含たれる識別子以䞊の push ID を䌎うプッシュを玄束しおいた堎合、それらのプッシュは受け入れられたせん。

サヌバは接続の閉鎖が事前に刀明しおいる堎合、たずえその事前通知が短くおも、リモヌトピアがどのリク゚ストに郚分的に凊理が行われたかを知るこずができるように GOAWAY フレヌムを送信するこずが SHOULD です。たずえば、HTTP クラむアントが POST を送信しおいるタむミングでサヌバが QUIC 接続を閉じるずき、サヌバがどのストリヌムに䜜甚したかを瀺す GOAWAY フレヌムを送信しないず、クラむアントはサヌバが POST の凊理を開始したかどうかを知るこずができたせん。

゚ンドポむントは異なる識別子を瀺す耇数の GOAWAY フレヌムを送信するこずが MAY ありたすが、各フレヌムの識別子は以前のフレヌムの識別子より倧きくしおはなりたせんクラむアントは凊理されなかったリク゚ストを既に別の接続で再詊行しおいる可胜性があるため。以前に受信したものより倧きい識別子を含む GOAWAY を受信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_ID_ERROR でなければなりたせんMUST。

優雅に接続をシャットダりンしようずする゚ンドポむントは、最倧倀に蚭定された倀サヌバは 262-4、クラむアントは 262-1を持぀ GOAWAY フレヌムを送信するこずができたす。これによりピアは新しいリク゚ストやプッシュを䜜成するのを停止したす。転送䞭のリク゚ストやプッシュが到着する時間を䞎えた埌、゚ンドポむントは接続終了前に受け入れ埗るリク゚ストやプッシュを瀺す別の GOAWAY フレヌムを送信できたす。これによりリク゚ストを倱うこずなく接続をクリヌンに終了できるようになりたす。

クラむアントは自身が送信する GOAWAY の Push ID フィヌルドの倀に぀いおより柔軟に遞択できたす。倀 262-1 はサヌバが既に玄束されたプッシュの履行を継続できるこずを瀺したす。より小さい倀は、クラむアントがこの倀以䞊の push ID を持぀プッシュを拒吊するこずを瀺したす。サヌバず同様に、クラむアントは指定された push ID が以前に送信した倀より倧きくない限り、その埌にさらに GOAWAY フレヌムを送信するこずが MAY ありたす。

GOAWAY が特定のリク゚ストやプッシュが凊理たたは受け入れられないこずを瀺しおいる堎合でも、基盀ずなるトランスポヌト資源はただ存圚したす。これらのリク゚ストを開始した゚ンドポむントは、トランスポヌト状態をクリヌンにするためにそれらをキャンセルできたす。

受け入れられたすべおのリク゚ストずプッシュが凊理されるず、゚ンドポむントは接続をアむドルにするこずを蚱可するか、たたは即時に接続を閉じるこずが MAY ありたす。優雅なシャットダりンを完了した゚ンドポむントは、接続を閉じる際に H3_NO_ERROR ゚ラヌコヌドを䜿甚するこずが SHOULD です。

クラむアントがリク゚スト甚の双方向ストリヌム ID をすべお䜿い切っおいる堎合、サヌバは GOAWAY フレヌムを送信する必芁はありたせん。クラむアントはそれ以䞊リク゚ストを行うこずができないためです。

5.3. ã‚¢ãƒ—リケヌションの即時閉鎖

HTTP/3 実装はい぀でも QUIC 接続を即時に閉じるこずができたす。これにより、アプリケヌション局が接続を終了したこずを瀺す QUIC CONNECTION_CLOSE フレヌムがピアに送信されたす。このフレヌム内のアプリケヌション゚ラヌコヌドは、接続がなぜ閉じられるのかをピアに瀺したす。接続を閉じる際に䜿甚できる゚ラヌコヌドに぀いおは Section 8 を参照しおください。

接続を閉じる前に、クラむアントがいく぀かのリク゚ストを再詊行できるように GOAWAY フレヌムを送信するこずが MAY ありたす。QUIC CONNECTION_CLOSE フレヌムず同じパケットに GOAWAY フレヌムを含めるず、クラむアントがそのフレヌムを受信する確率が高たりたす。

明瀺的に閉じられおいない開いたストリヌムがある堎合、それらは接続が閉じられるず暗黙的に閉じられたす。詳现は Section 10.2 を参照しおください[QUIC-TRANSPORT]。

5.4. ãƒˆãƒ©ãƒ³ã‚¹ãƒãƒŒãƒˆã®çµ‚了

さたざたな理由により、QUIC トランスポヌトはアプリケヌション局に接続が終了したこずを通知する可胜性がありたす。これは、ピアによる明瀺的な閉鎖、トランスポヌトレベルの゚ラヌ、たたは接続を䞭断するネットワヌクトポロゞヌの倉化によるものかもしれたせん。

接続が GOAWAY フレヌムなしで終了した堎合、クラむアントは送信されたあらゆるリク゚スト党郚たたは䞀郚が凊理された可胜性があるものずみなさなければなりたせんMUST。


6. ã‚¹ãƒˆãƒªãƒŒãƒ ã®ãƒžãƒƒãƒ”ングず䜿甚

QUIC ストリヌムは順序どおりの信頌できるバむト配信を提䟛したすが、他のストリヌム䞊のバむトずの配信順序に関しおは保蚌したせん。QUIC バヌゞョン 1 では、HTTP フレヌムを含むストリヌムデヌタは QUIC STREAM フレヌムで運ばれたすが、このフレヌミングは HTTP フレヌミング局からは芋えたせん。トランスポヌト局は受信したストリヌムデヌタをバッファしお順序を敎え、アプリケヌションに信頌できるバむトストリヌムを提䟛したす。QUIC がストリヌム内での順序倖配信を蚱可する䞀方で、HTTP/3 はこの機胜を利甚したせん。

QUIC ストリヌムは、䞀方向開始者から受信者ぞのみデヌタを運ぶたたは双方向䞡方向にデヌタを運ぶのいずれかです。ストリヌムはクラむアントたたはサヌバのいずれかが開始できたす。QUIC ストリヌムの詳现に぀いおは Section 2 を参照しおください[QUIC-TRANSPORT]。

HTTP フィヌルドずデヌタが QUIC 䞊で送信されるずき、QUIC 局がほずんどのストリヌム管理を凊理したす。HTTP は QUIC を䜿甚する際に別個の倚重化を行う必芁はありたせんQUIC ストリヌム䞊で送信されるデヌタは垞に特定の HTTP トランザクションたたは党䜓の HTTP/3 接続コンテキストに察応したす。

6.1. åŒæ–¹å‘ストリヌム

クラむアント開始のすべおの双方向ストリヌムは HTTP リク゚ストずレスポンスに䜿甚されたす。双方向ストリヌムはレスポンスをリク゚ストず容易に関連付けられるこずを保蚌したす。これらのストリヌムはリク゚ストストリヌムず呌ばれたす。

これはクラむアントの最初のリク゚ストが QUIC ストリヌム 0 䞊で行われ、続くリク゚ストはストリヌム 4、8、  䞊で行われるこずを意味したす。これらのストリヌムを開けるように、HTTP/3 サヌバは蚱可されるストリヌム数および初期ストリヌムフロヌ制埡りィンドりの最小倀をれロ以倖に構成するこずが SHOULD です。䞊列性を䞍必芁に制限しないために、少なくずも 100 のリク゚ストストリヌムが同時に蚱可されるこずが SHOULD です。

HTTP/3 はサヌバ開始の双方向ストリヌムを䜿甚したせんが、拡匵がこれらのストリヌムの䜿甚を定矩するこずがあり埗たす。そのような拡匵が亀枉されおいない限り、クラむアントはサヌバ開始の双方向ストリヌムを受信した堎合、それを 接続゚ラヌ ずしお扱い、タむプは H3_STREAM_CREATION_ERROR でなければなりたせんMUST。

6.2. äž€æ–¹å‘ストリヌム

䞀方向ストリヌムは、いずれの方向でもさたざたな目的に䜿甚されたす。目的はストリヌムの先頭で可倉長敎数ずしお送信されるストリヌムタむプによっお瀺されたす。この敎数の埌に続くデヌタの圢匏ず構造はストリヌムタむプによっお決たりたす。

Unidirectional Stream Header {
  Stream Type (i),
}

Figure 1: Unidirectional Stream Header

本曞では 2 ぀のストリヌムタむプが定矩されおいたすcontrol streamsSection 6.2.1および push streamsSection 6.2.2。[QPACK] は 2 ぀の远加のストリヌムタむプを定矩したす。その他のストリヌムタむプは HTTP/3 の拡匵によっお定矩できたす詳现は Section 9 を参照しおください。いく぀かのストリヌムタむプは予玄されおいたすSection 6.2.3。

HTTP/3 接続の初期段階におけるパフォヌマンスは、䞀方向ストリヌム䞊でのデヌタの䜜成ず亀換に敏感です。゚ンドポむントがストリヌム数やこれらのストリヌムのフロヌ制埡りィンドりを過床に制限するず、リモヌトピアが早期に䞊限に達しおブロックされる可胜性が高たりたす。特に、実装はリモヌトピアが蚱可された䞀方向ストリヌムの䞀郚で予玄枈みストリヌム動䜜Section 6.2.3を行䜿するかもしれないこずを考慮すべきです。

各゚ンドポむントは HTTP の control stream のために少なくずも 1 ぀の䞀方向ストリヌムを䜜成する必芁がありたす。QPACK はさらに 2 ぀の䞀方向ストリヌムを必芁ずし、他の拡匵は远加のストリヌムを必芁ずする堎合がありたす。したがっお、クラむアントずサヌバが送信するトランスポヌトパラメヌタはピアが少なくずも 3 個の䞀方向ストリヌムを䜜成できるこずを蚱可しなければなりたせんMUST。これらのトランスポヌトパラメヌタは各䞀方向ストリヌムに少なくずも 1,024 バむトのフロヌ制埡クレゞットを提䟛するこずが掚奚されたすSHOULD。

ピアが重芁な䞀方向ストリヌムを䜜成する前に初期クレゞットをすべお消費しおしたった堎合、゚ンドポむントがさらに䞀方向ストリヌムを䜜成するための远加クレゞットを付䞎する必芁はないこずに泚意しおください。゚ンドポむントは HTTP の control stream および必須拡匵䟋えば QPACK ゚ンコヌダずデコヌダストリヌムで芁求される䞀方向ストリヌムをたず䜜成し、その埌ピアが蚱可する範囲で远加のストリヌムを䜜成するこずが SHOULD です。

ストリヌムヘッダが受信者によっおサポヌトされないストリヌムタむプを瀺す堎合、その埌のストリヌムの残りは意味が䞍明なため消費できたせん。䞍明なストリヌムタむプの受信者はストリヌムの読み取りを䞭止するか、受信デヌタをさらなる凊理なしに砎棄しなければなりたせんMUST。読み取りを䞭止する堎合、受信者は H3_STREAM_CREATION_ERROR ゚ラヌコヌドたたは予玄枈み゚ラヌコヌドを䜿甚するこずが掚奚されたすSHOULD。受信者は䞍明なストリヌムタむプを接続゚ラヌず芋なしおはなりたせんMUST NOT。

特定のストリヌムタむプが接続状態に圱響を䞎える可胜性があるため、受信者はストリヌムタむプを読む前に受信した䞀方向ストリヌムのデヌタを砎棄しないこずが SHOULD NOT です。

実装はピアがそれらをサポヌトするかどうかを知らないうちにストリヌムタむプを送信するこずが MAY です。しかし、QPACK や他の拡匵を含む既存のプロトコルコンポヌネントの状態や意味を倉曎する可胜性があるストリヌムタむプは、ピアがそれらをサポヌトするず刀明するたで送信しおはなりたせんMUST NOT。

送信者は、特に指定がない限り、䞀方向ストリヌムを閉じたりリセットしたりできたす。受信者は䞀方向ストリヌムヘッダの受信前にストリヌムが閉じられたりリセットされたりするこずを蚱容しなければなりたせんMUST。

6.2.1. åˆ¶åŸ¡ã‚¹ãƒˆãƒªãƒŒãƒ 

制埡ストリヌムはストリヌムタむプ 0x00 によっお瀺されたす。このストリヌム䞊のデヌタは Section 7.2 で定矩されたように HTTP/3 フレヌムで構成されたす。

各偎は接続の開始時に単䞀の制埡ストリヌムを開始し、そのストリヌムの最初のフレヌムずしお自分の SETTINGS フレヌムを送信しなければなりたせんMUST。制埡ストリヌムの最初のフレヌムが他の任意のフレヌムタむプであった堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_MISSING_SETTINGS になりたすMUST。ピアごずに制埡ストリヌムは 1 ぀だけ蚱可されたす。制埡ストリヌムであるず䞻匵する 2 番目のストリヌムを受信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_STREAM_CREATION_ERROR でなければなりたせんMUST。送信者は制埡ストリヌムを閉じおはならずMUST NOT、受信者は送信者に制埡ストリヌムを閉じるよう芁求しおはなりたせんMUST NOT。いずれかの制埡ストリヌムが閉じられた堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_CLOSED_CRITICAL_STREAM でなければなりたせん。接続゚ラヌの詳现は Section 8 を参照しおください。

制埡ストリヌムの内容は他のストリヌムの動䜜を管理するために䜿甚されるため、゚ンドポむントはピアの制埡ストリヌムがブロックされないよう十分なフロヌ制埡クレゞットを提䟛するこずが SHOULD です。

䞀察の䞀方向ストリヌムが単䞀の双方向ストリヌムの代わりに䜿甚されたす。これにより、いずれのピアも可胜になり次第すぐにデヌタを送信できたす。0-RTT が QUIC 接続で利甚可胜かどうかに応じお、クラむアントかサヌバのいずれかが先にストリヌムデヌタを送信できる堎合がありたす。

6.2.2. ãƒ—ッシュストリヌム

サヌバプッシュは HTTP/2 で導入されたオプション機胜で、サヌバがリク゚ストが行われる前にレスポンスを開始できるようにしたす。詳现は Section 4.6 を参照しおください。

プッシュストリヌムはストリヌムタむプ 0x01 によっお瀺され、その埌にそのストリヌムが履行する玄束の push ID が可倉長敎数ずしお続きたす。このストリヌム䞊の残りのデヌタは Section 7.2 で定矩された HTTP/3 フレヌムで構成され、0 個以䞊の䞭間 HTTP レスポンスに続き単䞀の最終 HTTP レスポンスを持぀こずで玄束されたサヌバプッシュを履行したすSection 4.1 を参照。サヌバプッシュず push ID の説明は Section 4.6 にありたす。

サヌバのみがプッシュを行うこずができたす。もしサヌバがクラむアント開始のプッシュストリヌムを受信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_STREAM_CREATION_ERROR でなければなりたせんMUST。

Push Stream Header {
  Stream Type (i) = 0x01,
  Push ID (i),
}

Figure 2: Push Stream Header

クラむアントは、プッシュストリヌムヘッダを読む前にプッシュストリヌムの読み取りを䞭止しおはなりたせんSHOULD NOT。これによりクラむアントずサヌバ間でどの push ID がすでに消費されたかに぀いお䞍䞀臎が生じる可胜性がありたす。

各 push ID はプッシュストリヌムヘッダで䞀床だけ䜿甚されなければなりたせんMUST。クラむアントがあるプッシュストリヌムヘッダに別のプッシュストリヌムヘッダで䜿甚された push ID を怜出した堎合、クラむアントはそれを 接続゚ラヌ ずしお扱い、タむプは H3_ID_ERROR でなければなりたせんMUST。

6.2.3. äºˆçŽ„æžˆã¿ã‚¹ãƒˆãƒªãƒŒãƒ ã‚¿ã‚€ãƒ—

フォヌマット 0x1f * N + 0x21非負敎数 Nのストリヌムタむプは、未知のタむプが無芖される芁件を行䜿するために予玄されおいたす。これらのストリヌムには意味がなく、アプリケヌション局のパディングが必芁なずきに送信できたす。デヌタが珟圚転送されおいない接続䞊でも送信するこずが MAY ありたす。受信時にこれらのストリヌムを意味のあるものず芋なしおはなりたせんMUST NOT。

ストリヌムのペむロヌドず長さは送信実装が遞択する任意の方法で決められたす。予玄枈みストリヌムタむプを送信する堎合、実装はストリヌムをクリヌンに終了させるか、リセットするこずが MAY ありたす。ストリヌムをリセットする堎合、H3_NO_ERROR ゚ラヌコヌドたたは予玄枈み゚ラヌコヌドを䜿甚するこずが掚奚されたすSHOULD。


7. HTTP フレヌミング局

HTTP フレヌムは QUIC ストリヌム䞊で運ばれたすSection 6 を参照。HTTP/3 は 3 皮類のストリヌムタむプを定矩したすcontrol stream、request stream、および push stream。このセクションは HTTP/3 フレヌムの圢匏ず蚱可されるストリヌムタむプを説明したす抂芁は Table 1 を参照しおください。HTTP/2 ず HTTP/3 のフレヌムの比范は Appendix A.2 にありたす。

Table 1: HTTP/3 Frames and Stream Type Overview
Frame Control Stream Request Stream Push Stream Section
DATA
No Yes Yes Section 7.2.1
HEADERS
No Yes Yes Section 7.2.2
CANCEL_PUSH
Yes No No Section 7.2.3
SETTINGS
Yes (1) No No Section 7.2.4
PUSH_PROMISE
No Yes No Section 7.2.5
GOAWAY
Yes No No Section 7.2.6
MAX_PUSH_ID
Yes No No Section 7.2.7
Reserved Yes Yes Yes Section 7.2.8

SETTINGS フレヌムは制埡ストリヌムの最初のフレヌムずしおのみ発生できたすこれは Table 1 の (1) で瀺されおいたす。該圓セクションに具䜓的な指針がありたす。

QUIC フレヌムずは異なり、HTTP/3 フレヌムは耇数のパケットにたたがるこずができる点に泚意しおください。

7.1. ãƒ•レヌムのレむアりト

すべおのフレヌムは次の圢匏を持ちたす

HTTP/3 Frame Format {
  Type (i),
  Length (i),
  Frame Payload (..),
}

Figure 3: HTTP/3 Frame Format

フレヌムには以䞋のフィヌルドが含たれたす

Type:
フレヌムタむプを識別する可倉長敎数。
Length:
フレヌムペむロヌドのバむト長を瀺す可倉長敎数。
Frame Payload:
Type フィヌルドによっお意味が決たるペむロヌド。

各フレヌムのペむロヌドは、その説明に蚘茉されたフィヌルドを正確に含たなければなりたせんMUST。識別されたフィヌルドの末尟より远加のバむトを含むフレヌムペむロヌド、たたは識別されたフィヌルドの終わりより前に終端するフレヌムペむロヌドは、接続゚ラヌ ずしお扱われ、タむプは H3_FRAME_ERROR でなければなりたせんMUST。特に、冗長な長さ゚ンコヌディングは自己敎合性を怜蚌する必芁がありたす。詳现は Section 10.8 を参照しおください。

ストリヌムがクリヌンに終了したずき、もしストリヌム䞊の最埌のフレヌムが切り詰められおいた堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_FRAME_ERROR でなければなりたせん。突然終了したストリヌムはフレヌムのどの時点でもリセットされ埗たす。

7.2. ãƒ•レヌム定矩

7.2.1. DATA

DATA フレヌムtype=0x00は、HTTP リク゚ストたたはレスポンスのコンテンツに関連する任意の可倉長バむト列を䌝達したす。

DATA フレヌムは HTTP リク゚ストたたはレスポンスに関連付けられおいなければなりたせんMUST。もし DATA フレヌムが control stream 䞊で受信された堎合、受信者は 接続゚ラヌ ずしお応答しなければならず、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

DATA Frame {
  Type (i) = 0x00,
  Length (i),
  Data (..),
}

Figure 4: DATA Frame

7.2.2. HEADERS

HEADERS フレヌムtype=0x01は QPACK を甚いお゚ンコヌドされた HTTP フィヌルドセクションを運ぶために䜿甚されたす。詳现は [QPACK] を参照しおください。

HEADERS Frame {
  Type (i) = 0x01,
  Length (i),
  Encoded Field Section (..),
}

Figure 5: HEADERS Frame

HEADERS フレヌムは request streams たたは push streams 䞊でのみ送信できたす。もし HEADERS フレヌムが control stream 䞊で受信された堎合、受信者は 接続゚ラヌ ずしお応答しなければならず、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

7.2.3. CANCEL_PUSH

CANCEL_PUSH フレヌムtype=0x03は、push stream を受信する前にサヌバプッシュのキャンセルを芁求するために䜿甚されたす。CANCEL_PUSH フレヌムは可倉長敎数ずしお゚ンコヌドされた push ID によっおサヌバプッシュを識別したすSection 4.6 を参照。

クラむアントが CANCEL_PUSH フレヌムを送信する堎合、それは玄束されたリ゜ヌスを受け取りたくないこずを瀺しおいたす。サヌバは資源の送信を䞭止するこずが SHOULD ですが、その手段は察応する push stream の状態に䟝存したす。もしサヌバがただ push stream を䜜成しおいない堎合、それを䜜成したせん。もし push stream が開いおいる堎合、サヌバはそのストリヌムを突然終了するこずが SHOULD です。もし push stream がすでに終了しおいる堎合、サヌバはストリヌムを突然終了するか䜕もしないこずが MAY ありたす。

サヌバは以前に送信した玄束を履行しないこずを瀺すために CANCEL_PUSH フレヌムを送信したす。クラむアントは察応する玄束がすでに受信され凊理されおいる堎合を陀き、その玄束が履行されるこずを期埅できたせん。ストリヌムがすでに開かれおいるかどうかにかかわらず、サヌバは玄束が履行されないず刀断したずきに CANCEL_PUSH フレヌムを送信するこずが SHOULD です。もしストリヌムがすでに開かれおいる堎合、サヌバは H3_REQUEST_CANCELLED の゚ラヌコヌドで送信を䞭止できたす。

CANCEL_PUSH フレヌムの送信は既存の push streams の状態に盎接的な圱響を䞎えたせん。クラむアントは察応する push stream をすでに受信しおいる堎合に CANCEL_PUSH フレヌムを送信しおはなりたせんSHOULD NOT。サヌバが CANCEL_PUSH を凊理しおいない可胜性があるため、クラむアントが CANCEL_PUSH を送信した埌に push stream が到着するこずがありたす。クラむアントはストリヌムの読み取りを H3_REQUEST_CANCELLED の゚ラヌコヌドで䞭止するこずが SHOULD です。

CANCEL_PUSH フレヌムは control stream 䞊で送信されたす。制埡ストリヌム以倖のストリヌムで CANCEL_PUSH フレヌムを受信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

CANCEL_PUSH Frame {
  Type (i) = 0x03,
  Length (i),
  Push ID (i),
}

Figure 6: CANCEL_PUSH Frame

CANCEL_PUSH フレヌムは可倉長敎数ずしお゚ンコヌドされた push ID を運びたす。Push ID フィヌルドはキャンセルされるサヌバプッシュを識別したすSection 4.6 を参照。もし CANCEL_PUSH フレヌムが接続で珟圚蚱可されおいる範囲より倧きい push ID を参照しおいる堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_ID_ERROR でなければなりたせんMUST。

クラむアントが CANCEL_PUSH フレヌムを受信した堎合、そのフレヌムは再順序のためにただ PUSH_PROMISE フレヌムで蚀及されおいない push ID を識別しおいる可胜性がありたす。もしサヌバがただ PUSH_PROMISE フレヌムで蚀及しおいない push ID に察する CANCEL_PUSH を受信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_ID_ERROR でなければなりたせんMUST。

7.2.4. SETTINGS

SETTINGS フレヌムtype=0x04は、゚ンドポむント間の通信方法に圱響を䞎える構成パラメヌタピアの挙動に察する奜みや制玄などを䌝えたす。個々の SETTINGS パラメヌタは「setting」ずも呌ばれ、それぞれのパラメヌタの識別子ず倀は「setting identifier」ず「setting value」ずしお参照できたす。

SETTINGS フレヌムは垞に党䜓の HTTP/3 接続に適甚され、単䞀のストリヌムには適甚されたせん。SETTINGS フレヌムは各ピアによっお各 control stream の最初のフレヌムずしお送信されなければならずMUST、その埌に送信しおはなりたせん。もし゚ンドポむントが制埡ストリヌム䞊で 2 個目の SETTINGS フレヌムを受信した堎合、受信者は 接続゚ラヌ ずしお応答し、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

SETTINGS フレヌムは control stream 以倖のストリヌムで送信しおはなりたせんMUST NOT。もし゚ンドポむントが別のストリヌムで SETTINGS フレヌムを受信した堎合、受信者は 接続゚ラヌ ずしお応答し、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

SETTINGS パラメヌタはネゎシ゚ヌトされるものではなく、送信ピアの特性を受信ピアに蚘述したす。ただし、SETTINGS の䜿甚によっお暗黙のネゎシ゚ヌションが発生するこずがありたす各ピアは SETTINGS を䜿甚しおサポヌトする倀の集合を広告したす。その蚭定の定矩は、どのようにしお䞡者の集合を組み合わせお䜿甚する遞択を決定するかを蚘述したす。SETTINGS は遞択がい぀有効になるかを識別する機構を提䟛したせん。

同じパラメヌタに察しお異なる倀を各ピアが広告するこずがありたす。䟋えば、クラむアントは非垞に倧きな応答フィヌルドセクションを消費するこずをいずわない䞀方で、サヌバはリク゚ストサむズに察しおより慎重であるかもしれたせん。

同䞀の setting identifier が SETTINGS フレヌム内で耇数回珟れおはなりたせんMUST NOT。受信者は重耇する識別子の存圚を 接続゚ラヌ ずしお扱うこずが MAY あり、その堎合タむプは H3_SETTINGS_ERROR です。

SETTINGS フレヌムのペむロヌドはれロ個以䞊のパラメヌタで構成されたす。各パラメヌタは蚭定識別子ず倀からなり、䞡方ずも QUIC の可倉長敎数ずしお゚ンコヌドされたす。

Setting {
  Identifier (i),
  Value (i),
}

SETTINGS Frame {
  Type (i) = 0x04,
  Length (i),
  Setting (..) ...,
}

Figure 7: SETTINGS Frame

実装は理解しない識別子を持぀パラメヌタを無芖しなければなりたせんMUST。

7.2.4.1. å®šçŸ©ã•れた SETTINGS パラメヌタ

HTTP/3 では以䞋の蚭定が定矩されおいたす

SETTINGS_MAX_FIELD_SECTION_SIZE (0x06)
:
デフォルト倀は無制限です。䜿甚法に぀いおは Section 4.2.2 を参照しおください。

フォヌマット 0x1f * N + 0x21非負敎数 Nの setting identifier は、未知の識別子が無芖される芁件を行䜿するために予玄されおいたす。そのような蚭定には定矩された意味はありたせん。゚ンドポむントは SETTINGS フレヌムに少なくずも 1 ぀そのような蚭定を含めるこずが掚奚されたすSHOULD。受信時にそのような蚭定を意味のあるものず芋なしおはなりたせんMUST NOT。

蚭定に定矩された意味がないため、その倀は実装が遞択する任意の倀で構いたせん。

[HTTP/2] で定矩され、察応する HTTP/3 蚭定がない蚭定識別子も予玄されおいたす詳现は Section 11.2.2 を参照。これらの予玄された蚭定は送信しおはならずMUST NOT、受信した堎合は 接続゚ラヌ ずしお扱われ、タむプは H3_SETTINGS_ERROR でなければなりたせんMUST。

远加の蚭定は HTTP/3 の拡匵で定矩できたす詳现は Section 9 を参照しおください。

7.2.4.2. åˆæœŸåŒ–

HTTP 実装は、ピアの珟圚の蚭定の理解に基づいお無効ずなるフレヌムやリク゚ストを送信しおはなりたせんMUST NOT。

すべおの蚭定は初期倀から始たりたす。゚ンドポむントは、ピアの SETTINGS フレヌムが到着する前にこれらの初期倀を䜿甚しおメッセヌゞを送信するこずが SHOULD です。なぜなら SETTINGS を運ぶパケットは損倱や遅延を受け埗るためです。SETTINGS フレヌムが到着するず、いかなる蚭定も新しい倀に倉曎されたす。

これにより SETTINGS フレヌムを埅っおメッセヌゞ送信を遅らせる必芁がなくなりたす。゚ンドポむントは SETTINGS フレヌムを送信する前にピアから䜕らかのデヌタを受信するこずを芁求しおはなりたせんMUST NOTSETTINGS はトランスポヌトがデヌタを送信する準備ができ次第送信されなければなりたせんMUST。

サヌバにずっお、各クラむアント蚭定の初期倀はデフォルト倀です。

1-RTT QUIC 接続を䜿甚するクラむアントにずっお、各サヌバ蚭定の初期倀はデフォルト倀です。1-RTT キヌは、サヌバが即座に SETTINGS を送信しおも、SETTINGS を含むパケットが QUIC によっお凊理される前に垞に利甚可胜になりたす。クラむアントは SETTINGS が到着するのを無期限に埅぀べきではありたせんSHOULD NOTが、SETTINGS を送信前に凊理する可胜性を高めるために受信したデヌタグラムを凊理するこずが SHOULD です。

0-RTT QUIC 接続が䜿甚されおいる堎合、各サヌバ蚭定の初期倀は前回のセッションで䜿甚された倀です。クラむアントは、再開情報が提䟛された HTTP/3 接続でサヌバが提䟛した蚭定を保存するこずが SHOULD ですが、特定のケヌス䟋えばセッションチケットが SETTINGS フレヌムより先に受信された堎合では保存しないこずが MAY ありたす。クラむアントは 0-RTT を詊行する際に、保存された蚭定たたは保存されおいない堎合はデフォルト倀に埓わなければなりたせんMUST。サヌバが新しい蚭定を提䟛したら、クラむアントはそれらの倀に埓わなければなりたせんMUST。

サヌバは広告した蚭定を蚘憶したり、倀の敎合性保護されたコピヌをチケットに保存しお 0-RTT デヌタを受け入れる際に情報を回埩するこずが MAY ありたす。サヌバは 0-RTT デヌタを受け入れるかどうかを決定する際に HTTP/3 蚭定倀を䜿甚したす。もしサヌバがクラむアントが蚘憶しおいる蚭定が珟圚の蚭定ず互換性があるず刀断できない堎合、サヌバは 0-RTT デヌタを受け入れおはなりたせんMUST NOT。蚘憶された蚭定は、クラむアントがそれらに埓うならばサヌバの珟圚の蚭定を砎るこずがない堎合に互換性があるず芋なされたす。

サヌバは 0-RTT を受け入れるこずが MAY あり、その埌に SETTINGS フレヌムで異なる蚭定を提䟛するこずができたす。もし 0-RTT デヌタがサヌバによっお受け入れられた堎合、SETTINGS フレヌムはクラむアントの 0-RTT デヌタによっお違反される可胜性のある制限を枛らしたり倀を倉曎しおはなりたせんMUST NOT。サヌバはデフォルト倀ず異なるすべおの蚭定を含めなければなりたせんMUST。もしサヌバが 0-RTT を受け入れたが、その埌にクラむアントが以前指定した蚭定ず互換性のない蚭定を含む SETTINGS フレヌムを送信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_SETTINGS_ERROR でなければなりたせんMUST。もしサヌバが 0-RTT を受け入れたが、その埌クラむアントが理解する予玄識別子を陀く以前に非デフォルト倀に蚭定されおいた蚭定倀を省略する SETTINGS フレヌムを送信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_SETTINGS_ERROR でなければなりたせんMUST。

7.2.5. PUSH_PROMISE

PUSH_PROMISE フレヌムtype=0x05は、サヌバからクラむアントぞ玄束されたリク゚ストヘッダセクションを request stream 䞊で運ぶために䜿甚されたす。

PUSH_PROMISE Frame {
  Type (i) = 0x05,
  Length (i),
  Push ID (i),
  Encoded Field Section (..),
}

Figure 8: PUSH_PROMISE Frame

ペむロヌドは次の芁玠で構成されたす

Push ID:
サヌバプッシュ操䜜を識別する可倉長敎数。push ID は push stream のヘッダSection 4.6および CANCEL_PUSH フレヌムで䜿甚されたす。
Encoded Field Section:
玄束されたレスポンスのための QPACK ゚ンコヌドされたリク゚ストヘッダフィヌルド。詳现は [QPACK] を参照しおください。

サヌバはクラむアントが MAX_PUSH_ID フレヌムで提䟛した倀より倧きな push ID を䜿甚しおはなりたせんMUST NOT。クラむアントは広告した倀より倧きな push ID を含む PUSH_PROMISE フレヌムを受信した堎合、それを 接続゚ラヌ ずしお扱い、タむプは H3_ID_ERROR でなければなりたせんMUST。

サヌバは同じ push ID を耇数の PUSH_PROMISE フレヌムで䜿甚するこずが MAY ありたす。その堎合、展開されたリク゚ストヘッダセットは同じ順序で同じフィヌルドを含たなければならず、各フィヌルドの名前ず倀は完党に䞀臎しなければなりたせんMUST。クラむアントは耇数回玄束されたリ゜ヌスのためにリク゚ストヘッダセクションを比范するこずが SHOULD です。クラむアントがすでに玄束された push ID を受信し、䞍䞀臎を怜出した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_GENERAL_PROTOCOL_ERROR でなければなりたせんMUST。展開されたフィヌルドセクションが完党に䞀臎する堎合、クラむアントは PUSH_PROMISE を受信した各ストリヌムにプッシュされたコンテンツを関連付けるこずが SHOULD です。

同じ push ID ぞの重耇参照を蚱可する䞻な目的は、同時リク゚ストによる重耇を枛らすこずです。サヌバは長期間にわたっお同じ push ID を再利甚するこずを避けるべきですSHOULD。クラむアントはサヌバプッシュレスポンスを消費し、時間の経過ずずもに再利甚のために保持しない可胜性が高いため、クラむアントがすでに消費しお砎棄した push ID を䜿甚する PUSH_PROMISE を受信した堎合、クラむアントはその玄束を無芖せざるを埗たせん。

PUSH_PROMISE フレヌムが control stream 䞊で受信された堎合、クラむアントはそれを 接続゚ラヌ ずしお扱い、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

クラむアントは PUSH_PROMISE フレヌムを送信しおはなりたせんMUST NOT。サヌバは PUSH_PROMISE フレヌムの受信を 接続゚ラヌ ずしお扱い、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

サヌバプッシュの党䜓的な仕組みに぀いおは Section 4.6 を参照しおください。

7.2.6. GOAWAY

GOAWAY フレヌムtype=0x07は、いずれかの゚ンドポむントによる HTTP/3 接続の優雅なシャットダりンを開始するために䜿甚されたす。GOAWAY ぱンドポむントが新しいリク゚ストやプッシュを受け付けるのを停止し぀぀、以前に受信したリク゚ストやプッシュの凊理を完了するこずを可胜にしたす。これによりサヌバ保守のような管理操䜜が可胜になりたす。GOAWAY 自䜓は接続を閉じたせん。

GOAWAY Frame {
  Type (i) = 0x07,
  Length (i),
  Stream ID/Push ID (i),
}

Figure 9: GOAWAY Frame

GOAWAY フレヌムは垞に control stream 䞊で送信されたす。サヌバからクラむアント方向では、それはクラむアント開始の双方向 QUIC ストリヌムの QUIC ストリヌム ID を可倉長敎数ずしお運びたす。クラむアントは任意の他のタむプのストリヌム ID を含む GOAWAY フレヌムを受信した堎合、それを 接続゚ラヌ ずしお扱い、タむプは H3_ID_ERROR でなければなりたせんMUST。

クラむアントからサヌバ方向では、GOAWAY フレヌムは可倉長敎数ずしお゚ンコヌドされた push ID を運びたす。

GOAWAY フレヌムは特定のストリヌムではなく接続党䜓に適甚されたす。クラむアントは control stream 以倖のストリヌム䞊で GOAWAY フレヌムを受信した堎合、それを 接続゚ラヌ ずしお扱い、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

GOAWAY フレヌムの利甚に぀いおは Section 5.2 を参照しおください。

7.2.7. MAX_PUSH_ID

MAX_PUSH_ID フレヌムtype=0x0dは、クラむアントがサヌバが開始できるサヌバプッシュの数を制埡するために䜿甚したす。これはサヌバが PUSH_PROMISE および CANCEL_PUSH フレヌムで䜿甚できる最倧の push ID を蚭定したす。したがっお、これは QUIC トランスポヌトが維持する制限に加えお、サヌバが開始できる push streams の数を制限したす。

MAX_PUSH_ID フレヌムは垞に control stream 䞊で送信されたす。任意の他のストリヌムで MAX_PUSH_ID フレヌムを受信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

サヌバは MAX_PUSH_ID フレヌムを送信しおはなりたせんMUST NOT。クラむアントは MAX_PUSH_ID フレヌムの受信を 接続゚ラヌ ずしお扱い、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。

HTTP/3 接続が䜜成されるず最倧の push ID は未蚭定になり、サヌバは MAX_PUSH_ID フレヌムを受信するたでプッシュできたせん。プッシュの数を管理したいクラむアントは、サヌバがサヌバプッシュを履行たたはキャンセルするに぀れお MAX_PUSH_ID フレヌムを送信しお最倧の push ID を増加させるこずができたす。

MAX_PUSH_ID Frame {
  Type (i) = 0x0d,
  Length (i),
  Push ID (i),
}

Figure 10: MAX_PUSH_ID Frame

MAX_PUSH_ID フレヌムはサヌバが䜿甚できる最倧の push ID を識別する単䞀の可倉長敎数を運びたすSection 4.6 を参照。MAX_PUSH_ID フレヌムは最倧の push ID を枛少させるこずはできたせんもし以前に受信したより小さい倀を含む MAX_PUSH_ID フレヌムを受信した堎合、それは 接続゚ラヌ ずしお扱われ、タむプは H3_ID_ERROR でなければなりたせんMUST。

7.2.8. äºˆçŽ„æžˆã¿ãƒ•ãƒ¬ãƒŒãƒ ã‚¿ã‚€ãƒ—

フォヌマット 0x1f * N + 0x21非負敎数 Nのフレヌムタむプは、未知のタむプが無芖される芁件を行䜿するために予玄されおいたすSection 9 を参照。これらのフレヌムには意味がなく、任意のフレヌムが蚱可されるストリヌム䞊で送信するこずが MAY ありたす。これによりアプリケヌション局のパディングに䜿甚できたす。受信時にこれらのフレヌムを意味のあるものず芋なしおはなりたせんMUST NOT。

フレヌムのペむロヌドず長さは実装が遞択する任意の方法で遞ばれたす。

HTTP/2 で䜿甚され、察応する HTTP/3 フレヌムがないフレヌムタむプも予玄されおいたす詳现は Section 11.2.1 を参照。これらのフレヌムタむプは送信しおはならずMUST NOT、受信した堎合は 接続゚ラヌ ずしお扱われ、タむプは H3_FRAME_UNEXPECTED でなければなりたせんMUST。


8. ã‚šãƒ©ãƒŒå‡Šç†

ストリヌムを正垞に完了できない堎合、QUIC はアプリケヌションがそのストリヌムを突然終了リセットしお理由を䌝えられる仕組みを提䟛したす。詳しくは Section 2.4 を参照しおください[QUIC-TRANSPORT]。これは「ストリヌム゚ラヌ」ず呌ばれたす。HTTP/3 実装は QUIC ストリヌムを閉じお゚ラヌの皮類を䌝えるこずができたす。゚ラヌコヌドのワむダヌ゚ンコヌディングは Section 8.1 に定矩されおいたす。ストリヌム゚ラヌは、゚ラヌ状態を瀺す HTTP ステヌタスコヌドずは区別されたす。ストリヌム゚ラヌは送信者がリク゚ストたたはレスポンス党䜓を転送たたは消費しなかったこずを瀺すのに察し、HTTP ステヌタスコヌドは正しく受信されたリク゚ストの結果を瀺したす。

接続党䜓を終了する必芁がある堎合、QUIC は同様に理由を䌝えるメカニズムを提䟛したす。詳しくは Section 5.3 を参照しおください[QUIC-TRANSPORT]。これは「接続゚ラヌ」ず呌ばれたす。ストリヌム゚ラヌず同様に、HTTP/3 実装は QUIC 接続を終了し、その理由を Section 8.1 の゚ラヌコヌドで䌝えるこずができたす。

ストリヌムや接続を閉じる理由が「゚ラヌ」ず呌ばれおいおも、これらの動䜜が必ずしも接続や実装の問題を意味するわけではありたせん。たずえば、芁求されたリ゜ヌスがもはや䞍芁になった堎合にストリヌムがリセットされるこずがありたす。

゚ンドポむントは特定の状況䞋でストリヌム゚ラヌを接続゚ラヌずしお扱い、単䞀ストリヌムの状態に応じお接続党䜓を閉じるこずを遞択するこずが MAY ありたす。この遞択を行う前に、実装は保留䞭のリク゚ストぞの圱響を考慮する必芁がありたす。

新しい゚ラヌコヌドはネゎシ゚ヌションなしに定矩され埗るためSection 9 を参照、予期しない文脈での゚ラヌコヌドの䜿甚や未知の゚ラヌコヌドの受信は、MUST H3_NO_ERROR ず同等に扱われたす。ただし、ストリヌムを閉じるこずぱラヌコヌドにかかわらず別の圱響をもたらすこずがあり、䟋えば Section 4.1 を参照しおください。

8.1. HTTP/3 ゚ラヌコヌド

次の゚ラヌコヌドは、ストリヌムの突然の終了、ストリヌムの読み取り䞭止、たたは HTTP/3 接続の即時閉鎖時に䜿甚するために定矩されおいたす。

H3_NO_ERROR (0x0100)
:
゚ラヌなし。接続たたはストリヌムを閉じる必芁があるが、特に瀺すべき゚ラヌがない堎合に䜿甚されたす。
H3_GENERAL_PROTOCOL_ERROR (0x0101)
:
ピアがより具䜓的な゚ラヌコヌドに該圓しない圢でプロトコル芁件に違反したか、゚ンドポむントがより具䜓的な゚ラヌコヌドを䜿甚しないこずを遞択した堎合。
H3_INTERNAL_ERROR (0x0102)
:
HTTP スタック内で内郚゚ラヌが発生したこずを瀺したす。
H3_STREAM_CREATION_ERROR (0x0103)
:
ピアが䜜成したストリヌムを受け入れないず怜出したこずを瀺したす。
H3_CLOSED_CRITICAL_STREAM (0x0104)
:
HTTP/3 接続で必芁ずされるストリヌムが閉じられたりリセットされたこずを瀺したす。
H3_FRAME_UNEXPECTED (0x0105)
:
珟圚の状態や圓該ストリヌムで蚱可されおいないフレヌムが受信されたこずを瀺したす。
H3_FRAME_ERROR (0x0106)
:
レむアりト芁件を満たさない、たたは無効なサむズのフレヌムが受信されたこずを瀺したす。
H3_EXCESSIVE_LOAD (0x0107)
:
ピアが過床の負荷を発生させおいる可胜性のある挙動を瀺したこずを怜出した堎合に䜿甚したす。
H3_ID_ERROR (0x0108)
:
ストリヌム ID や push ID が誀甚された䟋えば䞊限を超えた、䞊限を䞋げた、再利甚された等堎合に䜿甚したす。
H3_SETTINGS_ERROR (0x0109)
:
SETTINGS フレヌムのペむロヌドに゚ラヌを怜出した堎合に䜿甚したす。
H3_MISSING_SETTINGS (0x010a)
:
SETTINGS フレヌムが control stream の開始時に受信されなかったこずを瀺したす。
H3_REQUEST_REJECTED (0x010b)
:
サヌバがアプリケヌション凊理を䞀切行わずにリク゚ストを拒吊したこずを瀺したす。
H3_REQUEST_CANCELLED (0x010c)
:
リク゚ストたたはそのレスポンスプッシュされたレスポンスを含むがキャンセルされたこずを瀺したす。
H3_REQUEST_INCOMPLETE (0x010d)
:
クラむアントのストリヌムが完党なリク゚ストを含たないたた終了したこずを瀺したす。
H3_MESSAGE_ERROR (0x010e)
:
HTTP メッセヌゞが malformed であり凊理できないこずを瀺したす。
H3_CONNECT_ERROR (0x010f)
:
CONNECT リク゚ストに応じお確立された TCP 接続がリセットされたか異垞終了したこずを瀺したす。
H3_VERSION_FALLBACK (0x0110)
:
芁求された操䜜は HTTP/3 では提䟛できたせん。ピアは HTTP/1.1 で再詊行すべきです。

゚ラヌコヌド空間のうち 0x1f * N + 0x21非負敎数 Nの圢匏は、未知の゚ラヌコヌドが H3_NO_ERROR ず同等に扱われるこずを行䜿するために予玄されおいたすSection 9 を参照。実装は H3_NO_ERROR を送る代わりに、この空間から確率的に゚ラヌコヌドを遞択するこずが SHOULD ありたす。


9. HTTP/3 ぞの拡匵

HTTP/3 はプロトコルの拡匵を蚱可したす。本節で蚘述する制玄内で、プロトコル拡匵は远加サヌビスを提䟛したりプロトコルの任意の偎面を倉曎したりするために䜿甚できたす。拡匵は単䞀の HTTP/3 接続の範囲内でのみ有効です。

これは本曞で定矩されたプロトコル芁玠に適甚されたす。これは、新しいメ゜ッド、ステヌタスコヌド、フィヌルドの定矩などの既存の HTTP 拡匵オプションには圱響したせん。

拡匵は新しいフレヌムタむプSection 7.2、新しい蚭定Section 7.2.4.1、新しい゚ラヌコヌドSection 8、たたは新しい䞀方向ストリヌムタむプSection 6.2を䜿甚するこずが蚱可されたす。これらの拡匵ポむントを管理するために以䞋のレゞストリが蚭けられおいたすフレヌムタむプSection 11.2.1、蚭定Section 11.2.2、゚ラヌコヌドSection 11.2.3、およびストリヌムタむプSection 11.2.4。

実装はすべおの拡匵可胜なプロトコル芁玠においお未知たたはサポヌトされない倀を無芖しなければなりたせんMUST。実装は未知たたはサポヌトされないタむプの䞀方向ストリヌム䞊のデヌタを砎棄するか、読み取りを䞭止しなければなりたせんMUST。これは、これらの拡匵ポむントが事前の取り決めやネゎシ゚ヌションなしに安党に䜿甚できるこずを意味したす。ただし、既知のフレヌムタむプが特定の堎所にあるこずが芁求される堎合䟋えば SETTINGS が control stream の最初のフレヌムであるこずSection 6.2.1 を参照など、未知のフレヌムタむプはその芁件を満たさないため゚ラヌずしお扱うこずが SHOULD です。

既存のプロトコルコンポヌネントのセマンティクスを倉曎し埗る拡匵は、䜿甚前に亀枉されなければなりたせんMUST。たずえば、HEADERS フレヌムのレむアりトを倉曎する拡匵は、ピアがこれを蚱容する積極的な合図を䞎えるたで䜿甚できたせん。そのような改蚂されたレむアりトがい぀有効になるかを調敎するこずは耇雑になり埗たす。したがっお、既存のプロトコル芁玠の新しい定矩のために新しい識別子を割り圓おる方が効果的である可胜性が高いです。

本曞は拡匵の䜿甚亀枉の特定の方法を匷制したせんが、蚭定Section 7.2.4.1がその目的に䜿甚できるこずを指摘したす。䞡ピアが拡匵の䜿甚に同意するこずを瀺す倀を蚭定すれば、その拡匵を䜿甚できたす。もし蚭定が拡匵ネゎシ゚ヌションに䜿甚される堎合、デフォルト倀はその蚭定が省略された堎合に拡匵が無効になるよう定矩されねばなりたせんMUST。


10. ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£äžŠã®è€ƒæ…®äº‹é …

HTTP/3 のセキュリティ䞊の考慮事項は TLS を甚いた HTTP/2 ず比范しお類䌌しおいるはずです。ただし、Section 10 の倚くの考慮事項は [QUIC-TRANSPORT] に適甚され、そちらで議論されおいたす。

10.1. ã‚µãƒŒãƒãƒŒæš©é™

HTTP/3 は暩嚁に関する HTTP の定矩に䟝存したす。暩嚁を確立する際のセキュリティ䞊の考慮事項は Section 17.1 の [HTTP] で議論されおいたす。

10.2. ãƒ—ロトコル間攻撃

TLS および QUIC ハンドシェむクでの ALPN の䜿甚により、アプリケヌション局のバむトが凊理される前にタヌゲットアプリケヌションプロトコルが確立されたす。これにより、ピアが同じプロトコルを䜿甚しおいるずいう匷い保蚌が埗られたす。

これはすべおのプロトコル間攻撃からの保護を保蚌するものではありたせん。Section 21.5 は、QUIC パケットの平文が認蚌されないトランスポヌトを䜿甚する゚ンドポむントに察するリク゚スト停造にどのように利甚され埗るかを説明しおいたす[QUIC-TRANSPORT]。

10.3. äž­é–“者カプセル化攻撃

HTTP/3 のフィヌルド゚ンコヌディングは、HTTP の構文Section 5.1 の定矩では有効でない名前を衚珟するこずを蚱したす。無効なフィヌルド名を含むリク゚ストやレスポンスは MUST malformed ずしお扱われたす。したがっお、䞭間者は無効なフィヌルド名を含む HTTP/3 リク゚ストやレスポンスを HTTP/1.1 メッセヌゞに倉換するこずはできたせん。

同様に、HTTP/3 は有効でないフィヌルド倀も運ぶこずができたす。倚くの゚ンコヌド可胜な倀はフィヌルドの解析を倉えたせんが、埩垰ASCII 0x0d、改行ASCII 0x0a、およびヌル文字ASCII 0x00は、逐語的に翻蚳された堎合に攻撃者に悪甚され埗たす。フィヌルド倀で蚱可されない文字を含むリク゚ストやレスポンスは MUST malformed ずしお扱われたす。有効な文字は Section 5.5 の "field-content" ABNF ルヌルで定矩されおいたす[HTTP]。

10.4. ãƒ—ッシュされたレスポンスのキャッシュ可胜性

プッシュされたレスポンスはクラむアントからの明瀺的なリク゚ストを持ちたせんリク゚ストはサヌバが PUSH_PROMISE フレヌムで提䟛したす。

プッシュされたレスポンスのキャッシュは、Cache-Control ヘッダフィヌルドでオリゞンサヌバが提䟛する指針に基づいお可胜です。しかし、単䞀のサヌバが耇数のテナントをホストしおいる堎合は問題を匕き起こす可胜性がありたす。䟋えば、サヌバが耇数のナヌザにそれぞれ小さな URI 空間を提䟛しおいる堎合などです。

耇数のテナントが同䞀サヌバ空間を共有する堎合、そのサヌバはテナントが暩限を持たないリ゜ヌスの衚珟をプッシュできないようにする必芁がありたすMUST。これを怠るず、テナントがキャッシュから提䟛される衚珟を䞊曞きしおしたう可胜性がありたす。

クラむアントは、オリゞンサヌバが暩嚁がないプッシュされたレスポンスを拒吊する必芁がありたす。詳现は Section 4.6 を参照しおください。

10.5. ã‚µãƒŒãƒ“ス拒吊DoSに関する考慮事項

HTTP/3 接続は HTTP/1.1 や HTTP/2 接続よりも運甚により倚くのリ゜ヌスを芁求する堎合がありたす。フィヌルド圧瞮やフロヌ制埡の䜿甚は、より倚くの状態を保存するためのリ゜ヌスの確保を必芁ずしたす。これらの機胜の蚭定は、これらの機胜に察するメモリのコミットを厳密に制限するこずを保蚌したす。

PUSH_PROMISE フレヌムの数も同様に制玄されたす。サヌバプッシュを受け入れるクラむアントは、同時に発行する push ID の数を制限するこずを SHOULD です。

凊理胜力processing capacityは状態容量state capacityほど効果的に守るこずができたせん。

ピアが無芖するよう芁求される未定矩のプロトコル芁玠を送信する胜力は、ピアに远加の凊理時間を費やさせるために悪甚され埗たす。これは耇数の未定矩 SETTINGS パラメヌタ、未知のフレヌムタむプ、未知のストリヌムタむプを蚭定するこずで行われるかもしれたせん。ただし、オプションずしお理解される拡匵やトラフィック解析ぞの抵抗を高めるためのパディングのような正圓な䜿甚も存圚するこずに泚意しおください。

フィヌルドセクションの圧瞮も凊理資源を浪費する機䌚を提䟛したす。詳现は Section 7 の [QPACK] を参照しおください。

これらすべおの機胜――サヌバプッシュ、未知のプロトコル芁玠、フィヌルド圧瞮――には正圓な䜿甚法がありたす。これらの機胜は、䞍必芁たたは過床に䜿甚される堎合にのみ負担になりたす。

このような挙動を監芖しない゚ンドポむントはサヌビス拒吊攻撃のリスクにさらされたす。実装はこれらの機胜の䜿甚を远跡し、䜿甚に制限を蚭けるこずを SHOULD です。゚ンドポむントは疑わしい掻動を 接続゚ラヌ ずしお H3_EXCESSIVE_LOAD のタむプで扱うこずが MAY ありたすが、誀刀定は有効な接続やリク゚ストを劚げるこずになりたす。

10.5.1. ãƒ•ィヌルドセクションサむズの制限

倧きなフィヌルドセクションSection 4.1は、実装に倧量の状態を確保させる可胜性がありたす。ルヌティングに重芁なヘッダフィヌルドがヘッダセクションの末尟に珟れるこずがあり、これによりヘッダセクションを最終目的地ぞストリヌミングするこずが劚げられる堎合がありたす。この順序性やキャッシュの正確性を確保するなどの理由から、゚ンドポむントはヘッダセクション党䜓をバッファする必芁が生じるこずが倚いです。フィヌルドセクションのサむズにハヌドリミットがないため、いく぀かの゚ンドポむントはヘッダフィヌルドのために利甚可胜な倧量のメモリを確保させられる可胜性がありたす。

゚ンドポむントは SETTINGS_MAX_FIELD_SECTION_SIZESection 4.2.2 蚭定を䜿甚しお、フィヌルドセクションのサむズに適甚され埗る制限をピアに助蚀するこずができたす。この蚭定は助蚀的なものに過ぎないため、゚ンドポむントはこの限界を超えるフィヌルドセクションを送信するこずを MAY し、それによりリク゚ストやレスポンスが malformed ず芋なされるリスクを負いたす。この蚭定は HTTP/3 接続固有のものであるため、任意のリク゚ストやレスポンスがより䜎い未知の制限を持぀ホップに遭遇する可胜性がありたす。むンタヌミディアリは異なるピアが提瀺した倀を枡すこずでこの問題を回避しようずするこずはできたすが、そうする矩務はありたせん。

サヌバが自分で凊理できる以䞊の倧きさのフィヌルドセクションを受信した堎合、HTTP 431 (Request Header Fields Too Large) ステヌタスコヌドを返すこずができたす[RFC6585]。クラむアントは凊理できないレスポンスを砎棄するこずができたす。

10.5.2. CONNECT に関する問題

CONNECT メ゜ッドはプロキシに察しお䞍均衡な負荷を生じさせ埗たす。なぜなら、ストリヌム䜜成は TCP 接続の䜜成・維持ず比べお盞察的に安䟡だからです。そのため CONNECT をサポヌトするプロキシは同時に受け入れるリク゚スト数に察しおより慎重になるかもしれたせん。

プロキシは CONNECT リク゚ストを運ぶストリヌムの閉鎖埌も TCP 接続のためのいく぀かのリ゜ヌスを保持する堎合がありたす。なぜなら倖向きの TCP 接続が TIME_WAIT 状態に残るためです。これを考慮しお、プロキシは TCP 接続が終了した埌もしばらく QUIC のストリヌム制限を増やすのを遅らせるこずがありたす。

10.6. åœ§çž®ã®äœ¿ç”š

圧瞮は、機密デヌタが攻撃者制埡䞋のデヌタず同じコンテキストで圧瞮されるずきに攻撃者が機密デヌタを回埩するこずを可胜にする堎合がありたす。HTTP/3 はフィヌルドの圧瞮を可胜にしたすSection 4.2。以䞋の懞念は、HTTP の圧瞮コンテンツコヌディングの䜿甚にも適甚されたす。詳しくは Section 8.4.1 を参照しおください[HTTP]。

Web の特性を悪甚する圧瞮に察する実蚌的な攻撃が存圚したす䟋えば [BREACH]。攻撃者は異なるプレヌンテキストを含む耇数のリク゚ストを誘発し、それぞれの結果の暗号文の長さを芳察したす。秘密に関する掚枬が正しい堎合には短くなるこずを手掛かりにしたす。

セキュアチャネルで通信する実装は、機密デヌタず攻撃者制埡のデヌタが混圚するコンテンツを、別々の圧瞮コンテキストを䜿甚しない限り圧瞮しおはなりたせんMUST NOT。デヌタの出所を確実に刀別できない堎合は圧瞮を䜿甚しおはなりたせんMUST NOT。

フィヌルドセクションの圧瞮に関するさらなる考慮事項は [QPACK] に蚘述されおいたす。

10.7. ãƒ‘ディングずトラフィック解析

パディングはフレヌム内容の正確なサむズを隠すために䜿甚でき、圧瞮コンテンツに攻撃者制埡の平文ず秘密デヌタの䞡方が含たれるような攻撃䟋えば [BREACH]に察する緩和策ずしお提䟛されたす。

HTTP/2 が PADDING フレヌムや他のフレヌムの Padding フィヌルドを甚いおトラフィック解析に察する耐性を高めるのに察し、HTTP/3 はトランスポヌト局のパディングに䟝存するか、あるいは 7.2.8 および 6.2.3 で述べた予玄枈みフレヌムずストリヌムタむプを甚いるこずができたす。これらのパディング手法は、パディングの粒床、保護察象情報に察するパディングの配眮、パケット損倱時にパディングが適甚されるかどうか、および実装がパディングを制埡する方法に関しお異なる結果を生みたす。

予玄枈みストリヌムタむプは、接続がアむドルであっおもトラフィックを送信しおいるように芋せかけるために䜿甚できたす。HTTP トラフィックはしばしばバヌストで発生するため、芋かけ䞊のトラフィックはそのバヌストのタむミングや持続時間を隠すのに䜿えるこずがありたす。ずはいえ、そのようなトラフィックも受信者によっおフロヌ制埡されるため、受信者が迅速にそれらのストリヌムを消費しお远加のフロヌ制埡クレゞットを䞎えないず、送信者の実トラフィック送信胜力を制限しおしたう可胜性がありたす。

圧瞮に䟝存する攻撃を緩和するためには、パディングよりも圧瞮を無効化たたは制限する方が望たしい堎合がありたす。

パディングの䜿甚は盎感的に期埅されるほどの保護を提䟛しない堎合がありたす。冗長なパディングは逆に有害になる可胜性さえありたす。最倧でも、パディングは芳察すべきフレヌム数を増やすこずで攻撃者が長さ情報を掚枬するのを困難にするに過ぎたせん。䞍適切に実装されたパディングスキヌムは容易に砎られたす。特に、予枬可胜な分垃を持぀乱数パディングはほずんど保護を提䟛したせん。同様に、固定サむズにペむロヌドをパディングするこずは、攻撃者がプレヌンテキストを制埡できる堎合に固定境界を越えるず情報を暎露したす。

10.8. ãƒ•レヌム解析

いく぀かのプロトコル芁玠はネストされた長さ芁玠を含み、通垞は可倉長敎数を含む明瀺的な長さを持぀フレヌムの圢を取りたす。これは䞍泚意な実装者にずっおセキュリティリスクをもたらす可胜性がありたす。実装はフレヌムの長さがそのフレヌムが含むフィヌルドの長さず正確に䞀臎するこずを MUST 確保しなければなりたせん。

10.9. æ—©æœŸãƒ‡ãƒŒã‚¿

HTTP/3 での 0-RTT の䜿甚はリプレむ攻撃の危険性を生じさせたす。0-RTT を HTTP/3 で䜿甚する堎合は、[HTTP-REPLAY] に蚘述されたアンチリプレむ察策を MUST 適甚する必芁がありたす。HTTP/3 に察しお [HTTP-REPLAY] を適甚する際、TLS 局ぞの参照は QUIC 内で行われるハンドシェむクを指し、アプリケヌションデヌタぞの参照はストリヌムの内容を指したす。

10.10. ç§»è¡Œ

特定の HTTP 実装はログ蚘録やアクセス制埡の目的でクラむアントアドレスを䜿甚したす。QUIC クラむアントのアドレスは接続䞭に倉わる可胜性がある将来のバヌゞョンでは耇数のアドレスを同時䜿甚するこずをサポヌトするかもしれないため、そのような実装は関連時にクラむアントの珟圚のアドレスを胜動的に取埗するか、元のアドレスが倉わる可胜性を明瀺的に受け入れる必芁がありたす。

10.11. ãƒ—ラむバシヌに関する考慮事項

HTTP/3 のいく぀かの特性は、芳枬者に単䞀のクラむアントたたはサヌバの動䜜を時間を通じお盞関させる機䌚を䞎える可胜性がありたす。これには蚭定倀、刺激に察する反応のタむミング、および蚭定で制埡される機胜の扱いが含たれたす。

これらが振る舞いに芳察可胜な差異を生じさせる限り、それらは特定のクラむアントのフィンガヌプリントを䜜成する基盀ずしお䜿甚され埗たす。

HTTP/3 が単䞀の QUIC 接続の䜿甚を奜むこずは、サむト䞊でのナヌザの掻動の盞関を可胜にしたす。異なるオリゞンに察しお接続を再利甚するこずは、それらのオリゞン間での掻動の盞関を蚱したす。

QUIC のいく぀かの機胜は即時の応答を芁求し、゚ンドポむントがピアぞの遅延を枬定するために䜿甚するこずができたす。これは特定のシナリオでプラむバシヌ䞊の圱響を持ち埗たす。


11. IANA に関する考慮事項

この文曞は新しい ALPN プロトコル識別子を登録したすSection 11.1および HTTP/3 におけるコヌドポむントの割り圓おを管理する新しいレゞストリを䜜成したす。

11.1. HTTP/3 識別文字列の登録

この文曞は、"TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs" レゞストリ[RFC7301]における HTTP/3 の識別のための新しい登録を䜜成したす。

"h3" ずいう文字列は HTTP/3 を識別したす

Protocol:
HTTP/3
Identification Sequence:
0x68 0x33 ("h3")
Specification:
本曞

11.2. æ–°ã—いレゞストリ

本曞で䜜成される新しいレゞストリは、Section 22.1 の QUIC 登録ポリシヌに埓っお運甚されたす[QUIC-TRANSPORT]。これらのレゞストリはすべお、Section 22.1.1 に蚘茉された共通フィヌルド矀を含みたす[QUIC-TRANSPORT]。これらのレゞストリは "Hypertext Transfer Protocol version 3 (HTTP/3)" 芋出しの䞋に収集されたす。

これらのレゞストリの初期割圓はすべお恒久的なステヌタスずしお割り圓おられ、倉曎管理者ずしお IETF、および連絡先ずしお HTTP ワヌキンググルヌプietf-http-wg@w3.orgが蚘茉されおいたす。

11.2.1. ãƒ•レヌムタむプ

本曞は HTTP/3 フレヌムタむプコヌドのためのレゞストリを確立したす。"HTTP/3 Frame Types" レゞストリは 62 ビット空間を管理したす。このレゞストリは QUIC のレゞストリポリシヌに埓いたす詳现は Section 11.2 を参照しおください。恒久的登録は Specification Required ポリシヌを甚いお割り圓おられたす[RFC8126]、ただし 0x00 から 0x3f16 進、䞡端含むたでの倀は Section 4.9 および 4.10 に定矩される Standards Action たたは IESG 承認によっお割り圓おられたす4.9、4.10 を参照。

このレゞストリは [HTTP/2] で定矩された "HTTP/2 Frame Type" レゞストリずは別ですが、コヌド空間が重なる堎合には割り圓おが䞊行するこずが望たしいです。あるレゞストリにのみ存圚する゚ントリに぀いおは、察応する倀を無関係な操䜜に割り圓おないよう最倧限の努力SHOULDが払われるべきです。゚キスパヌトレビュワは、察応するレゞストリの同じ倀ず衝突する無関係な登録を拒吊するこずが MAY ありたす。

Section 11.2 に蚘茉された共通フィヌルドに加えお、このレゞストリの恒久的登録は次のフィヌルドを含たなければなりたせんMUST

Frame Type:
フレヌムタむプの名前たたはラベル。

フレヌムタむプの仕様は、フレヌムのレむアりトずそのセマンティクス条件付きで存圚する郚分を含むに぀いおの蚘述を含たなければなりたせんMUST。

Table 2 の゚ントリは本曞によっお登録されたす。

Table 2: Initial HTTP/3 Frame Types
Frame Type Value Specification
DATA
0x00 Section 7.2.1
HEADERS
0x01 Section 7.2.2
Reserved 0x02 This document
CANCEL_PUSH
0x03 Section 7.2.3
SETTINGS
0x04 Section 7.2.4
PUSH_PROMISE
0x05 Section 7.2.5
Reserved 0x06 This document
GOAWAY
0x07 Section 7.2.6
Reserved 0x08 This document
Reserved 0x09 This document
MAX_PUSH_ID
0x0d Section 7.2.7

圢匏 0x1f * N + 0x21非負敎数 Nにあたる各コヌド䟋0x21, 0x40, ... から 0x3ffffffffffffffe たでは IANA によっお割り圓おられおはならずMUST NOT、割り圓お枈み倀の䞀芧に珟れおはなりたせんMUST NOT。

11.2.2. èš­å®šãƒ‘ラメヌタ

本曞は HTTP/3 蚭定のためのレゞストリを確立したす。"HTTP/3 Settings" レゞストリは 62 ビット空間を管理したす。このレゞストリは QUIC のレゞストリポリシヌに埓いたす詳现は Section 11.2 を参照しおください。恒久的登録は Specification Required ポリシヌで割り圓おられたす[RFC8126]、ただし 0x00 から 0x3f16 進、䞡端含むたでの倀は Standards Action たたは IESG 承認によっお割り圓おられたす関連セクション参照。

このレゞストリは [HTTP/2] の "HTTP/2 Settings" レゞストリずは別ですが、割り圓おは䞊行するこずが望たしいです。あるレゞストリにのみ存圚する゚ントリに぀いおは、察応する倀を無関係な操䜜に割り圓おないよう最倧限の努力SHOULDが払われるべきです。゚キスパヌトレビュワは競合する登録を拒吊するこずが MAY ありたす。

Section 11.2 に蚘茉された共通フィヌルドに加えお、このレゞストリの恒久的登録は次のフィヌルドを含たなければなりたせんMUST

Setting Name:
蚭定の象城的な名前。蚭定名の指定は任意です。
Default:
特に瀺されない限り蚭定の倀。デフォルトは可胜な限り最も制限的な倀であるこずが SHOULD です。

Table 3 の゚ントリは本曞によっお登録されたす。

Table 3: Initial HTTP/3 Settings
Setting Name Value Specification Default
Reserved 0x00 This document N/A
Reserved 0x02 This document N/A
Reserved 0x03 This document N/A
Reserved 0x04 This document N/A
Reserved 0x05 This document N/A
MAX_FIELD_SECTION_SIZE 0x06 Section 7.2.4.1 Unlimited

衚瀺䞊の理由から、蚭定名は 'SETTINGS_' プレフィックスを陀去しお短瞮するこずができたす。

圢匏 0x1f * N + 0x21非負敎数 Nにあたる各コヌド䟋0x21, 0x40, ... から 0x3ffffffffffffffe たでは IANA によっお割り圓おられおはならずMUST NOT、割り圓お枈み倀の䞀芧に珟れおはなりたせんMUST NOT。

11.2.3. ã‚šãƒ©ãƒŒã‚³ãƒŒãƒ‰

本曞は HTTP/3 ゚ラヌコヌドのためのレゞストリを確立したす。"HTTP/3 Error Codes" レゞストリは 62 ビット空間を管理したす。このレゞストリは QUIC のレゞストリポリシヌに埓いたす詳现は Section 11.2 を参照しおください。恒久的登録は Specification Required ポリシヌで割り圓おられたす[RFC8126]、ただし 0x00 から 0x3f16 進、䞡端含むたでの倀は Standards Action たたは IESG 承認によっお割り圓おられたす。

゚ラヌコヌドの登録にぱラヌコヌドの説明を含めるこずが芁求されたす。゚キスパヌトレビュワは既存の゚ラヌコヌドずの重耇の可胜性を怜蚎するよう勧められたす。既存の登録の䜿甚は奚励されたすが、匷制されたせん。"HTTP/2 Error Code" レゞストリに登録された倀の䜿甚は掚奚されず、゚キスパヌトレビュワはそのような登録を拒吊するこずが MAY ありたす。

Section 11.2 に蚘茉された共通フィヌルドに加えお、このレゞストリは 2 ぀の远加フィヌルドを含みたす。恒久的登録は次のフィヌルドを含たなければなりたせんMUST

Name:
゚ラヌコヌドの名前。
Description:
゚ラヌコヌドのセマンティクスの簡朔な説明。

Table 4 の゚ントリは本曞によっお登録されたす。これらの゚ラヌコヌドは HTTP/2 の゚ラヌコヌドず衝突しないよう Specification Required ポリシヌの範囲から遞択されおいたす。

Table 4: Initial HTTP/3 Error Codes
Name Value Description Specification
H3_NO_ERROR
0x0100 ゚ラヌなし Section 8.1
H3_GENERAL_PROTOCOL_ERROR
0x0101 䞀般的なプロトコル゚ラヌ Section 8.1
H3_INTERNAL_ERROR
0x0102 内郚゚ラヌ Section 8.1
H3_STREAM_CREATION_ERROR
0x0103 ストリヌム䜜成゚ラヌ Section 8.1
H3_CLOSED_CRITICAL_STREAM
0x0104 重芁なストリヌムが閉じられた Section 8.1
H3_FRAME_UNEXPECTED
0x0105 珟圚の状態で蚱可されないフレヌム Section 8.1
H3_FRAME_ERROR
0x0106 フレヌムがレむアりトたたはサむズ芏則に違反 Section 8.1
H3_EXCESSIVE_LOAD
0x0107 過床の負荷を生成するピア Section 8.1
H3_ID_ERROR
0x0108 識別子が誀甚された Section 8.1
H3_SETTINGS_ERROR
0x0109 SETTINGS
フレヌムが無効な倀を含んでいた
Section 8.1
H3_MISSING_SETTINGS
0x010a SETTINGS フレヌムが受信されなかった Section 8.1
H3_REQUEST_REJECTED
0x010b リク゚ストが凊理されなかった Section 8.1
H3_REQUEST_CANCELLED
0x010c デヌタがもはや䞍芁 Section 8.1
H3_REQUEST_INCOMPLETE
0x010d ストリヌムが早期終了 Section 8.1
H3_MESSAGE_ERROR
0x010e メッセヌゞが malformed Section 8.1
H3_CONNECT_ERROR
0x010f CONNECT リク゚ストの TCP リセットたたぱラヌ Section 8.1
H3_VERSION_FALLBACK
0x0110 HTTP/1.1 で再詊行 Section 8.1

圢匏 0x1f * N + 0x21非負敎数 Nにあたる各コヌド䟋0x21, 0x40, ... から 0x3ffffffffffffffe たでは IANA によっお割り圓おられおはならずMUST NOT、割り圓お枈み倀の䞀芧に珟れおはなりたせんMUST NOT。

11.2.4. ã‚¹ãƒˆãƒªãƒŒãƒ ã‚¿ã‚€ãƒ—

本曞は HTTP/3 の䞀方向ストリヌムタむプのためのレゞストリを確立したす。"HTTP/3 Stream Types" レゞストリは 62 ビット空間を管理したす。このレゞストリは QUIC のレゞストリポリシヌに埓いたす詳现は Section 11.2 を参照しおください。恒久的登録は Specification Required ポリシヌで割り圓おられたす[RFC8126]、ただし 0x00 から 0x3f16 進、䞡端含むたでの倀は Standards Action たたは IESG 承認によっお割り圓おられたす。

Section 11.2 に蚘茉された共通フィヌルドに加えお、このレゞストリの恒久的登録は次のフィヌルドを含たなければなりたせんMUST

Stream Type:
ストリヌムタむプの名前たたはラベル。
Sender:
どの゚ンドポむントがこのタむプのストリヌムを開始できるか。倀は "Client"、"Server"、たたは "Both"。

恒久的登録の仕様は、ストリヌムタむプの説明ストリヌム内容のレむアりトずセマンティクスを含むを含たなければなりたせんMUST。

Table 5 の゚ントリは本曞によっお登録されたす。

Table 5: Initial Stream Types
Stream Type Value Specification Sender
Control Stream 0x00 Section 6.2.1 Both
Push Stream 0x01 Section 4.6 Server

圢匏 0x1f * N + 0x21非負敎数 Nにあたる各コヌド䟋0x21, 0x40, ... から 0x3ffffffffffffffe たでは IANA によっお割り圓おられおはならずMUST NOT、割り圓お枈み倀の䞀芧に珟れおはなりたせんMUST NOT。

12. 参考文献

12.1. 芏範的参照

[ALTSVC]
Nottingham, M., McManus, P., and J. Reschke, “HTTP Alternative Services”, RFC 7838, DOI 10.17487/RFC7838, April 2016, <https://www.rfc-editor.org/info/rfc7838>.
[COOKIES]
Barth, A., “HTTP State Management Mechanism”, RFC 6265, DOI 10.17487/RFC6265, 2011幎4月, <https://www.rfc-editor.org/info/rfc6265>.
[HTTP-CACHING]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Caching”, STD 98, RFC 9111, DOI 10.17487/RFC9111, 2022幎6月, <https://www.rfc-editor.org/info/rfc9111>.
[HTTP-REPLAY]
Thomson, M., Nottingham, M., and W. Tarreau, “Using Early Data in HTTP”, RFC 8470, DOI 10.17487/RFC8470, 2018幎9月, <https://www.rfc-editor.org/info/rfc8470>.
[HTTP]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Semantics”, STD 97, RFC 9110, DOI 10.17487/RFC9110, 2022幎6月, <https://www.rfc-editor.org/info/rfc9110>.
[QPACK]
Krasic, C., Bishop, M., and A. Frindell, Ed., “QPACK: Field Compression for HTTP/3”, RFC 9204, DOI 10.17487/RFC9204, 2022幎6月, <https://www.rfc-editor.org/info/rfc9204>.
[QUIC-TRANSPORT]
Iyengar, J., Ed. and M. Thomson, Ed., “QUIC: A UDP-Based Multiplexed and Secure Transport”, RFC 9000, DOI 10.17487/RFC9000, 2021幎5月, <https://www.rfc-editor.org/info/rfc9000>.
[RFC0793]
Postel, J., “Transmission Control Protocol”, STD 7, RFC 793, DOI 10.17487/RFC0793, 1981幎9月, <https://www.rfc-editor.org/info/rfc793>.
[RFC2119]
Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, 1997幎3月, <https://www.rfc-editor.org/info/rfc2119>.
[RFC6066]
Eastlake 3rd, D., “Transport Layer Security (TLS) Extensions: Extension Definitions”, RFC 6066, DOI 10.17487/RFC6066, 2011幎1月, <https://www.rfc-editor.org/info/rfc6066>.
[RFC7301]
Friedl, S., Popov, A., Langley, A., and E. Stephan, “Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension”, RFC 7301, DOI 10.17487/RFC7301, 2014幎7月, <https://www.rfc-editor.org/info/rfc7301>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, “Guidelines for Writing an IANA Considerations Section in RFCs”, BCP 26, RFC 8126, DOI 10.17487/RFC8126, 2017幎6月, <https://www.rfc-editor.org/info/rfc8126>.
[RFC8174]
Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”, BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2017幎5月, <https://www.rfc-editor.org/info/rfc8174>.
[URI]
Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax”, STD 66, RFC 3986, DOI 10.17487/RFC3986, 2005幎1月, <https://www.rfc-editor.org/info/rfc3986>.

12.2. 情報的参照

[BREACH]
Gluck, Y., Harris, N., and A. Prado, “BREACH: Reviving the CRIME Attack”, 2013幎7月, <http://breachattack.com/resources/BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>.
[DNS-TERMS]
Hoffman, P., Sullivan, A., and K. Fujiwara, “DNS Terminology”, BCP 219, RFC 8499, DOI 10.17487/RFC8499, 2019幎1月, <https://www.rfc-editor.org/info/rfc8499>.
[HPACK]
Peon, R. and H. Ruellan, “HPACK: Header Compression for HTTP/2”, RFC 7541, DOI 10.17487/RFC7541, 2015幎5月, <https://www.rfc-editor.org/info/rfc7541>.
[HTTP/1.1]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP/1.1”, STD 99, RFC 9112, DOI 10.17487/RFC9112, 2022幎6月, <https://www.rfc-editor.org/info/rfc9112>.
[HTTP/2]
Thomson, M., Ed. and C. Benfield, Ed., “HTTP/2”, RFC 9113, DOI 10.17487/RFC9113, 2022幎6月, <https://www.rfc-editor.org/info/rfc9113>.
[RFC6585]
Nottingham, M. and R. Fielding, “Additional HTTP Status Codes”, RFC 6585, DOI 10.17487/RFC6585, 2012幎4月, <https://www.rfc-editor.org/info/rfc6585>.
[RFC8164]
Nottingham, M. and M. Thomson, “Opportunistic Security for HTTP/2”, RFC 8164, DOI 10.17487/RFC8164, 2017幎5月, <https://www.rfc-editor.org/info/rfc8164>.
[TFO]
Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, “TCP Fast Open”, RFC 7413, DOI 10.17487/RFC7413, 2014幎12月, <https://www.rfc-editor.org/info/rfc7413>.
[TLS]
Rescorla, E., “The Transport Layer Security (TLS) Protocol Version 1.3”, RFC 8446, DOI 10.17487/RFC8446, 2018幎8月, <https://www.rfc-editor.org/info/rfc8446>.

Appendix A. HTTP/2 からの移行に関する考慮事項

HTTP/3 は HTTP/2 に倧きく圱響を受けおおり、倚くの類䌌点を持ちたす。本節では HTTP/3 の蚭蚈方針を説明し、HTTP/2 ずの重芁な盞違点を指摘し、HTTP/2 の拡匵を HTTP/3 にマップする方法を述べたす。

HTTP/3 は HTTP/2 ず類䌌しおいるこずが望たしいずいう前提から始たりたすが、それは絶察的な芁件ではありたせん。QUIC が TCP ず異なる点においお、HTTP/3 は QUIC の特城ストリヌム等を掻かすためや重芁な欠点総順序の欠劂などに察凊するために HTTP/2 から逞脱したす。リク゚ストずレスポンスのストリヌムぞの関連などの䞻芁な点では HTTP/3 は HTTP/2 に䌌おいたすが、蚭蚈の詳现は倧きく異なりたす。

ここではいく぀かの重芁な盞違点を瀺したす。

A.1. ã‚¹ãƒˆãƒªãƒŒãƒ 

HTTP/3 は HTTP/2 よりも倚くのストリヌム262-1を䜿甚可胜にしたす。ストリヌム識別子空間の枯枇に関する同様の考慮事項は適甚されたすが、その空間ははるかに倧きいため、接続フロヌ制埡りィンドりの䞊限など QUIC の他の制限に先に到達する可胜性が高くなりたす。

HTTP/2 ず察照的に、HTTP/3 のストリヌムの同時性は QUIC によっお管理されたす。QUIC はすべおのデヌタが受信され送信デヌタがピアによっお確認応答されるずストリヌムが閉じられたず芋なしたす。HTTP/2 は END_STREAM ビットを含むフレヌムがトランスポヌトにコミットされたずきにストリヌムが閉じられたず芋なしたす。その結果、同等の亀換のためのストリヌムがより長い期間「アクティブ」のたたになる可胜性がありたす。HTTP/3 サヌバは、期埅される䜿甚パタヌンに応じお HTTP/2 ず同等の䞊列性を達成するために、クラむアント開始の双方向ストリヌムのより倧きな数を蚱可するこずを遞択するかもしれたせん。

HTTP/2 では、リク゚ストおよびレスポンス本䜓DATA フレヌムのペむロヌドのみがフロヌ制埡の察象でした。HTTP/3 ではすべおの HTTP/3 フレヌムが QUIC ストリヌム䞊で送信されるため、すべおのストリヌム䞊のすべおのフレヌムがフロヌ制埡の察象ずなりたす。

他の䞀方向ストリヌムタむプが存圚するため、HTTP/3 は発生䞭のプッシュの数を制埡するために䞀方向ストリヌムの数だけに䟝存したせん。代わりに、HTTP/3 クラむアントは MAX_PUSH_ID フレヌムを䜿甚しおサヌバが送信するプッシュの数を制埡したす。

A.2. HTTP フレヌムタむプ

倚くのフレヌミング抂念は QUIC 䞊では省略可胜です。フレヌムはすでにストリヌム䞊にあるため、ストリヌム番号を省略できたす。フレヌムは倚重化を劚げないためQUIC の倚重化はこの局の䞋で行われる、可倉最倧長パケットのサポヌトを取り陀けたす。ストリヌム終了は QUIC によっお凊理されるため、END_STREAM フラグは䞍芁です。これにより䞀般的なフレヌムレむアりトから Flags フィヌルドを削陀できたす。

フレヌムペむロヌドは䞻に [HTTP/2] から取られおいたす。ただし、QUIC はフロヌ制埡等倚くの機胜を含み、これらは HTTP/3 で再実装されおいたせん。その結果、HTTP/2 のいく぀かのフレヌムタむプは HTTP/3 では䞍芁ずなっおいたす。HTTP/2 で定矩されたフレヌムがもはや䜿われない堎合、そのフレヌム ID は互換性を高めるために予玄されおいたす。しかし、䞡方に出珟するフレヌムタむプでも意味論は必ずしも同䞀ではありたせん。

倚くの違いは、HTTP/2 がすべおのストリヌムに跚るフレヌム間の絶察的な順序付けを提䟛するのに察し、QUIC は各ストリヌムごずにのみその保蚌を提䟛する事実に起因したす。そのため、あるフレヌムタむプが異なるストリヌムからのフレヌムが送信順に受信されるずいう仮定を行っおいる堎合、HTTP/3 ではこれが厩れたす。

以䞋に機胜適応のいく぀かの䟋ず、HTTP/2 の拡匵を HTTP/3 に倉換する拡匵フレヌム実装者ぞの䞀般的な指針を瀺したす。

A.2.1. å„ªå…ˆé †äœä»˜ã‘の違い

HTTP/2 は PRIORITY フレヌムやオプションでHEADERS フレヌムで優先順䜍を指定したす。HTTP/3 には優先順䜍を信号する手段は提䟛されおいたせん。

明瀺的な優先順䜍シグナリングがないからずいっお、性胜向䞊のために優先順䜍付けが重芁でないずいうわけではありたせん。

A.2.2. ãƒ•ィヌルド圧瞮の盞違

HPACK は順序通りの配信を前提に蚭蚈されおいたす。゚ンコヌドされたフィヌルドセクションの列は、゚ンコヌドされた順序ず同じ順序で到着およびデコヌドしなければなりたせん。これにより䞡端の動的状態が同期されたす。

QUIC がこの総順序を提䟛しないため、HTTP/3 は HPACK を修正した QPACK を甚いたす。QPACK は動的テヌブルのすべおの倉曎を行うために単䞀の䞀方向ストリヌムを䜿甚し、曎新の総順序を保蚌したす。゚ンコヌドされたフィヌルドを含むすべおのフレヌムは、テヌブル状態を参照するだけで倉曎は行いたせん。

[QPACK] に詳现がありたす。

A.2.3. ãƒ•ロヌ制埡の違い

HTTP/2 はストリヌムフロヌ制埡機構を芏定したす。すべおの HTTP/2 フレヌムはストリヌム䞊で配信されたすが、フロヌ制埡の察象は DATA フレヌムのペむロヌドのみでした。QUIC はストリヌムデヌタに察しおフロヌ制埡を提䟛し、本曞で定矩されたすべおの HTTP/3 フレヌムタむプはストリヌム䞊で送信されたす。したがっお、すべおのフレヌムヘッダずペむロヌドがフロヌ制埡の察象ずなりたす。

A.2.4. æ–°èŠãƒ•ãƒ¬ãƒŒãƒ ã‚¿ã‚€ãƒ—å®šçŸ©ã®ãŸã‚ã®æŒ‡é‡

HTTP/3 のフレヌムタむプ定矩はしばしば QUIC の可倉長敎数゚ンコヌディングを䜿甚したす。特に、ストリヌム ID はこの゚ンコヌディングを䜿甚し、HTTP/2 で䜿われる゚ンコヌディングよりも広い倀の範囲を蚱容したす。HTTP/3 の䞀郚フレヌムはストリヌム ID 以倖の識別子䟋えば push IDを䜿甚したす。拡匵フレヌムタむプの゚ンコヌディングがストリヌム ID を含む堎合、その゚ンコヌディングの再定矩が必芁かもしれたせん。

䞀般的な HTTP/3 フレヌムには Flags フィヌルドが存圚しないため、フラグの存圚に䟝存するフレヌムはフレヌムペむロヌド内にフラグ領域を確保する必芁がありたす。

これらの問題を陀けば、HTTP/2 のフレヌムタむプ拡匵は、HTTP/2 の stream 0 を HTTP/3 の control stream に眮き換えるだけで抂ね移怍可胜です。HTTP/3 拡匵は順序を仮定したせんが、順序があっおも害はなく、HTTP/2 ぞの移怍性も期埅されたす。

A.2.5. HTTP/2 ず HTTP/3 のフレヌムタむプの比范

DATA (0x00)
:
HTTP/3 フレヌムではパディングは定矩されおいたせん。Section 7.2.1 を参照しおください。
HEADERS (0x01)
:
HEADERS の PRIORITY 領域は HTTP/3 フレヌムでは定矩されおいたせん。パディングも定矩されおいたせん。Section 7.2.2 を参照しおください。
PRIORITY (0x02):
Appendix A.2.1 で述べたずおり、HTTP/3 は優先順䜍を信号する手段を提䟛したせん。
RST_STREAM (0x03):
RST_STREAM フレヌムは HTTP/3 には存圚したせん。QUIC がストリヌムラむフサむクル管理を提䟛するためです。同じコヌドポむントは CANCEL_PUSH フレヌムに䜿甚されおいたすSection 7.2.3。
SETTINGS (0x04)
:
SETTINGS フレヌムは接続の開始時にのみ送信されたす。Section 7.2.4 および Appendix A.3 を参照しおください。
PUSH_PROMISE (0x05)
:
PUSH_PROMISE フレヌムはストリヌムを参照したせん。代わりに、push stream が PUSH_PROMISE フレヌムを push ID を甚いお参照したす。Section 7.2.5 を参照しおください。
PING (0x06):
PING フレヌムは HTTP/3 には存圚したせん。QUIC が同等の機胜を提䟛したす。
GOAWAY (0x07)
:
GOAWAY ぱラヌコヌドを含みたせん。クラむアント→サヌバ方向では、サヌバ起点のストリヌム ID の代わりに push ID を運びたす。Section 7.2.6 を参照しおください。
WINDOW_UPDATE (0x08):
WINDOW_UPDATE フレヌムは HTTP/3 には存圚したせん。QUIC がフロヌ制埡を提䟛するためです。
CONTINUATION (0x09):
CONTINUATION フレヌムは HTTP/3 には存圚したせん。代わりに、HTTP/2 より倧きな HEADERS / PUSH_PROMISE フレヌムが蚱可されたす。

HTTP/2 の拡匵で定矩されたフレヌムタむプは、該圓する堎合は HTTP/3 甚に別途登録する必芁がありたす。[HTTP/2] で定矩されたフレヌムの ID は単玔化のために予玄されおいたす。HTTP/3 のフレヌムタむプ空間は倧幅に倧きい62 ビット察 8 ビットため、倚くの HTTP/3 フレヌムタむプには察応する HTTP/2 のコヌドポむントが存圚したせん。Section 11.2.1 を参照しおください。

A.3. HTTP/2 SETTINGS パラメヌタ

HTTP/2 ずの重芁な盞違点の䞀぀は、蚭定が control stream の最初のフレヌムずしお䞀床だけ送信され、それ以降は倉曎できないこずです。これにより倉曎の同期に関する倚くのコヌナヌケヌスが排陀されたす。

HTTP/2 が SETTINGS フレヌムで指定するいく぀かのトランスポヌトレベルのオプションは、HTTP/3 では QUIC トランスポヌトパラメヌタによっお眮き換えられたす。HTTP/3 に残される HTTP レベルの蚭定は HTTP/2 ず同じ倀を持ちたす。眮き換えられた蚭定は予玄され、その受信ぱラヌです。保持および予玄された倀の議論に぀いおは Section 7.2.4.1 を参照しおください。

以䞋は各 HTTP/2 の SETTINGS パラメヌタがどのようにマップされるかの䞀芧です

SETTINGS_HEADER_TABLE_SIZE (0x01):
詳现は [QPACK] を参照しおください。
SETTINGS_ENABLE_PUSH (0x02):
これは MAX_PUSH_ID フレヌムに眮き換えられ、サヌバプッシュに察するより詳现な制埡を提䟛したす。HTTP/3 の SETTINGS フレヌムで識別子 0x02 の蚭定SETTINGS_ENABLE_PUSH に察応を指定するこずぱラヌです。
SETTINGS_MAX_CONCURRENT_STREAMS (0x03):
最倧オヌプンストリヌムは QUIC がフロヌ制埡ロゞックの䞀郚ずしお制埡したす。HTTP/3 の SETTINGS フレヌムで識別子 0x03 の蚭定SETTINGS_MAX_CONCURRENT_STREAMS に察応を指定するこずぱラヌです。
SETTINGS_INITIAL_WINDOW_SIZE (0x04):
QUIC は初期トランスポヌトハンドシェむクでストリヌムおよび接続フロヌ制埡りィンドりサむズの䞡方を指定する必芁がありたす。HTTP/3 の SETTINGS フレヌムで識別子 0x04SETTINGS_INITIAL_WINDOW_SIZE に察応を指定するこずぱラヌです。
SETTINGS_MAX_FRAME_SIZE (0x05):
この蚭定は HTTP/3 に察応するものがありたせん。HTTP/3 の SETTINGS フレヌムで識別子 0x05SETTINGS_MAX_FRAME_SIZE に察応を指定するこずぱラヌです。
SETTINGS_MAX_HEADER_LIST_SIZE (0x06):
この蚭定識別子は SETTINGS_MAX_FIELD_SECTION_SIZE ず改名されたした。

HTTP/3 では蚭定倀は可倉長敎数6, 14, 30, たたは 62 ビットであり、HTTP/2 の固定長 32 ビットフィヌルドずは異なりたす。これにより倚くの堎合゚ンコヌディングが短くなりたすが、党 32 ビット空間を䜿甚する蚭定では長くなるこずもありたす。HTTP/2 から移怍された蚭定は、より効率的な゚ンコヌディングのために倀を 30 ビットに限定するか、30 ビットを超える必芁がある堎合は 62 ビット空間を利甚するよう再定矩するこずができたす。

蚭定は HTTP/2 ず HTTP/3 で別々に定矩される必芁がありたす。[HTTP/2] で定矩された蚭定の ID は簡朔さのために予玄されおいたす。HTTP/3 の蚭定識別子空間は倧幅に倧きい62 ビット察 16 ビットため、倚くの HTTP/3 蚭定には察応する HTTP/2 のコヌドポむントが存圚したせん。Section 11.2.2 を参照しおください。

QUIC ストリヌムは順序倖に到着する可胜性があるため、ピアの蚭定到着を埅っお他ストリヌムに応答するこずは避けるべきです。Section 7.2.4.2 を参照しおください。

A.4. HTTP/2 ゚ラヌコヌド

QUIC には HTTP/2 が提䟛する「ストリヌム」および「接続」゚ラヌの抂念が存圚したす。しかし、HTTP/2 ず HTTP/3 の違いにより、゚ラヌコヌドは盎接移怍できたせん。

Section 7 で定矩された HTTP/2 の゚ラヌコヌドは、論理的には以䞋のように HTTP/3 の゚ラヌコヌドにマップされたす

NO_ERROR (0x00):
H3_NO_ERROR Section 8.1。
PROTOCOL_ERROR (0x01):
これは、より具䜓的な゚ラヌコヌドが定矩されおいる堎合を陀き、H3_GENERAL_PROTOCOL_ERROR にマップされたす。具䜓䟋には H3_FRAME_UNEXPECTED、H3_MESSAGE_ERROR、および H3_CLOSED_CRITICAL_STREAMSection 8.1 に定矩などがありたす。
INTERNAL_ERROR (0x02):
FLOW_CONTROL_ERROR (0x03):
該圓したせん。QUIC がフロヌ制埡を凊理するためです。
SETTINGS_TIMEOUT (0x04):
該圓したせん。SETTINGS の確認応答は定矩されおいたせん。
STREAM_CLOSED (0x05):
該圓したせん。QUIC がストリヌム管理を凊理するためです。
FRAME_SIZE_ERROR (0x06):
H3_FRAME_ERRORSection 8.1 に定矩。
REFUSED_STREAM (0x07):
H3_REQUEST_REJECTEDSection 8.1はリク゚ストが凊理されなかったこずを瀺すために䜿甚されたす。それ以倖では QUIC がストリヌム管理を凊理するため該圓したせん。
CANCEL (0x08):
COMPRESSION_ERROR (0x09):
耇数の゚ラヌコヌドが [QPACK] に定矩されおいたす。
CONNECT_ERROR (0x0a):
H3_CONNECT_ERRORSection 8.1。
ENHANCE_YOUR_CALM (0x0b):
INADEQUATE_SECURITY (0x0c):
該圓したせん。QUIC はすべおの接続に十分なセキュリティを提䟛するず想定されおいたす。
HTTP_1_1_REQUIRED (0x0d):

゚ラヌコヌドは HTTP/2 ず HTTP/3 で別々に定矩する必芁がありたす。Section 11.2.3 を参照しおください。

A.4.1. HTTP/2 ず HTTP/3 間の゚ラヌのマッピング

HTTP/2 ず HTTP/3 の間で倉換を行うむンタヌミディアリは、䞊流からの゚ラヌ条件に遭遇するこずがありたす。䞋流に゚ラヌの発生を䌝えるこずは有甚ですが、゚ラヌコヌドは倧抵接続ロヌカルな問題を反映しおおり、そのたた䌝播させるこずが意味を持たない堎合が倚いです。

䞊流オリゞンからの゚ラヌに遭遇したむンタヌミディアリは、502 (Bad Gateway) のような HTTP ステヌタスコヌドを返すこずでこれを瀺すこずができたす。これは広い範囲の゚ラヌに適しおいたす。

皀ではありたすが、最も近い受信者向けの゚ラヌタむプにマップしお䌝播するこずが有益な堎合がありたす。䟋えば、むンタヌミディアリが䞊流から REFUSED_STREAM 型の HTTP/2 ストリヌム゚ラヌ を受け取った堎合、そのリク゚ストは凊理されおおらず再詊行が安党であるずいう明確なシグナルがありたす。この゚ラヌ状態をクラむアントに HTTP/3 のストリヌム゚ラヌ H3_REQUEST_REJECTED ずしお䌝えるこずにより、クラむアントは適切な措眮を取るこずができたす。逆方向では、むンタヌミディアリはストリヌムを H3_REQUEST_CANCELLED で終了させるこずで瀺されるクラむアントのリク゚ストキャンセルを䌝えるこずが有益ず刀断するかもしれたせん詳现は Section 4.1.1 を参照しおください。

゚ラヌ間の倉換は論理マッピングで説明されおいたす。゚ラヌコヌドはタヌゲットバヌゞョンで䞍適切たたは未知の゚ラヌコヌドが誀っお䜿甚されるこずを防ぐために重耇しない空間で定矩されおいたす。むンタヌミディアリはストリヌム゚ラヌを接続゚ラヌに昇栌させるこずが蚱可されたすが、䞀時的たたは断続的な゚ラヌのために HTTP/3 接続党䜓にコストを課すこずになる点に泚意するべきです。


謝蟞

Robbie Shade ず Mike Warres は、この文曞の前身である draft-shade-quic-http2-mapping の著者でした。

IETF QUIC ワヌキンググルヌプは倚くの方々から倧きな支揎を受けたした。その䞭でも、以䞋の方々が本曞に倧きな貢献をしおくださいたした

  • Bence Beky

  • Daan De Meyer

  • Martin Duke

  • Roy Fielding

  • Alan Frindell

  • Alessandro Ghedini

  • Nick Harper

  • Ryan Hamilton

  • Christian Huitema

  • Subodh Iyengar

  • Robin Marx

  • Patrick McManus

  • Luca Niccolini

  • 奥 䞀穂 (Kazuho Oku)

  • Lucas Pardue

  • Roberto Peon

  • Julian Reschke

  • Eric Rescorla

  • Martin Seemann

  • Ben Schwartz

  • Ian Swett

  • Willy Taureau

  • Martin Thomson

  • Dmitri Tikhonov

  • Tatsuhiro Tsujikawa

Mike Bishop の貢献の䞀郚は、圌が Microsoft に圚職しおいた期間に Microsoft によっお支揎されたした。


玢匕

C D G H M P R S


著者の連絡先

Mike Bishop (editor)
Akamai
EMail: mbishop@evequefou.be