summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9113.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9113.txt')
-rw-r--r--doc/rfc/rfc9113.txt4188
1 files changed, 4188 insertions, 0 deletions
diff --git a/doc/rfc/rfc9113.txt b/doc/rfc/rfc9113.txt
new file mode 100644
index 0000000..1996ea2
--- /dev/null
+++ b/doc/rfc/rfc9113.txt
@@ -0,0 +1,4188 @@
+
+
+
+
+Internet Engineering Task Force (IETF) M. Thomson, Ed.
+Request for Comments: 9113 Mozilla
+Obsoletes: 7540, 8740 C. Benfield, Ed.
+Category: Standards Track Apple Inc.
+ISSN: 2070-1721 June 2022
+
+
+ HTTP/2
+
+Abstract
+
+ This specification describes an optimized expression of the semantics
+ of the Hypertext Transfer Protocol (HTTP), referred to as HTTP
+ version 2 (HTTP/2). HTTP/2 enables a more efficient use of network
+ resources and a reduced latency by introducing field compression and
+ allowing multiple concurrent exchanges on the same connection.
+
+ This document obsoletes RFCs 7540 and 8740.
+
+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/rfc9113.
+
+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
+ 2. HTTP/2 Protocol Overview
+ 2.1. Document Organization
+ 2.2. Conventions and Terminology
+ 3. Starting HTTP/2
+ 3.1. HTTP/2 Version Identification
+ 3.2. Starting HTTP/2 for "https" URIs
+ 3.3. Starting HTTP/2 with Prior Knowledge
+ 3.4. HTTP/2 Connection Preface
+ 4. HTTP Frames
+ 4.1. Frame Format
+ 4.2. Frame Size
+ 4.3. Field Section Compression and Decompression
+ 4.3.1. Compression State
+ 5. Streams and Multiplexing
+ 5.1. Stream States
+ 5.1.1. Stream Identifiers
+ 5.1.2. Stream Concurrency
+ 5.2. Flow Control
+ 5.2.1. Flow-Control Principles
+ 5.2.2. Appropriate Use of Flow Control
+ 5.2.3. Flow-Control Performance
+ 5.3. Prioritization
+ 5.3.1. Background on Priority in RFC 7540
+ 5.3.2. Priority Signaling in This Document
+ 5.4. Error Handling
+ 5.4.1. Connection Error Handling
+ 5.4.2. Stream Error Handling
+ 5.4.3. Connection Termination
+ 5.5. Extending HTTP/2
+ 6. Frame Definitions
+ 6.1. DATA
+ 6.2. HEADERS
+ 6.3. PRIORITY
+ 6.4. RST_STREAM
+ 6.5. SETTINGS
+ 6.5.1. SETTINGS Format
+ 6.5.2. Defined Settings
+ 6.5.3. Settings Synchronization
+ 6.6. PUSH_PROMISE
+ 6.7. PING
+ 6.8. GOAWAY
+ 6.9. WINDOW_UPDATE
+ 6.9.1. The Flow-Control Window
+ 6.9.2. Initial Flow-Control Window Size
+ 6.9.3. Reducing the Stream Window Size
+ 6.10. CONTINUATION
+ 7. Error Codes
+ 8. Expressing HTTP Semantics in HTTP/2
+ 8.1. HTTP Message Framing
+ 8.1.1. Malformed Messages
+ 8.2. HTTP Fields
+ 8.2.1. Field Validity
+ 8.2.2. Connection-Specific Header Fields
+ 8.2.3. Compressing the Cookie Header Field
+ 8.3. HTTP Control Data
+ 8.3.1. Request Pseudo-Header Fields
+ 8.3.2. Response Pseudo-Header Fields
+ 8.4. Server Push
+ 8.4.1. Push Requests
+ 8.4.2. Push Responses
+ 8.5. The CONNECT Method
+ 8.6. The Upgrade Header Field
+ 8.7. Request Reliability
+ 8.8. Examples
+ 8.8.1. Simple Request
+ 8.8.2. Simple Response
+ 8.8.3. Complex Request
+ 8.8.4. Response with Body
+ 8.8.5. Informational Responses
+ 9. HTTP/2 Connections
+ 9.1. Connection Management
+ 9.1.1. Connection Reuse
+ 9.2. Use of TLS Features
+ 9.2.1. TLS 1.2 Features
+ 9.2.2. TLS 1.2 Cipher Suites
+ 9.2.3. TLS 1.3 Features
+ 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 Block Size
+ 10.5.2. CONNECT Issues
+ 10.6. Use of Compression
+ 10.7. Use of Padding
+ 10.8. Privacy Considerations
+ 10.9. Remote Timing Attacks
+ 11. IANA Considerations
+ 11.1. HTTP2-Settings Header Field Registration
+ 11.2. The h2c Upgrade Token
+ 12. References
+ 12.1. Normative References
+ 12.2. Informative References
+ Appendix A. Prohibited TLS 1.2 Cipher Suites
+ Appendix B. Changes from RFC 7540
+ Acknowledgments
+ Contributors
+ Authors' Addresses
+
+1. Introduction
+
+ The performance of applications using the Hypertext Transfer Protocol
+ (HTTP, [HTTP]) is linked to how each version of HTTP uses the
+ underlying transport, and the conditions under which the transport
+ operates.
+
+ Making multiple concurrent requests can reduce latency and improve
+ application performance. HTTP/1.0 allowed only one request to be
+ outstanding at a time on a given TCP [TCP] connection. HTTP/1.1
+ [HTTP/1.1] added request pipelining, but this only partially
+ addressed request concurrency and still suffers from application-
+ layer head-of-line blocking. Therefore, HTTP/1.0 and HTTP/1.1
+ clients use multiple connections to a server to make concurrent
+ requests.
+
+ Furthermore, HTTP fields are often repetitive and verbose, causing
+ unnecessary network traffic as well as causing the initial TCP
+ congestion window to quickly fill. This can result in excessive
+ latency when multiple requests are made on a new TCP connection.
+
+ HTTP/2 addresses these issues by defining an optimized mapping of
+ HTTP's semantics to an underlying connection. Specifically, it
+ allows interleaving of messages on the same connection and uses an
+ efficient coding for HTTP fields. It also allows prioritization of
+ requests, letting more important requests complete more quickly,
+ further improving performance.
+
+ The resulting protocol is more friendly to the network because fewer
+ TCP connections can be used in comparison to HTTP/1.x. This means
+ less competition with other flows and longer-lived connections, which
+ in turn lead to better utilization of available network capacity.
+ Note, however, that TCP head-of-line blocking is not addressed by
+ this protocol.
+
+ Finally, HTTP/2 also enables more efficient processing of messages
+ through use of binary message framing.
+
+ This document obsoletes RFCs 7540 and 8740. Appendix B lists notable
+ changes.
+
+2. HTTP/2 Protocol Overview
+
+ HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2
+ supports all of the core features of HTTP but aims to be more
+ efficient than HTTP/1.1.
+
+ HTTP/2 is a connection-oriented application-layer protocol that runs
+ over a TCP connection ([TCP]). The client is the TCP connection
+ initiator.
+
+ The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each
+ frame type serves a different purpose. For example, HEADERS and DATA
+ frames form the basis of HTTP requests and responses (Section 8.1);
+ other frame types like SETTINGS, WINDOW_UPDATE, and PUSH_PROMISE are
+ used in support of other HTTP/2 features.
+
+ Multiplexing of requests is achieved by having each HTTP request/
+ response exchange associated with its own stream (Section 5).
+ Streams are largely independent of each other, so a blocked or
+ stalled request or response does not prevent progress on other
+ streams.
+
+ Effective use of multiplexing depends on flow control and
+ prioritization. Flow control (Section 5.2) ensures that it is
+ possible to efficiently use multiplexed streams by restricting data
+ that is transmitted to what the receiver is able to handle.
+ Prioritization (Section 5.3) ensures that limited resources are used
+ most effectively. This revision of HTTP/2 deprecates the priority
+ signaling scheme from [RFC7540].
+
+ Because HTTP fields used in a connection can contain large amounts of
+ redundant data, frames that contain them are compressed
+ (Section 4.3). This has especially advantageous impact upon request
+ sizes in the common case, allowing many requests to be compressed
+ into one packet.
+
+ Finally, HTTP/2 adds a new, optional interaction mode whereby a
+ server can push responses to a client (Section 8.4). This is
+ intended to allow a server to speculatively send data to a client
+ that the server anticipates the client will need, trading off some
+ network usage against a potential latency gain. The server does this
+ by synthesizing a request, which it sends as a PUSH_PROMISE frame.
+ The server is then able to send a response to the synthetic request
+ on a separate stream.
+
+2.1. Document Organization
+
+ The HTTP/2 specification is split into four parts:
+
+ * Starting HTTP/2 (Section 3) covers how an HTTP/2 connection is
+ initiated.
+
+ * The frame (Section 4) and stream (Section 5) layers describe the
+ way HTTP/2 frames are structured and formed into multiplexed
+ streams.
+
+ * Frame (Section 6) and error (Section 7) definitions include
+ details of the frame and error types used in HTTP/2.
+
+ * HTTP mappings (Section 8) and additional requirements (Section 9)
+ describe how HTTP semantics are expressed using frames and
+ streams.
+
+ While some of the frame- and stream-layer concepts are isolated from
+ HTTP, this specification does not define a completely generic frame
+ layer. The frame and stream layers are tailored to the needs of
+ HTTP.
+
+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.
+
+ All numeric values are in network byte order. Values are unsigned
+ unless otherwise indicated. Literal values are provided in decimal
+ or hexadecimal as appropriate. Hexadecimal literals are prefixed
+ with "0x" to distinguish them from decimal literals.
+
+ This specification describes binary formats using the conventions
+ described in Section 1.3 of RFC 9000 [QUIC]. Note that this format
+ uses network byte order and that high-valued bits are listed before
+ low-valued bits.
+
+ The following terms are used:
+
+ client: The endpoint that initiates an HTTP/2 connection. Clients
+ send HTTP requests and receive HTTP responses.
+
+ connection: A transport-layer connection between two endpoints.
+
+ connection error: An error that affects the entire HTTP/2
+ connection.
+
+ endpoint: Either the client or server of the connection.
+
+ frame: The smallest unit of communication within an HTTP/2
+ connection, consisting of a header and a variable-length sequence
+ of octets structured according to the frame type.
+
+ 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/2 connection. Servers
+ receive HTTP requests and send HTTP responses.
+
+ stream: A bidirectional flow of frames within the HTTP/2 connection.
+
+ stream error: An error on the individual HTTP/2 stream.
+
+ Finally, the terms "gateway", "intermediary", "proxy", and "tunnel"
+ are defined in Section 3.7 of [HTTP]. Intermediaries act as both
+ client and server at different times.
+
+ The term "content" as it applies to message bodies is defined in
+ Section 6.4 of [HTTP].
+
+3. Starting HTTP/2
+
+ Implementations that generate HTTP requests need to discover whether
+ a server supports HTTP/2.
+
+ HTTP/2 uses the "http" and "https" URI schemes defined in Section 4.2
+ of [HTTP], with the same default port numbers as HTTP/1.1 [HTTP/1.1].
+ These URIs do not include any indication about what HTTP versions an
+ upstream server (the immediate peer to which the client wishes to
+ establish a connection) supports.
+
+ The means by which support for HTTP/2 is determined is different for
+ "http" and "https" URIs. Discovery for "https" URIs is described in
+ Section 3.2. HTTP/2 support for "http" URIs can only be discovered
+ by out-of-band means and requires prior knowledge of the support as
+ described in Section 3.3.
+
+3.1. HTTP/2 Version Identification
+
+ The protocol defined in this document has two identifiers. Creating
+ a connection based on either implies the use of the transport,
+ framing, and message semantics described in this document.
+
+ * The string "h2" identifies the protocol where HTTP/2 uses
+ Transport Layer Security (TLS); see Section 9.2. This identifier
+ is used in the TLS Application-Layer Protocol Negotiation (ALPN)
+ extension [TLS-ALPN] field and in any place where HTTP/2 over TLS
+ is identified.
+
+ The "h2" string is serialized into an ALPN protocol identifier as
+ the two-octet sequence: 0x68, 0x32.
+
+ * The "h2c" string was previously used as a token for use in the
+ HTTP Upgrade mechanism's Upgrade header field (Section 7.8 of
+ [HTTP]). This usage was never widely deployed and is deprecated
+ by this document. The same applies to the HTTP2-Settings header
+ field, which was used with the upgrade to "h2c".
+
+3.2. Starting HTTP/2 for "https" URIs
+
+ A client that makes a request to an "https" URI uses TLS [TLS13] with
+ the ALPN extension [TLS-ALPN].
+
+ HTTP/2 over TLS uses the "h2" protocol identifier. The "h2c"
+ protocol identifier MUST NOT be sent by a client or selected by a
+ server; the "h2c" protocol identifier describes a protocol that does
+ not use TLS.
+
+ Once TLS negotiation is complete, both the client and the server MUST
+ send a connection preface (Section 3.4).
+
+3.3. Starting HTTP/2 with Prior Knowledge
+
+ A client can learn that a particular server supports HTTP/2 by other
+ means. For example, a client could be configured with knowledge that
+ a server supports HTTP/2.
+
+ A client that knows that a server supports HTTP/2 can establish a TCP
+ connection and send the connection preface (Section 3.4) followed by
+ HTTP/2 frames. Servers can identify these connections by the
+ presence of the connection preface. This only affects the
+ establishment of HTTP/2 connections over cleartext TCP; HTTP/2
+ connections over TLS MUST use protocol negotiation in TLS [TLS-ALPN].
+
+ Likewise, the server MUST send a connection preface (Section 3.4).
+
+ Without additional information, prior support for HTTP/2 is not a
+ strong signal that a given server will support HTTP/2 for future
+ connections. For example, it is possible for server configurations
+ to change, for configurations to differ between instances in
+ clustered servers, or for network conditions to change.
+
+3.4. HTTP/2 Connection Preface
+
+ In HTTP/2, each endpoint is required to send a connection preface as
+ a final confirmation of the protocol in use and to establish the
+ initial settings for the HTTP/2 connection. The client and server
+ each send a different connection preface.
+
+ The client connection preface starts with a sequence of 24 octets,
+ which in hex notation is:
+
+ 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
+
+ That is, the connection preface starts with the string "PRI *
+ HTTP/2.0\r\n\r\nSM\r\n\r\n". This sequence MUST be followed by a
+ SETTINGS frame (Section 6.5), which MAY be empty. The client sends
+ the client connection preface as the first application data octets of
+ a connection.
+
+ | Note: The client connection preface is selected so that a large
+ | proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries
+ | do not attempt to process further frames. Note that this does
+ | not address the concerns raised in [TALKING].
+
+ The server connection preface consists of a potentially empty
+ SETTINGS frame (Section 6.5) that MUST be the first frame the server
+ sends in the HTTP/2 connection.
+
+ The SETTINGS frames received from a peer as part of the connection
+ preface MUST be acknowledged (see Section 6.5.3) after sending the
+ connection preface.
+
+ To avoid unnecessary latency, clients are permitted to send
+ additional frames to the server immediately after sending the client
+ connection preface, without waiting to receive the server connection
+ preface. It is important to note, however, that the server
+ connection preface SETTINGS frame might include settings that
+ necessarily alter how a client is expected to communicate with the
+ server. Upon receiving the SETTINGS frame, the client is expected to
+ honor any settings established. In some configurations, it is
+ possible for the server to transmit SETTINGS before the client sends
+ additional frames, providing an opportunity to avoid this issue.
+
+ Clients and servers MUST treat an invalid connection preface as a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR. A GOAWAY
+ frame (Section 6.8) MAY be omitted in this case, since an invalid
+ preface indicates that the peer is not using HTTP/2.
+
+4. HTTP Frames
+
+ Once the HTTP/2 connection is established, endpoints can begin
+ exchanging frames.
+
+4.1. Frame Format
+
+ All frames begin with a fixed 9-octet header followed by a variable-
+ length frame payload.
+
+ HTTP Frame {
+ Length (24),
+ Type (8),
+
+ Flags (8),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ Frame Payload (..),
+ }
+
+ Figure 1: Frame Layout
+
+ The fields of the frame header are defined as:
+
+ Length: The length of the frame payload expressed as an unsigned
+ 24-bit integer in units of octets. Values greater than 2^14
+ (16,384) MUST NOT be sent unless the receiver has set a larger
+ value for SETTINGS_MAX_FRAME_SIZE.
+
+ The 9 octets of the frame header are not included in this value.
+
+ Type: The 8-bit type of the frame. The frame type determines the
+ format and semantics of the frame. Frames defined in this
+ document are listed in Section 6. Implementations MUST ignore and
+ discard frames of unknown types.
+
+ Flags: An 8-bit field reserved for boolean flags specific to the
+ frame type.
+
+ Flags are assigned semantics specific to the indicated frame type.
+ Unused flags are those that have no defined semantics for a
+ particular frame type. Unused flags MUST be ignored on receipt
+ and MUST be left unset (0x00) when sending.
+
+ Reserved: A reserved 1-bit field. The semantics of this bit are
+ undefined, and the bit MUST remain unset (0x00) when sending and
+ MUST be ignored when receiving.
+
+ Stream Identifier: A stream identifier (see Section 5.1.1) expressed
+ as an unsigned 31-bit integer. The value 0x00 is reserved for
+ frames that are associated with the connection as a whole as
+ opposed to an individual stream.
+
+ The structure and content of the frame payload are dependent entirely
+ on the frame type.
+
+4.2. Frame Size
+
+ The size of a frame payload is limited by the maximum size that a
+ receiver advertises in the SETTINGS_MAX_FRAME_SIZE setting. This
+ setting can have any value between 2^14 (16,384) and 2^24-1
+ (16,777,215) octets, inclusive.
+
+ All implementations MUST be capable of receiving and minimally
+ processing frames up to 2^14 octets in length, plus the 9-octet frame
+ header (Section 4.1). The size of the frame header is not included
+ when describing frame sizes.
+
+ | Note: Certain frame types, such as PING (Section 6.7), impose
+ | additional limits on the amount of frame payload data allowed.
+
+ An endpoint MUST send an error code of FRAME_SIZE_ERROR if a frame
+ exceeds the size defined in SETTINGS_MAX_FRAME_SIZE, exceeds any
+ limit defined for the frame type, or is too small to contain
+ mandatory frame data. A frame size error in a frame that could alter
+ the state of the entire connection MUST be treated as a connection
+ error (Section 5.4.1); this includes any frame carrying a field block
+ (Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), a
+ SETTINGS frame, and any frame with a stream identifier of 0.
+
+ Endpoints are not obligated to use all available space in a frame.
+ Responsiveness can be improved by using frames that are smaller than
+ the permitted maximum size. Sending large frames can result in
+ delays in sending time-sensitive frames (such as RST_STREAM,
+ WINDOW_UPDATE, or PRIORITY), which, if blocked by the transmission of
+ a large frame, could affect performance.
+
+4.3. Field Section Compression and Decompression
+
+ Field section compression is the process of compressing a set of
+ field lines (Section 5.2 of [HTTP]) to form a field block. Field
+ section decompression is the process of decoding a field block into a
+ set of field lines. Details of HTTP/2 field section compression and
+ decompression are defined in [COMPRESSION], which, for historical
+ reasons, refers to these processes as header compression and
+ decompression.
+
+ Each field block carries all of the compressed field lines of a
+ single field section. Header sections also include control data
+ associated with the message in the form of pseudo-header fields
+ (Section 8.3) that use the same format as a field line.
+
+ | Note: RFC 7540 [RFC7540] used the term "header block" in place
+ | of the more generic "field block".
+
+ Field blocks carry control data and header sections for requests,
+ responses, promised requests, and pushed responses (see Section 8.4).
+ All these messages, except for interim responses and requests
+ contained in PUSH_PROMISE (Section 6.6) frames, can optionally
+ include a field block that carries a trailer section.
+
+ A field section is a collection of field lines. Each of the field
+ lines in a field block carries a single value. The serialized field
+ block is then divided into one or more octet sequences, called field
+ block fragments. The first field block fragment is transmitted
+ within the frame payload of HEADERS (Section 6.2) or PUSH_PROMISE
+ (Section 6.6), each of which could be followed by CONTINUATION
+ (Section 6.10) frames to carry subsequent field block fragments.
+
+ The Cookie header field [COOKIE] is treated specially by the HTTP
+ mapping (see Section 8.2.3).
+
+ A receiving endpoint reassembles the field block by concatenating its
+ fragments and then decompresses the block to reconstruct the field
+ section.
+
+ A complete field section consists of either:
+
+ * a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag
+ set, or
+
+ * a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag unset
+ and one or more CONTINUATION frames, where the last CONTINUATION
+ frame has the END_HEADERS flag set.
+
+ Each field block is processed as a discrete unit. Field blocks MUST
+ be transmitted as a contiguous sequence of frames, with no
+ interleaved frames of any other type or from any other stream. The
+ last frame in a sequence of HEADERS or CONTINUATION frames has the
+ END_HEADERS flag set. The last frame in a sequence of PUSH_PROMISE
+ or CONTINUATION frames has the END_HEADERS flag set. This allows a
+ field block to be logically equivalent to a single frame.
+
+ Field block fragments can only be sent as the frame payload of
+ HEADERS, PUSH_PROMISE, or CONTINUATION frames because these frames
+ carry data that can modify the compression context maintained by a
+ receiver. An endpoint receiving HEADERS, PUSH_PROMISE, or
+ CONTINUATION frames needs to reassemble field blocks and perform
+ decompression even if the frames are to be discarded. A receiver
+ MUST terminate the connection with a connection error (Section 5.4.1)
+ of type COMPRESSION_ERROR if it does not decompress a field block.
+
+ A decoding error in a field block MUST be treated as a connection
+ error (Section 5.4.1) of type COMPRESSION_ERROR.
+
+4.3.1. Compression State
+
+ Field compression is stateful. Each endpoint has an HPACK encoder
+ context and an HPACK decoder context that are used for encoding and
+ decoding all field blocks on a connection. Section 4 of
+ [COMPRESSION] defines the dynamic table, which is the primary state
+ for each context.
+
+ The dynamic table has a maximum size that is set by an HPACK decoder.
+ An endpoint communicates the size chosen by its HPACK decoder context
+ using the SETTINGS_HEADER_TABLE_SIZE setting; see Section 6.5.2.
+ When a connection is established, the dynamic table size for the
+ HPACK decoder and encoder at both endpoints starts at 4,096 bytes,
+ the initial value of the SETTINGS_HEADER_TABLE_SIZE setting.
+
+ Any change to the maximum value set using SETTINGS_HEADER_TABLE_SIZE
+ takes effect when the endpoint acknowledges settings (Section 6.5.3).
+ The HPACK encoder at that endpoint can set the dynamic table to any
+ size up to the maximum value set by the decoder. An HPACK encoder
+ declares the size of the dynamic table with a Dynamic Table Size
+ Update instruction (Section 6.3 of [COMPRESSION]).
+
+ Once an endpoint acknowledges a change to SETTINGS_HEADER_TABLE_SIZE
+ that reduces the maximum below the current size of the dynamic table,
+ its HPACK encoder MUST start the next field block with a Dynamic
+ Table Size Update instruction that sets the dynamic table to a size
+ that is less than or equal to the reduced maximum; see Section 4.2 of
+ [COMPRESSION]. An endpoint MUST treat a field block that follows an
+ acknowledgment of the reduction to the maximum dynamic table size as
+ a connection error (Section 5.4.1) of type COMPRESSION_ERROR if it
+ does not start with a conformant Dynamic Table Size Update
+ instruction.
+
+ | Implementers are advised that reducing the value of
+ | SETTINGS_HEADER_TABLE_SIZE is not widely interoperable. Use of
+ | the connection preface to reduce the value below the initial
+ | value of 4,096 is somewhat better supported, but this might
+ | fail with some implementations.
+
+5. Streams and Multiplexing
+
+ A "stream" is an independent, bidirectional sequence of frames
+ exchanged between the client and server within an HTTP/2 connection.
+ Streams have several important characteristics:
+
+ * A single HTTP/2 connection can contain multiple concurrently open
+ streams, with either endpoint interleaving frames from multiple
+ streams.
+
+ * Streams can be established and used unilaterally or shared by
+ either endpoint.
+
+ * Streams can be closed by either endpoint.
+
+ * The order in which frames are sent is significant. Recipients
+ process frames in the order they are received. In particular, the
+ order of HEADERS and DATA frames is semantically significant.
+
+ * Streams are identified by an integer. Stream identifiers are
+ assigned to streams by the endpoint initiating the stream.
+
+5.1. Stream States
+
+ The lifecycle of a stream is shown in Figure 2.
+
+ +--------+
+ send PP | | recv PP
+ ,--------+ idle +--------.
+ / | | \
+ v +--------+ v
+ +----------+ | +----------+
+ | | | send H / | |
+ ,------+ reserved | | recv H | reserved +------.
+ | | (local) | | | (remote) | |
+ | +---+------+ v +------+---+ |
+ | | +--------+ | |
+ | | recv ES | | send ES | |
+ | send H | ,-------+ open +-------. | recv H |
+ | | / | | \ | |
+ | v v +---+----+ v v |
+ | +----------+ | +----------+ |
+ | | half- | | | half- | |
+ | | closed | | send R / | closed | |
+ | | (remote) | | recv R | (local) | |
+ | +----+-----+ | +-----+----+ |
+ | | | | |
+ | | send ES / | recv ES / | |
+ | | send R / v send R / | |
+ | | recv R +--------+ recv R | |
+ | send R / `----------->| |<-----------' send R / |
+ | recv R | closed | recv R |
+ `----------------------->| |<-----------------------'
+ +--------+
+
+ Figure 2: Stream States
+
+ send: endpoint sends this frame
+ recv: endpoint receives this frame
+ H: HEADERS frame (with implied CONTINUATION frames)
+ ES: END_STREAM flag
+ R: RST_STREAM frame
+ PP: PUSH_PROMISE frame (with implied CONTINUATION frames); state
+ transitions are for the promised stream
+
+ Note that this diagram shows stream state transitions and the frames
+ and flags that affect those transitions only. In this regard,
+ CONTINUATION frames do not result in state transitions; they are
+ effectively part of the HEADERS or PUSH_PROMISE that they follow.
+ For the purpose of state transitions, the END_STREAM flag is
+ processed as a separate event to the frame that bears it; a HEADERS
+ frame with the END_STREAM flag set can cause two state transitions.
+
+ Both endpoints have a subjective view of the state of a stream that
+ could be different when frames are in transit. Endpoints do not
+ coordinate the creation of streams; they are created unilaterally by
+ either endpoint. The negative consequences of a mismatch in states
+ are limited to the "closed" state after sending RST_STREAM, where
+ frames might be received for some time after closing.
+
+ Streams have the following states:
+
+ idle: All streams start in the "idle" state.
+
+ The following transitions are valid from this state:
+
+ * Sending a HEADERS frame as a client, or receiving a HEADERS
+ frame as a server, causes the stream to become "open". The
+ stream identifier is selected as described in Section 5.1.1.
+ The same HEADERS frame can also cause a stream to immediately
+ become "half-closed".
+
+ * Sending a PUSH_PROMISE frame on another stream reserves the
+ idle stream that is identified for later use. The stream state
+ for the reserved stream transitions to "reserved (local)".
+ Only a server may send PUSH_PROMISE frames.
+
+ * Receiving a PUSH_PROMISE frame on another stream reserves an
+ idle stream that is identified for later use. The stream state
+ for the reserved stream transitions to "reserved (remote)".
+ Only a client may receive PUSH_PROMISE frames.
+
+ * Note that the PUSH_PROMISE frame is not sent on the idle stream
+ but references the newly reserved stream in the Promised Stream
+ ID field.
+
+ * Opening a stream with a higher-valued stream identifier causes
+ the stream to transition immediately to a "closed" state; note
+ that this transition is not shown in the diagram.
+
+ Receiving any frame other than HEADERS or PRIORITY on a stream in
+ this state MUST be treated as a connection error (Section 5.4.1)
+ of type PROTOCOL_ERROR. If this stream is initiated by the
+ server, as described in Section 5.1.1, then receiving a HEADERS
+ frame MUST also be treated as a connection error (Section 5.4.1)
+ of type PROTOCOL_ERROR.
+
+ reserved (local): A stream in the "reserved (local)" state is one
+ that has been promised by sending a PUSH_PROMISE frame. A
+ PUSH_PROMISE frame reserves an idle stream by associating the
+ stream with an open stream that was initiated by the remote peer
+ (see Section 8.4).
+
+ In this state, only the following transitions are possible:
+
+ * The endpoint can send a HEADERS frame. This causes the stream
+ to open in a "half-closed (remote)" state.
+
+ * Either endpoint can send a RST_STREAM frame to cause the stream
+ to become "closed". This releases the stream reservation.
+
+ An endpoint MUST NOT send any type of frame other than HEADERS,
+ RST_STREAM, or PRIORITY in this state.
+
+ A PRIORITY or WINDOW_UPDATE frame MAY be received in this state.
+ Receiving any type of frame other than RST_STREAM, PRIORITY, or
+ WINDOW_UPDATE on a stream in this state MUST be treated as a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ reserved (remote): A stream in the "reserved (remote)" state has
+ been reserved by a remote peer.
+
+ In this state, only the following transitions are possible:
+
+ * Receiving a HEADERS frame causes the stream to transition to
+ "half-closed (local)".
+
+ * Either endpoint can send a RST_STREAM frame to cause the stream
+ to become "closed". This releases the stream reservation.
+
+ An endpoint MUST NOT send any type of frame other than RST_STREAM,
+ WINDOW_UPDATE, or PRIORITY in this state.
+
+ Receiving any type of frame other than HEADERS, RST_STREAM, or
+ PRIORITY on a stream in this state MUST be treated as a connection
+ error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ open: A stream in the "open" state may be used by both peers to send
+ frames of any type. In this state, sending peers observe
+ advertised stream-level flow-control limits (Section 5.2).
+
+ From this state, either endpoint can send a frame with an
+ END_STREAM flag set, which causes the stream to transition into
+ one of the "half-closed" states. An endpoint sending an
+ END_STREAM flag causes the stream state to become "half-closed
+ (local)"; an endpoint receiving an END_STREAM flag causes the
+ stream state to become "half-closed (remote)".
+
+ Either endpoint can send a RST_STREAM frame from this state,
+ causing it to transition immediately to "closed".
+
+ half-closed (local): A stream that is in the "half-closed (local)"
+ state cannot be used for sending frames other than WINDOW_UPDATE,
+ PRIORITY, and RST_STREAM.
+
+ A stream transitions from this state to "closed" when a frame is
+ received with the END_STREAM flag set or when either peer sends a
+ RST_STREAM frame.
+
+ An endpoint can receive any type of frame in this state.
+ Providing flow-control credit using WINDOW_UPDATE frames is
+ necessary to continue receiving flow-controlled frames. In this
+ state, a receiver can ignore WINDOW_UPDATE frames, which might
+ arrive for a short period after a frame with the END_STREAM flag
+ set is sent.
+
+ PRIORITY frames can be received in this state.
+
+ half-closed (remote): A stream that is "half-closed (remote)" is no
+ longer being used by the peer to send frames. In this state, an
+ endpoint is no longer obligated to maintain a receiver flow-
+ control window.
+
+ If an endpoint receives additional frames, other than
+ WINDOW_UPDATE, PRIORITY, or RST_STREAM, for a stream that is in
+ this state, it MUST respond with a stream error (Section 5.4.2) of
+ type STREAM_CLOSED.
+
+ A stream that is "half-closed (remote)" can be used by the
+ endpoint to send frames of any type. In this state, the endpoint
+ continues to observe advertised stream-level flow-control limits
+ (Section 5.2).
+
+ A stream can transition from this state to "closed" by sending a
+ frame with the END_STREAM flag set or when either peer sends a
+ RST_STREAM frame.
+
+ closed: The "closed" state is the terminal state.
+
+ A stream enters the "closed" state after an endpoint both sends
+ and receives a frame with an END_STREAM flag set. A stream also
+ enters the "closed" state after an endpoint either sends or
+ receives a RST_STREAM frame.
+
+ An endpoint MUST NOT send frames other than PRIORITY on a closed
+ stream. An endpoint MAY treat receipt of any other type of frame
+ on a closed stream as a connection error (Section 5.4.1) of type
+ STREAM_CLOSED, except as noted below.
+
+ An endpoint that sends a frame with the END_STREAM flag set or a
+ RST_STREAM frame might receive a WINDOW_UPDATE or RST_STREAM frame
+ from its peer in the time before the peer receives and processes
+ the frame that closes the stream.
+
+ An endpoint that sends a RST_STREAM frame on a stream that is in
+ the "open" or "half-closed (local)" state could receive any type
+ of frame. The peer might have sent or enqueued for sending these
+ frames before processing the RST_STREAM frame. An endpoint MUST
+ minimally process and then discard any frames it receives in this
+ state. This means updating header compression state for HEADERS
+ and PUSH_PROMISE frames. Receiving a PUSH_PROMISE frame also
+ causes the promised stream to become "reserved (remote)", even
+ when the PUSH_PROMISE frame is received on a closed stream.
+ Additionally, the content of DATA frames counts toward the
+ connection flow-control window.
+
+ An endpoint can perform this minimal processing for all streams
+ that are in the "closed" state. Endpoints MAY use other signals
+ to detect that a peer has received the frames that caused the
+ stream to enter the "closed" state and treat receipt of any frame
+ other than PRIORITY as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR. Endpoints can use frames that indicate that the
+ peer has received the closing signal to drive this. Endpoints
+ SHOULD NOT use timers for this purpose. For example, an endpoint
+ that sends a SETTINGS frame after closing a stream can safely
+ treat receipt of a DATA frame on that stream as an error after
+ receiving an acknowledgment of the settings. Other things that
+ might be used are PING frames, receiving data on streams that were
+ created after closing the stream, or responses to requests created
+ after closing the stream.
+
+ In the absence of more specific rules, implementations SHOULD treat
+ the receipt of a frame that is not expressly permitted in the
+ description of a state as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR. Note that PRIORITY can be sent and received in any
+ stream state.
+
+ The rules in this section only apply to frames defined in this
+ document. Receipt of frames for which the semantics are unknown
+ cannot be treated as an error, as the conditions for sending and
+ receiving those frames are also unknown; see Section 5.5.
+
+ An example of the state transitions for an HTTP request/response
+ exchange can be found in Section 8.8. An example of the state
+ transitions for server push can be found in Sections 8.4.1 and 8.4.2.
+
+5.1.1. Stream Identifiers
+
+ Streams are identified by an unsigned 31-bit integer. Streams
+ initiated by a client MUST use odd-numbered stream identifiers; those
+ initiated by the server MUST use even-numbered stream identifiers. A
+ stream identifier of zero (0x00) is used for connection control
+ messages; the stream identifier of zero cannot be used to establish a
+ new stream.
+
+ The identifier of a newly established stream MUST be numerically
+ greater than all streams that the initiating endpoint has opened or
+ reserved. This governs streams that are opened using a HEADERS frame
+ and streams that are reserved using PUSH_PROMISE. An endpoint that
+ receives an unexpected stream identifier MUST respond with a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ A HEADERS frame will transition the client-initiated stream
+ identified by the stream identifier in the frame header from "idle"
+ to "open". A PUSH_PROMISE frame will transition the server-initiated
+ stream identified by the Promised Stream ID field in the frame
+ payload from "idle" to "reserved (local)" or "reserved (remote)".
+ When a stream transitions out of the "idle" state, all streams in the
+ "idle" state that might have been opened by the peer with a lower-
+ valued stream identifier immediately transition to "closed". That
+ is, an endpoint may skip a stream identifier, with the effect being
+ that the skipped stream is immediately closed.
+
+ Stream identifiers cannot be reused. Long-lived connections can
+ result in an endpoint exhausting the available range of stream
+ identifiers. A client that is unable to establish a new stream
+ identifier can establish a new connection for new streams. A server
+ that is unable to establish a new stream identifier can send a GOAWAY
+ frame so that the client is forced to open a new connection for new
+ streams.
+
+5.1.2. Stream Concurrency
+
+ A peer can limit the number of concurrently active streams using the
+ SETTINGS_MAX_CONCURRENT_STREAMS parameter (see Section 6.5.2) within
+ a SETTINGS frame. The maximum concurrent streams setting is specific
+ to each endpoint and applies only to the peer that receives the
+ setting. That is, clients specify the maximum number of concurrent
+ streams the server can initiate, and servers specify the maximum
+ number of concurrent streams the client can initiate.
+
+ Streams that are in the "open" state or in either of the "half-
+ closed" states count toward the maximum number of streams that an
+ endpoint is permitted to open. Streams in any of these three states
+ count toward the limit advertised in the
+ SETTINGS_MAX_CONCURRENT_STREAMS setting. Streams in either of the
+ "reserved" states do not count toward the stream limit.
+
+ Endpoints MUST NOT exceed the limit set by their peer. An endpoint
+ that receives a HEADERS frame that causes its advertised concurrent
+ stream limit to be exceeded MUST treat this as a stream error
+ (Section 5.4.2) of type PROTOCOL_ERROR or REFUSED_STREAM. The choice
+ of error code determines whether the endpoint wishes to enable
+ automatic retry (see Section 8.7 for details).
+
+ An endpoint that wishes to reduce the value of
+ SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current
+ number of open streams can either close streams that exceed the new
+ value or allow streams to complete.
+
+5.2. Flow Control
+
+ Using streams for multiplexing introduces contention over use of the
+ TCP connection, resulting in blocked streams. A flow-control scheme
+ ensures that streams on the same connection do not destructively
+ interfere with each other. Flow control is used for both individual
+ streams and the connection as a whole.
+
+ HTTP/2 provides for flow control through use of the WINDOW_UPDATE
+ frame (Section 6.9).
+
+5.2.1. Flow-Control Principles
+
+ HTTP/2 stream flow control aims to allow a variety of flow-control
+ algorithms to be used without requiring protocol changes. Flow
+ control in HTTP/2 has the following characteristics:
+
+ 1. Flow control is specific to a connection. HTTP/2 flow control
+ operates between the endpoints of a single hop and not over the
+ entire end-to-end path.
+
+ 2. Flow control is based on WINDOW_UPDATE frames. Receivers
+ advertise how many octets they are prepared to receive on a
+ stream and for the entire connection. This is a credit-based
+ scheme.
+
+ 3. Flow control is directional with overall control provided by the
+ receiver. A receiver MAY choose to set any window size that it
+ desires for each stream and for the entire connection. A sender
+ MUST respect flow-control limits imposed by a receiver. Clients,
+ servers, and intermediaries all independently advertise their
+ flow-control window as a receiver and abide by the flow-control
+ limits set by their peer when sending.
+
+ 4. The initial value for the flow-control window is 65,535 octets
+ for both new streams and the overall connection.
+
+ 5. The frame type determines whether flow control applies to a
+ frame. Of the frames specified in this document, only DATA
+ frames are subject to flow control; all other frame types do not
+ consume space in the advertised flow-control window. This
+ ensures that important control frames are not blocked by flow
+ control.
+
+ 6. An endpoint can choose to disable its own flow control, but an
+ endpoint cannot ignore flow-control signals from its peer.
+
+ 7. HTTP/2 defines only the format and semantics of the WINDOW_UPDATE
+ frame (Section 6.9). This document does not stipulate how a
+ receiver decides when to send this frame or the value that it
+ sends, nor does it specify how a sender chooses to send packets.
+ Implementations are able to select any algorithm that suits their
+ needs.
+
+ Implementations are also responsible for prioritizing the sending of
+ requests and responses, choosing how to avoid head-of-line blocking
+ for requests, and managing the creation of new streams. Algorithm
+ choices for these could interact with any flow-control algorithm.
+
+5.2.2. Appropriate Use of Flow Control
+
+ Flow control is defined to protect endpoints that are operating under
+ resource constraints. For example, a proxy needs to share memory
+ between many connections and also might have a slow upstream
+ connection and a fast downstream one. Flow control addresses cases
+ where the receiver is unable to process data on one stream yet wants
+ to continue to process other streams in the same connection.
+
+ Deployments that do not require this capability can advertise a flow-
+ control window of the maximum size (2^31-1) and can maintain this
+ window by sending a WINDOW_UPDATE frame when any data is received.
+ This effectively disables flow control for that receiver.
+ Conversely, a sender is always subject to the flow-control window
+ advertised by the receiver.
+
+ Deployments with constrained resources (for example, memory) can
+ employ flow control to limit the amount of memory a peer can consume.
+ Note, however, that this can lead to suboptimal use of available
+ network resources if flow control is enabled without knowledge of the
+ bandwidth * delay product (see [RFC7323]).
+
+ Even with full awareness of the current bandwidth * delay product,
+ implementation of flow control can be difficult. Endpoints MUST read
+ and process HTTP/2 frames from the TCP receive buffer as soon as data
+ is available. Failure to read promptly could lead to a deadlock when
+ critical frames, such as WINDOW_UPDATE, are not read and acted upon.
+ Reading frames promptly does not expose endpoints to resource
+ exhaustion attacks, as HTTP/2 flow control limits resource
+ commitments.
+
+5.2.3. Flow-Control Performance
+
+ If an endpoint cannot ensure that its peer always has available flow-
+ control window space that is greater than the peer's bandwidth *
+ delay product on this connection, its receive throughput will be
+ limited by HTTP/2 flow control. This will result in degraded
+ performance.
+
+ Sending timely WINDOW_UPDATE frames can improve performance.
+ Endpoints will want to balance the need to improve receive throughput
+ with the need to manage resource exhaustion risks and should take
+ careful note of Section 10.5 in defining their strategy to manage
+ window sizes.
+
+5.3. Prioritization
+
+ In a multiplexed protocol like HTTP/2, prioritizing allocation of
+ bandwidth and computation resources to streams can be critical to
+ attaining good performance. A poor prioritization scheme can result
+ in HTTP/2 providing poor performance. With no parallelism at the TCP
+ layer, performance could be significantly worse than HTTP/1.1.
+
+ A good prioritization scheme benefits from the application of
+ contextual knowledge such as the content of resources, how resources
+ are interrelated, and how those resources will be used by a peer. In
+ particular, clients can possess knowledge about the priority of
+ requests that is relevant to server prioritization. In those cases,
+ having clients provide priority information can improve performance.
+
+5.3.1. Background on Priority in RFC 7540
+
+ RFC 7540 defined a rich system for signaling priority of requests.
+ However, this system proved to be complex, and it was not uniformly
+ implemented.
+
+ The flexible scheme meant that it was possible for clients to express
+ priorities in very different ways, with little consistency in the
+ approaches that were adopted. For servers, implementing generic
+ support for the scheme was complex. Implementation of priorities was
+ uneven in both clients and servers. Many server deployments ignored
+ client signals when prioritizing their handling of requests.
+
+ In short, the prioritization signaling in RFC 7540 [RFC7540] was not
+ successful.
+
+5.3.2. Priority Signaling in This Document
+
+ This update to HTTP/2 deprecates the priority signaling defined in
+ RFC 7540 [RFC7540]. The bulk of the text related to priority signals
+ is not included in this document. The description of frame fields
+ and some of the mandatory handling is retained to ensure that
+ implementations of this document remain interoperable with
+ implementations that use the priority signaling described in RFC
+ 7540.
+
+ A thorough description of the RFC 7540 priority scheme remains in
+ Section 5.3 of [RFC7540].
+
+ Signaling priority information is necessary to attain good
+ performance in many cases. Where signaling priority information is
+ important, endpoints are encouraged to use an alternative scheme,
+ such as the scheme described in [HTTP-PRIORITY].
+
+ Though the priority signaling from RFC 7540 was not widely adopted,
+ the information it provides can still be useful in the absence of
+ better information. Endpoints that receive priority signals in
+ HEADERS or PRIORITY frames can benefit from applying that
+ information. In particular, implementations that consume these
+ signals would not benefit from discarding these priority signals in
+ the absence of alternatives.
+
+ Servers SHOULD use other contextual information in determining
+ priority of requests in the absence of any priority signals. Servers
+ MAY interpret the complete absence of signals as an indication that
+ the client has not implemented the feature. The defaults described
+ in Section 5.3.5 of [RFC7540] are known to have poor performance
+ under most conditions, and their use is unlikely to be deliberate.
+
+5.4. Error Handling
+
+ HTTP/2 framing permits two classes of errors:
+
+ * An error condition that renders the entire connection unusable is
+ a connection error.
+
+ * An error in an individual stream is a stream error.
+
+ A list of error codes is included in Section 7.
+
+ It is possible that an endpoint will encounter frames that would
+ cause multiple errors. Implementations MAY discover multiple errors
+ during processing, but they SHOULD report at most one stream and one
+ connection error as a result.
+
+ The first stream error reported for a given stream prevents any other
+ errors on that stream from being reported. In comparison, the
+ protocol permits multiple GOAWAY frames, though an endpoint SHOULD
+ report just one type of connection error unless an error is
+ encountered during graceful shutdown. If this occurs, an endpoint
+ MAY send an additional GOAWAY frame with the new error code, in
+ addition to any prior GOAWAY that contained NO_ERROR.
+
+ If an endpoint detects multiple different errors, it MAY choose to
+ report any one of those errors. If a frame causes a connection
+ error, that error MUST be reported. Additionally, an endpoint MAY
+ use any applicable error code when it detects an error condition; a
+ generic error code (such as PROTOCOL_ERROR or INTERNAL_ERROR) can
+ always be used in place of more specific error codes.
+
+5.4.1. Connection Error Handling
+
+ A connection error is any error that prevents further processing of
+ the frame layer or corrupts any connection state.
+
+ An endpoint that encounters a connection error SHOULD first send a
+ GOAWAY frame (Section 6.8) with the stream identifier of the last
+ stream that it successfully received from its peer. The GOAWAY frame
+ includes an error code (Section 7) that indicates why the connection
+ is terminating. After sending the GOAWAY frame for an error
+ condition, the endpoint MUST close the TCP connection.
+
+ It is possible that the GOAWAY will not be reliably received by the
+ receiving endpoint. In the event of a connection error, GOAWAY only
+ provides a best-effort attempt to communicate with the peer about why
+ the connection is being terminated.
+
+ An endpoint can end a connection at any time. In particular, an
+ endpoint MAY choose to treat a stream error as a connection error.
+ Endpoints SHOULD send a GOAWAY frame when ending a connection,
+ providing that circumstances permit it.
+
+5.4.2. Stream Error Handling
+
+ A stream error is an error related to a specific stream that does not
+ affect processing of other streams.
+
+ An endpoint that detects a stream error sends a RST_STREAM frame
+ (Section 6.4) that contains the stream identifier of the stream where
+ the error occurred. The RST_STREAM frame includes an error code that
+ indicates the type of error.
+
+ A RST_STREAM is the last frame that an endpoint can send on a stream.
+ The peer that sends the RST_STREAM frame MUST be prepared to receive
+ any frames that were sent or enqueued for sending by the remote peer.
+ These frames can be ignored, except where they modify connection
+ state (such as the state maintained for field section compression
+ (Section 4.3) or flow control).
+
+ Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame
+ for any stream. However, an endpoint MAY send additional RST_STREAM
+ frames if it receives frames on a closed stream after more than a
+ round-trip time. This behavior is permitted to deal with misbehaving
+ implementations.
+
+ To avoid looping, an endpoint MUST NOT send a RST_STREAM in response
+ to a RST_STREAM frame.
+
+5.4.3. Connection Termination
+
+ If the TCP connection is closed or reset while streams remain in the
+ "open" or "half-closed" states, then the affected streams cannot be
+ automatically retried (see Section 8.7 for details).
+
+5.5. Extending HTTP/2
+
+ HTTP/2 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/2 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 (see Section 16 of
+ [HTTP]).
+
+ Extensions are permitted to use new frame types (Section 4.1), new
+ settings (Section 6.5), or new error codes (Section 7). Registries
+ for managing these extension points are defined in Section 11 of
+ [RFC7540].
+
+ Implementations MUST ignore unknown or unsupported values in all
+ extensible protocol elements. Implementations MUST discard frames
+ 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, extension frames that appear in
+ the middle of a field block (Section 4.3) are not permitted; these
+ MUST be treated as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ Extensions SHOULD avoid changing protocol elements defined in this
+ document or elements for which no extension mechanism is defined.
+ This includes changes to the layout of frames, additions or changes
+ to the way that frames are composed into HTTP messages (Section 8.1),
+ the definition of pseudo-header fields, or changes to any protocol
+ element that a compliant endpoint might treat as a connection error
+ (Section 5.4.1).
+
+ An extension that changes existing protocol elements or state 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. In this case, it
+ could also be necessary to coordinate when the revised layout comes
+ into effect. For example, treating frames other than DATA frames as
+ flow controlled requires a change in semantics that both endpoints
+ need to understand, so this can only be done through negotiation.
+
+ This document doesn't mandate a specific method for negotiating the
+ use of an extension but notes that a setting (Section 6.5.2) 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 initial value MUST
+ be defined in such a fashion that the extension is initially
+ disabled.
+
+6. Frame Definitions
+
+ This specification defines a number of frame types, each identified
+ by a unique 8-bit type code. Each frame type serves a distinct
+ purpose in the establishment and management of either the connection
+ as a whole or individual streams.
+
+ The transmission of specific frame types can alter the state of a
+ connection. If endpoints fail to maintain a synchronized view of the
+ connection state, successful communication within the connection will
+ no longer be possible. Therefore, it is important that endpoints
+ have a shared comprehension of how the state is affected by the use
+ of any given frame.
+
+6.1. DATA
+
+ DATA frames (type=0x00) convey arbitrary, variable-length sequences
+ of octets associated with a stream. One or more DATA frames are
+ used, for instance, to carry HTTP request or response message
+ contents.
+
+ DATA frames MAY also contain padding. Padding can be added to DATA
+ frames to obscure the size of messages. Padding is a security
+ feature; see Section 10.7.
+
+ DATA Frame {
+ Length (24),
+ Type (8) = 0x00,
+
+ Unused Flags (4),
+ PADDED Flag (1),
+ Unused Flags (2),
+ END_STREAM Flag (1),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ [Pad Length (8)],
+ Data (..),
+ Padding (..2040),
+ }
+
+ Figure 3: DATA Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. The DATA frame contains the
+ following additional fields:
+
+ Pad Length: An 8-bit field containing the length of the frame
+ padding in units of octets. This field is conditional and is only
+ present if the PADDED flag is set.
+
+ Data: Application data. The amount of data is the remainder of the
+ frame payload after subtracting the length of the other fields
+ that are present.
+
+ Padding: Padding octets that contain no application semantic value.
+ Padding octets MUST be set to zero when sending. A receiver is
+ not obligated to verify padding but MAY treat non-zero padding as
+ a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ The DATA frame defines the following flags:
+
+ PADDED (0x08): When set, the PADDED flag indicates that the Pad
+ Length field and any padding that it describes are present.
+
+ END_STREAM (0x01): When set, the END_STREAM flag indicates that this
+ frame is the last that the endpoint will send for the identified
+ stream. Setting this flag causes the stream to enter one of the
+ "half-closed" states or the "closed" state (Section 5.1).
+
+ | Note: An endpoint that learns of stream closure after sending
+ | all data can close a stream by sending a STREAM frame with a
+ | zero-length Data field and the END_STREAM flag set. This is
+ | only possible if the endpoint does not send trailers, as the
+ | END_STREAM flag appears on a HEADERS frame in that case; see
+ | Section 8.1.
+
+ DATA frames MUST be associated with a stream. If a DATA frame is
+ received whose Stream Identifier field is 0x00, the recipient MUST
+ respond with a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ DATA frames are subject to flow control and can only be sent when a
+ stream is in the "open" or "half-closed (remote)" state. The entire
+ DATA frame payload is included in flow control, including the Pad
+ Length and Padding fields if present. If a DATA frame is received
+ whose stream is not in the "open" or "half-closed (local)" state, the
+ recipient MUST respond with a stream error (Section 5.4.2) of type
+ STREAM_CLOSED.
+
+ The total number of padding octets is determined by the value of the
+ Pad Length field. If the length of the padding is the length of the
+ frame payload or greater, the recipient MUST treat this as a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ | Note: A frame can be increased in size by one octet by
+ | including a Pad Length field with a value of zero.
+
+6.2. HEADERS
+
+ The HEADERS frame (type=0x01) is used to open a stream (Section 5.1),
+ and additionally carries a field block fragment. Despite the name, a
+ HEADERS frame can carry a header section or a trailer section.
+ HEADERS frames can be sent on a stream in the "idle", "reserved
+ (local)", "open", or "half-closed (remote)" state.
+
+ HEADERS Frame {
+ Length (24),
+ Type (8) = 0x01,
+
+ Unused Flags (2),
+ PRIORITY Flag (1),
+ Unused Flag (1),
+ PADDED Flag (1),
+ END_HEADERS Flag (1),
+ Unused Flag (1),
+ END_STREAM Flag (1),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ [Pad Length (8)],
+ [Exclusive (1)],
+ [Stream Dependency (31)],
+ [Weight (8)],
+ Field Block Fragment (..),
+ Padding (..2040),
+ }
+
+ Figure 4: HEADERS Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. The HEADERS frame payload has the
+ following additional fields:
+
+ Pad Length: An 8-bit field containing the length of the frame
+ padding in units of octets. This field is only present if the
+ PADDED flag is set.
+
+ Exclusive: A single-bit flag. This field is only present if the
+ PRIORITY flag is set. Priority signals in HEADERS frames are
+ deprecated; see Section 5.3.2.
+
+ Stream Dependency: A 31-bit stream identifier. This field is only
+ present if the PRIORITY flag is set.
+
+ Weight: An unsigned 8-bit integer. This field is only present if
+ the PRIORITY flag is set.
+
+ Field Block Fragment: A field block fragment (Section 4.3).
+
+ Padding: Padding octets that contain no application semantic value.
+ Padding octets MUST be set to zero when sending. A receiver is
+ not obligated to verify padding but MAY treat non-zero padding as
+ a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ The HEADERS frame defines the following flags:
+
+ PRIORITY (0x20): When set, the PRIORITY flag indicates that the
+ Exclusive, Stream Dependency, and Weight fields are present.
+
+ PADDED (0x08): When set, the PADDED flag indicates that the Pad
+ Length field and any padding that it describes are present.
+
+ END_HEADERS (0x04): When set, the END_HEADERS flag indicates that
+ this frame contains an entire field block (Section 4.3) and is not
+ followed by any CONTINUATION frames.
+
+ A HEADERS frame without the END_HEADERS flag set MUST be followed
+ by a CONTINUATION frame for the same stream. A receiver MUST
+ treat the receipt of any other type of frame or a frame on a
+ different stream as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ END_STREAM (0x01): When set, the END_STREAM flag indicates that the
+ field block (Section 4.3) is the last that the endpoint will send
+ for the identified stream.
+
+ A HEADERS frame with the END_STREAM flag set signals the end of a
+ stream. However, a HEADERS frame with the END_STREAM flag set can
+ be followed by CONTINUATION frames on the same stream. Logically,
+ the CONTINUATION frames are part of the HEADERS frame.
+
+ The frame payload of a HEADERS frame contains a field block fragment
+ (Section 4.3). A field block that does not fit within a HEADERS
+ frame is continued in a CONTINUATION frame (Section 6.10).
+
+ HEADERS frames MUST be associated with a stream. If a HEADERS frame
+ is received whose Stream Identifier field is 0x00, the recipient MUST
+ respond with a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ The HEADERS frame changes the connection state as described in
+ Section 4.3.
+
+ The total number of padding octets is determined by the value of the
+ Pad Length field. If the length of the padding is the length of the
+ frame payload or greater, the recipient MUST treat this as a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ | Note: A frame can be increased in size by one octet by
+ | including a Pad Length field with a value of zero.
+
+6.3. PRIORITY
+
+ The PRIORITY frame (type=0x02) is deprecated; see Section 5.3.2. A
+ PRIORITY frame can be sent in any stream state, including idle or
+ closed streams.
+
+ PRIORITY Frame {
+ Length (24) = 0x05,
+ Type (8) = 0x02,
+
+ Unused Flags (8),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ Exclusive (1),
+ Stream Dependency (31),
+ Weight (8),
+ }
+
+ Figure 5: PRIORITY Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. The frame payload of a PRIORITY
+ frame contains the following additional fields:
+
+ Exclusive: A single-bit flag.
+
+ Stream Dependency: A 31-bit stream identifier.
+
+ Weight: An unsigned 8-bit integer.
+
+ The PRIORITY frame does not define any flags.
+
+ The PRIORITY frame always identifies a stream. If a PRIORITY frame
+ is received with a stream identifier of 0x00, the recipient MUST
+ respond with a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ Sending or receiving a PRIORITY frame does not affect the state of
+ any stream (Section 5.1). The PRIORITY frame can be sent on a stream
+ in any state, including "idle" or "closed". A PRIORITY frame cannot
+ be sent between consecutive frames that comprise a single field block
+ (Section 4.3).
+
+ A PRIORITY frame with a length other than 5 octets MUST be treated as
+ a stream error (Section 5.4.2) of type FRAME_SIZE_ERROR.
+
+6.4. RST_STREAM
+
+ The RST_STREAM frame (type=0x03) allows for immediate termination of
+ a stream. RST_STREAM is sent to request cancellation of a stream or
+ to indicate that an error condition has occurred.
+
+ RST_STREAM Frame {
+ Length (24) = 0x04,
+ Type (8) = 0x03,
+
+ Unused Flags (8),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ Error Code (32),
+ }
+
+ Figure 6: RST_STREAM Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. Additionally, the RST_STREAM
+ frame contains a single unsigned, 32-bit integer identifying the
+ error code (Section 7). The error code indicates why the stream is
+ being terminated.
+
+ The RST_STREAM frame does not define any flags.
+
+ The RST_STREAM frame fully terminates the referenced stream and
+ causes it to enter the "closed" state. After receiving a RST_STREAM
+ on a stream, the receiver MUST NOT send additional frames for that
+ stream, except for PRIORITY. However, after sending the RST_STREAM,
+ the sending endpoint MUST be prepared to receive and process
+ additional frames sent on the stream that might have been sent by the
+ peer prior to the arrival of the RST_STREAM.
+
+ RST_STREAM frames MUST be associated with a stream. If a RST_STREAM
+ frame is received with a stream identifier of 0x00, the recipient
+ MUST treat this as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ RST_STREAM frames MUST NOT be sent for a stream in the "idle" state.
+ If a RST_STREAM frame identifying an idle stream is received, the
+ recipient MUST treat this as a connection error (Section 5.4.1) of
+ type PROTOCOL_ERROR.
+
+ A RST_STREAM frame with a length other than 4 octets MUST be treated
+ as a connection error (Section 5.4.1) of type FRAME_SIZE_ERROR.
+
+6.5. SETTINGS
+
+ The SETTINGS frame (type=0x04) conveys configuration parameters that
+ affect how endpoints communicate, such as preferences and constraints
+ on peer behavior. The SETTINGS frame is also used to acknowledge the
+ receipt of those settings. Individually, a configuration parameter
+ from a SETTINGS frame is referred to as a "setting".
+
+ Settings are not negotiated; they describe characteristics of the
+ sending peer, which are used by the receiving peer. Different values
+ for the same setting can be advertised by each peer. For example, a
+ client might set a high initial flow-control window, whereas a server
+ might set a lower value to conserve resources.
+
+ A SETTINGS frame MUST be sent by both endpoints at the start of a
+ connection and MAY be sent at any other time by either endpoint over
+ the lifetime of the connection. Implementations MUST support all of
+ the settings defined by this specification.
+
+ Each parameter in a SETTINGS frame replaces any existing value for
+ that parameter. Settings are processed in the order in which they
+ appear, and a receiver of a SETTINGS frame does not need to maintain
+ any state other than the current value of each setting. Therefore,
+ the value of a SETTINGS parameter is the last value that is seen by a
+ receiver.
+
+ SETTINGS frames are acknowledged by the receiving peer. To enable
+ this, the SETTINGS frame defines the ACK flag:
+
+ ACK (0x01): When set, the ACK flag indicates that this frame
+ acknowledges receipt and application of the peer's SETTINGS frame.
+ When this bit is set, the frame payload of the SETTINGS frame MUST
+ be empty. Receipt of a SETTINGS frame with the ACK flag set and a
+ length field value other than 0 MUST be treated as a connection
+ error (Section 5.4.1) of type FRAME_SIZE_ERROR. For more
+ information, see Section 6.5.3 ("Settings Synchronization").
+
+ SETTINGS frames always apply to a connection, never a single stream.
+ The stream identifier for a SETTINGS frame MUST be zero (0x00). If
+ an endpoint receives a SETTINGS frame whose Stream Identifier field
+ is anything other than 0x00, the endpoint MUST respond with a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ The SETTINGS frame affects connection state. A badly formed or
+ incomplete SETTINGS frame MUST be treated as a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ A SETTINGS frame with a length other than a multiple of 6 octets MUST
+ be treated as a connection error (Section 5.4.1) of type
+ FRAME_SIZE_ERROR.
+
+6.5.1. SETTINGS Format
+
+ The frame payload of a SETTINGS frame consists of zero or more
+ settings, each consisting of an unsigned 16-bit setting identifier
+ and an unsigned 32-bit value.
+
+ SETTINGS Frame {
+ Length (24),
+ Type (8) = 0x04,
+
+ Unused Flags (7),
+ ACK Flag (1),
+
+ Reserved (1),
+ Stream Identifier (31) = 0,
+
+ Setting (48) ...,
+ }
+
+ Setting {
+ Identifier (16),
+ Value (32),
+ }
+
+ Figure 7: SETTINGS Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. The frame payload of a SETTINGS
+ frame contains any number of Setting fields, each of which consists
+ of:
+
+ Identifier: A 16-bit setting identifier; see Section 6.5.2.
+
+ Value: A 32-bit value for the setting.
+
+6.5.2. Defined Settings
+
+ The following settings are defined:
+
+ SETTINGS_HEADER_TABLE_SIZE (0x01): This setting allows the sender to
+ inform the remote endpoint of the maximum size of the compression
+ table used to decode field blocks, in units of octets. The
+ encoder can select any size equal to or less than this value by
+ using signaling specific to the compression format inside a field
+ block (see [COMPRESSION]). The initial value is 4,096 octets.
+
+ SETTINGS_ENABLE_PUSH (0x02): This setting can be used to enable or
+ disable server push. A server MUST NOT send a PUSH_PROMISE frame
+ if it receives this parameter set to a value of 0; see
+ Section 8.4. A client that has both set this parameter to 0 and
+ had it acknowledged MUST treat the receipt of a PUSH_PROMISE frame
+ as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ The initial value of SETTINGS_ENABLE_PUSH is 1. For a client,
+ this value indicates that it is willing to receive PUSH_PROMISE
+ frames. For a server, this initial value has no effect, and is
+ equivalent to the value 0. Any value other than 0 or 1 MUST be
+ treated as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ A server MUST NOT explicitly set this value to 1. A server MAY
+ choose to omit this setting when it sends a SETTINGS frame, but if
+ a server does include a value, it MUST be 0. A client MUST treat
+ receipt of a SETTINGS frame with SETTINGS_ENABLE_PUSH set to 1 as
+ a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ SETTINGS_MAX_CONCURRENT_STREAMS (0x03): This setting indicates the
+ maximum number of concurrent streams that the sender will allow.
+ This limit is directional: it applies to the number of streams
+ that the sender permits the receiver to create. Initially, there
+ is no limit to this value. It is recommended that this value be
+ no smaller than 100, so as to not unnecessarily limit parallelism.
+
+ A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be
+ treated as special by endpoints. A zero value does prevent the
+ creation of new streams; however, this can also happen for any
+ limit that is exhausted with active streams. Servers SHOULD only
+ set a zero value for short durations; if a server does not wish to
+ accept requests, closing the connection is more appropriate.
+
+ SETTINGS_INITIAL_WINDOW_SIZE (0x04): This setting indicates the
+ sender's initial window size (in units of octets) for stream-level
+ flow control. The initial value is 2^16-1 (65,535) octets.
+
+ This setting affects the window size of all streams (see
+ Section 6.9.2).
+
+ Values above the maximum flow-control window size of 2^31-1 MUST
+ be treated as a connection error (Section 5.4.1) of type
+ FLOW_CONTROL_ERROR.
+
+ SETTINGS_MAX_FRAME_SIZE (0x05): This setting indicates the size of
+ the largest frame payload that the sender is willing to receive,
+ in units of octets.
+
+ The initial value is 2^14 (16,384) octets. The value advertised
+ by an endpoint MUST be between this initial value and the maximum
+ allowed frame size (2^24-1 or 16,777,215 octets), inclusive.
+ Values outside this range MUST be treated as a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ SETTINGS_MAX_HEADER_LIST_SIZE (0x06): This advisory setting informs
+ a peer of the maximum field section size that the sender is
+ prepared to accept, in units of octets. The value is based on the
+ uncompressed size of field lines, including the length of the name
+ and value in units of octets plus an overhead of 32 octets for
+ each field line.
+
+ For any given request, a lower limit than what is advertised MAY
+ be enforced. The initial value of this setting is unlimited.
+
+ An endpoint that receives a SETTINGS frame with any unknown or
+ unsupported identifier MUST ignore that setting.
+
+6.5.3. Settings Synchronization
+
+ Most values in SETTINGS benefit from or require an understanding of
+ when the peer has received and applied the changed parameter values.
+ In order to provide such synchronization timepoints, the recipient of
+ a SETTINGS frame in which the ACK flag is not set MUST apply the
+ updated settings as soon as possible upon receipt. SETTINGS frames
+ are acknowledged in the order in which they are received.
+
+ The values in the SETTINGS frame MUST be processed in the order they
+ appear, with no other frame processing between values. Unsupported
+ settings MUST be ignored. Once all values have been processed, the
+ recipient MUST immediately emit a SETTINGS frame with the ACK flag
+ set. Upon receiving a SETTINGS frame with the ACK flag set, the
+ sender of the altered settings can rely on the values from the oldest
+ unacknowledged SETTINGS frame having been applied.
+
+ If the sender of a SETTINGS frame does not receive an acknowledgment
+ within a reasonable amount of time, it MAY issue a connection error
+ (Section 5.4.1) of type SETTINGS_TIMEOUT. In setting a timeout, some
+ allowance needs to be made for processing delays at the peer; a
+ timeout that is solely based on the round-trip time between endpoints
+ might result in spurious errors.
+
+6.6. PUSH_PROMISE
+
+ The PUSH_PROMISE frame (type=0x05) is used to notify the peer
+ endpoint in advance of streams the sender intends to initiate. The
+ PUSH_PROMISE frame includes the unsigned 31-bit identifier of the
+ stream the endpoint plans to create along with a field section that
+ provides additional context for the stream. Section 8.4 contains a
+ thorough description of the use of PUSH_PROMISE frames.
+
+ PUSH_PROMISE Frame {
+ Length (24),
+ Type (8) = 0x05,
+
+ Unused Flags (4),
+ PADDED Flag (1),
+ END_HEADERS Flag (1),
+ Unused Flags (2),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ [Pad Length (8)],
+ Reserved (1),
+ Promised Stream ID (31),
+ Field Block Fragment (..),
+ Padding (..2040),
+ }
+
+ Figure 8: PUSH_PROMISE Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. The PUSH_PROMISE frame payload
+ has the following additional fields:
+
+ Pad Length: An 8-bit field containing the length of the frame
+ padding in units of octets. This field is only present if the
+ PADDED flag is set.
+
+ Promised Stream ID: An unsigned 31-bit integer that identifies the
+ stream that is reserved by the PUSH_PROMISE. The promised stream
+ identifier MUST be a valid choice for the next stream sent by the
+ sender (see "new stream identifier" in Section 5.1.1).
+
+ Field Block Fragment: A field block fragment (Section 4.3)
+ containing the request control data and a header section.
+
+ Padding: Padding octets that contain no application semantic value.
+ Padding octets MUST be set to zero when sending. A receiver is
+ not obligated to verify padding but MAY treat non-zero padding as
+ a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ The PUSH_PROMISE frame defines the following flags:
+
+ PADDED (0x08): When set, the PADDED flag indicates that the Pad
+ Length field and any padding that it describes are present.
+
+ END_HEADERS (0x04): When set, the END_HEADERS flag indicates that
+ this frame contains an entire field block (Section 4.3) and is not
+ followed by any CONTINUATION frames.
+
+ A PUSH_PROMISE frame without the END_HEADERS flag set MUST be
+ followed by a CONTINUATION frame for the same stream. A receiver
+ MUST treat the receipt of any other type of frame or a frame on a
+ different stream as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that
+ is in either the "open" or "half-closed (remote)" state. The stream
+ identifier of a PUSH_PROMISE frame indicates the stream it is
+ associated with. If the Stream Identifier field specifies the value
+ 0x00, a recipient MUST respond with a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ Promised streams are not required to be used in the order they are
+ promised. The PUSH_PROMISE only reserves stream identifiers for
+ later use.
+
+ PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of
+ the peer endpoint is set to 0. An endpoint that has set this setting
+ and has received acknowledgment MUST treat the receipt of a
+ PUSH_PROMISE frame as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ Recipients of PUSH_PROMISE frames can choose to reject promised
+ streams by returning a RST_STREAM referencing the promised stream
+ identifier back to the sender of the PUSH_PROMISE.
+
+ A PUSH_PROMISE frame modifies the connection state in two ways.
+ First, the inclusion of a field block (Section 4.3) potentially
+ modifies the state maintained for field section compression. Second,
+ PUSH_PROMISE also reserves a stream for later use, causing the
+ promised stream to enter the "reserved (local)" or "reserved
+ (remote)" state. A sender MUST NOT send a PUSH_PROMISE on a stream
+ unless that stream is either "open" or "half-closed (remote)"; the
+ sender MUST ensure that the promised stream is a valid choice for a
+ new stream identifier (Section 5.1.1) (that is, the promised stream
+ MUST be in the "idle" state).
+
+ Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame
+ causes the stream state to become indeterminate. A receiver MUST
+ treat the receipt of a PUSH_PROMISE on a stream that is neither
+ "open" nor "half-closed (local)" as a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR. However, an endpoint that
+ has sent RST_STREAM on the associated stream MUST handle PUSH_PROMISE
+ frames that might have been created before the RST_STREAM frame is
+ received and processed.
+
+ A receiver MUST treat the receipt of a PUSH_PROMISE that promises an
+ illegal stream identifier (Section 5.1.1) as a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR. Note that an illegal stream
+ identifier is an identifier for a stream that is not currently in the
+ "idle" state.
+
+ The total number of padding octets is determined by the value of the
+ Pad Length field. If the length of the padding is the length of the
+ frame payload or greater, the recipient MUST treat this as a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ | Note: A frame can be increased in size by one octet by
+ | including a Pad Length field with a value of zero.
+
+6.7. PING
+
+ The PING frame (type=0x06) is a mechanism for measuring a minimal
+ round-trip time from the sender, as well as determining whether an
+ idle connection is still functional. PING frames can be sent from
+ any endpoint.
+
+ PING Frame {
+ Length (24) = 0x08,
+ Type (8) = 0x06,
+
+ Unused Flags (7),
+ ACK Flag (1),
+
+ Reserved (1),
+ Stream Identifier (31) = 0,
+
+ Opaque Data (64),
+ }
+
+ Figure 9: PING Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4.
+
+ In addition to the frame header, PING frames MUST contain 8 octets of
+ opaque data in the frame payload. A sender can include any value it
+ chooses and use those octets in any fashion.
+
+ Receivers of a PING frame that does not include an ACK flag MUST send
+ a PING frame with the ACK flag set in response, with an identical
+ frame payload. PING responses SHOULD be given higher priority than
+ any other frame.
+
+ The PING frame defines the following flags:
+
+ ACK (0x01): When set, the ACK flag indicates that this PING frame is
+ a PING response. An endpoint MUST set this flag in PING
+ responses. An endpoint MUST NOT respond to PING frames containing
+ this flag.
+
+ PING frames are not associated with any individual stream. If a PING
+ frame is received with a Stream Identifier field value other than
+ 0x00, the recipient MUST respond with a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ Receipt of a PING frame with a length field value other than 8 MUST
+ be treated as a connection error (Section 5.4.1) of type
+ FRAME_SIZE_ERROR.
+
+6.8. GOAWAY
+
+ The GOAWAY frame (type=0x07) is used to initiate shutdown of a
+ connection or to signal serious error conditions. GOAWAY allows an
+ endpoint to gracefully stop accepting new streams while still
+ finishing processing of previously established streams. This enables
+ administrative actions, like server maintenance.
+
+ There is an inherent race condition between an endpoint starting new
+ streams and the remote peer sending a GOAWAY frame. To deal with
+ this case, the GOAWAY contains the stream identifier of the last
+ peer-initiated stream that was or might be processed on the sending
+ endpoint in this connection. For instance, if the server sends a
+ GOAWAY frame, the identified stream is the highest-numbered stream
+ initiated by the client.
+
+ Once the GOAWAY is sent, the sender will ignore frames sent on
+ streams initiated by the receiver if the stream has an identifier
+ higher than the included last stream identifier. Receivers of a
+ GOAWAY frame MUST NOT open additional streams on the connection,
+ although a new connection can be established for new streams.
+
+ If the receiver of the GOAWAY has sent data on streams with a higher
+ stream identifier than what is indicated in the GOAWAY frame, those
+ streams are not or will not be processed. The receiver of the GOAWAY
+ frame can treat the streams as though they had never been created at
+ all, thereby allowing those streams to be retried later on a new
+ connection.
+
+ Endpoints SHOULD always send a GOAWAY frame before closing a
+ connection so that the remote peer can know whether a stream has been
+ partially processed or not. For example, if an HTTP client sends a
+ POST at the same time that a server closes a 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 might choose to close a connection without sending a
+ GOAWAY for misbehaving peers.
+
+ A GOAWAY frame might not immediately precede closing of the
+ connection; a receiver of a GOAWAY that has no more use for the
+ connection SHOULD still send a GOAWAY frame before terminating the
+ connection.
+
+ GOAWAY Frame {
+ Length (24),
+ Type (8) = 0x07,
+
+ Unused Flags (8),
+
+ Reserved (1),
+ Stream Identifier (31) = 0,
+
+ Reserved (1),
+ Last-Stream-ID (31),
+ Error Code (32),
+ Additional Debug Data (..),
+ }
+
+ Figure 10: GOAWAY Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4.
+
+ The GOAWAY frame does not define any flags.
+
+ The GOAWAY frame applies to the connection, not a specific stream.
+ An endpoint MUST treat a GOAWAY frame with a stream identifier other
+ than 0x00 as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR.
+
+ The last stream identifier in the GOAWAY frame contains the highest-
+ numbered stream identifier for which the sender of the GOAWAY frame
+ might have taken some action on or might yet take action on. All
+ streams up to and including the identified stream might have been
+ processed in some way. The last stream identifier can be set to 0 if
+ no streams were processed.
+
+ | Note: 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.
+
+ If a connection terminates without a GOAWAY frame, the last stream
+ identifier is effectively the highest possible stream identifier.
+
+ On streams with lower- or equal-numbered identifiers that were not
+ closed completely prior to the connection being closed, reattempting
+ requests, transactions, or any protocol activity is not possible,
+ except for idempotent actions like HTTP GET, PUT, or DELETE. Any
+ protocol activity that uses higher-numbered streams can be safely
+ retried using a new connection.
+
+ Activity on streams numbered lower than or equal to the last stream
+ identifier might still complete successfully. The sender of a GOAWAY
+ frame might gracefully shut down a connection by sending a GOAWAY
+ frame, maintaining the connection in an "open" state until all in-
+ progress streams complete.
+
+ An endpoint MAY send multiple GOAWAY frames if circumstances change.
+ For instance, an endpoint that sends GOAWAY with NO_ERROR during
+ graceful shutdown could subsequently encounter a condition that
+ requires immediate termination of the connection. The last stream
+ identifier from the last GOAWAY frame received indicates which
+ streams could have been acted upon. Endpoints MUST NOT increase the
+ value they send in the last stream identifier, since the peers might
+ already have retried unprocessed requests on another connection.
+
+ A client that is unable to retry requests loses all requests that are
+ in flight when the server closes the connection. This is especially
+ true for intermediaries that might not be serving clients using
+ HTTP/2. A server that is attempting to gracefully shut down a
+ connection SHOULD send an initial GOAWAY frame with the last stream
+ identifier set to 2^31-1 and a NO_ERROR code. This signals to the
+ client that a shutdown is imminent and that initiating further
+ requests is prohibited. After allowing time for any in-flight stream
+ creation (at least one round-trip time), the server MAY send another
+ GOAWAY frame with an updated last stream identifier. This ensures
+ that a connection can be cleanly shut down without losing requests.
+
+ After sending a GOAWAY frame, the sender can discard frames for
+ streams initiated by the receiver with identifiers higher than the
+ identified last stream. However, any frames that alter connection
+ state cannot be completely ignored. For instance, HEADERS,
+ PUSH_PROMISE, and CONTINUATION frames MUST be minimally processed to
+ ensure that the state maintained for field section compression is
+ consistent (see Section 4.3); similarly, DATA frames MUST be counted
+ toward the connection flow-control window. Failure to process these
+ frames can cause flow control or field section compression state to
+ become unsynchronized.
+
+ The GOAWAY frame also contains a 32-bit error code (Section 7) that
+ contains the reason for closing the connection.
+
+ Endpoints MAY append opaque data to the frame payload of any GOAWAY
+ frame. Additional debug data is intended for diagnostic purposes
+ only and carries no semantic value. Debug information could contain
+ security- or privacy-sensitive data. Logged or otherwise
+ persistently stored debug data MUST have adequate safeguards to
+ prevent unauthorized access.
+
+6.9. WINDOW_UPDATE
+
+ The WINDOW_UPDATE frame (type=0x08) is used to implement flow
+ control; see Section 5.2 for an overview.
+
+ Flow control operates at two levels: on each individual stream and on
+ the entire connection.
+
+ Both types of flow control are hop by hop, that is, only between the
+ two endpoints. Intermediaries do not forward WINDOW_UPDATE frames
+ between dependent connections. However, throttling of data transfer
+ by any receiver can indirectly cause the propagation of flow-control
+ information toward the original sender.
+
+ Flow control only applies to frames that are identified as being
+ subject to flow control. Of the frame types defined in this
+ document, this includes only DATA frames. Frames that are exempt
+ from flow control MUST be accepted and processed, unless the receiver
+ is unable to assign resources to handling the frame. A receiver MAY
+ respond with a stream error (Section 5.4.2) or connection error
+ (Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable to accept
+ a frame.
+
+ WINDOW_UPDATE Frame {
+ Length (24) = 0x04,
+ Type (8) = 0x08,
+
+ Unused Flags (8),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ Reserved (1),
+ Window Size Increment (31),
+ }
+
+ Figure 11: WINDOW_UPDATE Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. The frame payload of a
+ WINDOW_UPDATE frame is one reserved bit plus an unsigned 31-bit
+ integer indicating the number of octets that the sender can transmit
+ in addition to the existing flow-control window. The legal range for
+ the increment to the flow-control window is 1 to 2^31-1
+ (2,147,483,647) octets.
+
+ The WINDOW_UPDATE frame does not define any flags.
+
+ The WINDOW_UPDATE frame can be specific to a stream or to the entire
+ connection. In the former case, the frame's stream identifier
+ indicates the affected stream; in the latter, the value "0" indicates
+ that the entire connection is the subject of the frame.
+
+ A receiver MUST treat the receipt of a WINDOW_UPDATE frame with a
+ flow-control window increment of 0 as a stream error (Section 5.4.2)
+ of type PROTOCOL_ERROR; errors on the connection flow-control window
+ MUST be treated as a connection error (Section 5.4.1).
+
+ WINDOW_UPDATE can be sent by a peer that has sent a frame with the
+ END_STREAM flag set. This means that a receiver could receive a
+ WINDOW_UPDATE frame on a stream in a "half-closed (remote)" or
+ "closed" state. A receiver MUST NOT treat this as an error (see
+ Section 5.1).
+
+ A receiver that receives a flow-controlled frame MUST always account
+ for its contribution against the connection flow-control window,
+ unless the receiver treats this as a connection error
+ (Section 5.4.1). This is necessary even if the frame is in error.
+ The sender counts the frame toward the flow-control window, but if
+ the receiver does not, the flow-control window at the sender and
+ receiver can become different.
+
+ A WINDOW_UPDATE frame with a length other than 4 octets MUST be
+ treated as a connection error (Section 5.4.1) of type
+ FRAME_SIZE_ERROR.
+
+6.9.1. The Flow-Control Window
+
+ Flow control in HTTP/2 is implemented using a window kept by each
+ sender on every stream. The flow-control window is a simple integer
+ value that indicates how many octets of data the sender is permitted
+ to transmit; as such, its size is a measure of the buffering capacity
+ of the receiver.
+
+ Two flow-control windows are applicable: the stream flow-control
+ window and the connection flow-control window. The sender MUST NOT
+ send a flow-controlled frame with a length that exceeds the space
+ available in either of the flow-control windows advertised by the
+ receiver. Frames with zero length with the END_STREAM flag set (that
+ is, an empty DATA frame) MAY be sent if there is no available space
+ in either flow-control window.
+
+ For flow-control calculations, the 9-octet frame header is not
+ counted.
+
+ After sending a flow-controlled frame, the sender reduces the space
+ available in both windows by the length of the transmitted frame.
+
+ The receiver of a frame sends a WINDOW_UPDATE frame as it consumes
+ data and frees up space in flow-control windows. Separate
+ WINDOW_UPDATE frames are sent for the stream- and connection-level
+ flow-control windows. Receivers are advised to have mechanisms in
+ place to avoid sending WINDOW_UPDATE frames with very small
+ increments; see Section 4.2.3.3 of [RFC1122].
+
+ A sender that receives a WINDOW_UPDATE frame updates the
+ corresponding window by the amount specified in the frame.
+
+ A sender MUST NOT allow a flow-control window to exceed 2^31-1
+ octets. If a sender receives a WINDOW_UPDATE that causes a flow-
+ control window to exceed this maximum, it MUST terminate either the
+ stream or the connection, as appropriate. For streams, the sender
+ sends a RST_STREAM with an error code of FLOW_CONTROL_ERROR; for the
+ connection, a GOAWAY frame with an error code of FLOW_CONTROL_ERROR
+ is sent.
+
+ Flow-controlled frames from the sender and WINDOW_UPDATE frames from
+ the receiver are completely asynchronous with respect to each other.
+ This property allows a receiver to aggressively update the window
+ size kept by the sender to prevent streams from stalling.
+
+6.9.2. Initial Flow-Control Window Size
+
+ When an HTTP/2 connection is first established, new streams are
+ created with an initial flow-control window size of 65,535 octets.
+ The connection flow-control window is also 65,535 octets. Both
+ endpoints can adjust the initial window size for new streams by
+ including a value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS
+ frame. The connection flow-control window can only be changed using
+ WINDOW_UPDATE frames.
+
+ Prior to receiving a SETTINGS frame that sets a value for
+ SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default
+ initial window size when sending flow-controlled frames. Similarly,
+ the connection flow-control window is set based on the default
+ initial window size until a WINDOW_UPDATE frame is received.
+
+ In addition to changing the flow-control window for streams that are
+ not yet active, a SETTINGS frame can alter the initial flow-control
+ window size for streams with active flow-control windows (that is,
+ streams in the "open" or "half-closed (remote)" state). When the
+ value of SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST adjust
+ the size of all stream flow-control windows that it maintains by the
+ difference between the new value and the old value.
+
+ A change to SETTINGS_INITIAL_WINDOW_SIZE can cause the available
+ space in a flow-control window to become negative. A sender MUST
+ track the negative flow-control window and MUST NOT send new flow-
+ controlled frames until it receives WINDOW_UPDATE frames that cause
+ the flow-control window to become positive.
+
+ For example, if the client sends 60 KB immediately on connection
+ establishment and the server sets the initial window size to be 16
+ KB, the client will recalculate the available flow-control window to
+ be -44 KB on receipt of the SETTINGS frame. The client retains a
+ negative flow-control window until WINDOW_UPDATE frames restore the
+ window to being positive, after which the client can resume sending.
+
+ A SETTINGS frame cannot alter the connection flow-control window.
+
+ An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that
+ causes any flow-control window to exceed the maximum size as a
+ connection error (Section 5.4.1) of type FLOW_CONTROL_ERROR.
+
+6.9.3. Reducing the Stream Window Size
+
+ A receiver that wishes to use a smaller flow-control window than the
+ current size can send a new SETTINGS frame. However, the receiver
+ MUST be prepared to receive data that exceeds this window size, since
+ the sender might send data that exceeds the lower limit prior to
+ processing the SETTINGS frame.
+
+ After sending a SETTINGS frame that reduces the initial flow-control
+ window size, a receiver MAY continue to process streams that exceed
+ flow-control limits. Allowing streams to continue does not allow the
+ receiver to immediately reduce the space it reserves for flow-control
+ windows. Progress on these streams can also stall, since
+ WINDOW_UPDATE frames are needed to allow the sender to resume
+ sending. The receiver MAY instead send a RST_STREAM with an error
+ code of FLOW_CONTROL_ERROR for the affected streams.
+
+6.10. CONTINUATION
+
+ The CONTINUATION frame (type=0x09) is used to continue a sequence of
+ field block fragments (Section 4.3). Any number of CONTINUATION
+ frames can be sent, as long as the preceding frame is on the same
+ stream and is a HEADERS, PUSH_PROMISE, or CONTINUATION frame without
+ the END_HEADERS flag set.
+
+ CONTINUATION Frame {
+ Length (24),
+ Type (8) = 0x09,
+
+ Unused Flags (5),
+ END_HEADERS Flag (1),
+ Unused Flags (2),
+
+ Reserved (1),
+ Stream Identifier (31),
+
+ Field Block Fragment (..),
+ }
+
+ Figure 12: CONTINUATION Frame Format
+
+ The Length, Type, Unused Flag(s), Reserved, and Stream Identifier
+ fields are described in Section 4. The CONTINUATION frame payload
+ contains a field block fragment (Section 4.3).
+
+ The CONTINUATION frame defines the following flag:
+
+ END_HEADERS (0x04): When set, the END_HEADERS flag indicates that
+ this frame ends a field block (Section 4.3).
+
+ If the END_HEADERS flag is not set, this frame MUST be followed by
+ another CONTINUATION frame. A receiver MUST treat the receipt of
+ any other type of frame or a frame on a different stream as a
+ connection error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ The CONTINUATION frame changes the connection state as defined in
+ Section 4.3.
+
+ CONTINUATION frames MUST be associated with a stream. If a
+ CONTINUATION frame is received with a Stream Identifier field of
+ 0x00, the recipient MUST respond with a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ A CONTINUATION frame MUST be preceded by a HEADERS, PUSH_PROMISE or
+ CONTINUATION frame without the END_HEADERS flag set. A recipient
+ that observes violation of this rule MUST respond with a connection
+ error (Section 5.4.1) of type PROTOCOL_ERROR.
+
+7. Error Codes
+
+ Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY
+ frames to convey the reasons for the stream or connection error.
+
+ Error codes share a common code space. Some error codes apply only
+ to either streams or the entire connection and have no defined
+ semantics in the other context.
+
+ The following error codes are defined:
+
+ NO_ERROR (0x00): The associated condition is not a result of an
+ error. For example, a GOAWAY might include this code to indicate
+ graceful shutdown of a connection.
+
+ PROTOCOL_ERROR (0x01): The endpoint detected an unspecific protocol
+ error. This error is for use when a more specific error code is
+ not available.
+
+ INTERNAL_ERROR (0x02): The endpoint encountered an unexpected
+ internal error.
+
+ FLOW_CONTROL_ERROR (0x03): The endpoint detected that its peer
+ violated the flow-control protocol.
+
+ SETTINGS_TIMEOUT (0x04): The endpoint sent a SETTINGS frame but did
+ not receive a response in a timely manner. See Section 6.5.3
+ ("Settings Synchronization").
+
+ STREAM_CLOSED (0x05): The endpoint received a frame after a stream
+ was half-closed.
+
+ FRAME_SIZE_ERROR (0x06): The endpoint received a frame with an
+ invalid size.
+
+ REFUSED_STREAM (0x07): The endpoint refused the stream prior to
+ performing any application processing (see Section 8.7 for
+ details).
+
+ CANCEL (0x08): The endpoint uses this error code to indicate that
+ the stream is no longer needed.
+
+ COMPRESSION_ERROR (0x09): The endpoint is unable to maintain the
+ field section compression context for the connection.
+
+ CONNECT_ERROR (0x0a): The connection established in response to a
+ CONNECT request (Section 8.5) was reset or abnormally closed.
+
+ ENHANCE_YOUR_CALM (0x0b): The endpoint detected that its peer is
+ exhibiting a behavior that might be generating excessive load.
+
+ INADEQUATE_SECURITY (0x0c): The underlying transport has properties
+ that do not meet minimum security requirements (see Section 9.2).
+
+ HTTP_1_1_REQUIRED (0x0d): The endpoint requires that HTTP/1.1 be
+ used instead of HTTP/2.
+
+ Unknown or unsupported error codes MUST NOT trigger any special
+ behavior. These MAY be treated by an implementation as being
+ equivalent to INTERNAL_ERROR.
+
+8. Expressing HTTP Semantics in HTTP/2
+
+ HTTP/2 is an instantiation of the HTTP message abstraction (Section 6
+ of [HTTP]).
+
+8.1. HTTP Message Framing
+
+ A client sends an HTTP request on a new stream, using a previously
+ unused stream identifier (Section 5.1.1). A server sends an HTTP
+ response on the same stream as the request.
+
+ An HTTP message (request or response) consists of:
+
+ 1. one HEADERS frame (followed by zero or more CONTINUATION frames)
+ containing the header section (see Section 6.3 of [HTTP]),
+
+ 2. zero or more DATA frames containing the message content (see
+ Section 6.4 of [HTTP]), and
+
+ 3. optionally, one HEADERS frame (followed by zero or more
+ CONTINUATION frames) containing the trailer section, if present
+ (see Section 6.5 of [HTTP]).
+
+ For a response only, a server MAY send any number of interim
+ responses before the HEADERS frame containing a final response. An
+ interim response consists of a HEADERS frame (which might be followed
+ by zero or more CONTINUATION frames) containing the control data and
+ header section of an interim (1xx) HTTP response (see Section 15 of
+ [HTTP]). A HEADERS frame with the END_STREAM flag set that carries
+ an informational status code is malformed (Section 8.1.1).
+
+ The last frame in the sequence bears an END_STREAM flag, noting that
+ a HEADERS frame with the END_STREAM flag set can be followed by
+ CONTINUATION frames that carry any remaining fragments of the field
+ block.
+
+ Other frames (from any stream) MUST NOT occur between the HEADERS
+ frame and any CONTINUATION frames that might follow.
+
+ HTTP/2 uses DATA frames to carry message content. The chunked
+ transfer encoding defined in Section 7.1 of [HTTP/1.1] cannot be used
+ in HTTP/2; see Section 8.2.2.
+
+ Trailer fields are carried in a field block that also terminates the
+ stream. That is, trailer fields comprise a sequence starting with a
+ HEADERS frame, followed by zero or more CONTINUATION frames, where
+ the HEADERS frame bears an END_STREAM flag. Trailers MUST NOT
+ include pseudo-header fields (Section 8.3). An endpoint that
+ receives pseudo-header fields in trailers MUST treat the request or
+ response as malformed (Section 8.1.1).
+
+ An endpoint that receives a HEADERS frame without the END_STREAM flag
+ set after receiving the HEADERS frame that opens a request or after
+ receiving a final (non-informational) status code MUST treat the
+ corresponding request or response as malformed (Section 8.1.1).
+
+ An HTTP request/response exchange fully consumes a single stream. A
+ request starts with the HEADERS frame that puts the stream into the
+ "open" state. The request ends with a frame with the END_STREAM flag
+ set, which causes the stream to become "half-closed (local)" for the
+ client and "half-closed (remote)" for the server. A response stream
+ starts with zero or more interim responses in HEADERS frames,
+ followed by a HEADERS frame containing a final status code.
+
+ An HTTP response is complete after the server sends -- or the client
+ receives -- a frame with the END_STREAM flag set (including any
+ CONTINUATION frames needed to complete a field block). 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 this is true, a server MAY
+ request that the client abort transmission of a request without error
+ by sending a RST_STREAM with an error code of NO_ERROR after sending
+ a complete response (i.e., a frame with the END_STREAM flag set).
+ Clients MUST NOT discard responses as a result of receiving such a
+ RST_STREAM, though clients can always discard responses at their
+ discretion for other reasons.
+
+8.1.1. Malformed Messages
+
+ A malformed request or response is one that is an otherwise valid
+ sequence of HTTP/2 frames but is invalid due to the presence of
+ extraneous frames, prohibited fields or pseudo-header fields, the
+ absence of mandatory pseudo-header fields, the inclusion of uppercase
+ field names, or invalid field names and/or values (in certain
+ circumstances; see Section 8.2).
+
+ A request or response that includes message content can include a
+ content-length header field. A request or response is also malformed
+ if the value of a content-length header field does not equal the sum
+ of the DATA frame payload lengths that form the content, unless the
+ message is defined as having no content. For example, 204 or 304
+ responses contain no content, as does the response to a HEAD request.
+ A response that is defined to have no content, as described in
+ Section 6.4.1 of [HTTP], MAY 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 (Section 5.4.2) of type
+ PROTOCOL_ERROR.
+
+ For malformed requests, a server MAY send an HTTP response prior to
+ closing or resetting the stream. Clients MUST NOT accept a malformed
+ response.
+
+ Endpoints that progressively process messages might have performed
+ some processing before identifying a request or response as
+ malformed. For instance, it might be possible to generate an
+ informational or 404 status code without having received a complete
+ request. Similarly, intermediaries might forward incomplete messages
+ before detecting errors. A server MAY generate a final response
+ before receiving an entire request when the response does not depend
+ on the remainder of the request being correct.
+
+ 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.
+
+8.2. HTTP Fields
+
+ HTTP fields (Section 5 of [HTTP]) are conveyed by HTTP/2 in the
+ HEADERS, CONTINUATION, and PUSH_PROMISE frames, compressed with HPACK
+ [COMPRESSION].
+
+ Field names MUST be converted to lowercase when constructing an
+ HTTP/2 message.
+
+8.2.1. Field Validity
+
+ The definitions of field names and values in HTTP prohibit some
+ characters that HPACK might be able to convey. HTTP/2
+ implementations SHOULD validate field names and values according to
+ their definitions in Sections 5.1 and 5.5 of [HTTP], respectively,
+ and treat messages that contain prohibited characters as malformed
+ (Section 8.1.1).
+
+ Failure to validate fields can be exploited for request smuggling
+ attacks. In particular, unvalidated fields might enable attacks when
+ messages are forwarded using HTTP/1.1 [HTTP/1.1], where characters
+ such as carriage return (CR), line feed (LF), and COLON are used as
+ delimiters. Implementations MUST perform the following minimal
+ validation of field names and values:
+
+ * A field name MUST NOT contain characters in the ranges 0x00-0x20,
+ 0x41-0x5a, or 0x7f-0xff (all ranges inclusive). This specifically
+ excludes all non-visible ASCII characters, ASCII SP (0x20), and
+ uppercase characters ('A' to 'Z', ASCII 0x41 to 0x5a).
+
+ * With the exception of pseudo-header fields (Section 8.3), which
+ have a name that starts with a single colon, field names MUST NOT
+ include a colon (ASCII COLON, 0x3a).
+
+ * A field value MUST NOT contain the zero value (ASCII NUL, 0x00),
+ line feed (ASCII LF, 0x0a), or carriage return (ASCII CR, 0x0d) at
+ any position.
+
+ * A field value MUST NOT start or end with an ASCII whitespace
+ character (ASCII SP or HTAB, 0x20 or 0x09).
+
+ | Note: An implementation that validates fields according to the
+ | definitions in Sections 5.1 and 5.5 of [HTTP] only needs an
+ | additional check that field names do not include uppercase
+ | characters.
+
+ A request or response that contains a field that violates any of
+ these conditions MUST be treated as malformed (Section 8.1.1). In
+ particular, an intermediary that does not process fields when
+ forwarding messages MUST NOT forward fields that contain any of the
+ values that are listed as prohibited above.
+
+ When a request message violates one of these requirements, an
+ implementation SHOULD generate a 400 (Bad Request) status code (see
+ Section 15.5.1 of [HTTP]), unless a more suitable status code is
+ defined or the status code cannot be sent (e.g., because the error
+ occurs in a trailer field).
+
+ | Note: Field values that are not valid according to the
+ | definition of the corresponding field do not cause a request to
+ | be malformed; the requirements above only apply to the generic
+ | syntax for fields as defined in Section 5 of [HTTP].
+
+8.2.2. Connection-Specific Header Fields
+
+ HTTP/2 does not use the Connection header field (Section 7.6.1 of
+ [HTTP]) to indicate connection-specific header fields; in this
+ protocol, connection-specific metadata is conveyed by other means.
+ An endpoint MUST NOT generate an HTTP/2 message containing
+ connection-specific header fields. This includes the Connection
+ header field and those listed as having connection-specific semantics
+ in Section 7.6.1 of [HTTP] (that is, Proxy-Connection, Keep-Alive,
+ Transfer-Encoding, and Upgrade). Any message containing connection-
+ specific header fields MUST be treated as malformed (Section 8.1.1).
+
+ The only exception to this is the TE header field, which MAY be
+ present in an HTTP/2 request; when it is, it MUST NOT contain any
+ value other than "trailers".
+
+ An intermediary transforming an HTTP/1.x message to HTTP/2 MUST
+ remove connection-specific header fields as discussed in
+ Section 7.6.1 of [HTTP], or their messages will be treated by other
+ HTTP/2 endpoints as malformed (Section 8.1.1).
+
+ | Note: HTTP/2 purposefully does not support upgrade to another
+ | protocol. The handshake methods described in Section 3 are
+ | believed sufficient to negotiate the use of alternative
+ | protocols.
+
+8.2.3. Compressing the Cookie Header Field
+
+ The Cookie header field [COOKIE] uses a semicolon (";") to delimit
+ cookie-pairs (or "crumbs"). This header field contains multiple
+ values, but does not use a COMMA (",") as a separator, thereby
+ preventing cookie-pairs from being sent on multiple field lines (see
+ Section 5.2 of [HTTP]). This can significantly reduce compression
+ efficiency, as updates to individual cookie-pairs would invalidate
+ any field lines that are stored in the HPACK table.
+
+ To allow for better compression efficiency, the Cookie header field
+ MAY be split into separate header fields, each with one or more
+ cookie-pairs. If there are multiple Cookie header fields after
+ decompression, these MUST be concatenated into a single octet string
+ using the two-octet delimiter of 0x3b, 0x20 (the ASCII string "; ")
+ before being passed into a non-HTTP/2 context, such as an HTTP/1.1
+ connection, or a generic HTTP server application.
+
+ Therefore, the following two lists of Cookie header fields are
+ semantically equivalent.
+
+ cookie: a=b; c=d; e=f
+
+ cookie: a=b
+ cookie: c=d
+ cookie: e=f
+
+8.3. HTTP Control Data
+
+ HTTP/2 uses special pseudo-header fields beginning with a ':'
+ character (ASCII 0x3a) to convey message control data (see
+ Section 6.2 of [HTTP]).
+
+ Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT
+ generate pseudo-header fields other than those defined in this
+ document. Note that an extension could negotiate the use of
+ additional pseudo-header fields; see Section 5.5.
+
+ 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 a
+ trailer section. Endpoints MUST treat a request or response that
+ contains undefined or invalid pseudo-header fields as malformed
+ (Section 8.1.1).
+
+ All pseudo-header fields MUST appear in a field block before all
+ regular field lines. Any request or response that contains a pseudo-
+ header field that appears in a field block after a regular field line
+ MUST be treated as malformed (Section 8.1.1).
+
+ The same pseudo-header field name MUST NOT appear more than once in a
+ field block. A field block for an HTTP request or response that
+ contains a repeated pseudo-header field name MUST be treated as
+ malformed (Section 8.1.1).
+
+8.3.1. Request Pseudo-Header Fields
+
+ The following pseudo-header fields are defined for HTTP/2 requests:
+
+ * The ":method" pseudo-header field includes the HTTP method
+ (Section 9 of [HTTP]).
+
+ * The ":scheme" pseudo-header field includes the scheme portion of
+ the request target. The scheme is taken from the target URI
+ (Section 3.1 of [RFC3986]) when generating a request directly, or
+ from the scheme of a translated request (for example, see
+ Section 3.3 of [HTTP/1.1]). Scheme is omitted for CONNECT
+ requests (Section 8.5).
+
+ ":scheme" is not restricted to "http" and "https" schemed URIs. A
+ proxy or gateway can translate requests for non-HTTP schemes,
+ enabling the use of HTTP to interact with non-HTTP services.
+
+ * The ":authority" pseudo-header field conveys the authority portion
+ (Section 3.2 of [RFC3986]) of the target URI (Section 7.1 of
+ [HTTP]). The recipient of an HTTP/2 request MUST NOT use the Host
+ header field to determine the target URI if ":authority" is
+ present.
+
+ Clients that generate HTTP/2 requests directly MUST use the
+ ":authority" pseudo-header field to convey authority information,
+ unless there is no authority information to convey (in which case
+ it MUST NOT generate ":authority").
+
+ Clients MUST NOT generate a request with a Host header field that
+ differs from the ":authority" pseudo-header field. A server
+ SHOULD treat a request as malformed if it contains a Host header
+ field that identifies an entity that differs from the entity in
+ the ":authority" pseudo-header field. The values of fields need
+ to be normalized to compare them (see Section 6.2 of [RFC3986]).
+ An origin server can apply any normalization method, whereas other
+ servers MUST perform scheme-based normalization (see Section 6.2.3
+ of [RFC3986]) of the two fields.
+
+ An intermediary that forwards a request over HTTP/2 MUST construct
+ an ":authority" pseudo-header field using the authority
+ information from the control data of the original request, unless
+ the original request's target URI does not contain authority
+ information (in which case it MUST NOT generate ":authority").
+ Note that the Host header field is not the sole source of this
+ information; see Section 7.2 of [HTTP].
+
+ An intermediary that needs to generate a Host header field (which
+ might be necessary to construct an HTTP/1.1 request) MUST use the
+ value from the ":authority" pseudo-header field as the value of
+ the Host field, unless the intermediary also changes the request
+ target. This replaces any existing Host field to avoid potential
+ vulnerabilities in HTTP routing.
+
+ An intermediary that forwards a request over HTTP/2 MAY retain any
+ Host header field.
+
+ Note that request targets for CONNECT or asterisk-form OPTIONS
+ requests never include authority information; see Sections 7.1 and
+ 7.2 of [HTTP].
+
+ ":authority" MUST NOT include the deprecated userinfo subcomponent
+ for "http" or "https" schemed URIs.
+
+ * The ":path" pseudo-header field includes the path and query parts
+ of the target URI (the absolute-path production and, optionally, a
+ '?' character followed by the query production; see Section 4.1 of
+ [HTTP]). A request in asterisk form (for OPTIONS) includes the
+ value '*' for the ":path" pseudo-header field.
+
+ 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 '/'. The exceptions to this rule are:
+
+ - an OPTIONS request for an "http" or "https" URI that does not
+ include a path component; these MUST include a ":path" pseudo-
+ header field with a value of '*' (see Section 7.1 of [HTTP]).
+
+ - CONNECT requests (Section 8.5), where the ":path" pseudo-header
+ field is omitted.
+
+ All HTTP/2 requests MUST include exactly one valid value for the
+ ":method", ":scheme", and ":path" pseudo-header fields, unless they
+ are CONNECT requests (Section 8.5). An HTTP request that omits
+ mandatory pseudo-header fields is malformed (Section 8.1.1).
+
+ Individual HTTP/2 requests do not carry an explicit indicator of
+ protocol version. All HTTP/2 requests implicitly have a protocol
+ version of "2.0" (see Section 6.2 of [HTTP]).
+
+8.3.2. Response Pseudo-Header Fields
+
+ For HTTP/2 responses, a single ":status" pseudo-header field is
+ defined that carries the HTTP status code field (see Section 15 of
+ [HTTP]). This pseudo-header field MUST be included in all responses,
+ including interim responses; otherwise, the response is malformed
+ (Section 8.1.1).
+
+ HTTP/2 responses implicitly have a protocol version of "2.0".
+
+8.4. Server Push
+
+ HTTP/2 allows a server to preemptively send (or "push") responses
+ (along with corresponding "promised" requests) to a client in
+ association with a previous client-initiated request.
+
+ Server push was designed to allow a server to improve client-
+ perceived performance by predicting what requests will follow those
+ that it receives, thereby removing a round trip for them. For
+ example, a request for HTML is often followed by requests for
+ stylesheets and scripts referenced by that page. When these requests
+ are pushed, the client does not need to wait to receive the
+ references to them in the HTML and issue separate requests.
+
+ In practice, server push is difficult to use effectively, because it
+ requires the server to correctly anticipate the additional requests
+ the client will make, taking into account factors such as caching,
+ content negotiation, and user behavior. Errors in prediction can
+ lead to performance degradation, due to the opportunity cost that the
+ additional data on the wire represents. In particular, pushing any
+ significant amount of data can cause contention issues with responses
+ that are more important.
+
+ A client can request that server push be disabled, though this is
+ negotiated for each hop independently. The SETTINGS_ENABLE_PUSH
+ setting can be set to 0 to indicate that server push is disabled.
+
+ Promised requests MUST be safe (see Section 9.2.1 of [HTTP]) and
+ cacheable (see Section 9.2.3 of [HTTP]). Promised requests cannot
+ include any content or a trailer section. Clients that receive a
+ promised request that is not cacheable, that is not known to be safe,
+ or that indicates the presence of request content MUST reset the
+ promised stream with a stream error (Section 5.4.2) of type
+ PROTOCOL_ERROR. Note that this could result in the promised stream
+ being reset if the client does not recognize a newly defined method
+ as being safe.
+
+ Pushed responses that are cacheable (see Section 3 of [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 [CACHING]) while the stream identified by the
+ promised stream identifier is still open.
+
+ Pushed responses that are not cacheable MUST NOT be stored by any
+ HTTP cache. They MAY be made available to the application
+ separately.
+
+ The server MUST include a value in the ":authority" pseudo-header
+ field for which the server is authoritative (see Section 10.1). A
+ client MUST treat a PUSH_PROMISE for which the server is not
+ authoritative as a stream error (Section 5.4.2) of type
+ PROTOCOL_ERROR.
+
+ An intermediary can receive pushes from the server and choose not to
+ forward them on to the client. In other words, how to make use of
+ the pushed information is up to that intermediary. Equally, the
+ intermediary might choose to make additional pushes to the client,
+ without any action taken by the server.
+
+ A client cannot push. Thus, servers MUST treat the receipt of a
+ PUSH_PROMISE frame as a connection error (Section 5.4.1) of type
+ PROTOCOL_ERROR. A server cannot set the SETTINGS_ENABLE_PUSH setting
+ to a value other than 0 (see Section 6.5.2).
+
+8.4.1. Push Requests
+
+ Server push is semantically equivalent to a server responding to a
+ request; however, in this case, that request is also sent by the
+ server, as a PUSH_PROMISE frame.
+
+ The PUSH_PROMISE frame includes a field block that contains control
+ data and a complete set of request header fields that the server
+ attributes to the request. It is not possible to push a response to
+ a request that includes message content.
+
+ Promised requests are always associated with an explicit request from
+ the client. The PUSH_PROMISE frames sent by the server are sent on
+ that explicit request's stream. The PUSH_PROMISE frame also includes
+ a promised stream identifier, chosen from the stream identifiers
+ available to the server (see Section 5.1.1).
+
+ The header fields in PUSH_PROMISE and any subsequent CONTINUATION
+ frames MUST be a valid and complete set of request header fields
+ (Section 8.3.1). The server MUST include a method in the ":method"
+ pseudo-header field that is safe and cacheable. If a client receives
+ a PUSH_PROMISE that does not include a complete and valid set of
+ header fields or the ":method" pseudo-header field identifies a
+ method that is not safe, it MUST respond on the promised stream with
+ a stream error (Section 5.4.2) of type PROTOCOL_ERROR.
+
+ The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to
+ sending any frames that reference the promised responses. This
+ avoids a race where clients issue requests prior to receiving any
+ PUSH_PROMISE frames.
+
+ For example, if the server receives a request for a document
+ containing embedded links to multiple image files and the server
+ chooses to push those additional images to the client, sending
+ PUSH_PROMISE frames before the DATA frames that contain the image
+ links ensures that the client is able to see that a resource will be
+ pushed before discovering embedded links. Similarly, if the server
+ pushes resources referenced by the field block (for instance, in Link
+ header fields), sending a PUSH_PROMISE before sending the header
+ ensures that clients do not request those resources.
+
+ PUSH_PROMISE frames MUST NOT be sent by the client.
+
+ PUSH_PROMISE frames can be sent by the server on any client-initiated
+ stream, but the stream MUST be in either the "open" or "half-closed
+ (remote)" state with respect to the server. PUSH_PROMISE frames are
+ interspersed with the frames that comprise a response, though they
+ cannot be interspersed with HEADERS and CONTINUATION frames that
+ comprise a single field block.
+
+ Sending a PUSH_PROMISE frame creates a new stream and puts the stream
+ into the "reserved (local)" state for the server and the "reserved
+ (remote)" state for the client.
+
+8.4.2. Push Responses
+
+ After sending the PUSH_PROMISE frame, the server can begin delivering
+ the pushed response as a response (Section 8.3.2) on a server-
+ initiated stream that uses the promised stream identifier. The
+ server uses this stream to transmit an HTTP response, using the same
+ sequence of frames as that defined in Section 8.1. This stream
+ becomes "half-closed" to the client (Section 5.1) after the initial
+ HEADERS frame is sent.
+
+ Once a client receives a PUSH_PROMISE frame and chooses to accept the
+ pushed response, the client SHOULD NOT issue any requests for the
+ promised response until after the promised stream has closed.
+
+ If the client determines, for any reason, that it does not wish to
+ receive the pushed response from the server or if the server takes
+ too long to begin sending the promised response, the client can send
+ a RST_STREAM frame, using either the CANCEL or REFUSED_STREAM code
+ and referencing the pushed stream's identifier.
+
+ A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit
+ the number of responses that can be concurrently pushed by a server.
+ Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero prevents
+ the server from opening the streams necessary to push responses.
+ However, this does not prevent the server from reserving streams
+ using PUSH_PROMISE frames, because reserved streams do not count
+ toward the concurrent stream limit. Clients that do not wish to
+ receive pushed resources need to reset any unwanted reserved streams
+ or set SETTINGS_ENABLE_PUSH to 0.
+
+ Clients receiving a pushed response MUST validate that either the
+ server is authoritative (see Section 10.1) or the proxy that provided
+ the pushed response is configured for the corresponding request. For
+ example, a server that offers a certificate for only the example.com
+ DNS-ID (see [RFC6125]) is not permitted to push a response for
+ <https://www.example.org/doc>.
+
+ The response for a PUSH_PROMISE stream begins with a HEADERS frame,
+ which immediately puts the stream into the "half-closed (remote)"
+ state for the server and "half-closed (local)" state for the client,
+ and ends with a frame with the END_STREAM flag set, which places the
+ stream in the "closed" state.
+
+ | Note: The client never sends a frame with the END_STREAM flag
+ | set for a server push.
+
+8.5. The CONNECT Method
+
+ The CONNECT method (Section 9.3.6 of [HTTP]) is used to convert an
+ HTTP connection into a tunnel to a remote host. CONNECT 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/2, the CONNECT method establishes a tunnel over a single
+ HTTP/2 stream to a remote host, rather than converting the entire
+ connection to a tunnel. A CONNECT header section is constructed as
+ defined in Section 8.3.1 ("Request Pseudo-Header Fields"), with a few
+ differences. Specifically:
+
+ * The ":method" pseudo-header field is set to CONNECT.
+
+ * The ":scheme" and ":path" pseudo-header fields MUST be 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 3.2.3 of [HTTP/1.1]).
+
+ A CONNECT request that does not conform to these restrictions is
+ malformed (Section 8.1.1).
+
+ A proxy that supports CONNECT establishes a TCP connection [TCP] to
+ the host and port 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 9.3.6 of [HTTP].
+
+ After the initial HEADERS frame sent by each peer, all subsequent
+ DATA frames correspond to data sent on the TCP connection. The frame
+ payload of any DATA frames sent by the client is transmitted by the
+ proxy to the TCP server; data received from the TCP server is
+ assembled into DATA frames by the proxy. Frame types other than DATA
+ or stream management frames (RST_STREAM, WINDOW_UPDATE, and PRIORITY)
+ MUST NOT be sent on a connected stream and MUST be treated as a
+ stream error (Section 5.4.2) if received.
+
+ The TCP connection can be closed by either peer. The END_STREAM flag
+ on a DATA frame is treated as being equivalent to the TCP FIN bit. A
+ client is expected to send a DATA frame with the END_STREAM flag set
+ after receiving a frame with the END_STREAM flag set. A proxy that
+ receives a DATA frame with the END_STREAM flag set sends the attached
+ data with the FIN bit set on the last TCP segment. A proxy that
+ receives a TCP segment with the FIN bit set sends a DATA frame with
+ the END_STREAM flag set. Note that the final TCP segment or DATA
+ frame could be empty.
+
+ A TCP connection error is signaled with RST_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 (Section 5.4.2) of
+ type CONNECT_ERROR. Correspondingly, a proxy MUST send a TCP segment
+ with the RST bit set if it detects an error with the stream or the
+ HTTP/2 connection.
+
+8.6. The Upgrade Header Field
+
+ HTTP/2 does not support the 101 (Switching Protocols) informational
+ status code (Section 15.2.2 of [HTTP]).
+
+ The semantics of 101 (Switching Protocols) aren't applicable to a
+ multiplexed protocol. Similar functionality might be enabled through
+ the use of extended CONNECT [RFC8441], and other protocols are able
+ to use the same mechanisms that HTTP/2 uses to negotiate their use
+ (see Section 3).
+
+8.7. Request Reliability
+
+ In general, an HTTP client is unable to retry a non-idempotent
+ request when an error occurs because there is no means to determine
+ the nature of the error (see Section 9.2.2 of [HTTP]). It is
+ possible that some server processing occurred prior to the error,
+ which could result in undesirable effects if the request were
+ reattempted.
+
+ HTTP/2 provides two mechanisms for providing a guarantee to a client
+ that a request has not been processed:
+
+ * The GOAWAY frame indicates the highest stream number that might
+ have been processed. Requests on streams with higher numbers are
+ therefore guaranteed to be safe to retry.
+
+ * The REFUSED_STREAM error code can be included in a RST_STREAM
+ frame to indicate that the stream is being closed prior to any
+ processing having occurred. Any request that was sent on the
+ reset stream can be safely retried.
+
+ Requests that have not been processed have not failed; clients MAY
+ automatically retry them, even those with non-idempotent methods.
+
+ A server MUST NOT indicate that a stream has not been processed
+ unless it can guarantee that fact. If frames that are on a stream
+ are passed to the application layer for any stream, then
+ REFUSED_STREAM MUST NOT be used for that stream, and a GOAWAY frame
+ MUST include a stream identifier that is greater than or equal to the
+ given stream identifier.
+
+ In addition to these mechanisms, the PING frame provides a way for a
+ client to easily test a connection. Connections that remain idle can
+ become broken, because some middleboxes (for instance, network
+ address translators or load balancers) silently discard connection
+ bindings. The PING frame allows a client to safely test whether a
+ connection is still active without sending a request.
+
+8.8. Examples
+
+ This section shows HTTP/1.1 requests and responses, with
+ illustrations of equivalent HTTP/2 requests and responses.
+
+8.8.1. Simple Request
+
+ An HTTP GET request includes control data and a request header with
+ no message content and is therefore transmitted as a single HEADERS
+ frame, followed by zero or more CONTINUATION frames containing the
+ serialized block of request header fields. The HEADERS frame in the
+ following has both the END_HEADERS and END_STREAM flags set; no
+ CONTINUATION frames are sent.
+
+ GET /resource HTTP/1.1 HEADERS
+ Host: example.org ==> + END_STREAM
+ Accept: image/jpeg + END_HEADERS
+ :method = GET
+ :scheme = https
+ :authority = example.org
+ :path = /resource
+ host = example.org
+ accept = image/jpeg
+
+8.8.2. Simple Response
+
+ Similarly, a response that includes only control data and a response
+ header is transmitted as a HEADERS frame (again, followed by zero or
+ more CONTINUATION frames) containing the serialized block of response
+ header fields.
+
+ HTTP/1.1 304 Not Modified HEADERS
+ ETag: "xyzzy" ==> + END_STREAM
+ Expires: Thu, 23 Jan ... + END_HEADERS
+ :status = 304
+ etag = "xyzzy"
+ expires = Thu, 23 Jan ...
+
+8.8.3. Complex Request
+
+ An HTTP POST request that includes control data and a request header
+ with message content is transmitted as one HEADERS frame, followed by
+ zero or more CONTINUATION frames containing the request header,
+ followed by one or more DATA frames, with the last CONTINUATION (or
+ HEADERS) frame having the END_HEADERS flag set and the final DATA
+ frame having the END_STREAM flag set:
+
+ POST /resource HTTP/1.1 HEADERS
+ Host: example.org ==> - END_STREAM
+ Content-Type: image/jpeg - END_HEADERS
+ Content-Length: 123 :method = POST
+ :authority = example.org
+ :path = /resource
+ {binary data} :scheme = https
+
+ CONTINUATION
+ + END_HEADERS
+ content-type = image/jpeg
+ host = example.org
+ content-length = 123
+
+ DATA
+ + END_STREAM
+ {binary data}
+
+ Note that data contributing to any given field line could be spread
+ between field block fragments. The allocation of field lines to
+ frames in this example is illustrative only.
+
+8.8.4. Response with Body
+
+ A response that includes control data and a response header with
+ message content is transmitted as a HEADERS frame, followed by zero
+ or more CONTINUATION frames, followed by one or more DATA frames,
+ with the last DATA frame in the sequence having the END_STREAM flag
+ set:
+
+ HTTP/1.1 200 OK HEADERS
+ Content-Type: image/jpeg ==> - END_STREAM
+ Content-Length: 123 + END_HEADERS
+ :status = 200
+ {binary data} content-type = image/jpeg
+ content-length = 123
+
+ DATA
+ + END_STREAM
+ {binary data}
+
+8.8.5. Informational Responses
+
+ An informational response using a 1xx status code other than 101 is
+ transmitted as a HEADERS frame, followed by zero or more CONTINUATION
+ frames.
+
+ A trailer section is sent as a field block after both the request or
+ response field block and all the DATA frames have been sent. The
+ HEADERS frame starting the field block that comprises the trailer
+ section has the END_STREAM flag set.
+
+ The following example includes both a 100 (Continue) status code,
+ which is sent in response to a request containing a "100-continue"
+ token in the Expect header field, and a trailer section:
+
+ HTTP/1.1 100 Continue HEADERS
+ Extension-Field: bar ==> - END_STREAM
+ + END_HEADERS
+ :status = 100
+ extension-field = bar
+
+ HTTP/1.1 200 OK HEADERS
+ Content-Type: image/jpeg ==> - END_STREAM
+ Transfer-Encoding: chunked + END_HEADERS
+ Trailer: Foo :status = 200
+ content-type = image/jpeg
+ 123 trailer = Foo
+ {binary data}
+ 0 DATA
+ Foo: bar - END_STREAM
+ {binary data}
+
+ HEADERS
+ + END_STREAM
+ + END_HEADERS
+ foo = bar
+
+9. HTTP/2 Connections
+
+ This section outlines attributes of HTTP that improve
+ interoperability, reduce exposure to known security vulnerabilities,
+ or reduce the potential for implementation variation.
+
+9.1. Connection Management
+
+ HTTP/2 connections are persistent. 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.
+
+ Clients SHOULD NOT open more than one HTTP/2 connection to a given
+ host and port pair, where the host is derived from a URI, a selected
+ alternative service [ALT-SVC], or a configured proxy.
+
+ A client can create additional connections as replacements, either to
+ replace connections that are near to exhausting the available stream
+ identifier space (Section 5.1.1), to refresh the keying material for
+ a TLS connection, or to replace connections that have encountered
+ errors (Section 5.4.1).
+
+ A client MAY open multiple connections to the same IP address and TCP
+ port using different Server Name Indication [TLS-EXT] values or to
+ provide different TLS client certificates but SHOULD avoid creating
+ multiple connections with the same configuration.
+
+ Servers are encouraged to maintain open connections for as long as
+ possible but are permitted to terminate idle connections if
+ necessary. When either endpoint chooses to close the transport-layer
+ TCP connection, the terminating endpoint SHOULD first send a GOAWAY
+ (Section 6.8) frame so that both endpoints can reliably determine
+ whether previously sent frames have been processed and gracefully
+ complete or terminate any necessary remaining tasks.
+
+9.1.1. Connection Reuse
+
+ Connections that are made to an origin server, either directly or
+ through a tunnel created using the CONNECT method (Section 8.5), MAY
+ be reused for requests with multiple different URI authority
+ components. A connection can be reused as long as the origin server
+ is authoritative (Section 10.1). For TCP connections without TLS,
+ this depends on the host having resolved to the same IP address.
+
+ For "https" resources, connection reuse additionally depends on
+ having a certificate that is valid for the host in the URI. The
+ certificate presented by the server MUST satisfy any checks that the
+ client would perform when forming a new TLS connection for the host
+ in the URI. A single certificate can be used to establish authority
+ for multiple origins. Section 4.3 of [HTTP] describes how a client
+ determines whether a server is authoritative for a URI.
+
+ In some deployments, reusing a connection for multiple origins can
+ result in requests being directed to the wrong origin server. For
+ example, TLS termination might be performed by a middlebox that uses
+ the TLS Server Name Indication [TLS-EXT] extension to select an
+ origin server. This means that it is possible for clients to send
+ requests to servers that might not be the intended target for the
+ request, even though the server is otherwise authoritative.
+
+ A server that does not wish clients to reuse connections 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 15.5.20 of [HTTP]).
+
+ A client that is configured to use a proxy over HTTP/2 directs
+ requests to that proxy through a single connection. That is, all
+ requests sent via a proxy reuse the connection to the proxy.
+
+9.2. Use of TLS Features
+
+ Implementations of HTTP/2 MUST use TLS version 1.2 [TLS12] or higher
+ for HTTP/2 over TLS. The general TLS usage guidance in [TLSBCP]
+ SHOULD be followed, with some additional restrictions that are
+ specific to HTTP/2.
+
+ The TLS implementation MUST support the Server Name Indication (SNI)
+ [TLS-EXT] extension to TLS. If the server is identified by a domain
+ name [DNS-TERMS], clients MUST send the server_name TLS extension
+ unless an alternative mechanism to indicate the target host is used.
+
+ Requirements for deployments of HTTP/2 that negotiate TLS 1.3 [TLS13]
+ are included in Section 9.2.3. Deployments of TLS 1.2 are subject to
+ the requirements in Sections 9.2.1 and 9.2.2. Implementations are
+ encouraged to provide defaults that comply, but it is recognized that
+ deployments are ultimately responsible for compliance.
+
+9.2.1. TLS 1.2 Features
+
+ This section describes restrictions on the TLS 1.2 feature set that
+ can be used with HTTP/2. Due to deployment limitations, it might not
+ be possible to fail TLS negotiation when these restrictions are not
+ met. An endpoint MAY immediately terminate an HTTP/2 connection that
+ does not meet these TLS requirements with a connection error
+ (Section 5.4.1) of type INADEQUATE_SECURITY.
+
+ A deployment of HTTP/2 over TLS 1.2 MUST disable compression. TLS
+ compression can lead to the exposure of information that would not
+ otherwise be revealed [RFC3749]. Generic compression is unnecessary,
+ since HTTP/2 provides compression features that are more aware of
+ context and therefore likely to be more appropriate for use for
+ performance, security, or other reasons.
+
+ A deployment of HTTP/2 over TLS 1.2 MUST disable renegotiation. An
+ endpoint MUST treat a TLS renegotiation as a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR. Note that disabling
+ renegotiation can result in long-lived connections becoming unusable
+ due to limits on the number of messages the underlying cipher suite
+ can encipher.
+
+ An endpoint MAY use renegotiation to provide confidentiality
+ protection for client credentials offered in the handshake, but any
+ renegotiation MUST occur prior to sending the connection preface. A
+ server SHOULD request a client certificate if it sees a renegotiation
+ request immediately after establishing a connection.
+
+ This effectively prevents the use of renegotiation in response to a
+ request for a specific protected resource. A future specification
+ might provide a way to support this use case. Alternatively, a
+ server might use an error (Section 5.4) of type HTTP_1_1_REQUIRED to
+ request that the client use a protocol that supports renegotiation.
+
+ Implementations MUST support ephemeral key exchange sizes of at least
+ 2048 bits for cipher suites that use ephemeral finite field Diffie-
+ Hellman (DHE) (Section 8.1.2 of [TLS12]) and 224 bits for cipher
+ suites that use ephemeral elliptic curve Diffie-Hellman (ECDHE)
+ [RFC8422]. Clients MUST accept DHE sizes of up to 4096 bits.
+ Endpoints MAY treat negotiation of key sizes smaller than the lower
+ limits as a connection error (Section 5.4.1) of type
+ INADEQUATE_SECURITY.
+
+9.2.2. TLS 1.2 Cipher Suites
+
+ A deployment of HTTP/2 over TLS 1.2 SHOULD NOT use any of the
+ prohibited cipher suites listed in Appendix A.
+
+ Endpoints MAY choose to generate a connection error (Section 5.4.1)
+ of type INADEQUATE_SECURITY if one of the prohibited cipher suites is
+ negotiated. A deployment that chooses to use a prohibited cipher
+ suite risks triggering a connection error unless the set of potential
+ peers is known to accept that cipher suite.
+
+ Implementations MUST NOT generate this error in reaction to the
+ negotiation of a cipher suite that is not prohibited. Consequently,
+ when clients offer a cipher suite that is not prohibited, they have
+ to be prepared to use that cipher suite with HTTP/2.
+
+ The list of prohibited cipher suites includes the cipher suite that
+ TLS 1.2 makes mandatory, which means that TLS 1.2 deployments could
+ have non-intersecting sets of permitted cipher suites. To avoid this
+ problem, which causes TLS handshake failures, deployments of HTTP/2
+ that use TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+ [TLS-ECDHE] with the P-256 elliptic curve [RFC8422].
+
+ Note that clients might advertise support of cipher suites that are
+ prohibited in order to allow for connection to servers that do not
+ support HTTP/2. This allows servers to select HTTP/1.1 with a cipher
+ suite that is prohibited in HTTP/2. However, this can result in
+ HTTP/2 being negotiated with a prohibited cipher suite if the
+ application protocol and cipher suite are independently selected.
+
+9.2.3. TLS 1.3 Features
+
+ TLS 1.3 includes a number of features not available in earlier
+ versions. This section discusses the use of these features.
+
+ HTTP/2 servers MUST NOT send post-handshake TLS 1.3
+ CertificateRequest messages. HTTP/2 clients MUST treat a TLS post-
+ handshake CertificateRequest message as a connection error
+ (Section 5.4.1) of type PROTOCOL_ERROR.
+
+ The prohibition on post-handshake authentication applies even if the
+ client offered the "post_handshake_auth" TLS extension. Post-
+ handshake authentication support might be advertised independently of
+ ALPN [TLS-ALPN]. Clients might offer the capability for use in other
+ protocols, but inclusion of the extension cannot imply support within
+ HTTP/2.
+
+ [TLS13] defines other post-handshake messages, NewSessionTicket and
+ KeyUpdate, which can be used as they have no direct interaction with
+ HTTP/2. Unless the use of a new type of TLS message depends on an
+ interaction with the application-layer protocol, that TLS message can
+ be sent after the handshake completes.
+
+ TLS early data MAY be used to send requests, provided that the
+ guidance in [RFC8470] is observed. Clients send requests in early
+ data assuming initial values for all server settings.
+
+10. Security Considerations
+
+ The use of TLS is necessary to provide many of the security
+ properties of this protocol. Many of the claims in this section do
+ not hold unless TLS is used as described in Section 9.2.
+
+10.1. Server Authority
+
+ HTTP/2 relies on the HTTP definition of authority for determining
+ whether a server is authoritative in providing a given response (see
+ Section 4.3 of [HTTP]). This relies on local name resolution for the
+ "http" URI scheme and the authenticated server identity for the
+ "https" scheme.
+
+10.2. Cross-Protocol Attacks
+
+ In a cross-protocol attack, an attacker causes a client to initiate a
+ transaction in one protocol toward a server that understands a
+ different protocol. An attacker might be able to cause the
+ transaction to appear as a valid transaction in the second protocol.
+ In combination with the capabilities of the web context, this can be
+ used to interact with poorly protected servers in private networks.
+
+ Completing a TLS handshake with an ALPN identifier for HTTP/2 can be
+ considered sufficient protection against cross-protocol attacks.
+ ALPN provides a positive indication that a server is willing to
+ proceed with HTTP/2, which prevents attacks on other TLS-based
+ protocols.
+
+ The encryption in TLS makes it difficult for attackers to control the
+ data that could be used in a cross-protocol attack on a cleartext
+ protocol.
+
+ The cleartext version of HTTP/2 has minimal protection against cross-
+ protocol attacks. The connection preface (Section 3.4) contains a
+ string that is designed to confuse HTTP/1.1 servers, but no special
+ protection is offered for other protocols.
+
+10.3. Intermediary Encapsulation Attacks
+
+ HPACK permits encoding of field names and values that might be
+ treated as delimiters in other HTTP versions. An intermediary that
+ translates an HTTP/2 request or response MUST validate fields
+ according to the rules in Section 8.2 before translating a message to
+ another HTTP version. Translating a field that includes invalid
+ delimiters could be used to cause recipients to incorrectly interpret
+ a message, which could be exploited by an attacker.
+
+ Section 8.2 does not include specific rules for validation of pseudo-
+ header fields. If the values of these fields are used, additional
+ validation is necessary. This is particularly important where
+ ":scheme", ":authority", and ":path" are combined to form a single
+ URI string [RFC3986]. Similar problems might occur when that URI or
+ just ":path" is combined with ":method" to construct a request line
+ (as in Section 3 of [HTTP/1.1]). Simple concatenation is not secure
+ unless the input values are fully validated.
+
+ An intermediary can reject fields that contain invalid field names or
+ values for other reasons -- in particular, those fields that do not
+ conform to the HTTP ABNF grammar from Section 5 of [HTTP].
+ Intermediaries that do not perform any validation of fields other
+ than the minimum required by Section 8.2 could forward messages that
+ contain invalid field names or values.
+
+ An intermediary that receives any fields that require removal before
+ forwarding (see Section 7.6.1 of [HTTP]) MUST remove or replace those
+ header fields when forwarding messages. Additionally, intermediaries
+ should take care when forwarding messages containing Content-Length
+ fields to ensure that the message is well-formed (Section 8.1.1).
+ This ensures that if the message is translated into HTTP/1.1 at any
+ point, the framing will be correct.
+
+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.
+
+ Pushed responses for which an origin server is not authoritative (see
+ Section 10.1) MUST NOT be used or cached.
+
+10.5. Denial-of-Service Considerations
+
+ An HTTP/2 connection can demand a greater commitment of resources to
+ operate than an HTTP/1.1 connection. Both field section compression
+ and flow control depend on a commitment of 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 not constrained in the same
+ fashion. A client that accepts server push SHOULD limit the number
+ of streams it allows to be in the "reserved (remote)" state. An
+ excessive number of server push streams can be treated as a stream
+ error (Section 5.4.2) of type ENHANCE_YOUR_CALM.
+
+ A number of HTTP/2 implementations were found to be vulnerable to
+ denial of service [NFLX-2019-002]. Below is a list of known ways
+ that implementations might be subject to denial-of-service attacks:
+
+ * Inefficient tracking of outstanding outbound frames can lead to
+ overload if an adversary can cause large numbers of frames to be
+ enqueued for sending. A peer could use one of several techniques
+ to cause large numbers of frames to be generated:
+
+ - Providing tiny increments to flow control in WINDOW_UPDATE
+ frames can cause a sender to generate a large number of DATA
+ frames.
+
+ - An endpoint is required to respond to a PING frame.
+
+ - Each SETTINGS frame requires acknowledgment.
+
+ - An invalid request (or server push) can cause a peer to send
+ RST_STREAM frames in response.
+
+ * An attacker can provide large amounts of flow-control credit at
+ the HTTP/2 layer but withhold credit at the TCP layer, preventing
+ frames from being sent. An endpoint that constructs and remembers
+ frames for sending without considering TCP limits might be subject
+ to resource exhaustion.
+
+ * Large numbers of small or empty frames can be abused to cause a
+ peer to expend time processing frame headers. Caution is required
+ here as some uses of small frames are entirely legitimate, such as
+ the sending of an empty DATA or CONTINUATION frame at the end of a
+ stream.
+
+ * The SETTINGS frame might also be abused to cause a peer to expend
+ additional processing time. This might be done by pointlessly
+ changing settings, sending multiple undefined settings, or
+ changing the same setting multiple times in the same frame.
+
+ * Handling reprioritization with PRIORITY frames can require
+ significant processing time and can lead to overload if many
+ PRIORITY frames are sent.
+
+ * Field section compression also provides opportunities for an
+ attacker to waste processing resources; see Section 7 of
+ [COMPRESSION] for more details on potential abuses.
+
+ * Limits in SETTINGS cannot be reduced instantaneously, which leaves
+ an endpoint exposed to behavior from a peer that could exceed the
+ new limits. In particular, immediately after establishing a
+ connection, limits set by a server are not known to clients and
+ could be exceeded without being an obvious protocol violation.
+
+ Most of the features that might be exploited for denial of service --
+ such as SETTINGS changes, small frames, field section compression --
+ have legitimate uses. These features become a burden only when they
+ are used unnecessarily or to excess.
+
+ An endpoint that doesn't monitor use of these features exposes itself
+ to a risk of denial of service. 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 (Section 5.4.1) of
+ type ENHANCE_YOUR_CALM.
+
+10.5.1. Limits on Field Block Size
+
+ A large field block (Section 4.3) can cause an implementation to
+ commit a large amount of state. Field lines that are critical for
+ routing can appear toward the end of a field block, which prevents
+ streaming of fields to their ultimate destination. This ordering and
+ other reasons, such as ensuring cache correctness, mean that an
+ endpoint might need to buffer the entire field block. Since there is
+ no hard limit to the size of a field block, some endpoints could be
+ forced to commit a large amount of available memory for field blocks.
+
+ An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to advise peers
+ of limits that might apply on the size of uncompressed field blocks.
+ This setting is only advisory, so endpoints MAY choose to send field
+ blocks that exceed this limit and risk the request or response being
+ treated as malformed. This setting is specific to a 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 obliged to
+ do so.
+
+ A server that receives a larger field block 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 field block MUST be processed to ensure a consistent
+ connection state, unless the connection is closed.
+
+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. 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. Therefore, a proxy
+ cannot rely on SETTINGS_MAX_CONCURRENT_STREAMS alone to limit the
+ resources consumed by CONNECT requests.
+
+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/2 enables compression of field lines (Section 4.3); the
+ following concerns also apply to the use of HTTP compressed content-
+ codings (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 dictionaries are used for each source of
+ data. Compression MUST NOT be used if the source of data cannot be
+ reliably determined. Generic stream compression, such as that
+ provided by TLS, MUST NOT be used with HTTP/2 (see Section 9.2).
+
+ Further considerations regarding the compression of header fields are
+ described in [COMPRESSION].
+
+10.7. Use of Padding
+
+ Padding within HTTP/2 is not intended as a replacement for general
+ purpose padding, such as that provided by TLS [TLS13]. Redundant
+ padding could even be counterproductive. Correct application can
+ depend on having specific knowledge of the data that is being padded.
+
+ To mitigate attacks that rely on compression, disabling or limiting
+ compression might be preferable to padding as a countermeasure.
+
+ 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]).
+
+ Use of padding can result in less protection than might seem
+ immediately obvious. 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 frame payloads to a fixed size exposes
+ information as frame payload sizes cross the fixed-sized boundary,
+ which could be possible if an attacker can control plaintext.
+
+ Intermediaries SHOULD retain padding for DATA frames but MAY drop
+ padding for HEADERS and PUSH_PROMISE frames. A valid reason for an
+ intermediary to change the amount of padding of frames is to improve
+ the protections that padding provides.
+
+10.8. Privacy Considerations
+
+ Several characteristics of HTTP/2 provide an observer an opportunity
+ to correlate actions of a single client or server over time. These
+ include the values of settings, the manner in which flow-control
+ windows are managed, the way priorities are allocated to streams, 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, as defined
+ in Section 3.2 of [PRIVACY].
+
+ HTTP/2's preference for using a single TCP connection allows
+ correlation of a user's activity on a site. Reusing connections for
+ different origins allows tracking across those origins.
+
+ Because the PING and SETTINGS frames solicit immediate responses,
+ they can be used by an endpoint to measure latency to their peer.
+ This might have privacy implications in certain scenarios.
+
+10.9. Remote Timing Attacks
+
+ Remote timing attacks extract secrets from servers by observing
+ variations in the time that servers take when processing requests
+ that use secrets. HTTP/2 enables concurrent request creation and
+ processing, which can give attackers better control over when request
+ processing commences. Multiple HTTP/2 requests can be included in
+ the same IP packet or TLS record. HTTP/2 can therefore make remote
+ timing attacks more efficient by eliminating variability in request
+ delivery, leaving only request order and the delivery of responses as
+ sources of timing variability.
+
+ Ensuring that processing time is not dependent on the value of a
+ secret is the best defense against any form of timing attack.
+
+11. IANA Considerations
+
+ This revision of HTTP/2 marks the HTTP2-Settings header field and the
+ h2c upgrade token, both defined in [RFC7540], as obsolete.
+
+ Section 11 of [RFC7540] registered the h2 and h2c ALPN identifiers
+ along with the PRI HTTP method. RFC 7540 also established a registry
+ for frame types, settings, and error codes. These registrations and
+ registries apply to HTTP/2, but are not redefined in this document.
+
+ IANA has updated references to RFC 7540 in the following registries
+ to refer to this document: "TLS Application-Layer Protocol
+ Negotiation (ALPN) Protocol IDs", "HTTP/2 Frame Type", "HTTP/2
+ Settings", "HTTP/2 Error Code", and "HTTP Method Registry". The
+ registration of the PRI method has been updated to refer to
+ Section 3.4; all other section numbers have not changed.
+
+ IANA has changed the policy on those portions of the "HTTP/2 Frame
+ Type" and "HTTP/2 Settings" registries that were reserved for
+ Experimental Use in RFC 7540. These portions of the registries shall
+ operate on the same policy as the remainder of each registry.
+
+11.1. HTTP2-Settings Header Field Registration
+
+ This section marks the HTTP2-Settings header field registered by
+ Section 11.5 of [RFC7540] in the "Hypertext Transfer Protocol (HTTP)
+ Field Name Registry" as obsolete. This capability has been removed:
+ see Section 3.1. The registration is updated to include the details
+ as required by Section 18.4 of [HTTP]:
+
+ Field Name: HTTP2-Settings
+
+ Status: obsoleted
+
+ Reference: Section 3.2.1 of [RFC7540]
+
+ Comments: Obsolete; see Section 11.1 of this document.
+
+11.2. The h2c Upgrade Token
+
+ This section records the h2c upgrade token registered by Section 11.8
+ of [RFC7540] in the "Hypertext Transfer Protocol (HTTP) Upgrade Token
+ Registry" as obsolete. This capability has been removed: see
+ Section 3.1. The registration is updated as follows:
+
+ Value: h2c
+
+ Description: (OBSOLETE) Hypertext Transfer Protocol version 2
+ (HTTP/2)
+
+ Expected Version Tokens: None
+
+ Reference: Section 3.1 of this document
+
+12. References
+
+12.1. Normative References
+
+ [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>.
+
+ [COMPRESSION]
+ 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>.
+
+ [COOKIE] 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>.
+
+ [QUIC] 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>.
+
+ [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>.
+
+ [RFC3986] 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>.
+
+ [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>.
+
+ [RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, "Elliptic
+ Curve Cryptography (ECC) Cipher Suites for Transport Layer
+ Security (TLS) Versions 1.2 and Earlier", RFC 8422,
+ DOI 10.17487/RFC8422, August 2018,
+ <https://www.rfc-editor.org/info/rfc8422>.
+
+ [RFC8470] 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>.
+
+ [TCP] Postel, J., "Transmission Control Protocol", STD 7,
+ RFC 793, DOI 10.17487/RFC0793, September 1981,
+ <https://www.rfc-editor.org/info/rfc793>.
+
+ [TLS-ALPN] 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>.
+
+ [TLS-ECDHE]
+ Rescorla, E., "TLS Elliptic Curve Cipher Suites with SHA-
+ 256/384 and AES Galois Counter Mode (GCM)", RFC 5289,
+ DOI 10.17487/RFC5289, August 2008,
+ <https://www.rfc-editor.org/info/rfc5289>.
+
+ [TLS-EXT] 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>.
+
+ [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security
+ (TLS) Protocol Version 1.2", RFC 5246,
+ DOI 10.17487/RFC5246, August 2008,
+ <https://www.rfc-editor.org/info/rfc5246>.
+
+ [TLS13] 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>.
+
+ [TLSBCP] Sheffer, Y., Holz, R., and P. Saint-Andre,
+ "Recommendations for Secure Use of Transport Layer
+ Security (TLS) and Datagram Transport Layer Security
+ (DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, May
+ 2015, <https://www.rfc-editor.org/info/rfc7525>.
+
+12.2. Informative References
+
+ [ALT-SVC] 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>.
+
+ [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the
+ CRIME Attack", 12 July 2013,
+ <https://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>.
+
+ [HTTP-PRIORITY]
+ Oku, K. and L. Pardue, "Extensible Prioritization Scheme
+ for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022,
+ <https://www.rfc-editor.org/info/rfc9218>.
+
+ [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>.
+
+ [NFLX-2019-002]
+ Netflix, "HTTP/2 Denial of Service Advisory", 13 August
+ 2019, <https://github.com/Netflix/security-
+ bulletins/blob/master/advisories/third-party/2019-002.md>.
+
+ [PRIVACY] Cooper, A., Tschofenig, H., Aboba, B., Peterson, J.,
+ Morris, J., Hansen, M., and R. Smith, "Privacy
+ Considerations for Internet Protocols", RFC 6973,
+ DOI 10.17487/RFC6973, July 2013,
+ <https://www.rfc-editor.org/info/rfc6973>.
+
+ [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts -
+ Communication Layers", STD 3, RFC 1122,
+ DOI 10.17487/RFC1122, October 1989,
+ <https://www.rfc-editor.org/info/rfc1122>.
+
+ [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol
+ Compression Methods", RFC 3749, DOI 10.17487/RFC3749, May
+ 2004, <https://www.rfc-editor.org/info/rfc3749>.
+
+ [RFC6125] Saint-Andre, P. and J. Hodges, "Representation and
+ Verification of Domain-Based Application Service Identity
+ within Internet Public Key Infrastructure Using X.509
+ (PKIX) Certificates in the Context of Transport Layer
+ Security (TLS)", RFC 6125, DOI 10.17487/RFC6125, March
+ 2011, <https://www.rfc-editor.org/info/rfc6125>.
+
+ [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>.
+
+ [RFC7323] Borman, D., Braden, B., Jacobson, V., and R.
+ Scheffenegger, Ed., "TCP Extensions for High Performance",
+ RFC 7323, DOI 10.17487/RFC7323, September 2014,
+ <https://www.rfc-editor.org/info/rfc7323>.
+
+ [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext
+ Transfer Protocol Version 2 (HTTP/2)", RFC 7540,
+ DOI 10.17487/RFC7540, May 2015,
+ <https://www.rfc-editor.org/info/rfc7540>.
+
+ [RFC8441] McManus, P., "Bootstrapping WebSockets with HTTP/2",
+ RFC 8441, DOI 10.17487/RFC8441, September 2018,
+ <https://www.rfc-editor.org/info/rfc8441>.
+
+ [RFC8740] Benjamin, D., "Using TLS 1.3 with HTTP/2", RFC 8740,
+ DOI 10.17487/RFC8740, February 2020,
+ <https://www.rfc-editor.org/info/rfc8740>.
+
+ [TALKING] Huang, L., Chen, E., Barth, A., Rescorla, E., and C.
+ Jackson, "Talking to Yourself for Fun and Profit", 2011,
+ <https://www.adambarth.com/papers/2011/huang-chen-barth-
+ rescorla-jackson.pdf>.
+
+Appendix A. Prohibited TLS 1.2 Cipher Suites
+
+ An HTTP/2 implementation MAY treat the negotiation of any of the
+ following cipher suites with TLS 1.2 as a connection error
+ (Section 5.4.1) of type INADEQUATE_SECURITY:
+
+ * TLS_NULL_WITH_NULL_NULL
+ * TLS_RSA_WITH_NULL_MD5
+ * TLS_RSA_WITH_NULL_SHA
+ * TLS_RSA_EXPORT_WITH_RC4_40_MD5
+ * TLS_RSA_WITH_RC4_128_MD5
+ * TLS_RSA_WITH_RC4_128_SHA
+ * TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
+ * TLS_RSA_WITH_IDEA_CBC_SHA
+ * TLS_RSA_EXPORT_WITH_DES40_CBC_SHA
+ * TLS_RSA_WITH_DES_CBC_SHA
+ * TLS_RSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA
+ * TLS_DH_DSS_WITH_DES_CBC_SHA
+ * TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA
+ * TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA
+ * TLS_DH_RSA_WITH_DES_CBC_SHA
+ * TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
+ * TLS_DHE_DSS_WITH_DES_CBC_SHA
+ * TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
+ * TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
+ * TLS_DHE_RSA_WITH_DES_CBC_SHA
+ * TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_DH_anon_EXPORT_WITH_RC4_40_MD5
+ * TLS_DH_anon_WITH_RC4_128_MD5
+ * TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA
+ * TLS_DH_anon_WITH_DES_CBC_SHA
+ * TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
+ * TLS_KRB5_WITH_DES_CBC_SHA
+ * TLS_KRB5_WITH_3DES_EDE_CBC_SHA
+ * TLS_KRB5_WITH_RC4_128_SHA
+ * TLS_KRB5_WITH_IDEA_CBC_SHA
+ * TLS_KRB5_WITH_DES_CBC_MD5
+ * TLS_KRB5_WITH_3DES_EDE_CBC_MD5
+ * TLS_KRB5_WITH_RC4_128_MD5
+ * TLS_KRB5_WITH_IDEA_CBC_MD5
+ * TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA
+ * TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA
+ * TLS_KRB5_EXPORT_WITH_RC4_40_SHA
+ * TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
+ * TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5
+ * TLS_KRB5_EXPORT_WITH_RC4_40_MD5
+ * TLS_PSK_WITH_NULL_SHA
+ * TLS_DHE_PSK_WITH_NULL_SHA
+ * TLS_RSA_PSK_WITH_NULL_SHA
+ * TLS_RSA_WITH_AES_128_CBC_SHA
+ * TLS_DH_DSS_WITH_AES_128_CBC_SHA
+ * TLS_DH_RSA_WITH_AES_128_CBC_SHA
+ * TLS_DHE_DSS_WITH_AES_128_CBC_SHA
+ * TLS_DHE_RSA_WITH_AES_128_CBC_SHA
+ * TLS_DH_anon_WITH_AES_128_CBC_SHA
+ * TLS_RSA_WITH_AES_256_CBC_SHA
+ * TLS_DH_DSS_WITH_AES_256_CBC_SHA
+ * TLS_DH_RSA_WITH_AES_256_CBC_SHA
+ * TLS_DHE_DSS_WITH_AES_256_CBC_SHA
+ * TLS_DHE_RSA_WITH_AES_256_CBC_SHA
+ * TLS_DH_anon_WITH_AES_256_CBC_SHA
+ * TLS_RSA_WITH_NULL_SHA256
+ * TLS_RSA_WITH_AES_128_CBC_SHA256
+ * TLS_RSA_WITH_AES_256_CBC_SHA256
+ * TLS_DH_DSS_WITH_AES_128_CBC_SHA256
+ * TLS_DH_RSA_WITH_AES_128_CBC_SHA256
+ * TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
+ * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
+ * TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA
+ * TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA
+ * TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA
+ * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
+ * TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
+ * TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
+ * TLS_DH_DSS_WITH_AES_256_CBC_SHA256
+ * TLS_DH_RSA_WITH_AES_256_CBC_SHA256
+ * TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
+ * TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
+ * TLS_DH_anon_WITH_AES_128_CBC_SHA256
+ * TLS_DH_anon_WITH_AES_256_CBC_SHA256
+ * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
+ * TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA
+ * TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA
+ * TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA
+ * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
+ * TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA
+ * TLS_PSK_WITH_RC4_128_SHA
+ * TLS_PSK_WITH_3DES_EDE_CBC_SHA
+ * TLS_PSK_WITH_AES_128_CBC_SHA
+ * TLS_PSK_WITH_AES_256_CBC_SHA
+ * TLS_DHE_PSK_WITH_RC4_128_SHA
+ * TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * TLS_DHE_PSK_WITH_AES_128_CBC_SHA
+ * TLS_DHE_PSK_WITH_AES_256_CBC_SHA
+ * TLS_RSA_PSK_WITH_RC4_128_SHA
+ * TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA
+ * TLS_RSA_PSK_WITH_AES_128_CBC_SHA
+ * TLS_RSA_PSK_WITH_AES_256_CBC_SHA
+ * TLS_RSA_WITH_SEED_CBC_SHA
+ * TLS_DH_DSS_WITH_SEED_CBC_SHA
+ * TLS_DH_RSA_WITH_SEED_CBC_SHA
+ * TLS_DHE_DSS_WITH_SEED_CBC_SHA
+ * TLS_DHE_RSA_WITH_SEED_CBC_SHA
+ * TLS_DH_anon_WITH_SEED_CBC_SHA
+ * TLS_RSA_WITH_AES_128_GCM_SHA256
+ * TLS_RSA_WITH_AES_256_GCM_SHA384
+ * TLS_DH_RSA_WITH_AES_128_GCM_SHA256
+ * TLS_DH_RSA_WITH_AES_256_GCM_SHA384
+ * TLS_DH_DSS_WITH_AES_128_GCM_SHA256
+ * TLS_DH_DSS_WITH_AES_256_GCM_SHA384
+ * TLS_DH_anon_WITH_AES_128_GCM_SHA256
+ * TLS_DH_anon_WITH_AES_256_GCM_SHA384
+ * TLS_PSK_WITH_AES_128_GCM_SHA256
+ * TLS_PSK_WITH_AES_256_GCM_SHA384
+ * TLS_RSA_PSK_WITH_AES_128_GCM_SHA256
+ * TLS_RSA_PSK_WITH_AES_256_GCM_SHA384
+ * TLS_PSK_WITH_AES_128_CBC_SHA256
+ * TLS_PSK_WITH_AES_256_CBC_SHA384
+ * TLS_PSK_WITH_NULL_SHA256
+ * TLS_PSK_WITH_NULL_SHA384
+ * TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
+ * TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
+ * TLS_DHE_PSK_WITH_NULL_SHA256
+ * TLS_DHE_PSK_WITH_NULL_SHA384
+ * TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
+ * TLS_RSA_PSK_WITH_AES_256_CBC_SHA384
+ * TLS_RSA_PSK_WITH_NULL_SHA256
+ * TLS_RSA_PSK_WITH_NULL_SHA384
+ * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
+ * TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256
+ * TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256
+ * TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256
+ * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
+ * TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
+ * TLS_EMPTY_RENEGOTIATION_INFO_SCSV
+ * TLS_ECDH_ECDSA_WITH_NULL_SHA
+ * TLS_ECDH_ECDSA_WITH_RC4_128_SHA
+ * TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
+ * TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
+ * TLS_ECDHE_ECDSA_WITH_NULL_SHA
+ * TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
+ * TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
+ * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
+ * TLS_ECDH_RSA_WITH_NULL_SHA
+ * TLS_ECDH_RSA_WITH_RC4_128_SHA
+ * TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
+ * TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
+ * TLS_ECDHE_RSA_WITH_NULL_SHA
+ * TLS_ECDHE_RSA_WITH_RC4_128_SHA
+ * TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
+ * TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
+ * TLS_ECDH_anon_WITH_NULL_SHA
+ * TLS_ECDH_anon_WITH_RC4_128_SHA
+ * TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
+ * TLS_ECDH_anon_WITH_AES_128_CBC_SHA
+ * TLS_ECDH_anon_WITH_AES_256_CBC_SHA
+ * TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA
+ * TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA
+ * TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA
+ * TLS_SRP_SHA_WITH_AES_128_CBC_SHA
+ * TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA
+ * TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA
+ * TLS_SRP_SHA_WITH_AES_256_CBC_SHA
+ * TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA
+ * TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA
+ * TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
+ * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
+ * TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
+ * TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
+ * TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
+ * TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
+ * TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
+ * TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
+ * TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
+ * TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
+ * TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
+ * TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
+ * TLS_ECDHE_PSK_WITH_RC4_128_SHA
+ * TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA
+ * TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA
+ * TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
+ * TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384
+ * TLS_ECDHE_PSK_WITH_NULL_SHA
+ * TLS_ECDHE_PSK_WITH_NULL_SHA256
+ * TLS_ECDHE_PSK_WITH_NULL_SHA384
+ * TLS_RSA_WITH_ARIA_128_CBC_SHA256
+ * TLS_RSA_WITH_ARIA_256_CBC_SHA384
+ * TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256
+ * TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384
+ * TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256
+ * TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384
+ * TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256
+ * TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384
+ * TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256
+ * TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384
+ * TLS_DH_anon_WITH_ARIA_128_CBC_SHA256
+ * TLS_DH_anon_WITH_ARIA_256_CBC_SHA384
+ * TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256
+ * TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384
+ * TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256
+ * TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384
+ * TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256
+ * TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384
+ * TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256
+ * TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384
+ * TLS_RSA_WITH_ARIA_128_GCM_SHA256
+ * TLS_RSA_WITH_ARIA_256_GCM_SHA384
+ * TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256
+ * TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384
+ * TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256
+ * TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384
+ * TLS_DH_anon_WITH_ARIA_128_GCM_SHA256
+ * TLS_DH_anon_WITH_ARIA_256_GCM_SHA384
+ * TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256
+ * TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384
+ * TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256
+ * TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384
+ * TLS_PSK_WITH_ARIA_128_CBC_SHA256
+ * TLS_PSK_WITH_ARIA_256_CBC_SHA384
+ * TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256
+ * TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384
+ * TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256
+ * TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384
+ * TLS_PSK_WITH_ARIA_128_GCM_SHA256
+ * TLS_PSK_WITH_ARIA_256_GCM_SHA384
+ * TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256
+ * TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384
+ * TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256
+ * TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384
+ * TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * TLS_RSA_WITH_AES_128_CCM
+ * TLS_RSA_WITH_AES_256_CCM
+ * TLS_RSA_WITH_AES_128_CCM_8
+ * TLS_RSA_WITH_AES_256_CCM_8
+ * TLS_PSK_WITH_AES_128_CCM
+ * TLS_PSK_WITH_AES_256_CCM
+ * TLS_PSK_WITH_AES_128_CCM_8
+ * TLS_PSK_WITH_AES_256_CCM_8
+
+ | Note: This list was assembled from the set of registered TLS
+ | cipher suites when [RFC7540] was developed. This list includes
+ | those cipher suites that do not offer an ephemeral key exchange
+ | and those that are based on the TLS null, stream, or block
+ | cipher type (as defined in Section 6.2.3 of [TLS12]).
+ | Additional cipher suites with these properties could be
+ | defined; these would not be explicitly prohibited.
+
+ For more details, see Section 9.2.2.
+
+Appendix B. Changes from RFC 7540
+
+ This revision includes the following substantive changes:
+
+ * Use of TLS 1.3 was defined based on [RFC8740], which this document
+ obsoletes.
+
+ * The priority scheme defined in RFC 7540 is deprecated.
+ Definitions for the format of the PRIORITY frame and the priority
+ fields in the HEADERS frame have been retained, plus the rules
+ governing when PRIORITY frames can be sent and received, but the
+ semantics of these fields are only described in RFC 7540. The
+ priority signaling scheme from RFC 7540 was not successful. Using
+ the simpler signaling in [HTTP-PRIORITY] is recommended.
+
+ * The HTTP/1.1 Upgrade mechanism is deprecated and no longer
+ specified in this document. It was never widely deployed, with
+ plaintext HTTP/2 users choosing to use the prior-knowledge
+ implementation instead.
+
+ * Validation for field names and values has been narrowed. The
+ validation that is mandatory for intermediaries is precisely
+ defined, and error reporting for requests has been amended to
+ encourage sending 400-series status codes.
+
+ * The ranges of codepoints for settings and frame types that were
+ reserved for Experimental Use are now available for general use.
+
+ * Connection-specific header fields -- which are prohibited -- are
+ more precisely and comprehensively identified.
+
+ * Host and ":authority" are no longer permitted to disagree.
+
+ * Rules for sending Dynamic Table Size Update instructions after
+ changes in settings have been clarified in Section 4.3.1.
+
+ Editorial changes are also included. In particular, changes to
+ terminology and document structure are in response to updates to core
+ HTTP semantics [HTTP]. Those documents now include some concepts
+ that were first defined in RFC 7540, such as the 421 status code or
+ connection coalescing.
+
+Acknowledgments
+
+ Credit for non-trivial input to this document is owed to a large
+ number of people who have contributed to the HTTP Working Group over
+ the years. [RFC7540] contains a more extensive list of people that
+ deserve acknowledgment for their contributions.
+
+Contributors
+
+ Mike Belshe and Roberto Peon authored the text that this document is
+ based on.
+
+Authors' Addresses
+
+ Martin Thomson (editor)
+ Mozilla
+ Australia
+ Email: mt@lowentropy.net
+
+
+ Cory Benfield (editor)
+ Apple Inc.
+ Email: cbenfield@apple.com