summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9114.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9114.txt')
-rw-r--r--doc/rfc/rfc9114.txt3234
1 files changed, 3234 insertions, 0 deletions
diff --git a/doc/rfc/rfc9114.txt b/doc/rfc/rfc9114.txt
new file mode 100644
index 0000000..67d5b0b
--- /dev/null
+++ b/doc/rfc/rfc9114.txt
@@ -0,0 +1,3234 @@
+
+
+
+
+Internet Engineering Task Force (IETF) M. Bishop, Ed.
+Request for Comments: 9114 Akamai
+Category: Standards Track June 2022
+ISSN: 2070-1721
+
+
+ HTTP/3
+
+Abstract
+
+ The QUIC transport protocol has several features that are desirable
+ in a transport for HTTP, such as stream multiplexing, per-stream flow
+ control, and low-latency connection establishment. This document
+ describes a mapping of HTTP semantics over QUIC. This document also
+ identifies HTTP/2 features that are subsumed by QUIC and describes
+ how HTTP/2 extensions can be ported to HTTP/3.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ 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.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Prior Versions of HTTP
+ 1.2. Delegation to QUIC
+ 2. HTTP/3 Protocol Overview
+ 2.1. Document Organization
+ 2.2. Conventions and Terminology
+ 3. Connection Setup and Management
+ 3.1. Discovering an HTTP/3 Endpoint
+ 3.1.1. HTTP Alternative Services
+ 3.1.2. Other Schemes
+ 3.2. Connection Establishment
+ 3.3. Connection Reuse
+ 4. Expressing HTTP Semantics in HTTP/3
+ 4.1. HTTP Message Framing
+ 4.1.1. Request Cancellation and Rejection
+ 4.1.2. Malformed Requests and Responses
+ 4.2. HTTP Fields
+ 4.2.1. Field Compression
+ 4.2.2. Header Size Constraints
+ 4.3. HTTP Control Data
+ 4.3.1. Request Pseudo-Header Fields
+ 4.3.2. Response Pseudo-Header Fields
+ 4.4. The CONNECT Method
+ 4.5. HTTP Upgrade
+ 4.6. Server Push
+ 5. Connection Closure
+ 5.1. Idle Connections
+ 5.2. Connection Shutdown
+ 5.3. Immediate Application Closure
+ 5.4. Transport Closure
+ 6. Stream Mapping and Usage
+ 6.1. Bidirectional Streams
+ 6.2. Unidirectional Streams
+ 6.2.1. Control Streams
+ 6.2.2. Push Streams
+ 6.2.3. Reserved Stream Types
+ 7. HTTP Framing Layer
+ 7.1. Frame Layout
+ 7.2. Frame Definitions
+ 7.2.1. DATA
+ 7.2.2. HEADERS
+ 7.2.3. CANCEL_PUSH
+ 7.2.4. SETTINGS
+ 7.2.5. PUSH_PROMISE
+ 7.2.6. GOAWAY
+ 7.2.7. MAX_PUSH_ID
+ 7.2.8. Reserved Frame Types
+ 8. Error Handling
+ 8.1. HTTP/3 Error Codes
+ 9. Extensions to HTTP/3
+ 10. Security Considerations
+ 10.1. Server Authority
+ 10.2. Cross-Protocol Attacks
+ 10.3. Intermediary-Encapsulation Attacks
+ 10.4. Cacheability of Pushed Responses
+ 10.5. Denial-of-Service Considerations
+ 10.5.1. Limits on Field Section Size
+ 10.5.2. CONNECT Issues
+ 10.6. Use of Compression
+ 10.7. Padding and Traffic Analysis
+ 10.8. Frame Parsing
+ 10.9. Early Data
+ 10.10. Migration
+ 10.11. Privacy Considerations
+ 11. IANA Considerations
+ 11.1. Registration of HTTP/3 Identification String
+ 11.2. New Registries
+ 11.2.1. Frame Types
+ 11.2.2. Settings Parameters
+ 11.2.3. Error Codes
+ 11.2.4. Stream Types
+ 12. References
+ 12.1. Normative References
+ 12.2. Informative References
+ Appendix A. Considerations for Transitioning from HTTP/2
+ A.1. Streams
+ A.2. HTTP Frame Types
+ A.2.1. Prioritization Differences
+ A.2.2. Field Compression Differences
+ A.2.3. Flow-Control Differences
+ A.2.4. Guidance for New Frame Type Definitions
+ A.2.5. Comparison of HTTP/2 and HTTP/3 Frame Types
+ A.3. HTTP/2 SETTINGS Parameters
+ A.4. HTTP/2 Error Codes
+ A.4.1. Mapping between HTTP/2 and HTTP/3 Errors
+ Acknowledgments
+ Index
+ Author's Address
+
+1. Introduction
+
+ HTTP semantics ([HTTP]) are used for a broad range of services on the
+ Internet. These semantics have most commonly been used with HTTP/1.1
+ and HTTP/2. HTTP/1.1 has been used over a variety of transport and
+ session layers, while HTTP/2 has been used primarily with TLS over
+ TCP. HTTP/3 supports the same semantics over a new transport
+ protocol: QUIC.
+
+1.1. Prior Versions of HTTP
+
+ HTTP/1.1 ([HTTP/1.1]) uses whitespace-delimited text fields to convey
+ HTTP messages. While these exchanges are human readable, using
+ whitespace for message formatting leads to parsing complexity and
+ excessive tolerance of variant behavior.
+
+ Because HTTP/1.1 does not include a multiplexing layer, multiple TCP
+ connections are often used to service requests in parallel. However,
+ that has a negative impact on congestion control and network
+ efficiency, since TCP does not share congestion control across
+ multiple connections.
+
+ HTTP/2 ([HTTP/2]) introduced a binary framing and multiplexing layer
+ to improve latency without modifying the transport layer. However,
+ because the parallel nature of HTTP/2's multiplexing is not visible
+ to TCP's loss recovery mechanisms, a lost or reordered packet causes
+ all active transactions to experience a stall regardless of whether
+ that transaction was directly impacted by the lost packet.
+
+1.2. Delegation to QUIC
+
+ The QUIC transport protocol incorporates stream multiplexing and per-
+ stream flow control, similar to that provided by the HTTP/2 framing
+ layer. By providing reliability at the stream level and congestion
+ control across the entire connection, QUIC has the capability to
+ improve the performance of HTTP compared to a TCP mapping. QUIC also
+ incorporates TLS 1.3 ([TLS]) at the transport layer, offering
+ comparable confidentiality and integrity to running TLS over TCP,
+ with the improved connection setup latency of TCP Fast Open ([TFO]).
+
+ This document defines HTTP/3: a mapping of HTTP semantics over the
+ QUIC transport protocol, drawing heavily on the design of HTTP/2.
+ HTTP/3 relies on QUIC to provide confidentiality and integrity
+ protection of data; peer authentication; and reliable, in-order, per-
+ stream delivery. While delegating stream lifetime and flow-control
+ issues to QUIC, a binary framing similar to the HTTP/2 framing is
+ used on each stream. Some HTTP/2 features are subsumed by QUIC,
+ while other features are implemented atop QUIC.
+
+ QUIC is described in [QUIC-TRANSPORT]. For a full description of
+ HTTP/2, see [HTTP/2].
+
+2. HTTP/3 Protocol Overview
+
+ HTTP/3 provides a transport for HTTP semantics using the QUIC
+ transport protocol and an internal framing layer similar to HTTP/2.
+
+ Once a client knows that an HTTP/3 server exists at a certain
+ endpoint, it opens a QUIC connection. QUIC provides protocol
+ negotiation, stream-based multiplexing, and flow control. Discovery
+ of an HTTP/3 endpoint is described in Section 3.1.
+
+ Within each stream, the basic unit of HTTP/3 communication is a frame
+ (Section 7.2). Each frame type serves a different purpose. For
+ example, HEADERS and DATA frames form the basis of HTTP requests and
+ responses (Section 4.1). Frames that apply to the entire connection
+ are conveyed on a dedicated control stream.
+
+ Multiplexing of requests is performed using the QUIC stream
+ abstraction, which is described in Section 2 of [QUIC-TRANSPORT].
+ Each request-response pair consumes a single QUIC stream. Streams
+ are independent of each other, so one stream that is blocked or
+ suffers packet loss does not prevent progress on other streams.
+
+ Server push is an interaction mode introduced in HTTP/2 ([HTTP/2])
+ that permits a server to push a request-response exchange to a client
+ in anticipation of the client making the indicated request. This
+ trades off network usage against a potential latency gain. Several
+ HTTP/3 frames are used to manage server push, such as PUSH_PROMISE,
+ MAX_PUSH_ID, and CANCEL_PUSH.
+
+ As in HTTP/2, request and response fields are compressed for
+ transmission. Because HPACK ([HPACK]) relies on in-order
+ transmission of compressed field sections (a guarantee not provided
+ by QUIC), HTTP/3 replaces HPACK with QPACK ([QPACK]). QPACK uses
+ separate unidirectional streams to modify and track field table
+ state, while encoded field sections refer to the state of the table
+ without modifying it.
+
+2.1. Document Organization
+
+ The following sections provide a detailed overview of the lifecycle
+ of an HTTP/3 connection:
+
+ * "Connection Setup and Management" (Section 3) covers how an HTTP/3
+ endpoint is discovered and an HTTP/3 connection is established.
+
+ * "Expressing HTTP Semantics in HTTP/3" (Section 4) describes how
+ HTTP semantics are expressed using frames.
+
+ * "Connection Closure" (Section 5) describes how HTTP/3 connections
+ are terminated, either gracefully or abruptly.
+
+ The details of the wire protocol and interactions with the transport
+ are described in subsequent sections:
+
+ * "Stream Mapping and Usage" (Section 6) describes the way QUIC
+ streams are used.
+
+ * "HTTP Framing Layer" (Section 7) describes the frames used on most
+ streams.
+
+ * "Error Handling" (Section 8) describes how error conditions are
+ handled and expressed, either on a particular stream or for the
+ connection as a whole.
+
+ Additional resources are provided in the final sections:
+
+ * "Extensions to HTTP/3" (Section 9) describes how new capabilities
+ can be added in future documents.
+
+ * A more detailed comparison between HTTP/2 and HTTP/3 can be found
+ in Appendix A.
+
+2.2. Conventions and Terminology
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ This document uses the variable-length integer encoding from
+ [QUIC-TRANSPORT].
+
+ The following terms are used:
+
+ abort: An abrupt termination of a connection or stream, possibly due
+ to an error condition.
+
+ client: The endpoint that initiates an HTTP/3 connection. Clients
+ send HTTP requests and receive HTTP responses.
+
+ connection: A transport-layer connection between two endpoints using
+ QUIC as the transport protocol.
+
+ connection error: An error that affects the entire HTTP/3
+ connection.
+
+ endpoint: Either the client or server of the connection.
+
+ frame: The smallest unit of communication on a stream in HTTP/3,
+ consisting of a header and a variable-length sequence of bytes
+ structured according to the frame type.
+
+ Protocol elements called "frames" exist in both this document and
+ [QUIC-TRANSPORT]. Where frames from [QUIC-TRANSPORT] are
+ referenced, the frame name will be prefaced with "QUIC". For
+ example, "QUIC CONNECTION_CLOSE frames". References without this
+ preface refer to frames defined in Section 7.2.
+
+ HTTP/3 connection: A QUIC connection where the negotiated
+ application protocol is HTTP/3.
+
+ peer: An endpoint. When discussing a particular endpoint, "peer"
+ refers to the endpoint that is remote to the primary subject of
+ discussion.
+
+ receiver: An endpoint that is receiving frames.
+
+ sender: An endpoint that is transmitting frames.
+
+ server: The endpoint that accepts an HTTP/3 connection. Servers
+ receive HTTP requests and send HTTP responses.
+
+ stream: A bidirectional or unidirectional bytestream provided by the
+ QUIC transport. All streams within an HTTP/3 connection can be
+ considered "HTTP/3 streams", but multiple stream types are defined
+ within HTTP/3.
+
+ stream error: An application-level error on the individual stream.
+
+ The term "content" is defined in Section 6.4 of [HTTP].
+
+ Finally, the terms "resource", "message", "user agent", "origin
+ server", "gateway", "intermediary", "proxy", and "tunnel" are defined
+ in Section 3 of [HTTP].
+
+ Packet diagrams in this document use the format defined in
+ Section 1.3 of [QUIC-TRANSPORT] to illustrate the order and size of
+ fields.
+
+3. Connection Setup and Management
+
+3.1. Discovering an HTTP/3 Endpoint
+
+ HTTP relies on the notion of an authoritative response: a response
+ that has been determined to be the most appropriate response for that
+ request given the state of the target resource at the time of
+ response message origination by (or at the direction of) the origin
+ server identified within the target URI. Locating an authoritative
+ server for an HTTP URI is discussed in Section 4.3 of [HTTP].
+
+ The "https" scheme associates authority with possession of a
+ certificate that the client considers to be trustworthy for the host
+ identified by the authority component of the URI. Upon receiving a
+ server certificate in the TLS handshake, the client MUST verify that
+ the certificate is an acceptable match for the URI's origin server
+ using the process described in Section 4.3.4 of [HTTP]. If the
+ certificate cannot be verified with respect to the URI's origin
+ server, the client MUST NOT consider the server authoritative for
+ that origin.
+
+ A client MAY attempt access to a resource with an "https" URI by
+ resolving the host identifier to an IP address, establishing a QUIC
+ connection to that address on the indicated port (including
+ validation of the server certificate as described above), and sending
+ an HTTP/3 request message targeting the URI to the server over that
+ secured connection. Unless some other mechanism is used to select
+ HTTP/3, the token "h3" is used in the Application-Layer Protocol
+ Negotiation (ALPN; see [RFC7301]) extension during the TLS handshake.
+
+ Connectivity problems (e.g., blocking UDP) can result in a failure to
+ establish a QUIC connection; clients SHOULD attempt to use TCP-based
+ versions of HTTP in this case.
+
+ Servers MAY serve HTTP/3 on any UDP port; an alternative service
+ advertisement always includes an explicit port, and URIs contain
+ either an explicit port or a default port associated with the scheme.
+
+3.1.1. HTTP Alternative Services
+
+ An HTTP origin can advertise the availability of an equivalent HTTP/3
+ endpoint via the Alt-Svc HTTP response header field or the HTTP/2
+ ALTSVC frame ([ALTSVC]) using the "h3" ALPN token.
+
+ For example, an origin could indicate in an HTTP response that HTTP/3
+ was available on UDP port 50781 at the same hostname by including the
+ following header field:
+
+ Alt-Svc: h3=":50781"
+
+ On receipt of an Alt-Svc record indicating HTTP/3 support, a client
+ MAY attempt to establish a QUIC connection to the indicated host and
+ port; if this connection is successful, the client can send HTTP
+ requests using the mapping described in this document.
+
+3.1.2. Other Schemes
+
+ Although HTTP is independent of the transport protocol, the "http"
+ scheme associates authority with the ability to receive TCP
+ connections on the indicated port of whatever host is identified
+ within the authority component. Because HTTP/3 does not use TCP,
+ HTTP/3 cannot be used for direct access to the authoritative server
+ for a resource identified by an "http" URI. However, protocol
+ extensions such as [ALTSVC] permit the authoritative server to
+ identify other services that are also authoritative and that might be
+ reachable over HTTP/3.
+
+ Prior to making requests for an origin whose scheme is not "https",
+ the client MUST ensure the server is willing to serve that scheme.
+ For origins whose scheme is "http", an experimental method to
+ accomplish this is described in [RFC8164]. Other mechanisms might be
+ defined for various schemes in the future.
+
+3.2. Connection Establishment
+
+ HTTP/3 relies on QUIC version 1 as the underlying transport. The use
+ of other QUIC transport versions with HTTP/3 MAY be defined by future
+ specifications.
+
+ QUIC version 1 uses TLS version 1.3 or greater as its handshake
+ protocol. HTTP/3 clients MUST support a mechanism to indicate the
+ target host to the server during the TLS handshake. If the server is
+ identified by a domain name ([DNS-TERMS]), clients MUST send the
+ Server Name Indication (SNI; [RFC6066]) TLS extension unless an
+ alternative mechanism to indicate the target host is used.
+
+ QUIC connections are established as described in [QUIC-TRANSPORT].
+ During connection establishment, HTTP/3 support is indicated by
+ selecting the ALPN token "h3" in the TLS handshake. Support for
+ other application-layer protocols MAY be offered in the same
+ handshake.
+
+ While connection-level options pertaining to the core QUIC protocol
+ are set in the initial crypto handshake, settings specific to HTTP/3
+ are conveyed in the SETTINGS frame. After the QUIC connection is
+ established, a SETTINGS frame MUST be sent by each endpoint as the
+ initial frame of their respective HTTP control stream.
+
+3.3. Connection Reuse
+
+ HTTP/3 connections are persistent across multiple requests. For best
+ performance, it is expected that clients will not close connections
+ until it is determined that no further communication with a server is
+ necessary (for example, when a user navigates away from a particular
+ web page) or until the server closes the connection.
+
+ Once a connection to a server endpoint exists, this connection MAY be
+ reused for requests with multiple different URI authority components.
+ To use an existing connection for a new origin, clients MUST validate
+ the certificate presented by the server for the new origin server
+ using the process described in Section 4.3.4 of [HTTP]. This implies
+ that clients will need to retain the server certificate and any
+ additional information needed to verify that certificate; clients
+ that do not do so will be unable to reuse the connection for
+ additional origins.
+
+ If the certificate is not acceptable with regard to the new origin
+ for any reason, the connection MUST NOT be reused and a new
+ connection SHOULD be established for the new origin. If the reason
+ the certificate cannot be verified might apply to other origins
+ already associated with the connection, the client SHOULD revalidate
+ the server certificate for those origins. For instance, if
+ validation of a certificate fails because the certificate has expired
+ or been revoked, this might be used to invalidate all other origins
+ for which that certificate was used to establish authority.
+
+ Clients SHOULD NOT open more than one HTTP/3 connection to a given IP
+ address and UDP port, where the IP address and port might be derived
+ from a URI, a selected alternative service ([ALTSVC]), a configured
+ proxy, or name resolution of any of these. A client MAY open
+ multiple HTTP/3 connections to the same IP address and UDP port using
+ different transport or TLS configurations but SHOULD avoid creating
+ multiple connections with the same configuration.
+
+ Servers are encouraged to maintain open HTTP/3 connections for as
+ long as possible but are permitted to terminate idle connections if
+ necessary. When either endpoint chooses to close the HTTP/3
+ connection, the terminating endpoint SHOULD first send a GOAWAY frame
+ (Section 5.2) so that both endpoints can reliably determine whether
+ previously sent frames have been processed and gracefully complete or
+ terminate any necessary remaining tasks.
+
+ A server that does not wish clients to reuse HTTP/3 connections for a
+ particular origin can indicate that it is not authoritative for a
+ request by sending a 421 (Misdirected Request) status code in
+ response to the request; see Section 7.4 of [HTTP].
+
+4. Expressing HTTP Semantics in HTTP/3
+
+4.1. HTTP Message Framing
+
+ A client sends an HTTP request on a request stream, which is a
+ client-initiated bidirectional QUIC stream; see Section 6.1. A
+ client MUST send only a single request on a given stream. A server
+ sends zero or more interim HTTP responses on the same stream as the
+ request, followed by a single final HTTP response, as detailed below.
+ See Section 15 of [HTTP] for a description of interim and final HTTP
+ responses.
+
+ Pushed responses are sent on a server-initiated unidirectional QUIC
+ stream; see Section 6.2.2. A server sends zero or more interim HTTP
+ responses, followed by a single final HTTP response, in the same
+ manner as a standard response. Push is described in more detail in
+ Section 4.6.
+
+ On a given stream, receipt of multiple requests or receipt of an
+ additional HTTP response following a final HTTP response MUST be
+ treated as malformed.
+
+ An HTTP message (request or response) consists of:
+
+ 1. the header section, including message control data, sent as a
+ single HEADERS frame,
+
+ 2. optionally, the content, if present, sent as a series of DATA
+ frames, and
+
+ 3. optionally, the trailer section, if present, sent as a single
+ HEADERS frame.
+
+ Header and trailer sections are described in Sections 6.3 and 6.5 of
+ [HTTP]; the content is described in Section 6.4 of [HTTP].
+
+ Receipt of an invalid sequence of frames MUST be treated as a
+ connection error of type H3_FRAME_UNEXPECTED. In particular, a DATA
+ frame before any HEADERS frame, or a HEADERS or DATA frame after the
+ trailing HEADERS frame, is considered invalid. Other frame types,
+ especially unknown frame types, might be permitted subject to their
+ own rules; see Section 9.
+
+ A server MAY send one or more PUSH_PROMISE frames before, after, or
+ interleaved with the frames of a response message. These
+ PUSH_PROMISE frames are not part of the response; see Section 4.6 for
+ more details. PUSH_PROMISE frames are not permitted on push streams;
+ a pushed response that includes PUSH_PROMISE frames MUST be treated
+ as a connection error of type H3_FRAME_UNEXPECTED.
+
+ Frames of unknown types (Section 9), including reserved frames
+ (Section 7.2.8) MAY be sent on a request or push stream before,
+ after, or interleaved with other frames described in this section.
+
+ The HEADERS and PUSH_PROMISE frames might reference updates to the
+ QPACK dynamic table. While these updates are not directly part of
+ the message exchange, they must be received and processed before the
+ message can be consumed. See Section 4.2 for more details.
+
+ Transfer codings (see Section 7 of [HTTP/1.1]) are not defined for
+ HTTP/3; the Transfer-Encoding header field MUST NOT be used.
+
+ A response MAY consist of multiple messages when and only when one or
+ more interim responses (1xx; see Section 15.2 of [HTTP]) precede a
+ final response to the same request. Interim responses do not contain
+ content or trailer sections.
+
+ An HTTP request/response exchange fully consumes a client-initiated
+ bidirectional QUIC stream. After sending a request, a client MUST
+ close the stream for sending. Unless using the CONNECT method (see
+ Section 4.4), clients MUST NOT make stream closure dependent on
+ receiving a response to their request. After sending a final
+ response, the server MUST close the stream for sending. At this
+ point, the QUIC stream is fully closed.
+
+ When a stream is closed, this indicates the end of the final HTTP
+ message. Because some messages are large or unbounded, endpoints
+ SHOULD begin processing partial HTTP messages once enough of the
+ message has been received to make progress. If a client-initiated
+ stream terminates without enough of the HTTP message to provide a
+ complete response, the server SHOULD abort its response stream with
+ the error code H3_REQUEST_INCOMPLETE.
+
+ A server can send a complete response prior to the client sending an
+ entire request if the response does not depend on any portion of the
+ request that has not been sent and received. When the server does
+ not need to receive the remainder of the request, it MAY abort
+ reading the request stream, send a complete response, and cleanly
+ close the sending part of the stream. The error code H3_NO_ERROR
+ SHOULD be used when requesting that the client stop sending on the
+ request stream. Clients MUST NOT discard complete responses as a
+ result of having their request terminated abruptly, though clients
+ can always discard responses at their discretion for other reasons.
+ If the server sends a partial or complete response but does not abort
+ reading the request, clients SHOULD continue sending the content of
+ the request and close the stream normally.
+
+4.1.1. Request Cancellation and Rejection
+
+ Once a request stream has been opened, the request MAY be cancelled
+ by either endpoint. Clients cancel requests if the response is no
+ longer of interest; servers cancel requests if they are unable to or
+ choose not to respond. When possible, it is RECOMMENDED that servers
+ send an HTTP response with an appropriate status code rather than
+ cancelling a request it has already begun processing.
+
+ Implementations SHOULD cancel requests by abruptly terminating any
+ directions of a stream that are still open. To do so, an
+ implementation resets the sending parts of streams and aborts reading
+ on the receiving parts of streams; see Section 2.4 of
+ [QUIC-TRANSPORT].
+
+ When the server cancels a request without performing any application
+ processing, the request is considered "rejected". The server SHOULD
+ abort its response stream with the error code H3_REQUEST_REJECTED.
+ In this context, "processed" means that some data from the stream was
+ passed to some higher layer of software that might have taken some
+ action as a result. The client can treat requests rejected by the
+ server as though they had never been sent at all, thereby allowing
+ them to be retried later.
+
+ Servers MUST NOT use the H3_REQUEST_REJECTED error code for requests
+ that were partially or fully processed. When a server abandons a
+ response after partial processing, it SHOULD abort its response
+ stream with the error code H3_REQUEST_CANCELLED.
+
+ Client SHOULD use the error code H3_REQUEST_CANCELLED to cancel
+ requests. Upon receipt of this error code, a server MAY abruptly
+ terminate the response using the error code H3_REQUEST_REJECTED if no
+ processing was performed. Clients MUST NOT use the
+ H3_REQUEST_REJECTED error code, except when a server has requested
+ closure of the request stream with this error code.
+
+ If a stream is cancelled after receiving a complete response, the
+ client MAY ignore the cancellation and use the response. However, if
+ a stream is cancelled after receiving a partial response, the
+ response SHOULD NOT be used. Only idempotent actions such as GET,
+ PUT, or DELETE can be safely retried; a client SHOULD NOT
+ automatically retry a request with a non-idempotent method unless it
+ has some means to know that the request semantics are idempotent
+ independent of the method or some means to detect that the original
+ request was never applied. See Section 9.2.2 of [HTTP] for more
+ details.
+
+4.1.2. Malformed Requests and Responses
+
+ A malformed request or response is one that is an otherwise valid
+ sequence of frames but is invalid due to:
+
+ * the presence of prohibited fields or pseudo-header fields,
+
+ * the absence of mandatory pseudo-header fields,
+
+ * invalid values for pseudo-header fields,
+
+ * pseudo-header fields after fields,
+
+ * an invalid sequence of HTTP messages,
+
+ * the inclusion of uppercase field names, or
+
+ * the inclusion of invalid characters in field names or values.
+
+ A request or response that is defined as having content when it
+ contains a Content-Length header field (Section 8.6 of [HTTP]) is
+ malformed if the value of the Content-Length header field does not
+ equal the sum of the DATA frame lengths received. A response that is
+ defined as never having content, even when a Content-Length is
+ present, can have a non-zero Content-Length header field even though
+ no content is included in DATA frames.
+
+ Intermediaries that process HTTP requests or responses (i.e., any
+ intermediary not acting as a tunnel) MUST NOT forward a malformed
+ request or response. Malformed requests or responses that are
+ detected MUST be treated as a stream error of type H3_MESSAGE_ERROR.
+
+ For malformed requests, a server MAY send an HTTP response indicating
+ the error prior to closing or resetting the stream. Clients MUST NOT
+ accept a malformed response. Note that these requirements are
+ intended to protect against several types of common attacks against
+ HTTP; they are deliberately strict because being permissive can
+ expose implementations to these vulnerabilities.
+
+4.2. HTTP Fields
+
+ HTTP messages carry metadata as a series of key-value pairs called
+ "HTTP fields"; see Sections 6.3 and 6.5 of [HTTP]. For a listing of
+ registered HTTP fields, see the "Hypertext Transfer Protocol (HTTP)
+ Field Name Registry" maintained at <https://www.iana.org/assignments/
+ http-fields/>. Like HTTP/2, HTTP/3 has additional considerations
+ related to the use of characters in field names, the Connection
+ header field, and pseudo-header fields.
+
+ Field names are strings containing a subset of ASCII characters.
+ Properties of HTTP field names and values are discussed in more
+ detail in Section 5.1 of [HTTP]. Characters in field names MUST be
+ converted to lowercase prior to their encoding. A request or
+ response containing uppercase characters in field names MUST be
+ treated as malformed.
+
+ HTTP/3 does not use the Connection header field to indicate
+ connection-specific fields; in this protocol, connection-specific
+ metadata is conveyed by other means. An endpoint MUST NOT generate
+ an HTTP/3 field section containing connection-specific fields; any
+ message containing connection-specific fields MUST be treated as
+ malformed.
+
+ The only exception to this is the TE header field, which MAY be
+ present in an HTTP/3 request header; when it is, it MUST NOT contain
+ any value other than "trailers".
+
+ An intermediary transforming an HTTP/1.x message to HTTP/3 MUST
+ remove connection-specific header fields as discussed in
+ Section 7.6.1 of [HTTP], or their messages will be treated by other
+ HTTP/3 endpoints as malformed.
+
+4.2.1. Field Compression
+
+ [QPACK] describes a variation of HPACK that gives an encoder some
+ control over how much head-of-line blocking can be caused by
+ compression. This allows an encoder to balance compression
+ efficiency with latency. HTTP/3 uses QPACK to compress header and
+ trailer sections, including the control data present in the header
+ section.
+
+ To allow for better compression efficiency, the Cookie header field
+ ([COOKIES]) MAY be split into separate field lines, each with one or
+ more cookie-pairs, before compression. If a decompressed field
+ section contains multiple cookie field lines, these MUST be
+ concatenated into a single byte string using the two-byte delimiter
+ of "; " (ASCII 0x3b, 0x20) before being passed into a context other
+ than HTTP/2 or HTTP/3, such as an HTTP/1.1 connection, or a generic
+ HTTP server application.
+
+4.2.2. Header Size Constraints
+
+ An HTTP/3 implementation MAY impose a limit on the maximum size of
+ the message header it will accept on an individual HTTP message. A
+ server that receives a larger header section than it is willing to
+ handle can send an HTTP 431 (Request Header Fields Too Large) status
+ code ([RFC6585]). A client can discard responses that it cannot
+ process. The size of a field list is calculated based on the
+ uncompressed size of fields, including the length of the name and
+ value in bytes plus an overhead of 32 bytes for each field.
+
+ If an implementation wishes to advise its peer of this limit, it can
+ be conveyed as a number of bytes in the
+ SETTINGS_MAX_FIELD_SECTION_SIZE parameter. An implementation that
+ has received this parameter SHOULD NOT send an HTTP message header
+ that exceeds the indicated size, as the peer will likely refuse to
+ process it. However, an HTTP message can traverse one or more
+ intermediaries before reaching the origin server; see Section 3.7 of
+ [HTTP]. Because this limit is applied separately by each
+ implementation that processes the message, messages below this limit
+ are not guaranteed to be accepted.
+
+4.3. HTTP Control Data
+
+ Like HTTP/2, HTTP/3 employs a series of pseudo-header fields, where
+ the field name begins with the : character (ASCII 0x3a). These
+ pseudo-header fields convey message control data; see Section 6.2 of
+ [HTTP].
+
+ Pseudo-header fields are not HTTP fields. Endpoints MUST NOT
+ generate pseudo-header fields other than those defined in this
+ document. However, an extension could negotiate a modification of
+ this restriction; see Section 9.
+
+ Pseudo-header fields are only valid in the context in which they are
+ defined. Pseudo-header fields defined for requests MUST NOT appear
+ in responses; pseudo-header fields defined for responses MUST NOT
+ appear in requests. Pseudo-header fields MUST NOT appear in trailer
+ sections. Endpoints MUST treat a request or response that contains
+ undefined or invalid pseudo-header fields as malformed.
+
+ All pseudo-header fields MUST appear in the header section before
+ regular header fields. Any request or response that contains a
+ pseudo-header field that appears in a header section after a regular
+ header field MUST be treated as malformed.
+
+4.3.1. Request Pseudo-Header Fields
+
+ The following pseudo-header fields are defined for requests:
+
+ ":method": Contains the HTTP method (Section 9 of [HTTP])
+
+ ":scheme": Contains the scheme portion of the target URI
+ (Section 3.1 of [URI]).
+
+ The :scheme pseudo-header is not restricted to URIs with scheme
+ "http" and "https". A proxy or gateway can translate requests for
+ non-HTTP schemes, enabling the use of HTTP to interact with non-
+ HTTP services.
+
+ See Section 3.1.2 for guidance on using a scheme other than
+ "https".
+
+ ":authority": Contains the authority portion of the target URI
+ (Section 3.2 of [URI]). The authority MUST NOT include the
+ deprecated userinfo subcomponent for URIs of scheme "http" or
+ "https".
+
+ To ensure that the HTTP/1.1 request line can be reproduced
+ accurately, this pseudo-header field MUST be omitted when
+ translating from an HTTP/1.1 request that has a request target in
+ a method-specific form; see Section 7.1 of [HTTP]. Clients that
+ generate HTTP/3 requests directly SHOULD use the :authority
+ pseudo-header field instead of the Host header field. An
+ intermediary that converts an HTTP/3 request to HTTP/1.1 MUST
+ create a Host field if one is not present in a request by copying
+ the value of the :authority pseudo-header field.
+
+ ":path": Contains the path and query parts of the target URI (the
+ "path-absolute" production and optionally a ? character (ASCII
+ 0x3f) followed by the "query" production; see Sections 3.3 and 3.4
+ of [URI].
+
+ This pseudo-header field MUST NOT be empty for "http" or "https"
+ URIs; "http" or "https" URIs that do not contain a path component
+ MUST include a value of / (ASCII 0x2f). An OPTIONS request that
+ does not include a path component includes the value * (ASCII
+ 0x2a) for the :path pseudo-header field; see Section 7.1 of
+ [HTTP].
+
+ All HTTP/3 requests MUST include exactly one value for the :method,
+ :scheme, and :path pseudo-header fields, unless the request is a
+ CONNECT request; see Section 4.4.
+
+ If the :scheme pseudo-header field identifies a scheme that has a
+ mandatory authority component (including "http" and "https"), the
+ request MUST contain either an :authority pseudo-header field or a
+ Host header field. If these fields are present, they MUST NOT be
+ empty. If both fields are present, they MUST contain the same value.
+ If the scheme does not have a mandatory authority component and none
+ is provided in the request target, the request MUST NOT contain the
+ :authority pseudo-header or Host header fields.
+
+ An HTTP request that omits mandatory pseudo-header fields or contains
+ invalid values for those pseudo-header fields is malformed.
+
+ HTTP/3 does not define a way to carry the version identifier that is
+ included in the HTTP/1.1 request line. HTTP/3 requests implicitly
+ have a protocol version of "3.0".
+
+4.3.2. Response Pseudo-Header Fields
+
+ For responses, a single ":status" pseudo-header field is defined that
+ carries the HTTP status code; see Section 15 of [HTTP]. This pseudo-
+ header field MUST be included in all responses; otherwise, the
+ response is malformed (see Section 4.1.2).
+
+ HTTP/3 does not define a way to carry the version or reason phrase
+ that is included in an HTTP/1.1 status line. HTTP/3 responses
+ implicitly have a protocol version of "3.0".
+
+4.4. The CONNECT Method
+
+ The CONNECT method requests that the recipient establish a tunnel to
+ the destination origin server identified by the request-target; see
+ Section 9.3.6 of [HTTP]. It is primarily used with HTTP proxies to
+ establish a TLS session with an origin server for the purposes of
+ interacting with "https" resources.
+
+ In HTTP/1.x, CONNECT is used to convert an entire HTTP connection
+ into a tunnel to a remote host. In HTTP/2 and HTTP/3, the CONNECT
+ method is used to establish a tunnel over a single stream.
+
+ A CONNECT request MUST be constructed as follows:
+
+ * The :method pseudo-header field is set to "CONNECT"
+
+ * The :scheme and :path pseudo-header fields are omitted
+
+ * The :authority pseudo-header field contains the host and port to
+ connect to (equivalent to the authority-form of the request-target
+ of CONNECT requests; see Section 7.1 of [HTTP]).
+
+ The request stream remains open at the end of the request to carry
+ the data to be transferred. A CONNECT request that does not conform
+ to these restrictions is malformed.
+
+ A proxy that supports CONNECT establishes a TCP connection
+ ([RFC0793]) to the server identified in the :authority pseudo-header
+ field. Once this connection is successfully established, the proxy
+ sends a HEADERS frame containing a 2xx series status code to the
+ client, as defined in Section 15.3 of [HTTP].
+
+ All DATA frames on the stream correspond to data sent or received on
+ the TCP connection. The payload of any DATA frame sent by the client
+ is transmitted by the proxy to the TCP server; data received from the
+ TCP server is packaged into DATA frames by the proxy. Note that the
+ size and number of TCP segments is not guaranteed to map predictably
+ to the size and number of HTTP DATA or QUIC STREAM frames.
+
+ Once the CONNECT method has completed, only DATA frames are permitted
+ to be sent on the stream. Extension frames MAY be used if
+ specifically permitted by the definition of the extension. Receipt
+ of any other known frame type MUST be treated as a connection error
+ of type H3_FRAME_UNEXPECTED.
+
+ The TCP connection can be closed by either peer. When the client
+ ends the request stream (that is, the receive stream at the proxy
+ enters the "Data Recvd" state), the proxy will set the FIN bit on its
+ connection to the TCP server. When the proxy receives a packet with
+ the FIN bit set, it will close the send stream that it sends to the
+ client. TCP connections that remain half closed in a single
+ direction are not invalid, but are often handled poorly by servers,
+ so clients SHOULD NOT close a stream for sending while they still
+ expect to receive data from the target of the CONNECT.
+
+ A TCP connection error is signaled by abruptly terminating the
+ stream. A proxy treats any error in the TCP connection, which
+ includes receiving a TCP segment with the RST bit set, as a stream
+ error of type H3_CONNECT_ERROR.
+
+ Correspondingly, if a proxy detects an error with the stream or the
+ QUIC connection, it MUST close the TCP connection. If the proxy
+ detects that the client has reset the stream or aborted reading from
+ the stream, it MUST close the TCP connection. If the stream is reset
+ or reading is aborted by the client, a proxy SHOULD perform the same
+ operation on the other direction in order to ensure that both
+ directions of the stream are cancelled. In all these cases, if the
+ underlying TCP implementation permits it, the proxy SHOULD send a TCP
+ segment with the RST bit set.
+
+ Since CONNECT creates a tunnel to an arbitrary server, proxies that
+ support CONNECT SHOULD restrict its use to a set of known ports or a
+ list of safe request targets; see Section 9.3.6 of [HTTP] for more
+ details.
+
+4.5. HTTP Upgrade
+
+ HTTP/3 does not support the HTTP Upgrade mechanism (Section 7.8 of
+ [HTTP]) or the 101 (Switching Protocols) informational status code
+ (Section 15.2.2 of [HTTP]).
+
+4.6. Server Push
+
+ Server push is an interaction mode that permits a server to push a
+ request-response exchange to a client in anticipation of the client
+ making the indicated request. This trades off network usage against
+ a potential latency gain. HTTP/3 server push is similar to what is
+ described in Section 8.2 of [HTTP/2], but it uses different
+ mechanisms.
+
+ Each server push is assigned a unique push ID by the server. The
+ push ID is used to refer to the push in various contexts throughout
+ the lifetime of the HTTP/3 connection.
+
+ The push ID space begins at zero and ends at a maximum value set by
+ the MAX_PUSH_ID frame. In particular, a server is not able to push
+ until after the client sends a MAX_PUSH_ID frame. A client sends
+ MAX_PUSH_ID frames to control the number of pushes that a server can
+ promise. A server SHOULD use push IDs sequentially, beginning from
+ zero. A client MUST treat receipt of a push stream as a connection
+ error of type H3_ID_ERROR when no MAX_PUSH_ID frame has been sent or
+ when the stream references a push ID that is greater than the maximum
+ push ID.
+
+ The push ID is used in one or more PUSH_PROMISE frames that carry the
+ control data and header fields of the request message. These frames
+ are sent on the request stream that generated the push. This allows
+ the server push to be associated with a client request. When the
+ same push ID is promised on multiple request streams, the
+ decompressed request field sections MUST contain the same fields in
+ the same order, and both the name and the value in each field MUST be
+ identical.
+
+ The push ID is then included with the push stream that ultimately
+ fulfills those promises. The push stream identifies the push ID of
+ the promise that it fulfills, then contains a response to the
+ promised request as described in Section 4.1.
+
+ Finally, the push ID can be used in CANCEL_PUSH frames; see
+ Section 7.2.3. Clients use this frame to indicate they do not wish
+ to receive a promised resource. Servers use this frame to indicate
+ they will not be fulfilling a previous promise.
+
+ Not all requests can be pushed. A server MAY push requests that have
+ the following properties:
+
+ * cacheable; see Section 9.2.3 of [HTTP]
+
+ * safe; see Section 9.2.1 of [HTTP]
+
+ * does not include request content or a trailer section
+
+ The server MUST include a value in the :authority pseudo-header field
+ for which the server is authoritative. If the client has not yet
+ validated the connection for the origin indicated by the pushed
+ request, it MUST perform the same verification process it would do
+ before sending a request for that origin on the connection; see
+ Section 3.3. If this verification fails, the client MUST NOT
+ consider the server authoritative for that origin.
+
+ Clients SHOULD send a CANCEL_PUSH frame upon receipt of a
+ PUSH_PROMISE frame carrying a request that is not cacheable, is not
+ known to be safe, that indicates the presence of request content, or
+ for which it does not consider the server authoritative. Any
+ corresponding responses MUST NOT be used or cached.
+
+ Each pushed response is associated with one or more client requests.
+ The push is associated with the request stream on which the
+ PUSH_PROMISE frame was received. The same server push can be
+ associated with additional client requests using a PUSH_PROMISE frame
+ with the same push ID on multiple request streams. These
+ associations do not affect the operation of the protocol, but they
+ MAY be considered by user agents when deciding how to use pushed
+ resources.
+
+ Ordering of a PUSH_PROMISE frame in relation to certain parts of the
+ response is important. The server SHOULD send PUSH_PROMISE frames
+ prior to sending HEADERS or DATA frames that reference the promised
+ responses. This reduces the chance that a client requests a resource
+ that will be pushed by the server.
+
+ Due to reordering, push stream data can arrive before the
+ corresponding PUSH_PROMISE frame. When a client receives a new push
+ stream with an as-yet-unknown push ID, both the associated client
+ request and the pushed request header fields are unknown. The client
+ can buffer the stream data in expectation of the matching
+ PUSH_PROMISE. The client can use stream flow control (Section 4.1 of
+ [QUIC-TRANSPORT]) to limit the amount of data a server may commit to
+ the pushed stream. Clients SHOULD abort reading and discard data
+ already read from push streams if no corresponding PUSH_PROMISE frame
+ is processed in a reasonable amount of time.
+
+ Push stream data can also arrive after a client has cancelled a push.
+ In this case, the client can abort reading the stream with an error
+ code of H3_REQUEST_CANCELLED. This asks the server not to transfer
+ additional data and indicates that it will be discarded upon receipt.
+
+ Pushed responses that are cacheable (see Section 3 of [HTTP-CACHING])
+ can be stored by the client, if it implements an HTTP cache. Pushed
+ responses are considered successfully validated on the origin server
+ (e.g., if the "no-cache" cache response directive is present; see
+ Section 5.2.2.4 of [HTTP-CACHING]) at the time the pushed response is
+ received.
+
+ Pushed responses that are not cacheable MUST NOT be stored by any
+ HTTP cache. They MAY be made available to the application
+ separately.
+
+5. Connection Closure
+
+ Once established, an HTTP/3 connection can be used for many requests
+ and responses over time until the connection is closed. Connection
+ closure can happen in any of several different ways.
+
+5.1. Idle Connections
+
+ Each QUIC endpoint declares an idle timeout during the handshake. If
+ the QUIC connection remains idle (no packets received) for longer
+ than this duration, the peer will assume that the connection has been
+ closed. HTTP/3 implementations will need to open a new HTTP/3
+ connection for new requests if the existing connection has been idle
+ for longer than the idle timeout negotiated during the QUIC
+ handshake, and they SHOULD do so if approaching the idle timeout; see
+ Section 10.1 of [QUIC-TRANSPORT].
+
+ HTTP clients are expected to request that the transport keep
+ connections open while there are responses outstanding for requests
+ or server pushes, as described in Section 10.1.2 of [QUIC-TRANSPORT].
+ If the client is not expecting a response from the server, allowing
+ an idle connection to time out is preferred over expending effort
+ maintaining a connection that might not be needed. A gateway MAY
+ maintain connections in anticipation of need rather than incur the
+ latency cost of connection establishment to servers. Servers SHOULD
+ NOT actively keep connections open.
+
+5.2. Connection Shutdown
+
+ Even when a connection is not idle, either endpoint can decide to
+ stop using the connection and initiate a graceful connection close.
+ Endpoints initiate the graceful shutdown of an HTTP/3 connection by
+ sending a GOAWAY frame. The GOAWAY frame contains an identifier that
+ indicates to the receiver the range of requests or pushes that were
+ or might be processed in this connection. The server sends a client-
+ initiated bidirectional stream ID; the client sends a push ID.
+ Requests or pushes with the indicated identifier or greater are
+ rejected (Section 4.1.1) by the sender of the GOAWAY. This
+ identifier MAY be zero if no requests or pushes were processed.
+
+ The information in the GOAWAY frame enables a client and server to
+ agree on which requests or pushes were accepted prior to the shutdown
+ of the HTTP/3 connection. Upon sending a GOAWAY frame, the endpoint
+ SHOULD explicitly cancel (see Sections 4.1.1 and 7.2.3) any requests
+ or pushes that have identifiers greater than or equal to the one
+ indicated, in order to clean up transport state for the affected
+ streams. The endpoint SHOULD continue to do so as more requests or
+ pushes arrive.
+
+ Endpoints MUST NOT initiate new requests or promise new pushes on the
+ connection after receipt of a GOAWAY frame from the peer. Clients
+ MAY establish a new connection to send additional requests.
+
+ Some requests or pushes might already be in transit:
+
+ * Upon receipt of a GOAWAY frame, if the client has already sent
+ requests with a stream ID greater than or equal to the identifier
+ contained in the GOAWAY frame, those requests will not be
+ processed. Clients can safely retry unprocessed requests on a
+ different HTTP connection. A client that is unable to retry
+ requests loses all requests that are in flight when the server
+ closes the connection.
+
+ Requests on stream IDs less than the stream ID in a GOAWAY frame
+ from the server might have been processed; their status cannot be
+ known until a response is received, the stream is reset
+ individually, another GOAWAY is received with a lower stream ID
+ than that of the request in question, or the connection
+ terminates.
+
+ Servers MAY reject individual requests on streams below the
+ indicated ID if these requests were not processed.
+
+ * If a server receives a GOAWAY frame after having promised pushes
+ with a push ID greater than or equal to the identifier contained
+ in the GOAWAY frame, those pushes will not be accepted.
+
+ Servers SHOULD send a GOAWAY frame when the closing of a connection
+ is known in advance, even if the advance notice is small, so that the
+ remote peer can know whether or not a request has been partially
+ processed. For example, if an HTTP client sends a POST at the same
+ time that a server closes a QUIC connection, the client cannot know
+ if the server started to process that POST request if the server does
+ not send a GOAWAY frame to indicate what streams it might have acted
+ on.
+
+ An endpoint MAY send multiple GOAWAY frames indicating different
+ identifiers, but the identifier in each frame MUST NOT be greater
+ than the identifier in any previous frame, since clients might
+ already have retried unprocessed requests on another HTTP connection.
+ Receiving a GOAWAY containing a larger identifier than previously
+ received MUST be treated as a connection error of type H3_ID_ERROR.
+
+ An endpoint that is attempting to gracefully shut down a connection
+ can send a GOAWAY frame with a value set to the maximum possible
+ value (2^62-4 for servers, 2^62-1 for clients). This ensures that
+ the peer stops creating new requests or pushes. After allowing time
+ for any in-flight requests or pushes to arrive, the endpoint can send
+ another GOAWAY frame indicating which requests or pushes it might
+ accept before the end of the connection. This ensures that a
+ connection can be cleanly shut down without losing requests.
+
+ A client has more flexibility in the value it chooses for the Push ID
+ field in a GOAWAY that it sends. A value of 2^62-1 indicates that
+ the server can continue fulfilling pushes that have already been
+ promised. A smaller value indicates the client will reject pushes
+ with push IDs greater than or equal to this value. Like the server,
+ the client MAY send subsequent GOAWAY frames so long as the specified
+ push ID is no greater than any previously sent value.
+
+ Even when a GOAWAY indicates that a given request or push will not be
+ processed or accepted upon receipt, the underlying transport
+ resources still exist. The endpoint that initiated these requests
+ can cancel them to clean up transport state.
+
+ Once all accepted requests and pushes have been processed, the
+ endpoint can permit the connection to become idle, or it MAY initiate
+ an immediate closure of the connection. An endpoint that completes a
+ graceful shutdown SHOULD use the H3_NO_ERROR error code when closing
+ the connection.
+
+ If a client has consumed all available bidirectional stream IDs with
+ requests, the server need not send a GOAWAY frame, since the client
+ is unable to make further requests.
+
+5.3. Immediate Application Closure
+
+ An HTTP/3 implementation can immediately close the QUIC connection at
+ any time. This results in sending a QUIC CONNECTION_CLOSE frame to
+ the peer indicating that the application layer has terminated the
+ connection. The application error code in this frame indicates to
+ the peer why the connection is being closed. See Section 8 for error
+ codes that can be used when closing a connection in HTTP/3.
+
+ Before closing the connection, a GOAWAY frame MAY be sent to allow
+ the client to retry some requests. Including the GOAWAY frame in the
+ same packet as the QUIC CONNECTION_CLOSE frame improves the chances
+ of the frame being received by clients.
+
+ If there are open streams that have not been explicitly closed, they
+ are implicitly closed when the connection is closed; see Section 10.2
+ of [QUIC-TRANSPORT].
+
+5.4. Transport Closure
+
+ For various reasons, the QUIC transport could indicate to the
+ application layer that the connection has terminated. This might be
+ due to an explicit closure by the peer, a transport-level error, or a
+ change in network topology that interrupts connectivity.
+
+ If a connection terminates without a GOAWAY frame, clients MUST
+ assume that any request that was sent, whether in whole or in part,
+ might have been processed.
+
+6. Stream Mapping and Usage
+
+ A QUIC stream provides reliable in-order delivery of bytes, but makes
+ no guarantees about order of delivery with regard to bytes on other
+ streams. In version 1 of QUIC, the stream data containing HTTP
+ frames is carried by QUIC STREAM frames, but this framing is
+ invisible to the HTTP framing layer. The transport layer buffers and
+ orders received stream data, exposing a reliable byte stream to the
+ application. Although QUIC permits out-of-order delivery within a
+ stream, HTTP/3 does not make use of this feature.
+
+ QUIC streams can be either unidirectional, carrying data only from
+ initiator to receiver, or bidirectional, carrying data in both
+ directions. Streams can be initiated by either the client or the
+ server. For more detail on QUIC streams, see Section 2 of
+ [QUIC-TRANSPORT].
+
+ When HTTP fields and data are sent over QUIC, the QUIC layer handles
+ most of the stream management. HTTP does not need to do any separate
+ multiplexing when using QUIC: data sent over a QUIC stream always
+ maps to a particular HTTP transaction or to the entire HTTP/3
+ connection context.
+
+6.1. Bidirectional Streams
+
+ All client-initiated bidirectional streams are used for HTTP requests
+ and responses. A bidirectional stream ensures that the response can
+ be readily correlated with the request. These streams are referred
+ to as request streams.
+
+ This means that the client's first request occurs on QUIC stream 0,
+ with subsequent requests on streams 4, 8, and so on. In order to
+ permit these streams to open, an HTTP/3 server SHOULD configure non-
+ zero minimum values for the number of permitted streams and the
+ initial stream flow-control window. So as to not unnecessarily limit
+ parallelism, at least 100 request streams SHOULD be permitted at a
+ time.
+
+ HTTP/3 does not use server-initiated bidirectional streams, though an
+ extension could define a use for these streams. Clients MUST treat
+ receipt of a server-initiated bidirectional stream as a connection
+ error of type H3_STREAM_CREATION_ERROR unless such an extension has
+ been negotiated.
+
+6.2. Unidirectional Streams
+
+ Unidirectional streams, in either direction, are used for a range of
+ purposes. The purpose is indicated by a stream type, which is sent
+ as a variable-length integer at the start of the stream. The format
+ and structure of data that follows this integer is determined by the
+ stream type.
+
+ Unidirectional Stream Header {
+ Stream Type (i),
+ }
+
+ Figure 1: Unidirectional Stream Header
+
+ Two stream types are defined in this document: control streams
+ (Section 6.2.1) and push streams (Section 6.2.2). [QPACK] defines
+ two additional stream types. Other stream types can be defined by
+ extensions to HTTP/3; see Section 9 for more details. Some stream
+ types are reserved (Section 6.2.3).
+
+ The performance of HTTP/3 connections in the early phase of their
+ lifetime is sensitive to the creation and exchange of data on
+ unidirectional streams. Endpoints that excessively restrict the
+ number of streams or the flow-control window of these streams will
+ increase the chance that the remote peer reaches the limit early and
+ becomes blocked. In particular, implementations should consider that
+ remote peers may wish to exercise reserved stream behavior
+ (Section 6.2.3) with some of the unidirectional streams they are
+ permitted to use.
+
+ Each endpoint needs to create at least one unidirectional stream for
+ the HTTP control stream. QPACK requires two additional
+ unidirectional streams, and other extensions might require further
+ streams. Therefore, the transport parameters sent by both clients
+ and servers MUST allow the peer to create at least three
+ unidirectional streams. These transport parameters SHOULD also
+ provide at least 1,024 bytes of flow-control credit to each
+ unidirectional stream.
+
+ Note that an endpoint is not required to grant additional credits to
+ create more unidirectional streams if its peer consumes all the
+ initial credits before creating the critical unidirectional streams.
+ Endpoints SHOULD create the HTTP control stream as well as the
+ unidirectional streams required by mandatory extensions (such as the
+ QPACK encoder and decoder streams) first, and then create additional
+ streams as allowed by their peer.
+
+ If the stream header indicates a stream type that is not supported by
+ the recipient, the remainder of the stream cannot be consumed as the
+ semantics are unknown. Recipients of unknown stream types MUST
+ either abort reading of the stream or discard incoming data without
+ further processing. If reading is aborted, the recipient SHOULD use
+ the H3_STREAM_CREATION_ERROR error code or a reserved error code
+ (Section 8.1). The recipient MUST NOT consider unknown stream types
+ to be a connection error of any kind.
+
+ As certain stream types can affect connection state, a recipient
+ SHOULD NOT discard data from incoming unidirectional streams prior to
+ reading the stream type.
+
+ Implementations MAY send stream types before knowing whether the peer
+ supports them. However, stream types that could modify the state or
+ semantics of existing protocol components, including QPACK or other
+ extensions, MUST NOT be sent until the peer is known to support them.
+
+ A sender can close or reset a unidirectional stream unless otherwise
+ specified. A receiver MUST tolerate unidirectional streams being
+ closed or reset prior to the reception of the unidirectional stream
+ header.
+
+6.2.1. Control Streams
+
+ A control stream is indicated by a stream type of 0x00. Data on this
+ stream consists of HTTP/3 frames, as defined in Section 7.2.
+
+ Each side MUST initiate a single control stream at the beginning of
+ the connection and send its SETTINGS frame as the first frame on this
+ stream. If the first frame of the control stream is any other frame
+ type, this MUST be treated as a connection error of type
+ H3_MISSING_SETTINGS. Only one control stream per peer is permitted;
+ receipt of a second stream claiming to be a control stream MUST be
+ treated as a connection error of type H3_STREAM_CREATION_ERROR. The
+ sender MUST NOT close the control stream, and the receiver MUST NOT
+ request that the sender close the control stream. If either control
+ stream is closed at any point, this MUST be treated as a connection
+ error of type H3_CLOSED_CRITICAL_STREAM. Connection errors are
+ described in Section 8.
+
+ Because the contents of the control stream are used to manage the
+ behavior of other streams, endpoints SHOULD provide enough flow-
+ control credit to keep the peer's control stream from becoming
+ blocked.
+
+ A pair of unidirectional streams is used rather than a single
+ bidirectional stream. This allows either peer to send data as soon
+ as it is able. Depending on whether 0-RTT is available on the QUIC
+ connection, either client or server might be able to send stream data
+ first.
+
+6.2.2. Push Streams
+
+ Server push is an optional feature introduced in HTTP/2 that allows a
+ server to initiate a response before a request has been made. See
+ Section 4.6 for more details.
+
+ A push stream is indicated by a stream type of 0x01, followed by the
+ push ID of the promise that it fulfills, encoded as a variable-length
+ integer. The remaining data on this stream consists of HTTP/3
+ frames, as defined in Section 7.2, and fulfills a promised server
+ push by zero or more interim HTTP responses followed by a single
+ final HTTP response, as defined in Section 4.1. Server push and push
+ IDs are described in Section 4.6.
+
+ Only servers can push; if a server receives a client-initiated push
+ stream, this MUST be treated as a connection error of type
+ H3_STREAM_CREATION_ERROR.
+
+ Push Stream Header {
+ Stream Type (i) = 0x01,
+ Push ID (i),
+ }
+
+ Figure 2: Push Stream Header
+
+ A client SHOULD NOT abort reading on a push stream prior to reading
+ the push stream header, as this could lead to disagreement between
+ client and server on which push IDs have already been consumed.
+
+ Each push ID MUST only be used once in a push stream header. If a
+ client detects that a push stream header includes a push ID that was
+ used in another push stream header, the client MUST treat this as a
+ connection error of type H3_ID_ERROR.
+
+6.2.3. Reserved Stream Types
+
+ Stream types of the format 0x1f * N + 0x21 for non-negative integer
+ values of N are reserved to exercise the requirement that unknown
+ types be ignored. These streams have no semantics, and they can be
+ sent when application-layer padding is desired. They MAY also be
+ sent on connections where no data is currently being transferred.
+ Endpoints MUST NOT consider these streams to have any meaning upon
+ receipt.
+
+ The payload and length of the stream are selected in any manner the
+ sending implementation chooses. When sending a reserved stream type,
+ the implementation MAY either terminate the stream cleanly or reset
+ it. When resetting the stream, either the H3_NO_ERROR error code or
+ a reserved error code (Section 8.1) SHOULD be used.
+
+7. HTTP Framing Layer
+
+ HTTP frames are carried on QUIC streams, as described in Section 6.
+ HTTP/3 defines three stream types: control stream, request stream,
+ and push stream. This section describes HTTP/3 frame formats and
+ their permitted stream types; see Table 1 for an overview. A
+ comparison between HTTP/2 and HTTP/3 frames is provided in
+ Appendix A.2.
+
+ +==============+================+================+========+=========+
+ | Frame | Control Stream | Request | Push | Section |
+ | | | Stream | Stream | |
+ +==============+================+================+========+=========+
+ | 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 |
+ +--------------+----------------+----------------+--------+---------+
+
+ Table 1: HTTP/3 Frames and Stream Type Overview
+
+ The SETTINGS frame can only occur as the first frame of a Control
+ stream; this is indicated in Table 1 with a (1). Specific guidance
+ is provided in the relevant section.
+
+ Note that, unlike QUIC frames, HTTP/3 frames can span multiple
+ packets.
+
+7.1. Frame Layout
+
+ All frames have the following format:
+
+ HTTP/3 Frame Format {
+ Type (i),
+ Length (i),
+ Frame Payload (..),
+ }
+
+ Figure 3: HTTP/3 Frame Format
+
+ A frame includes the following fields:
+
+ Type: A variable-length integer that identifies the frame type.
+
+ Length: A variable-length integer that describes the length in bytes
+ of the Frame Payload.
+
+ Frame Payload: A payload, the semantics of which are determined by
+ the Type field.
+
+ Each frame's payload MUST contain exactly the fields identified in
+ its description. A frame payload that contains additional bytes
+ after the identified fields or a frame payload that terminates before
+ the end of the identified fields MUST be treated as a connection
+ error of type H3_FRAME_ERROR. In particular, redundant length
+ encodings MUST be verified to be self-consistent; see Section 10.8.
+
+ When a stream terminates cleanly, if the last frame on the stream was
+ truncated, this MUST be treated as a connection error of type
+ H3_FRAME_ERROR. Streams that terminate abruptly may be reset at any
+ point in a frame.
+
+7.2. Frame Definitions
+
+7.2.1. DATA
+
+ DATA frames (type=0x00) convey arbitrary, variable-length sequences
+ of bytes associated with HTTP request or response content.
+
+ DATA frames MUST be associated with an HTTP request or response. If
+ a DATA frame is received on a control stream, the recipient MUST
+ respond with a connection error of type H3_FRAME_UNEXPECTED.
+
+ DATA Frame {
+ Type (i) = 0x00,
+ Length (i),
+ Data (..),
+ }
+
+ Figure 4: DATA Frame
+
+7.2.2. HEADERS
+
+ The HEADERS frame (type=0x01) is used to carry an HTTP field section
+ that is encoded using QPACK. See [QPACK] for more details.
+
+ HEADERS Frame {
+ Type (i) = 0x01,
+ Length (i),
+ Encoded Field Section (..),
+ }
+
+ Figure 5: HEADERS Frame
+
+ HEADERS frames can only be sent on request streams or push streams.
+ If a HEADERS frame is received on a control stream, the recipient
+ MUST respond with a connection error of type H3_FRAME_UNEXPECTED.
+
+7.2.3. CANCEL_PUSH
+
+ The CANCEL_PUSH frame (type=0x03) is used to request cancellation of
+ a server push prior to the push stream being received. The
+ CANCEL_PUSH frame identifies a server push by push ID (see
+ Section 4.6), encoded as a variable-length integer.
+
+ When a client sends a CANCEL_PUSH frame, it is indicating that it
+ does not wish to receive the promised resource. The server SHOULD
+ abort sending the resource, but the mechanism to do so depends on the
+ state of the corresponding push stream. If the server has not yet
+ created a push stream, it does not create one. If the push stream is
+ open, the server SHOULD abruptly terminate that stream. If the push
+ stream has already ended, the server MAY still abruptly terminate the
+ stream or MAY take no action.
+
+ A server sends a CANCEL_PUSH frame to indicate that it will not be
+ fulfilling a promise that was previously sent. The client cannot
+ expect the corresponding promise to be fulfilled, unless it has
+ already received and processed the promised response. Regardless of
+ whether a push stream has been opened, a server SHOULD send a
+ CANCEL_PUSH frame when it determines that promise will not be
+ fulfilled. If a stream has already been opened, the server can abort
+ sending on the stream with an error code of H3_REQUEST_CANCELLED.
+
+ Sending a CANCEL_PUSH frame has no direct effect on the state of
+ existing push streams. A client SHOULD NOT send a CANCEL_PUSH frame
+ when it has already received a corresponding push stream. A push
+ stream could arrive after a client has sent a CANCEL_PUSH frame,
+ because a server might not have processed the CANCEL_PUSH. The
+ client SHOULD abort reading the stream with an error code of
+ H3_REQUEST_CANCELLED.
+
+ A CANCEL_PUSH frame is sent on the control stream. Receiving a
+ CANCEL_PUSH frame on a stream other than the control stream MUST be
+ treated as a connection error of type H3_FRAME_UNEXPECTED.
+
+ CANCEL_PUSH Frame {
+ Type (i) = 0x03,
+ Length (i),
+ Push ID (i),
+ }
+
+ Figure 6: CANCEL_PUSH Frame
+
+ The CANCEL_PUSH frame carries a push ID encoded as a variable-length
+ integer. The Push ID field identifies the server push that is being
+ cancelled; see Section 4.6. If a CANCEL_PUSH frame is received that
+ references a push ID greater than currently allowed on the
+ connection, this MUST be treated as a connection error of type
+ H3_ID_ERROR.
+
+ If the client receives a CANCEL_PUSH frame, that frame might identify
+ a push ID that has not yet been mentioned by a PUSH_PROMISE frame due
+ to reordering. If a server receives a CANCEL_PUSH frame for a push
+ ID that has not yet been mentioned by a PUSH_PROMISE frame, this MUST
+ be treated as a connection error of type H3_ID_ERROR.
+
+7.2.4. SETTINGS
+
+ The SETTINGS frame (type=0x04) conveys configuration parameters that
+ affect how endpoints communicate, such as preferences and constraints
+ on peer behavior. Individually, a SETTINGS parameter can also be
+ referred to as a "setting"; the identifier and value of each setting
+ parameter can be referred to as a "setting identifier" and a "setting
+ value".
+
+ SETTINGS frames always apply to an entire HTTP/3 connection, never a
+ single stream. A SETTINGS frame MUST be sent as the first frame of
+ each control stream (see Section 6.2.1) by each peer, and it MUST NOT
+ be sent subsequently. If an endpoint receives a second SETTINGS
+ frame on the control stream, the endpoint MUST respond with a
+ connection error of type H3_FRAME_UNEXPECTED.
+
+ SETTINGS frames MUST NOT be sent on any stream other than the control
+ stream. If an endpoint receives a SETTINGS frame on a different
+ stream, the endpoint MUST respond with a connection error of type
+ H3_FRAME_UNEXPECTED.
+
+ SETTINGS parameters are not negotiated; they describe characteristics
+ of the sending peer that can be used by the receiving peer. However,
+ a negotiation can be implied by the use of SETTINGS: each peer uses
+ SETTINGS to advertise a set of supported values. The definition of
+ the setting would describe how each peer combines the two sets to
+ conclude which choice will be used. SETTINGS does not provide a
+ mechanism to identify when the choice takes effect.
+
+ Different values for the same parameter can be advertised by each
+ peer. For example, a client might be willing to consume a very large
+ response field section, while servers are more cautious about request
+ size.
+
+ The same setting identifier MUST NOT occur more than once in the
+ SETTINGS frame. A receiver MAY treat the presence of duplicate
+ setting identifiers as a connection error of type H3_SETTINGS_ERROR.
+
+ The payload of a SETTINGS frame consists of zero or more parameters.
+ Each parameter consists of a setting identifier and a value, both
+ encoded as QUIC variable-length integers.
+
+ Setting {
+ Identifier (i),
+ Value (i),
+ }
+
+ SETTINGS Frame {
+ Type (i) = 0x04,
+ Length (i),
+ Setting (..) ...,
+ }
+
+ Figure 7: SETTINGS Frame
+
+ An implementation MUST ignore any parameter with an identifier it
+ does not understand.
+
+7.2.4.1. Defined SETTINGS Parameters
+
+ The following settings are defined in HTTP/3:
+
+ SETTINGS_MAX_FIELD_SECTION_SIZE (0x06): The default value is
+ unlimited. See Section 4.2.2 for usage.
+
+ Setting identifiers of the format 0x1f * N + 0x21 for non-negative
+ integer values of N are reserved to exercise the requirement that
+ unknown identifiers be ignored. Such settings have no defined
+ meaning. Endpoints SHOULD include at least one such setting in their
+ SETTINGS frame. Endpoints MUST NOT consider such settings to have
+ any meaning upon receipt.
+
+ Because the setting has no defined meaning, the value of the setting
+ can be any value the implementation selects.
+
+ Setting identifiers that were defined in [HTTP/2] where there is no
+ corresponding HTTP/3 setting have also been reserved
+ (Section 11.2.2). These reserved settings MUST NOT be sent, and
+ their receipt MUST be treated as a connection error of type
+ H3_SETTINGS_ERROR.
+
+ Additional settings can be defined by extensions to HTTP/3; see
+ Section 9 for more details.
+
+7.2.4.2. Initialization
+
+ An HTTP implementation MUST NOT send frames or requests that would be
+ invalid based on its current understanding of the peer's settings.
+
+ All settings begin at an initial value. Each endpoint SHOULD use
+ these initial values to send messages before the peer's SETTINGS
+ frame has arrived, as packets carrying the settings can be lost or
+ delayed. When the SETTINGS frame arrives, any settings are changed
+ to their new values.
+
+ This removes the need to wait for the SETTINGS frame before sending
+ messages. Endpoints MUST NOT require any data to be received from
+ the peer prior to sending the SETTINGS frame; settings MUST be sent
+ as soon as the transport is ready to send data.
+
+ For servers, the initial value of each client setting is the default
+ value.
+
+ For clients using a 1-RTT QUIC connection, the initial value of each
+ server setting is the default value. 1-RTT keys will always become
+ available prior to the packet containing SETTINGS being processed by
+ QUIC, even if the server sends SETTINGS immediately. Clients SHOULD
+ NOT wait indefinitely for SETTINGS to arrive before sending requests,
+ but they SHOULD process received datagrams in order to increase the
+ likelihood of processing SETTINGS before sending the first request.
+
+ When a 0-RTT QUIC connection is being used, the initial value of each
+ server setting is the value used in the previous session. Clients
+ SHOULD store the settings the server provided in the HTTP/3
+ connection where resumption information was provided, but they MAY
+ opt not to store settings in certain cases (e.g., if the session
+ ticket is received before the SETTINGS frame). A client MUST comply
+ with stored settings -- or default values if no values are stored --
+ when attempting 0-RTT. Once a server has provided new settings,
+ clients MUST comply with those values.
+
+ A server can remember the settings that it advertised or store an
+ integrity-protected copy of the values in the ticket and recover the
+ information when accepting 0-RTT data. A server uses the HTTP/3
+ settings values in determining whether to accept 0-RTT data. If the
+ server cannot determine that the settings remembered by a client are
+ compatible with its current settings, it MUST NOT accept 0-RTT data.
+ Remembered settings are compatible if a client complying with those
+ settings would not violate the server's current settings.
+
+ A server MAY accept 0-RTT and subsequently provide different settings
+ in its SETTINGS frame. If 0-RTT data is accepted by the server, its
+ SETTINGS frame MUST NOT reduce any limits or alter any values that
+ might be violated by the client with its 0-RTT data. The server MUST
+ include all settings that differ from their default values. If a
+ server accepts 0-RTT but then sends settings that are not compatible
+ with the previously specified settings, this MUST be treated as a
+ connection error of type H3_SETTINGS_ERROR. If a server accepts
+ 0-RTT but then sends a SETTINGS frame that omits a setting value that
+ the client understands (apart from reserved setting identifiers) that
+ was previously specified to have a non-default value, this MUST be
+ treated as a connection error of type H3_SETTINGS_ERROR.
+
+7.2.5. PUSH_PROMISE
+
+ The PUSH_PROMISE frame (type=0x05) is used to carry a promised
+ request header section from server to client on a request stream.
+
+ PUSH_PROMISE Frame {
+ Type (i) = 0x05,
+ Length (i),
+ Push ID (i),
+ Encoded Field Section (..),
+ }
+
+ Figure 8: PUSH_PROMISE Frame
+
+ The payload consists of:
+
+ Push ID: A variable-length integer that identifies the server push
+ operation. A push ID is used in push stream headers (Section 4.6)
+ and CANCEL_PUSH frames.
+
+ Encoded Field Section: QPACK-encoded request header fields for the
+ promised response. See [QPACK] for more details.
+
+ A server MUST NOT use a push ID that is larger than the client has
+ provided in a MAX_PUSH_ID frame (Section 7.2.7). A client MUST treat
+ receipt of a PUSH_PROMISE frame that contains a larger push ID than
+ the client has advertised as a connection error of H3_ID_ERROR.
+
+ A server MAY use the same push ID in multiple PUSH_PROMISE frames.
+ If so, the decompressed request header sets MUST contain the same
+ fields in the same order, and both the name and the value in each
+ field MUST be exact matches. Clients SHOULD compare the request
+ header sections for resources promised multiple times. If a client
+ receives a push ID that has already been promised and detects a
+ mismatch, it MUST respond with a connection error of type
+ H3_GENERAL_PROTOCOL_ERROR. If the decompressed field sections match
+ exactly, the client SHOULD associate the pushed content with each
+ stream on which a PUSH_PROMISE frame was received.
+
+ Allowing duplicate references to the same push ID is primarily to
+ reduce duplication caused by concurrent requests. A server SHOULD
+ avoid reusing a push ID over a long period. Clients are likely to
+ consume server push responses and not retain them for reuse over
+ time. Clients that see a PUSH_PROMISE frame that uses a push ID that
+ they have already consumed and discarded are forced to ignore the
+ promise.
+
+ If a PUSH_PROMISE frame is received on the control stream, the client
+ MUST respond with a connection error of type H3_FRAME_UNEXPECTED.
+
+ A client MUST NOT send a PUSH_PROMISE frame. A server MUST treat the
+ receipt of a PUSH_PROMISE frame as a connection error of type
+ H3_FRAME_UNEXPECTED.
+
+ See Section 4.6 for a description of the overall server push
+ mechanism.
+
+7.2.6. GOAWAY
+
+ The GOAWAY frame (type=0x07) is used to initiate graceful shutdown of
+ an HTTP/3 connection by either endpoint. GOAWAY allows an endpoint
+ to stop accepting new requests or pushes while still finishing
+ processing of previously received requests and pushes. This enables
+ administrative actions, like server maintenance. GOAWAY by itself
+ does not close a connection.
+
+ GOAWAY Frame {
+ Type (i) = 0x07,
+ Length (i),
+ Stream ID/Push ID (i),
+ }
+
+ Figure 9: GOAWAY Frame
+
+ The GOAWAY frame is always sent on the control stream. In the
+ server-to-client direction, it carries a QUIC stream ID for a client-
+ initiated bidirectional stream encoded as a variable-length integer.
+ A client MUST treat receipt of a GOAWAY frame containing a stream ID
+ of any other type as a connection error of type H3_ID_ERROR.
+
+ In the client-to-server direction, the GOAWAY frame carries a push ID
+ encoded as a variable-length integer.
+
+ The GOAWAY frame applies to the entire connection, not a specific
+ stream. A client MUST treat a GOAWAY frame on a stream other than
+ the control stream as a connection error of type H3_FRAME_UNEXPECTED.
+
+ See Section 5.2 for more information on the use of the GOAWAY frame.
+
+7.2.7. MAX_PUSH_ID
+
+ The MAX_PUSH_ID frame (type=0x0d) is used by clients to control the
+ number of server pushes that the server can initiate. This sets the
+ maximum value for a push ID that the server can use in PUSH_PROMISE
+ and CANCEL_PUSH frames. Consequently, this also limits the number of
+ push streams that the server can initiate in addition to the limit
+ maintained by the QUIC transport.
+
+ The MAX_PUSH_ID frame is always sent on the control stream. Receipt
+ of a MAX_PUSH_ID frame on any other stream MUST be treated as a
+ connection error of type H3_FRAME_UNEXPECTED.
+
+ A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the
+ receipt of a MAX_PUSH_ID frame as a connection error of type
+ H3_FRAME_UNEXPECTED.
+
+ The maximum push ID is unset when an HTTP/3 connection is created,
+ meaning that a server cannot push until it receives a MAX_PUSH_ID
+ frame. A client that wishes to manage the number of promised server
+ pushes can increase the maximum push ID by sending MAX_PUSH_ID frames
+ as the server fulfills or cancels server pushes.
+
+ MAX_PUSH_ID Frame {
+ Type (i) = 0x0d,
+ Length (i),
+ Push ID (i),
+ }
+
+ Figure 10: MAX_PUSH_ID Frame
+
+ The MAX_PUSH_ID frame carries a single variable-length integer that
+ identifies the maximum value for a push ID that the server can use;
+ see Section 4.6. A MAX_PUSH_ID frame cannot reduce the maximum push
+ ID; receipt of a MAX_PUSH_ID frame that contains a smaller value than
+ previously received MUST be treated as a connection error of type
+ H3_ID_ERROR.
+
+7.2.8. Reserved Frame Types
+
+ Frame types of the format 0x1f * N + 0x21 for non-negative integer
+ values of N are reserved to exercise the requirement that unknown
+ types be ignored (Section 9). These frames have no semantics, and
+ they MAY be sent on any stream where frames are allowed to be sent.
+ This enables their use for application-layer padding. Endpoints MUST
+ NOT consider these frames to have any meaning upon receipt.
+
+ The payload and length of the frames are selected in any manner the
+ implementation chooses.
+
+ Frame types that were used in HTTP/2 where there is no corresponding
+ HTTP/3 frame have also been reserved (Section 11.2.1). These frame
+ types MUST NOT be sent, and their receipt MUST be treated as a
+ connection error of type H3_FRAME_UNEXPECTED.
+
+8. Error Handling
+
+ When a stream cannot be completed successfully, QUIC allows the
+ application to abruptly terminate (reset) that stream and communicate
+ a reason; see Section 2.4 of [QUIC-TRANSPORT]. This is referred to
+ as a "stream error". An HTTP/3 implementation can decide to close a
+ QUIC stream and communicate the type of error. Wire encodings of
+ error codes are defined in Section 8.1. Stream errors are distinct
+ from HTTP status codes that indicate error conditions. Stream errors
+ indicate that the sender did not transfer or consume the full request
+ or response, while HTTP status codes indicate the result of a request
+ that was successfully received.
+
+ If an entire connection needs to be terminated, QUIC similarly
+ provides mechanisms to communicate a reason; see Section 5.3 of
+ [QUIC-TRANSPORT]. This is referred to as a "connection error".
+ Similar to stream errors, an HTTP/3 implementation can terminate a
+ QUIC connection and communicate the reason using an error code from
+ Section 8.1.
+
+ Although the reasons for closing streams and connections are called
+ "errors", these actions do not necessarily indicate a problem with
+ the connection or either implementation. For example, a stream can
+ be reset if the requested resource is no longer needed.
+
+ An endpoint MAY choose to treat a stream error as a connection error
+ under certain circumstances, closing the entire connection in
+ response to a condition on a single stream. Implementations need to
+ consider the impact on outstanding requests before making this
+ choice.
+
+ Because new error codes can be defined without negotiation (see
+ Section 9), use of an error code in an unexpected context or receipt
+ of an unknown error code MUST be treated as equivalent to
+ H3_NO_ERROR. However, closing a stream can have other effects
+ regardless of the error code; for example, see Section 4.1.
+
+8.1. HTTP/3 Error Codes
+
+ The following error codes are defined for use when abruptly
+ terminating streams, aborting reading of streams, or immediately
+ closing HTTP/3 connections.
+
+ H3_NO_ERROR (0x0100): No error. This is used when the connection or
+ stream needs to be closed, but there is no error to signal.
+
+ H3_GENERAL_PROTOCOL_ERROR (0x0101): Peer violated protocol
+ requirements in a way that does not match a more specific error
+ code or endpoint declines to use the more specific error code.
+
+ H3_INTERNAL_ERROR (0x0102): An internal error has occurred in the
+ HTTP stack.
+
+ H3_STREAM_CREATION_ERROR (0x0103): The endpoint detected that its
+ peer created a stream that it will not accept.
+
+ H3_CLOSED_CRITICAL_STREAM (0x0104): A stream required by the HTTP/3
+ connection was closed or reset.
+
+ H3_FRAME_UNEXPECTED (0x0105): A frame was received that was not
+ permitted in the current state or on the current stream.
+
+ H3_FRAME_ERROR (0x0106): A frame that fails to satisfy layout
+ requirements or with an invalid size was received.
+
+ H3_EXCESSIVE_LOAD (0x0107): The endpoint detected that its peer is
+ exhibiting a behavior that might be generating excessive load.
+
+ H3_ID_ERROR (0x0108): A stream ID or push ID was used incorrectly,
+ such as exceeding a limit, reducing a limit, or being reused.
+
+ H3_SETTINGS_ERROR (0x0109): An endpoint detected an error in the
+ payload of a SETTINGS frame.
+
+ H3_MISSING_SETTINGS (0x010a): No SETTINGS frame was received at the
+ beginning of the control stream.
+
+ H3_REQUEST_REJECTED (0x010b): A server rejected a request without
+ performing any application processing.
+
+ H3_REQUEST_CANCELLED (0x010c): The request or its response
+ (including pushed response) is cancelled.
+
+ H3_REQUEST_INCOMPLETE (0x010d): The client's stream terminated
+ without containing a fully formed request.
+
+ H3_MESSAGE_ERROR (0x010e): An HTTP message was malformed and cannot
+ be processed.
+
+ H3_CONNECT_ERROR (0x010f): The TCP connection established in
+ response to a CONNECT request was reset or abnormally closed.
+
+ H3_VERSION_FALLBACK (0x0110): The requested operation cannot be
+ served over HTTP/3. The peer should retry over HTTP/1.1.
+
+ Error codes of the format 0x1f * N + 0x21 for non-negative integer
+ values of N are reserved to exercise the requirement that unknown
+ error codes be treated as equivalent to H3_NO_ERROR (Section 9).
+ Implementations SHOULD select an error code from this space with some
+ probability when they would have sent H3_NO_ERROR.
+
+9. Extensions to HTTP/3
+
+ HTTP/3 permits extension of the protocol. Within the limitations
+ described in this section, protocol extensions can be used to provide
+ additional services or alter any aspect of the protocol. Extensions
+ are effective only within the scope of a single HTTP/3 connection.
+
+ This applies to the protocol elements defined in this document. This
+ does not affect the existing options for extending HTTP, such as
+ defining new methods, status codes, or fields.
+
+ Extensions are permitted to use new frame types (Section 7.2), new
+ settings (Section 7.2.4.1), new error codes (Section 8), or new
+ unidirectional stream types (Section 6.2). Registries are
+ established for managing these extension points: frame types
+ (Section 11.2.1), settings (Section 11.2.2), error codes
+ (Section 11.2.3), and stream types (Section 11.2.4).
+
+ Implementations MUST ignore unknown or unsupported values in all
+ extensible protocol elements. Implementations MUST discard data or
+ abort reading on unidirectional streams that have unknown or
+ unsupported types. This means that any of these extension points can
+ be safely used by extensions without prior arrangement or
+ negotiation. However, where a known frame type is required to be in
+ a specific location, such as the SETTINGS frame as the first frame of
+ the control stream (see Section 6.2.1), an unknown frame type does
+ not satisfy that requirement and SHOULD be treated as an error.
+
+ Extensions that could change the semantics of existing protocol
+ components MUST be negotiated before being used. For example, an
+ extension that changes the layout of the HEADERS frame cannot be used
+ until the peer has given a positive signal that this is acceptable.
+ Coordinating when such a revised layout comes into effect could prove
+ complex. As such, allocating new identifiers for new definitions of
+ existing protocol elements is likely to be more effective.
+
+ This document does not mandate a specific method for negotiating the
+ use of an extension, but it notes that a setting (Section 7.2.4.1)
+ could be used for that purpose. If both peers set a value that
+ indicates willingness to use the extension, then the extension can be
+ used. If a setting is used for extension negotiation, the default
+ value MUST be defined in such a fashion that the extension is
+ disabled if the setting is omitted.
+
+10. Security Considerations
+
+ The security considerations of HTTP/3 should be comparable to those
+ of HTTP/2 with TLS. However, many of the considerations from
+ Section 10 of [HTTP/2] apply to [QUIC-TRANSPORT] and are discussed in
+ that document.
+
+10.1. Server Authority
+
+ HTTP/3 relies on the HTTP definition of authority. The security
+ considerations of establishing authority are discussed in
+ Section 17.1 of [HTTP].
+
+10.2. Cross-Protocol Attacks
+
+ The use of ALPN in the TLS and QUIC handshakes establishes the target
+ application protocol before application-layer bytes are processed.
+ This ensures that endpoints have strong assurances that peers are
+ using the same protocol.
+
+ This does not guarantee protection from all cross-protocol attacks.
+ Section 21.5 of [QUIC-TRANSPORT] describes some ways in which the
+ plaintext of QUIC packets can be used to perform request forgery
+ against endpoints that don't use authenticated transports.
+
+10.3. Intermediary-Encapsulation Attacks
+
+ The HTTP/3 field encoding allows the expression of names that are not
+ valid field names in the syntax used by HTTP (Section 5.1 of [HTTP]).
+ Requests or responses containing invalid field names MUST be treated
+ as malformed. Therefore, an intermediary cannot translate an HTTP/3
+ request or response containing an invalid field name into an HTTP/1.1
+ message.
+
+ Similarly, HTTP/3 can transport field values that are not valid.
+ While most values that can be encoded will not alter field parsing,
+ carriage return (ASCII 0x0d), line feed (ASCII 0x0a), and the null
+ character (ASCII 0x00) might be exploited by an attacker if they are
+ translated verbatim. Any request or response that contains a
+ character not permitted in a field value MUST be treated as
+ malformed. Valid characters are defined by the "field-content" ABNF
+ rule in Section 5.5 of [HTTP].
+
+10.4. Cacheability of Pushed Responses
+
+ Pushed responses do not have an explicit request from the client; the
+ request is provided by the server in the PUSH_PROMISE frame.
+
+ Caching responses that are pushed is possible based on the guidance
+ provided by the origin server in the Cache-Control header field.
+ However, this can cause issues if a single server hosts more than one
+ tenant. For example, a server might offer multiple users each a
+ small portion of its URI space.
+
+ Where multiple tenants share space on the same server, that server
+ MUST ensure that tenants are not able to push representations of
+ resources that they do not have authority over. Failure to enforce
+ this would allow a tenant to provide a representation that would be
+ served out of cache, overriding the actual representation that the
+ authoritative tenant provides.
+
+ Clients are required to reject pushed responses for which an origin
+ server is not authoritative; see Section 4.6.
+
+10.5. Denial-of-Service Considerations
+
+ An HTTP/3 connection can demand a greater commitment of resources to
+ operate than an HTTP/1.1 or HTTP/2 connection. The use of field
+ compression and flow control depend on a commitment of resources for
+ storing a greater amount of state. Settings for these features
+ ensure that memory commitments for these features are strictly
+ bounded.
+
+ The number of PUSH_PROMISE frames is constrained in a similar
+ fashion. A client that accepts server push SHOULD limit the number
+ of push IDs it issues at a time.
+
+ Processing capacity cannot be guarded as effectively as state
+ capacity.
+
+ The ability to send undefined protocol elements that the peer is
+ required to ignore can be abused to cause a peer to expend additional
+ processing time. This might be done by setting multiple undefined
+ SETTINGS parameters, unknown frame types, or unknown stream types.
+ Note, however, that some uses are entirely legitimate, such as
+ optional-to-understand extensions and padding to increase resistance
+ to traffic analysis.
+
+ Compression of field sections also offers some opportunities to waste
+ processing resources; see Section 7 of [QPACK] for more details on
+ potential abuses.
+
+ All these features -- i.e., server push, unknown protocol elements,
+ field compression -- have legitimate uses. These features become a
+ burden only when they are used unnecessarily or to excess.
+
+ An endpoint that does not monitor such behavior exposes itself to a
+ risk of denial-of-service attack. Implementations SHOULD track the
+ use of these features and set limits on their use. An endpoint MAY
+ treat activity that is suspicious as a connection error of type
+ H3_EXCESSIVE_LOAD, but false positives will result in disrupting
+ valid connections and requests.
+
+10.5.1. Limits on Field Section Size
+
+ A large field section (Section 4.1) can cause an implementation to
+ commit a large amount of state. Header fields that are critical for
+ routing can appear toward the end of a header section, which prevents
+ streaming of the header section to its ultimate destination. This
+ ordering and other reasons, such as ensuring cache correctness, mean
+ that an endpoint likely needs to buffer the entire header section.
+ Since there is no hard limit to the size of a field section, some
+ endpoints could be forced to commit a large amount of available
+ memory for header fields.
+
+ An endpoint can use the SETTINGS_MAX_FIELD_SECTION_SIZE
+ (Section 4.2.2) setting to advise peers of limits that might apply on
+ the size of field sections. This setting is only advisory, so
+ endpoints MAY choose to send field sections that exceed this limit
+ and risk having the request or response being treated as malformed.
+ This setting is specific to an HTTP/3 connection, so any request or
+ response could encounter a hop with a lower, unknown limit. An
+ intermediary can attempt to avoid this problem by passing on values
+ presented by different peers, but they are not obligated to do so.
+
+ A server that receives a larger field section than it is willing to
+ handle can send an HTTP 431 (Request Header Fields Too Large) status
+ code ([RFC6585]). A client can discard responses that it cannot
+ process.
+
+10.5.2. CONNECT Issues
+
+ The CONNECT method can be used to create disproportionate load on a
+ proxy, since stream creation is relatively inexpensive when compared
+ to the creation and maintenance of a TCP connection. Therefore, a
+ proxy that supports CONNECT might be more conservative in the number
+ of simultaneous requests it accepts.
+
+ A proxy might also maintain some resources for a TCP connection
+ beyond the closing of the stream that carries the CONNECT request,
+ since the outgoing TCP connection remains in the TIME_WAIT state. To
+ account for this, a proxy might delay increasing the QUIC stream
+ limits for some time after a TCP connection terminates.
+
+10.6. Use of Compression
+
+ Compression can allow an attacker to recover secret data when it is
+ compressed in the same context as data under attacker control.
+ HTTP/3 enables compression of fields (Section 4.2); the following
+ concerns also apply to the use of HTTP compressed content-codings;
+ see Section 8.4.1 of [HTTP].
+
+ There are demonstrable attacks on compression that exploit the
+ characteristics of the web (e.g., [BREACH]). The attacker induces
+ multiple requests containing varying plaintext, observing the length
+ of the resulting ciphertext in each, which reveals a shorter length
+ when a guess about the secret is correct.
+
+ Implementations communicating on a secure channel MUST NOT compress
+ content that includes both confidential and attacker-controlled data
+ unless separate compression contexts are used for each source of
+ data. Compression MUST NOT be used if the source of data cannot be
+ reliably determined.
+
+ Further considerations regarding the compression of field sections
+ are described in [QPACK].
+
+10.7. Padding and Traffic Analysis
+
+ Padding can be used to obscure the exact size of frame content and is
+ provided to mitigate specific attacks within HTTP, for example,
+ attacks where compressed content includes both attacker-controlled
+ plaintext and secret data (e.g., [BREACH]).
+
+ Where HTTP/2 employs PADDING frames and Padding fields in other
+ frames to make a connection more resistant to traffic analysis,
+ HTTP/3 can either rely on transport-layer padding or employ the
+ reserved frame and stream types discussed in Sections 7.2.8 and
+ 6.2.3. These methods of padding produce different results in terms
+ of the granularity of padding, how padding is arranged in relation to
+ the information that is being protected, whether padding is applied
+ in the case of packet loss, and how an implementation might control
+ padding.
+
+ Reserved stream types can be used to give the appearance of sending
+ traffic even when the connection is idle. Because HTTP traffic often
+ occurs in bursts, apparent traffic can be used to obscure the timing
+ or duration of such bursts, even to the point of appearing to send a
+ constant stream of data. However, as such traffic is still flow
+ controlled by the receiver, a failure to promptly drain such streams
+ and provide additional flow-control credit can limit the sender's
+ ability to send real traffic.
+
+ To mitigate attacks that rely on compression, disabling or limiting
+ compression might be preferable to padding as a countermeasure.
+
+ Use of padding can result in less protection than might seem
+ immediately obvious. Redundant padding could even be
+ counterproductive. At best, padding only makes it more difficult for
+ an attacker to infer length information by increasing the number of
+ frames an attacker has to observe. Incorrectly implemented padding
+ schemes can be easily defeated. In particular, randomized padding
+ with a predictable distribution provides very little protection;
+ similarly, padding payloads to a fixed size exposes information as
+ payload sizes cross the fixed-sized boundary, which could be possible
+ if an attacker can control plaintext.
+
+10.8. Frame Parsing
+
+ Several protocol elements contain nested length elements, typically
+ in the form of frames with an explicit length containing variable-
+ length integers. This could pose a security risk to an incautious
+ implementer. An implementation MUST ensure that the length of a
+ frame exactly matches the length of the fields it contains.
+
+10.9. Early Data
+
+ The use of 0-RTT with HTTP/3 creates an exposure to replay attack.
+ The anti-replay mitigations in [HTTP-REPLAY] MUST be applied when
+ using HTTP/3 with 0-RTT. When applying [HTTP-REPLAY] to HTTP/3,
+ references to the TLS layer refer to the handshake performed within
+ QUIC, while all references to application data refer to the contents
+ of streams.
+
+10.10. Migration
+
+ Certain HTTP implementations use the client address for logging or
+ access-control purposes. Since a QUIC client's address might change
+ during a connection (and future versions might support simultaneous
+ use of multiple addresses), such implementations will need to either
+ actively retrieve the client's current address or addresses when they
+ are relevant or explicitly accept that the original address might
+ change.
+
+10.11. Privacy Considerations
+
+ Several characteristics of HTTP/3 provide an observer an opportunity
+ to correlate actions of a single client or server over time. These
+ include the value of settings, the timing of reactions to stimulus,
+ and the handling of any features that are controlled by settings.
+
+ As far as these create observable differences in behavior, they could
+ be used as a basis for fingerprinting a specific client.
+
+ HTTP/3's preference for using a single QUIC connection allows
+ correlation of a user's activity on a site. Reusing connections for
+ different origins allows for correlation of activity across those
+ origins.
+
+ Several features of QUIC solicit immediate responses and can be used
+ by an endpoint to measure latency to their peer; this might have
+ privacy implications in certain scenarios.
+
+11. IANA Considerations
+
+ This document registers a new ALPN protocol ID (Section 11.1) and
+ creates new registries that manage the assignment of code points in
+ HTTP/3.
+
+11.1. Registration of HTTP/3 Identification String
+
+ This document creates a new registration for the identification of
+ HTTP/3 in the "TLS Application-Layer Protocol Negotiation (ALPN)
+ Protocol IDs" registry established in [RFC7301].
+
+ The "h3" string identifies HTTP/3:
+
+ Protocol: HTTP/3
+
+ Identification Sequence: 0x68 0x33 ("h3")
+
+ Specification: This document
+
+11.2. New Registries
+
+ New registries created in this document operate under the QUIC
+ registration policy documented in Section 22.1 of [QUIC-TRANSPORT].
+ These registries all include the common set of fields listed in
+ Section 22.1.1 of [QUIC-TRANSPORT]. These registries are collected
+ under the "Hypertext Transfer Protocol version 3 (HTTP/3)" heading.
+
+ The initial allocations in these registries are all assigned
+ permanent status and list a change controller of the IETF and a
+ contact of the HTTP working group (ietf-http-wg@w3.org).
+
+11.2.1. Frame Types
+
+ This document establishes a registry for HTTP/3 frame type codes.
+ The "HTTP/3 Frame Types" registry governs a 62-bit space. This
+ registry follows the QUIC registry policy; see Section 11.2.
+ Permanent registrations in this registry are assigned using the
+ Specification Required policy ([RFC8126]), except for values between
+ 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using
+ Standards Action or IESG Approval as defined in Sections 4.9 and 4.10
+ of [RFC8126].
+
+ While this registry is separate from the "HTTP/2 Frame Type" registry
+ defined in [HTTP/2], it is preferable that the assignments parallel
+ each other where the code spaces overlap. If an entry is present in
+ only one registry, every effort SHOULD be made to avoid assigning the
+ corresponding value to an unrelated operation. Expert reviewers MAY
+ reject unrelated registrations that would conflict with the same
+ value in the corresponding registry.
+
+ In addition to common fields as described in Section 11.2, permanent
+ registrations in this registry MUST include the following field:
+
+ Frame Type: A name or label for the frame type.
+
+ Specifications of frame types MUST include a description of the frame
+ layout and its semantics, including any parts of the frame that are
+ conditionally present.
+
+ The entries in Table 2 are registered by this document.
+
+ +==============+=======+===============+
+ | 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 |
+ +--------------+-------+---------------+
+
+ Table 2: Initial HTTP/3 Frame Types
+
+ Each code of the format 0x1f * N + 0x21 for non-negative integer
+ values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe)
+ MUST NOT be assigned by IANA and MUST NOT appear in the listing of
+ assigned values.
+
+11.2.2. Settings Parameters
+
+ This document establishes a registry for HTTP/3 settings. The
+ "HTTP/3 Settings" registry governs a 62-bit space. This registry
+ follows the QUIC registry policy; see Section 11.2. Permanent
+ registrations in this registry are assigned using the Specification
+ Required policy ([RFC8126]), except for values between 0x00 and 0x3f
+ (in hexadecimal; inclusive), which are assigned using Standards
+ Action or IESG Approval as defined in Sections 4.9 and 4.10 of
+ [RFC8126].
+
+ While this registry is separate from the "HTTP/2 Settings" registry
+ defined in [HTTP/2], it is preferable that the assignments parallel
+ each other. If an entry is present in only one registry, every
+ effort SHOULD be made to avoid assigning the corresponding value to
+ an unrelated operation. Expert reviewers MAY reject unrelated
+ registrations that would conflict with the same value in the
+ corresponding registry.
+
+ In addition to common fields as described in Section 11.2, permanent
+ registrations in this registry MUST include the following fields:
+
+ Setting Name: A symbolic name for the setting. Specifying a setting
+ name is optional.
+
+ Default: The value of the setting unless otherwise indicated. A
+ default SHOULD be the most restrictive possible value.
+
+ The entries in Table 3 are registered by this document.
+
+ +========================+=======+=================+===========+
+ | 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 |
+ +------------------------+-------+-----------------+-----------+
+
+ Table 3: Initial HTTP/3 Settings
+
+ For formatting reasons, setting names can be abbreviated by removing
+ the 'SETTINGS_' prefix.
+
+ Each code of the format 0x1f * N + 0x21 for non-negative integer
+ values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe)
+ MUST NOT be assigned by IANA and MUST NOT appear in the listing of
+ assigned values.
+
+11.2.3. Error Codes
+
+ This document establishes a registry for HTTP/3 error codes. The
+ "HTTP/3 Error Codes" registry manages a 62-bit space. This registry
+ follows the QUIC registry policy; see Section 11.2. Permanent
+ registrations in this registry are assigned using the Specification
+ Required policy ([RFC8126]), except for values between 0x00 and 0x3f
+ (in hexadecimal; inclusive), which are assigned using Standards
+ Action or IESG Approval as defined in Sections 4.9 and 4.10 of
+ [RFC8126].
+
+ Registrations for error codes are required to include a description
+ of the error code. An expert reviewer is advised to examine new
+ registrations for possible duplication with existing error codes.
+ Use of existing registrations is to be encouraged, but not mandated.
+ Use of values that are registered in the "HTTP/2 Error Code" registry
+ is discouraged, and expert reviewers MAY reject such registrations.
+
+ In addition to common fields as described in Section 11.2, this
+ registry includes two additional fields. Permanent registrations in
+ this registry MUST include the following field:
+
+ Name: A name for the error code.
+
+ Description: A brief description of the error code semantics.
+
+ The entries in Table 4 are registered by this document. These error
+ codes were selected from the range that operates on a Specification
+ Required policy to avoid collisions with HTTP/2 error codes.
+
+ +===========================+========+==============+===============+
+ | Name | Value | Description | Specification |
+ +===========================+========+==============+===============+
+ | H3_NO_ERROR | 0x0100 | No error | Section 8.1 |
+ +---------------------------+--------+--------------+---------------+
+ | H3_GENERAL_PROTOCOL_ERROR | 0x0101 | General | Section 8.1 |
+ | | | protocol | |
+ | | | error | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_INTERNAL_ERROR | 0x0102 | Internal | Section 8.1 |
+ | | | error | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_STREAM_CREATION_ERROR | 0x0103 | Stream | Section 8.1 |
+ | | | creation | |
+ | | | error | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_CLOSED_CRITICAL_STREAM | 0x0104 | Critical | Section 8.1 |
+ | | | stream was | |
+ | | | closed | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_FRAME_UNEXPECTED | 0x0105 | Frame not | Section 8.1 |
+ | | | permitted | |
+ | | | in the | |
+ | | | current | |
+ | | | state | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_FRAME_ERROR | 0x0106 | Frame | Section 8.1 |
+ | | | violated | |
+ | | | layout or | |
+ | | | size rules | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_EXCESSIVE_LOAD | 0x0107 | Peer | Section 8.1 |
+ | | | generating | |
+ | | | excessive | |
+ | | | load | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_ID_ERROR | 0x0108 | An | Section 8.1 |
+ | | | identifier | |
+ | | | was used | |
+ | | | incorrectly | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_SETTINGS_ERROR | 0x0109 | SETTINGS | Section 8.1 |
+ | | | frame | |
+ | | | contained | |
+ | | | invalid | |
+ | | | values | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_MISSING_SETTINGS | 0x010a | No SETTINGS | Section 8.1 |
+ | | | frame | |
+ | | | received | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_REQUEST_REJECTED | 0x010b | Request not | Section 8.1 |
+ | | | processed | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_REQUEST_CANCELLED | 0x010c | Data no | Section 8.1 |
+ | | | longer | |
+ | | | needed | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_REQUEST_INCOMPLETE | 0x010d | Stream | Section 8.1 |
+ | | | terminated | |
+ | | | early | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_MESSAGE_ERROR | 0x010e | Malformed | Section 8.1 |
+ | | | message | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_CONNECT_ERROR | 0x010f | TCP reset | Section 8.1 |
+ | | | or error on | |
+ | | | CONNECT | |
+ | | | request | |
+ +---------------------------+--------+--------------+---------------+
+ | H3_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 |
+ | | | HTTP/1.1 | |
+ +---------------------------+--------+--------------+---------------+
+
+ Table 4: Initial HTTP/3 Error Codes
+
+ Each code of the format 0x1f * N + 0x21 for non-negative integer
+ values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe)
+ MUST NOT be assigned by IANA and MUST NOT appear in the listing of
+ assigned values.
+
+11.2.4. Stream Types
+
+ This document establishes a registry for HTTP/3 unidirectional stream
+ types. The "HTTP/3 Stream Types" registry governs a 62-bit space.
+ This registry follows the QUIC registry policy; see Section 11.2.
+ Permanent registrations in this registry are assigned using the
+ Specification Required policy ([RFC8126]), except for values between
+ 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using
+ Standards Action or IESG Approval as defined in Sections 4.9 and 4.10
+ of [RFC8126].
+
+ In addition to common fields as described in Section 11.2, permanent
+ registrations in this registry MUST include the following fields:
+
+ Stream Type: A name or label for the stream type.
+
+ Sender: Which endpoint on an HTTP/3 connection may initiate a stream
+ of this type. Values are "Client", "Server", or "Both".
+
+ Specifications for permanent registrations MUST include a description
+ of the stream type, including the layout and semantics of the stream
+ contents.
+
+ The entries in Table 5 are registered by this document.
+
+ +================+=======+===============+========+
+ | Stream Type | Value | Specification | Sender |
+ +================+=======+===============+========+
+ | Control Stream | 0x00 | Section 6.2.1 | Both |
+ +----------------+-------+---------------+--------+
+ | Push Stream | 0x01 | Section 4.6 | Server |
+ +----------------+-------+---------------+--------+
+
+ Table 5: Initial Stream Types
+
+ Each code of the format 0x1f * N + 0x21 for non-negative integer
+ values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe)
+ MUST NOT be assigned by IANA and MUST NOT appear in the listing of
+ assigned values.
+
+12. References
+
+12.1. Normative References
+
+ [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, April 2011,
+ <https://www.rfc-editor.org/info/rfc6265>.
+
+ [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP Semantics", STD 97, RFC 9110,
+ DOI 10.17487/RFC9110, June 2022,
+ <https://www.rfc-editor.org/info/rfc9110>.
+
+ [HTTP-CACHING]
+ Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP Caching", STD 98, RFC 9111,
+ DOI 10.17487/RFC9111, June 2022,
+ <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, September
+ 2018, <https://www.rfc-editor.org/info/rfc8470>.
+
+ [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK:
+ Field Compression for HTTP/3", RFC 9204,
+ DOI 10.17487/RFC9204, June 2022,
+ <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, May 2021,
+ <https://www.rfc-editor.org/info/rfc9000>.
+
+ [RFC0793] Postel, J., "Transmission Control Protocol", STD 7,
+ RFC 793, DOI 10.17487/RFC0793, September 1981,
+ <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, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS)
+ Extensions: Extension Definitions", RFC 6066,
+ DOI 10.17487/RFC6066, January 2011,
+ <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,
+ July 2014, <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, June 2017,
+ <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,
+ May 2017, <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, January 2005,
+ <https://www.rfc-editor.org/info/rfc3986>.
+
+12.2. Informative References
+
+ [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the
+ CRIME Attack", July 2013,
+ <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,
+ January 2019, <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, May 2015,
+ <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,
+ June 2022, <https://www.rfc-editor.org/info/rfc9112>.
+
+ [HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113,
+ DOI 10.17487/RFC9113, June 2022,
+ <https://www.rfc-editor.org/info/rfc9113>.
+
+ [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status
+ Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012,
+ <https://www.rfc-editor.org/info/rfc6585>.
+
+ [RFC8164] Nottingham, M. and M. Thomson, "Opportunistic Security for
+ HTTP/2", RFC 8164, DOI 10.17487/RFC8164, May 2017,
+ <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, December 2014,
+ <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, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+Appendix A. Considerations for Transitioning from HTTP/2
+
+ HTTP/3 is strongly informed by HTTP/2, and it bears many
+ similarities. This section describes the approach taken to design
+ HTTP/3, points out important differences from HTTP/2, and describes
+ how to map HTTP/2 extensions into HTTP/3.
+
+ HTTP/3 begins from the premise that similarity to HTTP/2 is
+ preferable, but not a hard requirement. HTTP/3 departs from HTTP/2
+ where QUIC differs from TCP, either to take advantage of QUIC
+ features (like streams) or to accommodate important shortcomings
+ (such as a lack of total ordering). While HTTP/3 is similar to
+ HTTP/2 in key aspects, such as the relationship of requests and
+ responses to streams, the details of the HTTP/3 design are
+ substantially different from HTTP/2.
+
+ Some important departures are noted in this section.
+
+A.1. Streams
+
+ HTTP/3 permits use of a larger number of streams (2^62-1) than
+ HTTP/2. The same considerations about exhaustion of stream
+ identifier space apply, though the space is significantly larger such
+ that it is likely that other limits in QUIC are reached first, such
+ as the limit on the connection flow-control window.
+
+ In contrast to HTTP/2, stream concurrency in HTTP/3 is managed by
+ QUIC. QUIC considers a stream closed when all data has been received
+ and sent data has been acknowledged by the peer. HTTP/2 considers a
+ stream closed when the frame containing the END_STREAM bit has been
+ committed to the transport. As a result, the stream for an
+ equivalent exchange could remain "active" for a longer period of
+ time. HTTP/3 servers might choose to permit a larger number of
+ concurrent client-initiated bidirectional streams to achieve
+ equivalent concurrency to HTTP/2, depending on the expected usage
+ patterns.
+
+ In HTTP/2, only request and response bodies (the frame payload of
+ DATA frames) are subject to flow control. All HTTP/3 frames are sent
+ on QUIC streams, so all frames on all streams are flow controlled in
+ HTTP/3.
+
+ Due to the presence of other unidirectional stream types, HTTP/3 does
+ not rely exclusively on the number of concurrent unidirectional
+ streams to control the number of concurrent in-flight pushes.
+ Instead, HTTP/3 clients use the MAX_PUSH_ID frame to control the
+ number of pushes received from an HTTP/3 server.
+
+A.2. HTTP Frame Types
+
+ Many framing concepts from HTTP/2 can be elided on QUIC, because the
+ transport deals with them. Because frames are already on a stream,
+ they can omit the stream number. Because frames do not block
+ multiplexing (QUIC's multiplexing occurs below this layer), the
+ support for variable-maximum-length packets can be removed. Because
+ stream termination is handled by QUIC, an END_STREAM flag is not
+ required. This permits the removal of the Flags field from the
+ generic frame layout.
+
+ Frame payloads are largely drawn from [HTTP/2]. However, QUIC
+ includes many features (e.g., flow control) that are also present in
+ HTTP/2. In these cases, the HTTP mapping does not re-implement them.
+ As a result, several HTTP/2 frame types are not required in HTTP/3.
+ Where an HTTP/2-defined frame is no longer used, the frame ID has
+ been reserved in order to maximize portability between HTTP/2 and
+ HTTP/3 implementations. However, even frame types that appear in
+ both mappings do not have identical semantics.
+
+ Many of the differences arise from the fact that HTTP/2 provides an
+ absolute ordering between frames across all streams, while QUIC
+ provides this guarantee on each stream only. As a result, if a frame
+ type makes assumptions that frames from different streams will still
+ be received in the order sent, HTTP/3 will break them.
+
+ Some examples of feature adaptations are described below, as well as
+ general guidance to extension frame implementors converting an HTTP/2
+ extension to HTTP/3.
+
+A.2.1. Prioritization Differences
+
+ HTTP/2 specifies priority assignments in PRIORITY frames and
+ (optionally) in HEADERS frames. HTTP/3 does not provide a means of
+ signaling priority.
+
+ Note that, while there is no explicit signaling for priority, this
+ does not mean that prioritization is not important for achieving good
+ performance.
+
+A.2.2. Field Compression Differences
+
+ HPACK was designed with the assumption of in-order delivery. A
+ sequence of encoded field sections must arrive (and be decoded) at an
+ endpoint in the same order in which they were encoded. This ensures
+ that the dynamic state at the two endpoints remains in sync.
+
+ Because this total ordering is not provided by QUIC, HTTP/3 uses a
+ modified version of HPACK, called QPACK. QPACK uses a single
+ unidirectional stream to make all modifications to the dynamic table,
+ ensuring a total order of updates. All frames that contain encoded
+ fields merely reference the table state at a given time without
+ modifying it.
+
+ [QPACK] provides additional details.
+
+A.2.3. Flow-Control Differences
+
+ HTTP/2 specifies a stream flow-control mechanism. Although all
+ HTTP/2 frames are delivered on streams, only the DATA frame payload
+ is subject to flow control. QUIC provides flow control for stream
+ data and all HTTP/3 frame types defined in this document are sent on
+ streams. Therefore, all frame headers and payload are subject to
+ flow control.
+
+A.2.4. Guidance for New Frame Type Definitions
+
+ Frame type definitions in HTTP/3 often use the QUIC variable-length
+ integer encoding. In particular, stream IDs use this encoding, which
+ allows for a larger range of possible values than the encoding used
+ in HTTP/2. Some frames in HTTP/3 use an identifier other than a
+ stream ID (e.g., push IDs). Redefinition of the encoding of
+ extension frame types might be necessary if the encoding includes a
+ stream ID.
+
+ Because the Flags field is not present in generic HTTP/3 frames,
+ those frames that depend on the presence of flags need to allocate
+ space for flags as part of their frame payload.
+
+ Other than these issues, frame type HTTP/2 extensions are typically
+ portable to QUIC simply by replacing stream 0 in HTTP/2 with a
+ control stream in HTTP/3. HTTP/3 extensions will not assume
+ ordering, but would not be harmed by ordering, and are expected to be
+ portable to HTTP/2.
+
+A.2.5. Comparison of HTTP/2 and HTTP/3 Frame Types
+
+ DATA (0x00): Padding is not defined in HTTP/3 frames. See
+ Section 7.2.1.
+
+ HEADERS (0x01): The PRIORITY region of HEADERS is not defined in
+ HTTP/3 frames. Padding is not defined in HTTP/3 frames. See
+ Section 7.2.2.
+
+ PRIORITY (0x02): As described in Appendix A.2.1, HTTP/3 does not
+ provide a means of signaling priority.
+
+ RST_STREAM (0x03): RST_STREAM frames do not exist in HTTP/3, since
+ QUIC provides stream lifecycle management. The same code point is
+ used for the CANCEL_PUSH frame (Section 7.2.3).
+
+ SETTINGS (0x04): SETTINGS frames are sent only at the beginning of
+ the connection. See Section 7.2.4 and Appendix A.3.
+
+ PUSH_PROMISE (0x05): The PUSH_PROMISE frame does not reference a
+ stream; instead, the push stream references the PUSH_PROMISE frame
+ using a push ID. See Section 7.2.5.
+
+ PING (0x06): PING frames do not exist in HTTP/3, as QUIC provides
+ equivalent functionality.
+
+ GOAWAY (0x07): GOAWAY does not contain an error code. In the
+ client-to-server direction, it carries a push ID instead of a
+ server-initiated stream ID. See Section 7.2.6.
+
+ WINDOW_UPDATE (0x08): WINDOW_UPDATE frames do not exist in HTTP/3,
+ since QUIC provides flow control.
+
+ CONTINUATION (0x09): CONTINUATION frames do not exist in HTTP/3;
+ instead, larger HEADERS/PUSH_PROMISE frames than HTTP/2 are
+ permitted.
+
+ Frame types defined by extensions to HTTP/2 need to be separately
+ registered for HTTP/3 if still applicable. The IDs of frames defined
+ in [HTTP/2] have been reserved for simplicity. Note that the frame
+ type space in HTTP/3 is substantially larger (62 bits versus 8 bits),
+ so many HTTP/3 frame types have no equivalent HTTP/2 code points.
+ See Section 11.2.1.
+
+A.3. HTTP/2 SETTINGS Parameters
+
+ An important difference from HTTP/2 is that settings are sent once,
+ as the first frame of the control stream, and thereafter cannot
+ change. This eliminates many corner cases around synchronization of
+ changes.
+
+ Some transport-level options that HTTP/2 specifies via the SETTINGS
+ frame are superseded by QUIC transport parameters in HTTP/3. The
+ HTTP-level setting that is retained in HTTP/3 has the same value as
+ in HTTP/2. The superseded settings are reserved, and their receipt
+ is an error. See Section 7.2.4.1 for discussion of both the retained
+ and reserved values.
+
+ Below is a listing of how each HTTP/2 SETTINGS parameter is mapped:
+
+ SETTINGS_HEADER_TABLE_SIZE (0x01): See [QPACK].
+
+ SETTINGS_ENABLE_PUSH (0x02): This is removed in favor of the
+ MAX_PUSH_ID frame, which provides a more granular control over
+ server push. Specifying a setting with the identifier 0x02
+ (corresponding to the SETTINGS_ENABLE_PUSH parameter) in the
+ HTTP/3 SETTINGS frame is an error.
+
+ SETTINGS_MAX_CONCURRENT_STREAMS (0x03): QUIC controls the largest
+ open stream ID as part of its flow-control logic. Specifying a
+ setting with the identifier 0x03 (corresponding to the
+ SETTINGS_MAX_CONCURRENT_STREAMS parameter) in the HTTP/3 SETTINGS
+ frame is an error.
+
+ SETTINGS_INITIAL_WINDOW_SIZE (0x04): QUIC requires both stream and
+ connection flow-control window sizes to be specified in the
+ initial transport handshake. Specifying a setting with the
+ identifier 0x04 (corresponding to the SETTINGS_INITIAL_WINDOW_SIZE
+ parameter) in the HTTP/3 SETTINGS frame is an error.
+
+ SETTINGS_MAX_FRAME_SIZE (0x05): This setting has no equivalent in
+ HTTP/3. Specifying a setting with the identifier 0x05
+ (corresponding to the SETTINGS_MAX_FRAME_SIZE parameter) in the
+ HTTP/3 SETTINGS frame is an error.
+
+ SETTINGS_MAX_HEADER_LIST_SIZE (0x06): This setting identifier has
+ been renamed SETTINGS_MAX_FIELD_SECTION_SIZE.
+
+ In HTTP/3, setting values are variable-length integers (6, 14, 30, or
+ 62 bits long) rather than fixed-length 32-bit fields as in HTTP/2.
+ This will often produce a shorter encoding, but can produce a longer
+ encoding for settings that use the full 32-bit space. Settings
+ ported from HTTP/2 might choose to redefine their value to limit it
+ to 30 bits for more efficient encoding or to make use of the 62-bit
+ space if more than 30 bits are required.
+
+ Settings need to be defined separately for HTTP/2 and HTTP/3. The
+ IDs of settings defined in [HTTP/2] have been reserved for
+ simplicity. Note that the settings identifier space in HTTP/3 is
+ substantially larger (62 bits versus 16 bits), so many HTTP/3
+ settings have no equivalent HTTP/2 code point. See Section 11.2.2.
+
+ As QUIC streams might arrive out of order, endpoints are advised not
+ to wait for the peers' settings to arrive before responding to other
+ streams. See Section 7.2.4.2.
+
+A.4. HTTP/2 Error Codes
+
+ QUIC has the same concepts of "stream" and "connection" errors that
+ HTTP/2 provides. However, the differences between HTTP/2 and HTTP/3
+ mean that error codes are not directly portable between versions.
+
+ The HTTP/2 error codes defined in Section 7 of [HTTP/2] logically map
+ to the HTTP/3 error codes as follows:
+
+ NO_ERROR (0x00): H3_NO_ERROR in Section 8.1.
+
+ PROTOCOL_ERROR (0x01): This is mapped to H3_GENERAL_PROTOCOL_ERROR
+ except in cases where more specific error codes have been defined.
+ Such cases include H3_FRAME_UNEXPECTED, H3_MESSAGE_ERROR, and
+ H3_CLOSED_CRITICAL_STREAM defined in Section 8.1.
+
+ INTERNAL_ERROR (0x02): H3_INTERNAL_ERROR in Section 8.1.
+
+ FLOW_CONTROL_ERROR (0x03): Not applicable, since QUIC handles flow
+ control.
+
+ SETTINGS_TIMEOUT (0x04): Not applicable, since no acknowledgment of
+ SETTINGS is defined.
+
+ STREAM_CLOSED (0x05): Not applicable, since QUIC handles stream
+ management.
+
+ FRAME_SIZE_ERROR (0x06): H3_FRAME_ERROR error code defined in
+ Section 8.1.
+
+ REFUSED_STREAM (0x07): H3_REQUEST_REJECTED (in Section 8.1) is used
+ to indicate that a request was not processed. Otherwise, not
+ applicable because QUIC handles stream management.
+
+ CANCEL (0x08): H3_REQUEST_CANCELLED in Section 8.1.
+
+ COMPRESSION_ERROR (0x09): Multiple error codes are defined in
+ [QPACK].
+
+ CONNECT_ERROR (0x0a): H3_CONNECT_ERROR in Section 8.1.
+
+ ENHANCE_YOUR_CALM (0x0b): H3_EXCESSIVE_LOAD in Section 8.1.
+
+ INADEQUATE_SECURITY (0x0c): Not applicable, since QUIC is assumed to
+ provide sufficient security on all connections.
+
+ HTTP_1_1_REQUIRED (0x0d): H3_VERSION_FALLBACK in Section 8.1.
+
+ Error codes need to be defined for HTTP/2 and HTTP/3 separately. See
+ Section 11.2.3.
+
+A.4.1. Mapping between HTTP/2 and HTTP/3 Errors
+
+ An intermediary that converts between HTTP/2 and HTTP/3 may encounter
+ error conditions from either upstream. It is useful to communicate
+ the occurrence of errors to the downstream, but error codes largely
+ reflect connection-local problems that generally do not make sense to
+ propagate.
+
+ An intermediary that encounters an error from an upstream origin can
+ indicate this by sending an HTTP status code such as 502 (Bad
+ Gateway), which is suitable for a broad class of errors.
+
+ There are some rare cases where it is beneficial to propagate the
+ error by mapping it to the closest matching error type to the
+ receiver. For example, an intermediary that receives an HTTP/2
+ stream error of type REFUSED_STREAM from the origin has a clear
+ signal that the request was not processed and that the request is
+ safe to retry. Propagating this error condition to the client as an
+ HTTP/3 stream error of type H3_REQUEST_REJECTED allows the client to
+ take the action it deems most appropriate. In the reverse direction,
+ the intermediary might deem it beneficial to pass on client request
+ cancellations that are indicated by terminating a stream with
+ H3_REQUEST_CANCELLED; see Section 4.1.1.
+
+ Conversion between errors is described in the logical mapping. The
+ error codes are defined in non-overlapping spaces in order to protect
+ against accidental conversion that could result in the use of
+ inappropriate or unknown error codes for the target version. An
+ intermediary is permitted to promote stream errors to connection
+ errors but they should be aware of the cost to the HTTP/3 connection
+ for what might be a temporary or intermittent error.
+
+Acknowledgments
+
+ Robbie Shade and Mike Warres were the authors of draft-shade-quic-
+ http2-mapping, a precursor of this document.
+
+ The IETF QUIC Working Group received an enormous amount of support
+ from many people. Among others, the following people provided
+ substantial contributions to this document:
+
+ * 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
+
+ A portion of Mike Bishop's contribution was supported by Microsoft
+ during his employment there.
+
+Index
+
+ C D G H M P R S
+
+ C
+
+ CANCEL_PUSH Section 2, Paragraph 5; Section 4.6, Paragraph 6;
+ Section 4.6, Paragraph 10; Table 1; *_Section 7.2.3_*;
+ Section 7.2.5, Paragraph 4.2.1; Section 7.2.7, Paragraph 1;
+ Table 2; Appendix A.2.5, Paragraph 1.8.1
+ connection error Section 2.2; Section 4.1, Paragraph 7;
+ Section 4.1, Paragraph 8; Section 4.4, Paragraph 8;
+ Section 4.4, Paragraph 10; Section 4.6, Paragraph 3;
+ Section 5.2, Paragraph 7; Section 6.1, Paragraph 3;
+ Section 6.2, Paragraph 7; Section 6.2.1, Paragraph 2;
+ Section 6.2.1, Paragraph 2; Section 6.2.1, Paragraph 2;
+ Section 6.2.2, Paragraph 3; Section 6.2.2, Paragraph 6;
+ Section 7.1, Paragraph 5; Section 7.1, Paragraph 6;
+ Section 7.2.1, Paragraph 2; Section 7.2.2, Paragraph 3;
+ Section 7.2.3, Paragraph 5; Section 7.2.3, Paragraph 7;
+ Section 7.2.3, Paragraph 8; Section 7.2.4, Paragraph 2;
+ Section 7.2.4, Paragraph 3; Section 7.2.4, Paragraph 6;
+ Section 7.2.4.1, Paragraph 5; Section 7.2.4.2, Paragraph 8;
+ Section 7.2.4.2, Paragraph 8; Section 7.2.5, Paragraph 5;
+ Section 7.2.5, Paragraph 6; Section 7.2.5, Paragraph 8;
+ Section 7.2.5, Paragraph 9; Section 7.2.6, Paragraph 3;
+ Section 7.2.6, Paragraph 5; Section 7.2.7, Paragraph 2;
+ Section 7.2.7, Paragraph 3; Section 7.2.7, Paragraph 6;
+ Section 7.2.8, Paragraph 3; *_Section 8_*; Section 10.5,
+ Paragraph 7; Appendix A.4.1, Paragraph 4
+ control stream Section 2, Paragraph 3; Section 3.2, Paragraph
+ 4; Section 6.2, Paragraph 3; Section 6.2, Paragraph 5;
+ Section 6.2, Paragraph 6; *_Section 6.2.1_*; Section 7,
+ Paragraph 1; Section 7.2.1, Paragraph 2; Section 7.2.2,
+ Paragraph 3; Section 7.2.3, Paragraph 5; Section 7.2.3,
+ Paragraph 5; Section 7.2.4, Paragraph 2; Section 7.2.4,
+ Paragraph 2; Section 7.2.4, Paragraph 3; Section 7.2.5,
+ Paragraph 8; Section 7.2.6, Paragraph 3; Section 7.2.6,
+ Paragraph 5; Section 7.2.7, Paragraph 2; Section 8.1,
+ Paragraph 2.22.1; Section 9, Paragraph 4; Appendix A.2.4,
+ Paragraph 3; Appendix A.3, Paragraph 1
+
+ D
+
+ DATA Section 2, Paragraph 3; Section 4.1, Paragraph 5, Item 2;
+ Section 4.1, Paragraph 7; Section 4.1, Paragraph 7;
+ Section 4.1.2, Paragraph 3; Section 4.1.2, Paragraph 3;
+ Section 4.4, Paragraph 7; Section 4.4, Paragraph 7;
+ Section 4.4, Paragraph 7; Section 4.4, Paragraph 7;
+ Section 4.4, Paragraph 8; Section 4.6, Paragraph 12;
+ Table 1; *_Section 7.2.1_*; Table 2; Appendix A.1, Paragraph
+ 3; Appendix A.2.3, Paragraph 1; Appendix A.2.5
+
+ G
+
+ GOAWAY Section 3.3, Paragraph 5; Section 5.2, Paragraph 1;
+ Section 5.2, Paragraph 1; Section 5.2, Paragraph 1;
+ Section 5.2, Paragraph 2; Section 5.2, Paragraph 2;
+ Section 5.2, Paragraph 3; Section 5.2, Paragraph 5.1.1;
+ Section 5.2, Paragraph 5.1.1; Section 5.2, Paragraph 5.1.2;
+ Section 5.2, Paragraph 5.1.2; Section 5.2, Paragraph 5, Item
+ 2; Section 5.2, Paragraph 5, Item 2; Section 5.2, Paragraph
+ 6; Section 5.2, Paragraph 6; Section 5.2, Paragraph 7;
+ Section 5.2, Paragraph 7; Section 5.2, Paragraph 8;
+ Section 5.2, Paragraph 8; Section 5.2, Paragraph 9;
+ Section 5.2, Paragraph 9; Section 5.2, Paragraph 10;
+ Section 5.2, Paragraph 12; Section 5.3, Paragraph 2;
+ Section 5.3, Paragraph 2; Section 5.4, Paragraph 2; Table 1;
+ *_Section 7.2.6_*; Table 2; Appendix A.2.5; Appendix A.2.5,
+ Paragraph 1.16.1
+
+ H
+
+ H3_CLOSED_CRITICAL_STREAM Section 6.2.1, Paragraph 2;
+ Section 8.1; Table 4; Appendix A.4, Paragraph 3.4.1
+ H3_CONNECT_ERROR Section 4.4, Paragraph 10; Section 8.1;
+ Table 4; Appendix A.4, Paragraph 3.22.1
+ H3_EXCESSIVE_LOAD Section 8.1; Section 10.5, Paragraph 7;
+ Table 4; Appendix A.4, Paragraph 3.24.1
+ H3_FRAME_ERROR Section 7.1, Paragraph 5; Section 7.1,
+ Paragraph 6; Section 8.1; Table 4; Appendix A.4, Paragraph
+ 3.14.1
+ H3_FRAME_UNEXPECTED Section 4.1, Paragraph 7; Section 4.1,
+ Paragraph 8; Section 4.4, Paragraph 8; Section 7.2.1,
+ Paragraph 2; Section 7.2.2, Paragraph 3; Section 7.2.3,
+ Paragraph 5; Section 7.2.4, Paragraph 2; Section 7.2.4,
+ Paragraph 3; Section 7.2.5, Paragraph 8; Section 7.2.5,
+ Paragraph 9; Section 7.2.6, Paragraph 5; Section 7.2.7,
+ Paragraph 2; Section 7.2.7, Paragraph 3; Section 7.2.8,
+ Paragraph 3; Section 8.1; Table 4; Appendix A.4, Paragraph
+ 3.4.1
+ H3_GENERAL_PROTOCOL_ERROR Section 7.2.5, Paragraph 6;
+ Section 8.1; Table 4; Appendix A.4, Paragraph 3.4.1
+ H3_ID_ERROR Section 4.6, Paragraph 3; Section 5.2, Paragraph
+ 7; Section 6.2.2, Paragraph 6; Section 7.2.3, Paragraph 7;
+ Section 7.2.3, Paragraph 8; Section 7.2.5, Paragraph 5;
+ Section 7.2.6, Paragraph 3; Section 7.2.7, Paragraph 6;
+ Section 8.1; Table 4
+ H3_INTERNAL_ERROR Section 8.1; Table 4; Appendix A.4,
+ Paragraph 3.6.1
+ H3_MESSAGE_ERROR Section 4.1.2, Paragraph 4; Section 8.1;
+ Table 4; Appendix A.4, Paragraph 3.4.1
+ H3_MISSING_SETTINGS Section 6.2.1, Paragraph 2; Section 8.1;
+ Table 4
+ H3_NO_ERROR Section 4.1, Paragraph 15; Section 5.2, Paragraph
+ 11; Section 6.2.3, Paragraph 2; Section 8, Paragraph 5;
+ Section 8.1; Section 8.1, Paragraph 3; Section 8.1,
+ Paragraph 3; Table 4; Appendix A.4, Paragraph 3.2.1
+ H3_REQUEST_CANCELLED Section 4.1.1, Paragraph 4;
+ Section 4.1.1, Paragraph 5; Section 4.6, Paragraph 14;
+ Section 7.2.3, Paragraph 3; Section 7.2.3, Paragraph 4;
+ Section 8.1; Table 4; Appendix A.4, Paragraph 3.18.1;
+ Appendix A.4.1, Paragraph 3
+ H3_REQUEST_INCOMPLETE Section 4.1, Paragraph 14; Section 8.1;
+ Table 4
+ H3_REQUEST_REJECTED Section 4.1.1, Paragraph 3; Section 4.1.1,
+ Paragraph 4; Section 4.1.1, Paragraph 5; Section 4.1.1,
+ Paragraph 5; Section 8.1; Table 4; Appendix A.4, Paragraph
+ 3.16.1; Appendix A.4.1, Paragraph 3
+ H3_SETTINGS_ERROR Section 7.2.4, Paragraph 6; Section 7.2.4.1,
+ Paragraph 5; Section 7.2.4.2, Paragraph 8; Section 7.2.4.2,
+ Paragraph 8; Section 8.1; Table 4
+ H3_STREAM_CREATION_ERROR Section 6.1, Paragraph 3;
+ Section 6.2, Paragraph 7; Section 6.2.1, Paragraph 2;
+ Section 6.2.2, Paragraph 3; Section 8.1; Table 4
+ H3_VERSION_FALLBACK Section 8.1; Table 4; Appendix A.4,
+ Paragraph 3.28.1
+ HEADERS Section 2, Paragraph 3; Section 4.1, Paragraph 5, Item
+ 1; Section 4.1, Paragraph 5, Item 3; Section 4.1, Paragraph
+ 7; Section 4.1, Paragraph 7; Section 4.1, Paragraph 7;
+ Section 4.1, Paragraph 10; Section 4.4, Paragraph 6;
+ Section 4.6, Paragraph 12; Table 1; *_Section 7.2.2_*;
+ Section 9, Paragraph 5; Table 2; Appendix A.2.1, Paragraph
+ 1; Appendix A.2.5; Appendix A.2.5, Paragraph 1.4.1;
+ Appendix A.2.5, Paragraph 1.20.1
+
+ M
+
+ malformed Section 4.1, Paragraph 3; *_Section 4.1.2_*;
+ Section 4.2, Paragraph 2; Section 4.2, Paragraph 3;
+ Section 4.2, Paragraph 5; Section 4.3, Paragraph 3;
+ Section 4.3, Paragraph 4; Section 4.3.1, Paragraph 5;
+ Section 4.3.2, Paragraph 1; Section 4.4, Paragraph 5;
+ Section 8.1, Paragraph 2.30.1; Section 10.3, Paragraph 1;
+ Section 10.3, Paragraph 2; Section 10.5.1, Paragraph 2
+ MAX_PUSH_ID Section 2, Paragraph 5; Section 4.6, Paragraph 3;
+ Section 4.6, Paragraph 3; Section 4.6, Paragraph 3;
+ Section 4.6, Paragraph 3; Table 1; Section 7.2.5, Paragraph
+ 5; *_Section 7.2.7_*; Table 2; Appendix A.1, Paragraph 4;
+ Appendix A.3, Paragraph 4.4.1
+
+ P
+
+ push ID *_Section 4.6_*; Section 5.2, Paragraph 1;
+ Section 5.2, Paragraph 5, Item 2; Section 5.2, Paragraph 9;
+ Section 6.2.2, Paragraph 2; Section 6.2.2, Paragraph 6;
+ Section 6.2.2, Paragraph 6; Section 7.2.3, Paragraph 1;
+ Section 7.2.3, Paragraph 7; Section 7.2.3, Paragraph 7;
+ Section 7.2.3, Paragraph 8; Section 7.2.3, Paragraph 8;
+ Section 7.2.5, Paragraph 4.2.1; Section 7.2.5, Paragraph 5;
+ Section 7.2.5, Paragraph 5; Section 7.2.5, Paragraph 6;
+ Section 7.2.5, Paragraph 6; Section 7.2.5, Paragraph 7;
+ Section 7.2.5, Paragraph 7; Section 7.2.5, Paragraph 7;
+ Section 7.2.6, Paragraph 4; Section 7.2.7, Paragraph 1;
+ Section 7.2.7, Paragraph 4; Section 7.2.7, Paragraph 4;
+ Section 7.2.7, Paragraph 6; Section 7.2.7, Paragraph 6;
+ Section 8.1, Paragraph 2.18.1; Appendix A.2.5, Paragraph
+ 1.12.1; Appendix A.2.5, Paragraph 1.16.1
+ push stream Section 4.1, Paragraph 8; Section 4.1, Paragraph
+ 9; Section 4.6, Paragraph 3; Section 4.6, Paragraph 5;
+ Section 4.6, Paragraph 5; Section 4.6, Paragraph 13;
+ Section 4.6, Paragraph 13; Section 4.6, Paragraph 13;
+ Section 6.2, Paragraph 3; *_Section 6.2.2_*; Section 7,
+ Paragraph 1; Section 7.2.2, Paragraph 3; Section 7.2.3,
+ Paragraph 1; Section 7.2.3, Paragraph 2; Section 7.2.3,
+ Paragraph 2; Section 7.2.3, Paragraph 2; Section 7.2.3,
+ Paragraph 2; Section 7.2.3, Paragraph 3; Section 7.2.3,
+ Paragraph 4; Section 7.2.3, Paragraph 4; Section 7.2.3,
+ Paragraph 4; Section 7.2.5, Paragraph 4.2.1; Section 7.2.7,
+ Paragraph 1; Appendix A.2.5, Paragraph 1.12.1
+ PUSH_PROMISE Section 2, Paragraph 5; Section 4.1, Paragraph 8;
+ Section 4.1, Paragraph 8; Section 4.1, Paragraph 8;
+ Section 4.1, Paragraph 8; Section 4.1, Paragraph 10;
+ Section 4.6, Paragraph 4; Section 4.6, Paragraph 10;
+ Section 4.6, Paragraph 11; Section 4.6, Paragraph 11;
+ Section 4.6, Paragraph 12; Section 4.6, Paragraph 12;
+ Section 4.6, Paragraph 13; Section 4.6, Paragraph 13;
+ Section 4.6, Paragraph 13; Table 1; Section 7.2.3, Paragraph
+ 8; Section 7.2.3, Paragraph 8; *_Section 7.2.5_*;
+ Section 7.2.7, Paragraph 1; Section 10.4, Paragraph 1;
+ Section 10.5, Paragraph 2; Table 2; Appendix A.2.5;
+ Appendix A.2.5, Paragraph 1.12.1; Appendix A.2.5, Paragraph
+ 1.12.1; Appendix A.2.5, Paragraph 1.20.1
+
+ R
+
+ request stream Section 4.1, Paragraph 1; Section 4.1,
+ Paragraph 15; Section 4.1, Paragraph 15; Section 4.1.1,
+ Paragraph 1; Section 4.1.1, Paragraph 5; Section 4.4,
+ Paragraph 5; Section 4.4, Paragraph 9; Section 4.6,
+ Paragraph 4; Section 4.6, Paragraph 4; Section 4.6,
+ Paragraph 11; Section 4.6, Paragraph 11; *_Section 6.1_*;
+ Section 7, Paragraph 1; Section 7.2.2, Paragraph 3;
+ Section 7.2.5, Paragraph 1
+
+ S
+
+ SETTINGS Section 3.2, Paragraph 4; Section 3.2, Paragraph 4;
+ Section 6.2.1, Paragraph 2; Table 1; Section 7, Paragraph 3;
+ *_Section 7.2.4_*; Section 8.1, Paragraph 2.20.1;
+ Section 8.1, Paragraph 2.22.1; Section 9, Paragraph 4;
+ Section 10.5, Paragraph 4; Table 2; Table 4; Table 4;
+ Appendix A.2.5; Appendix A.2.5, Paragraph 1.10.1;
+ Appendix A.3, Paragraph 2; Appendix A.3, Paragraph 3;
+ Appendix A.3, Paragraph 4.4.1; Appendix A.3, Paragraph
+ 4.6.1; Appendix A.3, Paragraph 4.8.1; Appendix A.3,
+ Paragraph 4.10.1; Appendix A.4, Paragraph 3.10.1
+ SETTINGS_MAX_FIELD_SECTION_SIZE Section 4.2.2, Paragraph 2;
+ Section 7.2.4.1; Section 10.5.1, Paragraph 2; Appendix A.3,
+ Paragraph 4.12.1
+ stream error Section 2.2; Section 4.1.2, Paragraph 4;
+ Section 4.4, Paragraph 10; *_Section 8_*; Appendix A.4.1,
+ Paragraph 3; Appendix A.4.1, Paragraph 3; Appendix A.4.1,
+ Paragraph 4
+
+Author's Address
+
+ Mike Bishop (editor)
+ Akamai
+ Email: mbishop@evequefou.be