DeAI Research
Source · rfc

rfc:9113

2022

cid 454b691b11ce57de078b7353ff66658d9d30501f23b9ef9dfeb88b7ea8645974 · original · open access · via rfc

Title: rfc:9113
Authors: 
Venue: rfc
Year: 2022
Canonical: rfc:9113
URL: https://www.rfc-editor.org/rfc/rfc9113.txt
Collector: rfc
OA: true

ABSTRACT
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 / `-----------| || |. 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, . [COMPRESSION] Peon, R. and H. Ruellan, "HPACK: Header Compression for HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, . [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, DOI 10.17487/RFC6265, April 2011, . [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., "HTTP Semantics", STD 97, RFC 9110, DOI 10.17487/RFC9110, June 2022, . [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based Multiplexed and Secure Transport", RFC 9000, DOI 10.17487/RFC9000, May 2021, . [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, . [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, . [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, . [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, . [RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September 2018, . [TCP] Postel, J., "Transmission Control Protocol", STD 7, RFC 793, DOI 10.17487/RFC0793, September 1981, . [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, . [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, . [TLS-EXT] Eastlake 3rd, D., "Transport Layer Security (TLS) Extensions: Extension Definitions", RFC 6066, DOI 10.17487/RFC6066, January 2011, . [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.2", RFC 5246, DOI 10.17487/RFC5246, August 2008, . [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, . [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, . 12.2. Informative References [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP Alternative Services", RFC 7838, DOI 10.17487/RFC7838, April 2016, . [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the CRIME Attack", 12 July 2013, . [DNS-TERMS] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, January 2019, . [HTTP-PRIORITY] Oku, K. and L. Pardue, "Extensible Prioritization Scheme for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022, . [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, . [NFLX-2019-002] Netflix, "HTTP/2 Denial of Service Advisory", 13 August 2019, . [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, . [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - Communication Layers", STD 3, RFC 1122, DOI 10.17487/RFC1122, October 1989, . [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol Compression Methods", RFC 3749, DOI 10.17487/RFC3749, May 2004, . [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, . [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012, . [RFC7323] Borman, D., Braden, B., Jacobson, V., and R. Scheffenegger, Ed., "TCP Extensions for High Performance", . [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext Transfer Protocol Version 2 (HTTP/2)", RFC 7540, DOI 10.17487/RFC7540, May 2015, . [RFC8441] McManus, P., "Bootstrapping WebSockets with HTTP/2", . [RFC8740] Benjamin, D., "Using TLS 1.3 with HTTP/2", RFC 8740, DOI 10.17487/RFC8740, February 2020, . [TALKING] Huang, L., Chen, E., Barth, A., Rescorla, E., and C. Jackson, "Talking to Yourself for Fun and Profit", 2011, . 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