| draft-ietf-httpbis-http2bis-07.txt | draft-ietf-httpbis-http2bis-latest.txt | |||
|---|---|---|---|---|
| HTTPbis Working Group M. Thomson, Ed. | Internet Engineering Task Force (IETF) M. Thomson, Ed. | |||
| Internet-Draft Mozilla | Request for Comments: 9113 Mozilla | |||
| Obsoletes: 7540, 8740 (if approved) C. Benfield, Ed. | Obsoletes: 7540, 8740 C. Benfield, Ed. | |||
| Intended status: Standards Track Apple Inc. | Category: Standards Track Apple Inc. | |||
| Expires: July 28, 2022 January 24, 2022 | ISSN: 2070-1721 May 2022 | |||
| HTTP/2 | HTTP/2 | |||
| draft-ietf-httpbis-http2bis-07 | ||||
| Abstract | Abstract | |||
| This specification describes an optimized expression of the semantics | This specification describes an optimized expression of the semantics | |||
| of the Hypertext Transfer Protocol (HTTP), referred to as HTTP | of the Hypertext Transfer Protocol (HTTP), referred to as HTTP | |||
| version 2 (HTTP/2). HTTP/2 enables a more efficient use of network | version 2 (HTTP/2). HTTP/2 enables a more efficient use of network | |||
| resources and a reduced latency by introducing field compression and | resources and a reduced latency by introducing field compression and | |||
| allowing multiple concurrent exchanges on the same connection. | allowing multiple concurrent exchanges on the same connection. | |||
| This document obsoletes RFC 7540 and RFC 8740. | This document obsoletes RFCs 7540 and 8740. | |||
| Discussion Venues | ||||
| This note is to be removed before publishing as an RFC. | ||||
| Discussion of this document takes place on the HTTPBIS Working Group | ||||
| mailing list (ietf-http-wg@w3.org), which is archived at | ||||
| <https://lists.w3.org/Archives/Public/ietf-http-wg/>. | ||||
| Source for this draft and an issue tracker can be found at | ||||
| <https://github.com/httpwg/http2-spec>. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on July 28, 2022. | 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 Notice | |||
| Copyright (c) 2022 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
| license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
| extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
| described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
| provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
| in the Revised BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
| 2. HTTP/2 Protocol Overview . . . . . . . . . . . . . . . . . . 5 | 2. HTTP/2 Protocol Overview | |||
| 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | 2.1. Document Organization | |||
| 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 2.2. Conventions and Terminology | |||
| 3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 7 | 3. Starting HTTP/2 | |||
| 3.1. HTTP/2 Version Identification . . . . . . . . . . . . . . 8 | 3.1. HTTP/2 Version Identification | |||
| 3.2. Starting HTTP/2 for "https" URIs . . . . . . . . . . . . 8 | 3.2. Starting HTTP/2 for "https" URIs | |||
| 3.3. Starting HTTP/2 with Prior Knowledge . . . . . . . . . . 8 | 3.3. Starting HTTP/2 with Prior Knowledge | |||
| 3.4. HTTP/2 Connection Preface . . . . . . . . . . . . . . . . 9 | 3.4. HTTP/2 Connection Preface | |||
| 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 4. HTTP Frames | |||
| 4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . 10 | 4.1. Frame Format | |||
| 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . 11 | 4.2. Frame Size | |||
| 4.3. Field Section Compression and Decompression . . . . . . . 12 | 4.3. Field Section Compression and Decompression | |||
| 4.3.1. Compression State . . . . . . . . . . . . . . . . . . 13 | 4.3.1. Compression State | |||
| 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . 14 | 5. Streams and Multiplexing | |||
| 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 14 | 5.1. Stream States | |||
| 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . 20 | 5.1.1. Stream Identifiers | |||
| 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . 21 | 5.1.2. Stream Concurrency | |||
| 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . 21 | 5.2. Flow Control | |||
| 5.2.1. Flow-Control Principles . . . . . . . . . . . . . . . 21 | 5.2.1. Flow-Control Principles | |||
| 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 23 | 5.2.2. Appropriate Use of Flow Control | |||
| 5.2.3. Flow Control Performance . . . . . . . . . . . . . . 23 | 5.2.3. Flow-Control Performance | |||
| 5.3. Prioritization . . . . . . . . . . . . . . . . . . . . . 24 | 5.3. Prioritization | |||
| 5.3.1. Background on Priority in RFC 7540 . . . . . . . . . 24 | 5.3.1. Background on Priority in RFC 7540 | |||
| 5.3.2. Priority Signaling in this Document . . . . . . . . . 24 | 5.3.2. Priority Signaling in This Document | |||
| 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . 25 | 5.4. Error Handling | |||
| 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 26 | 5.4.1. Connection Error Handling | |||
| 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 26 | 5.4.2. Stream Error Handling | |||
| 5.4.3. Connection Termination . . . . . . . . . . . . . . . 27 | 5.4.3. Connection Termination | |||
| 5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . 27 | 5.5. Extending HTTP/2 | |||
| 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 28 | 6. Frame Definitions | |||
| 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 6.1. DATA | |||
| 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 30 | 6.2. HEADERS | |||
| 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . 32 | 6.3. PRIORITY | |||
| 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . 33 | 6.4. RST_STREAM | |||
| 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . 34 | 6.5. SETTINGS | |||
| 6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 35 | 6.5.1. SETTINGS Format | |||
| 6.5.2. Defined Settings . . . . . . . . . . . . . . . . . . 36 | 6.5.2. Defined Settings | |||
| 6.5.3. Settings Synchronization . . . . . . . . . . . . . . 38 | 6.5.3. Settings Synchronization | |||
| 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . 38 | 6.6. PUSH_PROMISE | |||
| 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 6.7. PING | |||
| 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . 42 | 6.8. GOAWAY | |||
| 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 45 | 6.9. WINDOW_UPDATE | |||
| 6.9.1. The Flow-Control Window . . . . . . . . . . . . . . . 47 | 6.9.1. The Flow-Control Window | |||
| 6.9.2. Initial Flow-Control Window Size . . . . . . . . . . 48 | 6.9.2. Initial Flow-Control Window Size | |||
| 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 49 | 6.9.3. Reducing the Stream Window Size | |||
| 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . 49 | 6.10. CONTINUATION | |||
| 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 50 | 7. Error Codes | |||
| 8. Expressing HTTP Semantics in HTTP/2 . . . . . . . . . . . . . 51 | 8. Expressing HTTP Semantics in HTTP/2 | |||
| 8.1. HTTP Message Framing . . . . . . . . . . . . . . . . . . 51 | 8.1. HTTP Message Framing | |||
| 8.1.1. Malformed Messages . . . . . . . . . . . . . . . . . 53 | 8.1.1. Malformed Messages | |||
| 8.2. HTTP Fields . . . . . . . . . . . . . . . . . . . . . . . 54 | 8.2. HTTP Fields | |||
| 8.2.1. Field Validity . . . . . . . . . . . . . . . . . . . 54 | 8.2.1. Field Validity | |||
| 8.2.2. Connection-Specific Header Fields . . . . . . . . . . 55 | 8.2.2. Connection-Specific Header Fields | |||
| 8.2.3. Compressing the Cookie Header Field . . . . . . . . . 56 | 8.2.3. Compressing the Cookie Header Field | |||
| 8.3. HTTP Control Data . . . . . . . . . . . . . . . . . . . . 56 | 8.3. HTTP Control Data | |||
| 8.3.1. Request Pseudo-Header Fields . . . . . . . . . . . . 57 | 8.3.1. Request Pseudo-Header Fields | |||
| 8.3.2. Response Pseudo-Header Fields . . . . . . . . . . . . 59 | 8.3.2. Response Pseudo-Header Fields | |||
| 8.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 59 | 8.4. Server Push | |||
| 8.4.1. Push Requests . . . . . . . . . . . . . . . . . . . . 60 | 8.4.1. Push Requests | |||
| 8.4.2. Push Responses . . . . . . . . . . . . . . . . . . . 62 | 8.4.2. Push Responses | |||
| 8.5. The CONNECT Method . . . . . . . . . . . . . . . . . . . 63 | 8.5. The CONNECT Method | |||
| 8.6. The Upgrade Header Field . . . . . . . . . . . . . . . . 64 | 8.6. The Upgrade Header Field | |||
| 8.7. Request Reliability . . . . . . . . . . . . . . . . . . . 64 | 8.7. Request Reliability | |||
| 8.8. Examples . . . . . . . . . . . . . . . . . . . . . . . . 65 | 8.8. Examples | |||
| 8.8.1. Simple Request . . . . . . . . . . . . . . . . . . . 65 | 8.8.1. Simple Request | |||
| 8.8.2. Simple Response . . . . . . . . . . . . . . . . . . . 65 | 8.8.2. Simple Response | |||
| 8.8.3. Complex Request . . . . . . . . . . . . . . . . . . . 66 | 8.8.3. Complex Request | |||
| 8.8.4. Response with Body . . . . . . . . . . . . . . . . . 66 | 8.8.4. Response with Body | |||
| 8.8.5. Informational Responses . . . . . . . . . . . . . . . 67 | 8.8.5. Informational Responses | |||
| 9. HTTP/2 Connections . . . . . . . . . . . . . . . . . . . . . 68 | 9. HTTP/2 Connections | |||
| 9.1. Connection Management . . . . . . . . . . . . . . . . . . 68 | 9.1. Connection Management | |||
| 9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . 68 | 9.1.1. Connection Reuse | |||
| 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 69 | 9.2. Use of TLS Features | |||
| 9.2.1. TLS 1.2 Features . . . . . . . . . . . . . . . . . . 70 | 9.2.1. TLS 1.2 Features | |||
| 9.2.2. TLS 1.2 Cipher Suites . . . . . . . . . . . . . . . . 71 | 9.2.2. TLS 1.2 Cipher Suites | |||
| 9.2.3. TLS 1.3 Features . . . . . . . . . . . . . . . . . . 71 | 9.2.3. TLS 1.3 Features | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 72 | 10. Security Considerations | |||
| 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 72 | 10.1. Server Authority | |||
| 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 72 | 10.2. Cross-Protocol Attacks | |||
| 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 73 | 10.3. Intermediary Encapsulation Attacks | |||
| 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 73 | 10.4. Cacheability of Pushed Responses | |||
| 10.5. Denial-of-Service Considerations . . . . . . . . . . . . 74 | 10.5. Denial-of-Service Considerations | |||
| 10.5.1. Limits on Field Block Size . . . . . . . . . . . . . 75 | 10.5.1. Limits on Field Block Size | |||
| 10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . 76 | 10.5.2. CONNECT Issues | |||
| 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 76 | 10.6. Use of Compression | |||
| 10.7. Use of Padding . . . . . . . . . . . . . . . . . . . . . 77 | 10.7. Use of Padding | |||
| 10.8. Privacy Considerations . . . . . . . . . . . . . . . . . 77 | 10.8. Privacy Considerations | |||
| 10.9. Remote Timing Attacks . . . . . . . . . . . . . . . . . 78 | 10.9. Remote Timing Attacks | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 78 | 11. IANA Considerations | |||
| 11.1. HTTP2-Settings Header Field Registration . . . . . . . . 79 | 11.1. HTTP2-Settings Header Field Registration | |||
| 11.2. The h2c Upgrade Token . . . . . . . . . . . . . . . . . 79 | 11.2. The h2c Upgrade Token | |||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 79 | 12. References | |||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . 79 | 12.1. Normative References | |||
| 12.2. Informative References . . . . . . . . . . . . . . . . . 81 | 12.2. Informative References | |||
| Appendix A. Prohibited TLS 1.2 Cipher Suites . . . . . . . . . . 83 | Appendix A. Prohibited TLS 1.2 Cipher Suites | |||
| Appendix B. Changes from RFC 7540 . . . . . . . . . . . . . . . 89 | Appendix B. Changes from RFC 7540 | |||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 90 | Acknowledgments | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 90 | Contributors | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 91 | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| The performance of applications using the Hypertext Transfer Protocol | The performance of applications using the Hypertext Transfer Protocol | |||
| (HTTP, [HTTP]) is linked to how each version of HTTP uses the | (HTTP, [HTTP]) is linked to how each version of HTTP uses the | |||
| underlying transport, and the conditions under which the transport | underlying transport, and the conditions under which the transport | |||
| operates. | operates. | |||
| Making multiple concurrent requests can reduce latency and improve | Making multiple concurrent requests can reduce latency and improve | |||
| application performance. HTTP/1.0 allowed only one request to be | application performance. HTTP/1.0 allowed only one request to be | |||
| outstanding at a time on a given TCP [TCP] connection. HTTP/1.1 | outstanding at a time on a given TCP [TCP] connection. HTTP/1.1 | |||
| ([HTTP11]) added request pipelining, but this only partially | [HTTP/1.1] added request pipelining, but this only partially | |||
| addressed request concurrency and still suffers from application- | addressed request concurrency and still suffers from application- | |||
| layer head-of-line blocking. Therefore, HTTP/1.0 and HTTP/1.1 | layer head-of-line blocking. Therefore, HTTP/1.0 and HTTP/1.1 | |||
| clients use multiple connections to a server to make concurrent | clients use multiple connections to a server to make concurrent | |||
| requests. | requests. | |||
| Furthermore, HTTP fields are often repetitive and verbose, causing | Furthermore, HTTP fields are often repetitive and verbose, causing | |||
| unnecessary network traffic as well as causing the initial TCP | unnecessary network traffic as well as causing the initial TCP | |||
| congestion window to quickly fill. This can result in excessive | congestion window to quickly fill. This can result in excessive | |||
| latency when multiple requests are made on a new TCP connection. | latency when multiple requests are made on a new TCP connection. | |||
| skipping to change at page 5, line 15 ¶ | skipping to change at line 190 ¶ | |||
| The resulting protocol is more friendly to the network because fewer | The resulting protocol is more friendly to the network because fewer | |||
| TCP connections can be used in comparison to HTTP/1.x. This means | TCP connections can be used in comparison to HTTP/1.x. This means | |||
| less competition with other flows and longer-lived connections, which | less competition with other flows and longer-lived connections, which | |||
| in turn lead to better utilization of available network capacity. | in turn lead to better utilization of available network capacity. | |||
| Note, however, that TCP head-of-line blocking is not addressed by | Note, however, that TCP head-of-line blocking is not addressed by | |||
| this protocol. | this protocol. | |||
| Finally, HTTP/2 also enables more efficient processing of messages | Finally, HTTP/2 also enables more efficient processing of messages | |||
| through use of binary message framing. | through use of binary message framing. | |||
| This document obsoletes RFC 7540 [RFC7540] and RFC 8740 [RFC8740]. | This document obsoletes RFCs 7540 and 8740. Appendix B lists notable | |||
| Appendix B lists notable changes. | changes. | |||
| 2. HTTP/2 Protocol Overview | 2. HTTP/2 Protocol Overview | |||
| HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 | HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 | |||
| supports all of the core features of HTTP but aims to be more | supports all of the core features of HTTP but aims to be more | |||
| efficient than HTTP/1.1. | efficient than HTTP/1.1. | |||
| HTTP/2 is a connection-oriented application-layer protocol that runs | HTTP/2 is a connection-oriented application-layer protocol that runs | |||
| over a TCP connection ([TCP]). The client is the TCP connection | over a TCP connection ([TCP]). The client is the TCP connection | |||
| initiator. | initiator. | |||
| skipping to change at page 6, line 32 ¶ | skipping to change at line 256 ¶ | |||
| way HTTP/2 frames are structured and formed into multiplexed | way HTTP/2 frames are structured and formed into multiplexed | |||
| streams. | streams. | |||
| o Frame (Section 6) and error (Section 7) definitions include | o Frame (Section 6) and error (Section 7) definitions include | |||
| details of the frame and error types used in HTTP/2. | details of the frame and error types used in HTTP/2. | |||
| o HTTP mappings (Section 8) and additional requirements (Section 9) | o HTTP mappings (Section 8) and additional requirements (Section 9) | |||
| describe how HTTP semantics are expressed using frames and | describe how HTTP semantics are expressed using frames and | |||
| streams. | streams. | |||
| While some of the frame and stream layer concepts are isolated from | While some of the frame- and stream-layer concepts are isolated from | |||
| HTTP, this specification does not define a completely generic frame | HTTP, this specification does not define a completely generic frame | |||
| layer. The frame and stream layers are tailored to the needs of the | layer. The frame and stream layers are tailored to the needs of | |||
| HTTP protocol. | HTTP. | |||
| 2.2. Conventions and Terminology | 2.2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| All numeric values are in network byte order. Values are unsigned | All numeric values are in network byte order. Values are unsigned | |||
| unless otherwise indicated. Literal values are provided in decimal | unless otherwise indicated. Literal values are provided in decimal | |||
| or hexadecimal as appropriate. Hexadecimal literals are prefixed | or hexadecimal as appropriate. Hexadecimal literals are prefixed | |||
| with "0x" to distinguish them from decimal literals. | with "0x" to distinguish them from decimal literals. | |||
| This specification describes binary formats using the convention | This specification describes binary formats using the conventions | |||
| described in RFC 9000 [QUIC]. Note that this format uses network | described in RFC 9000 [QUIC]. Note that this format uses network | |||
| byte order and high-valued bits are listed before low-valued bits. | byte order and that high-valued bits are listed before low-valued | |||
| bits. | ||||
| The following terms are used: | The following terms are used: | |||
| client: The endpoint that initiates an HTTP/2 connection. Clients | client: The endpoint that initiates an HTTP/2 connection. Clients | |||
| send HTTP requests and receive HTTP responses. | send HTTP requests and receive HTTP responses. | |||
| connection: A transport-layer connection between two endpoints. | connection: A transport-layer connection between two endpoints. | |||
| connection error: An error that affects the entire HTTP/2 | connection error: An error that affects the entire HTTP/2 | |||
| connection. | connection. | |||
| skipping to change at page 7, line 49 ¶ | skipping to change at line 323 ¶ | |||
| The term "content" as it applies to message bodies is defined in | The term "content" as it applies to message bodies is defined in | |||
| Section 6.4 of [HTTP]. | Section 6.4 of [HTTP]. | |||
| 3. Starting HTTP/2 | 3. Starting HTTP/2 | |||
| Implementations that generate HTTP requests need to discover whether | Implementations that generate HTTP requests need to discover whether | |||
| a server supports HTTP/2. | a server supports HTTP/2. | |||
| HTTP/2 uses the "http" and "https" URI schemes defined in Section 4.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 ([HTTP11]). | 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 | These URIs do not include any indication about what HTTP versions an | |||
| upstream server (the immediate peer to which the client wishes to | upstream server (the immediate peer to which the client wishes to | |||
| establish a connection) supports. | establish a connection) supports. | |||
| The means by which support for HTTP/2 is determined is different for | The means by which support for HTTP/2 is determined is different for | |||
| "http" and "https" URIs. Discovery for "https" URIs is described in | "http" and "https" URIs. Discovery for "https" URIs is described in | |||
| Section 3.2. HTTP/2 support for "http" URIs can only be discovered | 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 | by out-of-band means and requires prior knowledge of the support as | |||
| described in Section 3.3. | described in Section 3.3. | |||
| 3.1. HTTP/2 Version Identification | 3.1. HTTP/2 Version Identification | |||
| The protocol defined in this document has two identifiers. Creating | The protocol defined in this document has two identifiers. Creating | |||
| a connection based on either implies the use of the transport, | a connection based on either implies the use of the transport, | |||
| framing, and message semantics described in this document. | framing, and message semantics described in this document. | |||
| o The string "h2" identifies the protocol where HTTP/2 uses | o The string "h2" identifies the protocol where HTTP/2 uses | |||
| Transport Layer Security (TLS); see Section 9.2. This identifier | Transport Layer Security (TLS); see Section 9.2. This identifier | |||
| is used in the TLS application-layer protocol negotiation (ALPN) | is used in the TLS Application-Layer Protocol Negotiation (ALPN) | |||
| extension [TLS-ALPN] field and in any place where HTTP/2 over TLS | extension [TLS-ALPN] field and in any place where HTTP/2 over TLS | |||
| is identified. | is identified. | |||
| The "h2" string is serialized into an ALPN protocol identifier as | The "h2" string is serialized into an ALPN protocol identifier as | |||
| the two-octet sequence: 0x68, 0x32. | the two-octet sequence: 0x68, 0x32. | |||
| o The "h2c" string was previously used as a token for use in the | o 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 Upgrade mechanism's Upgrade header field (Section 7.8 of | |||
| [HTTP]). This usage was never widely deployed and is deprecated | [HTTP]). This usage was never widely deployed and is deprecated | |||
| by this document. The same apples to the HTTP2-Settings header | by this document. The same applies to the HTTP2-Settings header | |||
| field, which was used with the upgrade to "h2c". | field, which was used with the upgrade to "h2c". | |||
| 3.2. Starting HTTP/2 for "https" URIs | 3.2. Starting HTTP/2 for "https" URIs | |||
| A client that makes a request to an "https" URI uses TLS [TLS13] with | A client that makes a request to an "https" URI uses TLS [TLS13] with | |||
| the application-layer protocol negotiation (ALPN) extension | the ALPN extension [TLS-ALPN]. | |||
| [TLS-ALPN]. | ||||
| HTTP/2 over TLS uses the "h2" protocol identifier. The "h2c" | HTTP/2 over TLS uses the "h2" protocol identifier. The "h2c" | |||
| protocol identifier MUST NOT be sent by a client or selected by a | protocol identifier MUST NOT be sent by a client or selected by a | |||
| server; the "h2c" protocol identifier describes a protocol that does | server; the "h2c" protocol identifier describes a protocol that does | |||
| not use TLS. | not use TLS. | |||
| Once TLS negotiation is complete, both the client and the server MUST | Once TLS negotiation is complete, both the client and the server MUST | |||
| send a connection preface (Section 3.4). | send a connection preface (Section 3.4). | |||
| 3.3. Starting HTTP/2 with Prior Knowledge | 3.3. Starting HTTP/2 with Prior Knowledge | |||
| skipping to change at page 11, line 16 ¶ | skipping to change at line 480 ¶ | |||
| format and semantics of the frame. Frames defined in this | format and semantics of the frame. Frames defined in this | |||
| document are listed in Section 6. Implementations MUST ignore and | document are listed in Section 6. Implementations MUST ignore and | |||
| discard frames of unknown types. | discard frames of unknown types. | |||
| Flags: An 8-bit field reserved for boolean flags specific to the | Flags: An 8-bit field reserved for boolean flags specific to the | |||
| frame type. | frame type. | |||
| Flags are assigned semantics specific to the indicated frame type. | Flags are assigned semantics specific to the indicated frame type. | |||
| Unused flags are those that have no defined semantics for a | Unused flags are those that have no defined semantics for a | |||
| particular frame type. Unused flags MUST be ignored on receipt | particular frame type. Unused flags MUST be ignored on receipt | |||
| and MUST be left unset (0x0) when sending. | and MUST be left unset (0x00) when sending. | |||
| Reserved: A reserved 1-bit field. The semantics of this bit are | Reserved: A reserved 1-bit field. The semantics of this bit are | |||
| undefined, and the bit MUST remain unset (0x0) when sending and | undefined, and the bit MUST remain unset (0x00) when sending and | |||
| MUST be ignored when receiving. | MUST be ignored when receiving. | |||
| Stream Identifier: A stream identifier (see Section 5.1.1) expressed | Stream Identifier: A stream identifier (see Section 5.1.1) expressed | |||
| as an unsigned 31-bit integer. The value 0x0 is reserved for | as an unsigned 31-bit integer. The value 0x00 is reserved for | |||
| frames that are associated with the connection as a whole as | frames that are associated with the connection as a whole as | |||
| opposed to an individual stream. | opposed to an individual stream. | |||
| The structure and content of the frame payload is dependent entirely | The structure and content of the frame payload are dependent entirely | |||
| on the frame type. | on the frame type. | |||
| 4.2. Frame Size | 4.2. Frame Size | |||
| The size of a frame payload is limited by the maximum size that a | The size of a frame payload is limited by the maximum size that a | |||
| receiver advertises in the SETTINGS_MAX_FRAME_SIZE setting. This | receiver advertises in the SETTINGS_MAX_FRAME_SIZE setting. This | |||
| setting can have any value between 2^14 (16,384) and 2^24-1 | setting can have any value between 2^14 (16,384) and 2^24-1 | |||
| (16,777,215) octets, inclusive. | (16,777,215) octets, inclusive. | |||
| All implementations MUST be capable of receiving and minimally | All implementations MUST be capable of receiving and minimally | |||
| skipping to change at page 11, line 51 ¶ | skipping to change at line 515 ¶ | |||
| | Note: Certain frame types, such as PING (Section 6.7), impose | | Note: Certain frame types, such as PING (Section 6.7), impose | |||
| | additional limits on the amount of frame payload data allowed. | | additional limits on the amount of frame payload data allowed. | |||
| An endpoint MUST send an error code of FRAME_SIZE_ERROR if a frame | 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 | exceeds the size defined in SETTINGS_MAX_FRAME_SIZE, exceeds any | |||
| limit defined for the frame type, or is too small to contain | 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 | 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 | 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 | error (Section 5.4.1); this includes any frame carrying a field block | |||
| (Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), | (Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), a | |||
| SETTINGS, and any frame with a stream identifier of 0. | SETTINGS frame, and any frame with a stream identifier of 0. | |||
| Endpoints are not obligated to use all available space in a frame. | Endpoints are not obligated to use all available space in a frame. | |||
| Responsiveness can be improved by using frames that are smaller than | Responsiveness can be improved by using frames that are smaller than | |||
| the permitted maximum size. Sending large frames can result in | the permitted maximum size. Sending large frames can result in | |||
| delays in sending time-sensitive frames (such as RST_STREAM, | delays in sending time-sensitive frames (such as RST_STREAM, | |||
| WINDOW_UPDATE, or PRIORITY), which, if blocked by the transmission of | WINDOW_UPDATE, or PRIORITY), which, if blocked by the transmission of | |||
| a large frame, could affect performance. | a large frame, could affect performance. | |||
| 4.3. Field Section Compression and Decompression | 4.3. Field Section Compression and Decompression | |||
| Field section compression is the process of compressing a set of | Field section compression is the process of compressing a set of | |||
| field lines (Section 5.2 of [HTTP]) to form a field block. Field | 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 | section decompression is the process of decoding a field block into a | |||
| set of field lines. Details of HTTP/2 field section compression and | set of field lines. Details of HTTP/2 field section compression and | |||
| decompression is defined in [COMPRESSION], which, for historical | decompression are defined in [COMPRESSION], which, for historical | |||
| reasons, refers to these processes as header compression and | reasons, refers to these processes as header compression and | |||
| decompression. | decompression. | |||
| Each field block carries all of the compressed field lines of a | Each field block carries all of the compressed field lines of a | |||
| single field section. Header sections also include control data | single field section. Header sections also include control data | |||
| associated with the message in the form of pseudo-header fields | associated with the message in the form of pseudo-header fields | |||
| (Section 8.3) that use the same format as a field line. | (Section 8.3) that use the same format as a field line. | |||
| | Note: RFC 7540 [RFC7540] used the term "header block" in place | | Note: RFC 7540 [RFC7540] used the term "header block" in place | |||
| | of the more generic "field block". | | of the more generic "field block". | |||
| Field blocks carry control data and header sections for requests, | Field blocks carry control data and header sections for requests, | |||
| responses, promised requests, and pushed responses (see Section 8.4). | responses, promised requests, and pushed responses (see Section 8.4). | |||
| All these messages, except for interim responses and requests | All these messages, except for interim responses and requests | |||
| contained in PUSH_PROMISE (Section 6.6) frames, can optionally | contained in PUSH_PROMISE (Section 6.6) frames, can optionally | |||
| include a field block that carries a trailer section. | include a field block that carries a trailer section. | |||
| A field section is a collection of field lines. Each of the field | A field section is a collection of field lines. Each of the field | |||
| lines in a field block carry a single value. The serialized 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 is then divided into one or more octet sequences, called field | |||
| block fragments. The first field block fragment is transmitted | block fragments. The first field block fragment is transmitted | |||
| within the frame payload of HEADERS (Section 6.2) or PUSH_PROMISE | 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.6), each of which could be followed by CONTINUATION | |||
| (Section 6.10) frames to carry subsequent field block fragments. | (Section 6.10) frames to carry subsequent field block fragments. | |||
| The Cookie header field [COOKIE] is treated specially by the HTTP | The Cookie header field [COOKIE] is treated specially by the HTTP | |||
| mapping (see Section 8.2.3). | mapping (see Section 8.2.3). | |||
| A receiving endpoint reassembles the field block by concatenating its | A receiving endpoint reassembles the field block by concatenating its | |||
| skipping to change at page 15, line 21 ¶ | skipping to change at line 674 ¶ | |||
| | | | send H / | | | | | | send H / | | | |||
| ,------+ reserved | | recv H | reserved +------. | ,------+ reserved | | recv H | reserved +------. | |||
| | | (local) | | | (remote) | | | | | (local) | | | (remote) | | | |||
| | +---+------+ v +------+---+ | | | +---+------+ v +------+---+ | | |||
| | | +--------+ | | | | | +--------+ | | | |||
| | | recv ES | | send ES | | | | | recv ES | | send ES | | | |||
| | send H | ,-------+ open +-------. | recv H | | | send H | ,-------+ open +-------. | recv H | | |||
| | | / | | \ | | | | | / | | \ | | | |||
| | v v +---+----+ v v | | | v v +---+----+ v v | | |||
| | +----------+ | +----------+ | | | +----------+ | +----------+ | | |||
| | | half | | | half | | | | | half- | | | half- | | | |||
| | | closed | | send R / | closed | | | | | closed | | send R / | closed | | | |||
| | | (remote) | | recv R | (local) | | | | | (remote) | | recv R | (local) | | | |||
| | +----+-----+ | +-----+----+ | | | +----+-----+ | +-----+----+ | | |||
| | | | | | | | | | | | | |||
| | | send ES / | recv ES / | | | | | send ES / | recv ES / | | | |||
| | | send R / v send R / | | | | | send R / v send R / | | | |||
| | | recv R +--------+ recv R | | | | | recv R +--------+ recv R | | | |||
| | send R / `----------->| |<-----------' send R / | | | send R / `----------->| |<-----------' send R / | | |||
| | recv R | closed | recv R | | | recv R | closed | recv R | | |||
| `----------------------->| |<-----------------------' | `----------------------->| |<-----------------------' | |||
| skipping to change at page 16, line 44 ¶ | skipping to change at line 744 ¶ | |||
| o Note that the PUSH_PROMISE frame is not sent on the idle stream | o Note that the PUSH_PROMISE frame is not sent on the idle stream | |||
| but references the newly reserved stream in the Promised Stream | but references the newly reserved stream in the Promised Stream | |||
| ID field. | ID field. | |||
| o Opening a stream with a higher-valued stream identifier causes | o Opening a stream with a higher-valued stream identifier causes | |||
| the stream to transition immediately to a "closed" state; note | the stream to transition immediately to a "closed" state; note | |||
| that this transition is not shown in the diagram. | that this transition is not shown in the diagram. | |||
| Receiving any frame other than HEADERS or PRIORITY on a stream in | 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) | this state MUST be treated as a connection error (Section 5.4.1) | |||
| of type PROTOCOL_ERROR. If this stream is server-initiated, as | of type PROTOCOL_ERROR. If this stream is initiated by the | |||
| described in Section 5.1.1, then receiving a HEADERS frame MUST | server, as described in Section 5.1.1, then receiving a HEADERS | |||
| also be treated as a connection error (Section 5.4.1) of type | frame MUST also be treated as a connection error (Section 5.4.1) | |||
| PROTOCOL_ERROR. | of type PROTOCOL_ERROR. | |||
| reserved (local): A stream in the "reserved (local)" state is one | reserved (local): A stream in the "reserved (local)" state is one | |||
| that has been promised by sending a PUSH_PROMISE frame. A | that has been promised by sending a PUSH_PROMISE frame. A | |||
| PUSH_PROMISE frame reserves an idle stream by associating the | PUSH_PROMISE frame reserves an idle stream by associating the | |||
| stream with an open stream that was initiated by the remote peer | stream with an open stream that was initiated by the remote peer | |||
| (see Section 8.4). | (see Section 8.4). | |||
| In this state, only the following transitions are possible: | In this state, only the following transitions are possible: | |||
| o The endpoint can send a HEADERS frame. This causes the stream | o The endpoint can send a HEADERS frame. This causes the stream | |||
| skipping to change at page 19, line 26 ¶ | skipping to change at line 862 ¶ | |||
| RST_STREAM frame might receive a WINDOW_UPDATE or RST_STREAM frame | RST_STREAM frame might receive a WINDOW_UPDATE or RST_STREAM frame | |||
| from its peer in the time before the peer receives and processes | from its peer in the time before the peer receives and processes | |||
| the frame that closes the stream. | the frame that closes the stream. | |||
| An endpoint that sends a RST_STREAM frame on a stream that is in | 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 | the "open" or "half-closed (local)" state could receive any type | |||
| of frame. The peer might have sent or enqueued for sending these | of frame. The peer might have sent or enqueued for sending these | |||
| frames before processing the RST_STREAM frame. An endpoint MUST | frames before processing the RST_STREAM frame. An endpoint MUST | |||
| minimally process and then discard any frames it receives in this | minimally process and then discard any frames it receives in this | |||
| state. This means updating header compression state for HEADERS | state. This means updating header compression state for HEADERS | |||
| and PUSH_PROMISE frames; PUSH_PROMISE frames also cause the | and PUSH_PROMISE frames. Receiving a PUSH_PROMISE frame also | |||
| promised stream to become "reserved", even when the PUSH_PROMISE | causes the promised stream to become "reserved (remote)", even | |||
| frame is received on a closed stream; and, the content of DATA | when the PUSH_PROMISE frame is received on a closed stream. | |||
| frames count toward the connection flow-control window. | Additionally, the content of DATA frames counts toward the | |||
| connection flow-control window. | ||||
| An endpoint can perform this minimal processing for all streams | An endpoint can perform this minimal processing for all streams | |||
| that are in the "closed" state. Endpoints MAY use other signals | that are in the "closed" state. Endpoints MAY use other signals | |||
| to detect that a peer has received the frames that caused the | to detect that a peer has received the frames that caused the | |||
| stream to enter the "closed" state and treat receipt of any frame | 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 | other than PRIORITY as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. Endpoints can use frames that indicate that the | PROTOCOL_ERROR. Endpoints can use frames that indicate that the | |||
| peer has received the closing signal to drive this. Endpoints | peer has received the closing signal to drive this. Endpoints | |||
| SHOULD NOT use timers for this purpose. For example, an endpoint | SHOULD NOT use timers for this purpose. For example, an endpoint | |||
| that sends a SETTINGS frame after closing a stream can safely | that sends a SETTINGS frame after closing a stream can safely | |||
| skipping to change at page 20, line 7 ¶ | skipping to change at line 891 ¶ | |||
| after closing the stream. | after closing the stream. | |||
| In the absence of more specific rules, implementations SHOULD treat | In the absence of more specific rules, implementations SHOULD treat | |||
| the receipt of a frame that is not expressly permitted in the | 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 | 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 | PROTOCOL_ERROR. Note that PRIORITY can be sent and received in any | |||
| stream state. | stream state. | |||
| The rules in this section only apply to frames defined in this | The rules in this section only apply to frames defined in this | |||
| document. Receipt of frames for which the semantics are unknown | document. Receipt of frames for which the semantics are unknown | |||
| cannot be treated as an error as the conditions for sending and | cannot be treated as an error, as the conditions for sending and | |||
| receiving those frames are also unknown; see Section 5.5. | receiving those frames are also unknown; see Section 5.5. | |||
| An example of the state transitions for an HTTP request/response | An example of the state transitions for an HTTP request/response | |||
| exchange can be found in Section 8.8. An example of the state | 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. | transitions for server push can be found in Sections 8.4.1 and 8.4.2. | |||
| 5.1.1. Stream Identifiers | 5.1.1. Stream Identifiers | |||
| Streams are identified by an unsigned 31-bit integer. Streams | Streams are identified by an unsigned 31-bit integer. Streams | |||
| initiated by a client MUST use odd-numbered stream identifiers; those | initiated by a client MUST use odd-numbered stream identifiers; those | |||
| initiated by the server MUST use even-numbered stream identifiers. A | initiated by the server MUST use even-numbered stream identifiers. A | |||
| stream identifier of zero (0x0) is used for connection control | stream identifier of zero (0x00) is used for connection control | |||
| messages; the stream identifier of zero cannot be used to establish a | messages; the stream identifier of zero cannot be used to establish a | |||
| new stream. | new stream. | |||
| The identifier of a newly established stream MUST be numerically | The identifier of a newly established stream MUST be numerically | |||
| greater than all streams that the initiating endpoint has opened or | greater than all streams that the initiating endpoint has opened or | |||
| reserved. This governs streams that are opened using a HEADERS frame | reserved. This governs streams that are opened using a HEADERS frame | |||
| and streams that are reserved using PUSH_PROMISE. An endpoint that | and streams that are reserved using PUSH_PROMISE. An endpoint that | |||
| receives an unexpected stream identifier MUST respond with a | receives an unexpected stream identifier MUST respond with a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| A HEADERS frame will transition the client-initiated stream | A HEADERS frame will transition the client-initiated stream | |||
| identified by the stream identifier in the frame header from "idle" | identified by the stream identifier in the frame header from "idle" | |||
| to "open". A PUSH_PROMISE frame will transition the server-initiated | to "open". A PUSH_PROMISE frame will transition the server-initiated | |||
| stream identified by the "Promised Stream ID" field in the frame | stream identified by the Promised Stream ID field in the frame | |||
| payload from "idle" to "reserved". When a stream transitions out of | payload from "idle" to "reserved (local)" or "reserved (remote)". | |||
| the "idle" state, all "idle" streams that might have been opened by | When a stream transitions out of the "idle" state, all streams in the | |||
| the peer with a lower-valued stream identifier immediately transition | "idle" state that might have been opened by the peer with a lower- | |||
| to "closed". That is, an endpoint may skip a stream identifier, with | valued stream identifier immediately transition to "closed". That | |||
| the effect being that the skipped stream is immediately closed. | 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 | Stream identifiers cannot be reused. Long-lived connections can | |||
| result in an endpoint exhausting the available range of stream | result in an endpoint exhausting the available range of stream | |||
| identifiers. A client that is unable to establish a new stream | identifiers. A client that is unable to establish a new stream | |||
| identifier can establish a new connection for new streams. A server | identifier can establish a new connection for new streams. A server | |||
| that is unable to establish a new stream identifier can send a GOAWAY | 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 | frame so that the client is forced to open a new connection for new | |||
| streams. | streams. | |||
| 5.1.2. Stream Concurrency | 5.1.2. Stream Concurrency | |||
| skipping to change at page 21, line 40 ¶ | skipping to change at line 968 ¶ | |||
| SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current | SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current | |||
| number of open streams can either close streams that exceed the new | number of open streams can either close streams that exceed the new | |||
| value or allow streams to complete. | value or allow streams to complete. | |||
| 5.2. Flow Control | 5.2. Flow Control | |||
| Using streams for multiplexing introduces contention over use of the | Using streams for multiplexing introduces contention over use of the | |||
| TCP connection, resulting in blocked streams. A flow-control scheme | TCP connection, resulting in blocked streams. A flow-control scheme | |||
| ensures that streams on the same connection do not destructively | ensures that streams on the same connection do not destructively | |||
| interfere with each other. Flow control is used for both individual | interfere with each other. Flow control is used for both individual | |||
| streams and for the connection as a whole. | streams and the connection as a whole. | |||
| HTTP/2 provides for flow control through use of the WINDOW_UPDATE | HTTP/2 provides for flow control through use of the WINDOW_UPDATE | |||
| frame (Section 6.9). | frame (Section 6.9). | |||
| 5.2.1. Flow-Control Principles | 5.2.1. Flow-Control Principles | |||
| HTTP/2 stream flow control aims to allow a variety of flow-control | HTTP/2 stream flow control aims to allow a variety of flow-control | |||
| algorithms to be used without requiring protocol changes. Flow | algorithms to be used without requiring protocol changes. Flow | |||
| control in HTTP/2 has the following characteristics: | control in HTTP/2 has the following characteristics: | |||
| skipping to change at page 22, line 33 ¶ | skipping to change at line 1007 ¶ | |||
| for both new streams and the overall connection. | for both new streams and the overall connection. | |||
| 5. The frame type determines whether flow control applies to a | 5. The frame type determines whether flow control applies to a | |||
| frame. Of the frames specified in this document, only DATA | frame. Of the frames specified in this document, only DATA | |||
| frames are subject to flow control; all other frame types do not | frames are subject to flow control; all other frame types do not | |||
| consume space in the advertised flow-control window. This | consume space in the advertised flow-control window. This | |||
| ensures that important control frames are not blocked by flow | ensures that important control frames are not blocked by flow | |||
| control. | control. | |||
| 6. An endpoint can choose to disable its own flow control, but an | 6. An endpoint can choose to disable its own flow control, but an | |||
| endpoint cannot ignore flow control signals from its peer. | endpoint cannot ignore flow-control signals from its peer. | |||
| 7. HTTP/2 defines only the format and semantics of the WINDOW_UPDATE | 7. HTTP/2 defines only the format and semantics of the WINDOW_UPDATE | |||
| frame (Section 6.9). This document does not stipulate how a | frame (Section 6.9). This document does not stipulate how a | |||
| receiver decides when to send this frame or the value that it | receiver decides when to send this frame or the value that it | |||
| sends, nor does it specify how a sender chooses to send packets. | sends, nor does it specify how a sender chooses to send packets. | |||
| Implementations are able to select any algorithm that suits their | Implementations are able to select any algorithm that suits their | |||
| needs. | needs. | |||
| Implementations are also responsible for prioritizing the sending of | Implementations are also responsible for prioritizing the sending of | |||
| requests and responses, choosing how to avoid head-of-line blocking | requests and responses, choosing how to avoid head-of-line blocking | |||
| skipping to change at page 23, line 25 ¶ | skipping to change at line 1041 ¶ | |||
| control window of the maximum size (2^31-1) and can maintain this | 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. | window by sending a WINDOW_UPDATE frame when any data is received. | |||
| This effectively disables flow control for that receiver. | This effectively disables flow control for that receiver. | |||
| Conversely, a sender is always subject to the flow-control window | Conversely, a sender is always subject to the flow-control window | |||
| advertised by the receiver. | advertised by the receiver. | |||
| Deployments with constrained resources (for example, memory) can | Deployments with constrained resources (for example, memory) can | |||
| employ flow control to limit the amount of memory a peer can consume. | employ flow control to limit the amount of memory a peer can consume. | |||
| Note, however, that this can lead to suboptimal use of available | Note, however, that this can lead to suboptimal use of available | |||
| network resources if flow control is enabled without knowledge of the | network resources if flow control is enabled without knowledge of the | |||
| bandwidth-delay product (see [RFC7323]). | bandwidth * delay product (see [RFC7323]). | |||
| Even with full awareness of the current bandwidth-delay product, | Even with full awareness of the current bandwidth * delay product, | |||
| implementation of flow control can be difficult. Endpoints MUST read | implementation of flow control can be difficult. Endpoints MUST read | |||
| and process HTTP/2 frames from the TCP receive buffer as soon as data | 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 | is available. Failure to read promptly could lead to a deadlock when | |||
| critical frames, such as WINDOW_UPDATE, are not read and acted upon. | critical frames, such as WINDOW_UPDATE, are not read and acted upon. | |||
| Reading frames promptly does not expose endpoints to resource | Reading frames promptly does not expose endpoints to resource | |||
| exhaustion attacks as HTTP/2 flow control limits resource | exhaustion attacks, as HTTP/2 flow control limits resource | |||
| commitments. | commitments. | |||
| 5.2.3. Flow Control Performance | 5.2.3. Flow-Control Performance | |||
| If an endpoint cannot ensure that its peer always has available flow | If an endpoint cannot ensure that its peer always has available flow- | |||
| control window space that is greater than the peer's bandwidth-delay | control window space that is greater than the peer's bandwidth * | |||
| product on this connection, its receive throughput will be limited by | delay product on this connection, its receive throughput will be | |||
| HTTP/2 flow control. This will result in degraded performance. | limited by HTTP/2 flow control. This will result in degraded | |||
| performance. | ||||
| Sending timely WINDOW_UPDATE frames can improve performance. | Sending timely WINDOW_UPDATE frames can improve performance. | |||
| Endpoints will want to balance the need to improve receive throughput | Endpoints will want to balance the need to improve receive throughput | |||
| with the need to manage resource exhaustion risks, and should take | with the need to manage resource exhaustion risks and should take | |||
| careful note of Section 10.5 in defining their strategy to manage | careful note of Section 10.5 in defining their strategy to manage | |||
| window sizes. | window sizes. | |||
| 5.3. Prioritization | 5.3. Prioritization | |||
| In a multiplexed protocol like HTTP/2, prioritizing allocation of | In a multiplexed protocol like HTTP/2, prioritizing allocation of | |||
| bandwidth and computation resources to streams can be critical to | bandwidth and computation resources to streams can be critical to | |||
| attaining good performance. A poor prioritization scheme can result | attaining good performance. A poor prioritization scheme can result | |||
| in HTTP/2 providing poor performance. With no parallelism at the TCP | in HTTP/2 providing poor performance. With no parallelism at the TCP | |||
| layer, performance could be significantly worse than HTTP/1.1. | layer, performance could be significantly worse than HTTP/1.1. | |||
| skipping to change at page 24, line 23 ¶ | skipping to change at line 1084 ¶ | |||
| A good prioritization scheme benefits from the application of | A good prioritization scheme benefits from the application of | |||
| contextual knowledge such as the content of resources, how resources | contextual knowledge such as the content of resources, how resources | |||
| are interrelated, and how those resources will be used by a peer. In | are interrelated, and how those resources will be used by a peer. In | |||
| particular, clients can possess knowledge about the priority of | particular, clients can possess knowledge about the priority of | |||
| requests that is relevant to server prioritization. In those cases, | requests that is relevant to server prioritization. In those cases, | |||
| having clients provide priority information can improve performance. | having clients provide priority information can improve performance. | |||
| 5.3.1. Background on Priority in RFC 7540 | 5.3.1. Background on Priority in RFC 7540 | |||
| RFC 7540 defined a rich system for signaling priority of requests. | RFC 7540 defined a rich system for signaling priority of requests. | |||
| However, this system proved to be complex and it was not uniformly | However, this system proved to be complex, and it was not uniformly | |||
| implemented. | implemented. | |||
| The flexible scheme meant that it was possible for clients to express | The flexible scheme meant that it was possible for clients to express | |||
| priorities in very different ways, with little consistency in the | priorities in very different ways, with little consistency in the | |||
| approaches that were adopted. For servers, implementing generic | approaches that were adopted. For servers, implementing generic | |||
| support for the scheme was complex. Implementation of priorities was | support for the scheme was complex. Implementation of priorities was | |||
| uneven in both clients and servers. Many server deployments ignored | uneven in both clients and servers. Many server deployments ignored | |||
| client signals when prioritizing their handling of requests. | client signals when prioritizing their handling of requests. | |||
| In short, the prioritization signaling in RFC7540 [RFC7540] was not | In short, the prioritization signaling in RFC 7540 [RFC7540] was not | |||
| successful. | successful. | |||
| 5.3.2. Priority Signaling in this Document | 5.3.2. Priority Signaling in This Document | |||
| This update to HTTP/2 deprecates the priority signaling defined in | This update to HTTP/2 deprecates the priority signaling defined in | |||
| RFC 7540 [RFC7540]. The bulk of the text related to priority signals | RFC 7540 [RFC7540]. The bulk of the text related to priority signals | |||
| is not included in this document. The description of frame fields | is not included in this document. The description of frame fields | |||
| and some of the mandatory handling is retained to ensure that | and some of the mandatory handling is retained to ensure that | |||
| implementations of this document remain interoperable with | implementations of this document remain interoperable with | |||
| implementations that use the priority signaling described in RFC | implementations that use the priority signaling described in RFC | |||
| 7540. | 7540. | |||
| A thorough description of the RFC 7540 priority scheme remains in | A thorough description of the RFC 7540 priority scheme remains in | |||
| Section 5.3 of [RFC7540]. | Section 5.3 of [RFC7540]. | |||
| Signaling priority information is necessary to attain good | Signaling priority information is necessary to attain good | |||
| performance in many cases. Where signaling priority information is | performance in many cases. Where signaling priority information is | |||
| important, endpoints are encouraged to use an alternative scheme, | important, endpoints are encouraged to use an alternative scheme, | |||
| such as [I-D.ietf-httpbis-priority]. | such as the scheme described in [HTTP-PRIORITY]. | |||
| Though the priority signaling from RFC 7540 was not widely adopted, | Though the priority signaling from RFC 7540 was not widely adopted, | |||
| the information it provides can still be useful in the absence of | the information it provides can still be useful in the absence of | |||
| better information. Endpoints that receive priority signals in | better information. Endpoints that receive priority signals in | |||
| HEADERS or PRIORITY frames can benefit from applying that | HEADERS or PRIORITY frames can benefit from applying that | |||
| information. In particular, implementations that consume these | information. In particular, implementations that consume these | |||
| signals would not benefit from discarding these priority signals in | signals would not benefit from discarding these priority signals in | |||
| the absence of alternatives. | the absence of alternatives. | |||
| Servers SHOULD use other contextual information in determining | Servers SHOULD use other contextual information in determining | |||
| priority of requests in the absence of any priority signals. Servers | priority of requests in the absence of any priority signals. Servers | |||
| MAY interpret the complete absence of signals as an indication that | MAY interpret the complete absence of signals as an indication that | |||
| the client has not implemented the feature. The defaults described | the client has not implemented the feature. The defaults described | |||
| in Section 5.3.5 of [RFC7540] are known to have poor performance | in Section 5.3.5 of [RFC7540] are known to have poor performance | |||
| under most conditions and their use is unlikely to be deliberate. | under most conditions, and their use is unlikely to be deliberate. | |||
| 5.4. Error Handling | 5.4. Error Handling | |||
| HTTP/2 framing permits two classes of error: | HTTP/2 framing permits two classes of errors: | |||
| o An error condition that renders the entire connection unusable is | o An error condition that renders the entire connection unusable is | |||
| a connection error. | a connection error. | |||
| o An error in an individual stream is a stream error. | o An error in an individual stream is a stream error. | |||
| A list of error codes is included in Section 7. | A list of error codes is included in Section 7. | |||
| It is possible that an endpoint will encounter frames that would | It is possible that an endpoint will encounter frames that would | |||
| cause multiple errors. Implementations MAY discover multiple errors | cause multiple errors. Implementations MAY discover multiple errors | |||
| skipping to change at page 28, line 17 ¶ | skipping to change at line 1270 ¶ | |||
| used for that purpose. If both peers set a value that indicates | used for that purpose. If both peers set a value that indicates | |||
| willingness to use the extension, then the extension can be used. If | willingness to use the extension, then the extension can be used. If | |||
| a setting is used for extension negotiation, the initial value MUST | a setting is used for extension negotiation, the initial value MUST | |||
| be defined in such a fashion that the extension is initially | be defined in such a fashion that the extension is initially | |||
| disabled. | disabled. | |||
| 6. Frame Definitions | 6. Frame Definitions | |||
| This specification defines a number of frame types, each identified | This specification defines a number of frame types, each identified | |||
| by a unique 8-bit type code. Each frame type serves a distinct | by a unique 8-bit type code. Each frame type serves a distinct | |||
| purpose in the establishment and management either of the connection | purpose in the establishment and management of either the connection | |||
| as a whole or of individual streams. | as a whole or individual streams. | |||
| The transmission of specific frame types can alter the state of a | The transmission of specific frame types can alter the state of a | |||
| connection. If endpoints fail to maintain a synchronized view of the | connection. If endpoints fail to maintain a synchronized view of the | |||
| connection state, successful communication within the connection will | connection state, successful communication within the connection will | |||
| no longer be possible. Therefore, it is important that endpoints | no longer be possible. Therefore, it is important that endpoints | |||
| have a shared comprehension of how the state is affected by the use | have a shared comprehension of how the state is affected by the use | |||
| of any given frame. | of any given frame. | |||
| 6.1. DATA | 6.1. DATA | |||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x00) convey arbitrary, variable-length sequences | |||
| octets associated with a stream. One or more DATA frames are used, | of octets associated with a stream. One or more DATA frames are | |||
| for instance, to carry HTTP request or response message contents. | used, for instance, to carry HTTP request or response message | |||
| contents. | ||||
| DATA frames MAY also contain padding. Padding can be added to DATA | DATA frames MAY also contain padding. Padding can be added to DATA | |||
| frames to obscure the size of messages. Padding is a security | frames to obscure the size of messages. Padding is a security | |||
| feature; see Section 10.7. | feature; see Section 10.7. | |||
| DATA Frame { | DATA Frame { | |||
| Length (24), | Length (24), | |||
| Type (8) = 0x0, | Type (8) = 0x00, | |||
| Unused Flags (4), | Unused Flags (4), | |||
| PADDED Flag (1), | PADDED Flag (1), | |||
| Unused Flags (2), | Unused Flags (2), | |||
| END_STREAM Flag (1), | END_STREAM Flag (1), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31), | Stream Identifier (31), | |||
| [Pad Length (8)], | [Pad Length (8)], | |||
| skipping to change at page 29, line 25 ¶ | skipping to change at line 1329 ¶ | |||
| frame payload after subtracting the length of the other fields | frame payload after subtracting the length of the other fields | |||
| that are present. | that are present. | |||
| Padding: Padding octets that contain no application semantic value. | Padding: Padding octets that contain no application semantic value. | |||
| Padding octets MUST be set to zero when sending. A receiver is | Padding octets MUST be set to zero when sending. A receiver is | |||
| not obligated to verify padding but MAY treat non-zero padding as | not obligated to verify padding but MAY treat non-zero padding as | |||
| a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The DATA frame defines the following flags: | The DATA frame defines the following flags: | |||
| PADDED (0x8): When set, the PADDED flag indicates that the Pad | PADDED (0x08): When set, the PADDED flag indicates that the Pad | |||
| Length field and any padding that it describes are present. | Length field and any padding that it describes are present. | |||
| END_STREAM (0x1): When set, the END_STREAM flag indicates that this | END_STREAM (0x01): When set, the END_STREAM flag indicates that this | |||
| frame is the last that the endpoint will send for the identified | frame is the last that the endpoint will send for the identified | |||
| stream. Setting this flag causes the stream to enter one of the | stream. Setting this flag causes the stream to enter one of the | |||
| "half-closed" states or the "closed" state (Section 5.1). | "half-closed" states or the "closed" state (Section 5.1). | |||
| | Note: An endpoint that learns of stream closure after sending | | Note: An endpoint that learns of stream closure after sending | |||
| | all data can close a stream by sending a STREAM frame with a | | 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 | | zero-length Data field and the END_STREAM flag set. This is | |||
| | only possible if the endpoint does not send trailers as the | | only possible if the endpoint does not send trailers, as the | |||
| | END_STREAM flag appears on a HEADERS frame in that case; see | | END_STREAM flag appears on a HEADERS frame in that case; see | |||
| | Section 8.1. | | Section 8.1. | |||
| DATA frames MUST be associated with a stream. If a DATA frame is | DATA frames MUST be associated with a stream. If a DATA frame is | |||
| received whose stream identifier field is 0x0, the recipient MUST | received whose Stream Identifier field is 0x00, the recipient MUST | |||
| respond with a connection error (Section 5.4.1) of type | respond with a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| DATA frames are subject to flow control and can only be sent when a | 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 | stream is in the "open" or "half-closed (remote)" state. The entire | |||
| DATA frame payload is included in flow control, including the Pad | DATA frame payload is included in flow control, including the Pad | |||
| Length and Padding fields if present. If a DATA frame is received | Length and Padding fields if present. If a DATA frame is received | |||
| whose stream is not in "open" or "half-closed (local)" state, the | 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 | recipient MUST respond with a stream error (Section 5.4.2) of type | |||
| STREAM_CLOSED. | STREAM_CLOSED. | |||
| The total number of padding octets is determined by the value of the | 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 | 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 | frame payload or greater, the recipient MUST treat this as a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| | Note: A frame can be increased in size by one octet by | | Note: A frame can be increased in size by one octet by | |||
| | including a Pad Length field with a value of zero. | | including a Pad Length field with a value of zero. | |||
| 6.2. HEADERS | 6.2. HEADERS | |||
| The HEADERS frame (type=0x1) is used to open a stream (Section 5.1), | 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 | and additionally carries a field block fragment. Despite the name, a | |||
| HEADERS frame can carry a header section or a trailer section. | HEADERS frame can carry a header section or a trailer section. | |||
| HEADERS frames can be sent on a stream in the "idle", "reserved | HEADERS frames can be sent on a stream in the "idle", "reserved | |||
| (local)", "open", or "half-closed (remote)" state. | (local)", "open", or "half-closed (remote)" state. | |||
| HEADERS Frame { | HEADERS Frame { | |||
| Length (24), | Length (24), | |||
| Type (8) = 0x1, | Type (8) = 0x01, | |||
| Unused Flags (2), | Unused Flags (2), | |||
| PRIORITY Flag (1), | PRIORITY Flag (1), | |||
| Unused Flag (1), | Unused Flag (1), | |||
| PADDED Flag (1), | PADDED Flag (1), | |||
| END_HEADERS Flag (1), | END_HEADERS Flag (1), | |||
| Unused Flag (1), | Unused Flag (1), | |||
| END_STREAM Flag (1), | END_STREAM Flag (1), | |||
| Reserved (1), | Reserved (1), | |||
| skipping to change at page 31, line 27 ¶ | skipping to change at line 1428 ¶ | |||
| Padding: Padding octets that contain no application semantic value. | Padding: Padding octets that contain no application semantic value. | |||
| Padding octets MUST be set to zero when sending. A receiver is | Padding octets MUST be set to zero when sending. A receiver is | |||
| not obligated to verify padding but MAY treat non-zero padding as | not obligated to verify padding but MAY treat non-zero padding as | |||
| a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The HEADERS frame defines the following flags: | The HEADERS frame defines the following flags: | |||
| PRIORITY (0x20): When set, the PRIORITY flag indicates that the | PRIORITY (0x20): When set, the PRIORITY flag indicates that the | |||
| Exclusive, Stream Dependency, and Weight fields are present. | Exclusive, Stream Dependency, and Weight fields are present. | |||
| PADDED (0x8): When set, the PADDED flag indicates that the Pad | PADDED (0x08): When set, the PADDED flag indicates that the Pad | |||
| Length field and any padding that it describes are present. | Length field and any padding that it describes are present. | |||
| END_HEADERS (0x4): When set, the END_HEADERS flag indicates that | END_HEADERS (0x04): When set, the END_HEADERS flag indicates that | |||
| this frame contains an entire field block (Section 4.3) and is not | this frame contains an entire field block (Section 4.3) and is not | |||
| followed by any CONTINUATION frames. | followed by any CONTINUATION frames. | |||
| A HEADERS frame without the END_HEADERS flag set MUST be followed | A HEADERS frame without the END_HEADERS flag set MUST be followed | |||
| by a CONTINUATION frame for the same stream. A receiver MUST | 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 | 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 | different stream as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| END_STREAM (0x1): When set, the END_STREAM flag indicates that the | 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 | field block (Section 4.3) is the last that the endpoint will send | |||
| for the identified stream. | for the identified stream. | |||
| A HEADERS frame with the END_STREAM flag set signals the end of a | 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 | stream. However, a HEADERS frame with the END_STREAM flag set can | |||
| be followed by CONTINUATION frames on the same stream. Logically, | be followed by CONTINUATION frames on the same stream. Logically, | |||
| the CONTINUATION frames are part of the HEADERS frame. | the CONTINUATION frames are part of the HEADERS frame. | |||
| The frame payload of a HEADERS frame contains a field block fragment | 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 | (Section 4.3). A field block that does not fit within a HEADERS | |||
| frame is continued in a CONTINUATION frame (Section 6.10). | frame is continued in a CONTINUATION frame (Section 6.10). | |||
| HEADERS frames MUST be associated with a stream. If a HEADERS frame | HEADERS frames MUST be associated with a stream. If a HEADERS frame | |||
| is received whose stream identifier field is 0x0, the recipient MUST | is received whose Stream Identifier field is 0x00, the recipient MUST | |||
| respond with a connection error (Section 5.4.1) of type | respond with a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| The HEADERS frame changes the connection state as described in | The HEADERS frame changes the connection state as described in | |||
| Section 4.3. | Section 4.3. | |||
| The total number of padding octets is determined by the value of the | 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 | 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 | frame payload or greater, the recipient MUST treat this as a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| | Note: A frame can be increased in size by one octet by | | Note: A frame can be increased in size by one octet by | |||
| | including a Pad Length field with a value of zero. | | including a Pad Length field with a value of zero. | |||
| 6.3. PRIORITY | 6.3. PRIORITY | |||
| The PRIORITY frame (type=0x2) is deprecated; see Section 5.3.2. A | 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 | PRIORITY frame can be sent in any stream state, including idle or | |||
| closed streams. | closed streams. | |||
| PRIORITY Frame { | PRIORITY Frame { | |||
| Length (24) = 0x5, | Length (24) = 0x05, | |||
| Type (8) = 0x2, | Type (8) = 0x02, | |||
| Unused Flags (8), | Unused Flags (8), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31), | Stream Identifier (31), | |||
| Exclusive (1), | Exclusive (1), | |||
| Stream Dependency (31), | Stream Dependency (31), | |||
| Weight (8), | Weight (8), | |||
| } | } | |||
| skipping to change at page 33, line 8 ¶ | skipping to change at line 1505 ¶ | |||
| Exclusive: A single-bit flag. | Exclusive: A single-bit flag. | |||
| Stream Dependency: A 31-bit stream identifier. | Stream Dependency: A 31-bit stream identifier. | |||
| Weight: An unsigned 8-bit integer. | Weight: An unsigned 8-bit integer. | |||
| The PRIORITY frame does not define any flags. | The PRIORITY frame does not define any flags. | |||
| The PRIORITY frame always identifies a stream. If a PRIORITY frame | The PRIORITY frame always identifies a stream. If a PRIORITY frame | |||
| is received with a stream identifier of 0x0, the recipient MUST | is received with a stream identifier of 0x00, the recipient MUST | |||
| respond with a connection error (Section 5.4.1) of type | respond with a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| Sending or receiving a PRIORITY frame does not affect the state of | 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 | 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 | in any state, including "idle" or "closed". A PRIORITY frame cannot | |||
| be sent between consecutive frames that comprise a single field block | be sent between consecutive frames that comprise a single field block | |||
| (Section 4.3). | (Section 4.3). | |||
| A PRIORITY frame with a length other than 5 octets MUST be treated as | 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. | a stream error (Section 5.4.2) of type FRAME_SIZE_ERROR. | |||
| 6.4. RST_STREAM | 6.4. RST_STREAM | |||
| The RST_STREAM frame (type=0x3) allows for immediate termination of a | The RST_STREAM frame (type=0x03) allows for immediate termination of | |||
| stream. RST_STREAM is sent to request cancellation of a stream or to | a stream. RST_STREAM is sent to request cancellation of a stream or | |||
| indicate that an error condition has occurred. | to indicate that an error condition has occurred. | |||
| RST_STREAM Frame { | RST_STREAM Frame { | |||
| Length (24) = 0x4, | Length (24) = 0x04, | |||
| Type (8) = 0x3, | Type (8) = 0x03, | |||
| Unused Flags (8), | Unused Flags (8), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31), | Stream Identifier (31), | |||
| Error Code (32), | Error Code (32), | |||
| } | } | |||
| Figure 6: RST_STREAM Frame Format | Figure 6: RST_STREAM Frame Format | |||
| skipping to change at page 34, line 9 ¶ | skipping to change at line 1555 ¶ | |||
| The RST_STREAM frame fully terminates the referenced stream and | The RST_STREAM frame fully terminates the referenced stream and | |||
| causes it to enter the "closed" state. After receiving a RST_STREAM | causes it to enter the "closed" state. After receiving a RST_STREAM | |||
| on a stream, the receiver MUST NOT send additional frames for that | on a stream, the receiver MUST NOT send additional frames for that | |||
| stream, except for PRIORITY. However, after sending the RST_STREAM, | stream, except for PRIORITY. However, after sending the RST_STREAM, | |||
| the sending endpoint MUST be prepared to receive and process | the sending endpoint MUST be prepared to receive and process | |||
| additional frames sent on the stream that might have been sent by the | additional frames sent on the stream that might have been sent by the | |||
| peer prior to the arrival of the RST_STREAM. | peer prior to the arrival of the RST_STREAM. | |||
| RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | |||
| frame is received with a stream identifier of 0x0, the recipient MUST | frame is received with a stream identifier of 0x00, the recipient | |||
| treat this as a connection error (Section 5.4.1) of type | MUST treat this as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. | 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 | 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 | recipient MUST treat this as a connection error (Section 5.4.1) of | |||
| type PROTOCOL_ERROR. | type PROTOCOL_ERROR. | |||
| A RST_STREAM frame with a length other than 4 octets MUST be treated | 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. | as a connection error (Section 5.4.1) of type FRAME_SIZE_ERROR. | |||
| 6.5. SETTINGS | 6.5. SETTINGS | |||
| The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x04) conveys configuration parameters that | |||
| affect how endpoints communicate, such as preferences and constraints | affect how endpoints communicate, such as preferences and constraints | |||
| on peer behavior. The SETTINGS frame is also used to acknowledge the | on peer behavior. The SETTINGS frame is also used to acknowledge the | |||
| receipt of those settings. Individually, a configuration parameter | receipt of those settings. Individually, a configuration parameter | |||
| from a SETTINGS frame is referred to as a "setting". | from a SETTINGS frame is referred to as a "setting". | |||
| Settings are not negotiated; they describe characteristics of the | Settings are not negotiated; they describe characteristics of the | |||
| sending peer, which are used by the receiving peer. Different values | sending peer, which are used by the receiving peer. Different values | |||
| for the same setting can be advertised by each peer. For example, a | 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 | client might set a high initial flow-control window, whereas a server | |||
| might set a lower value to conserve resources. | might set a lower value to conserve resources. | |||
| skipping to change at page 34, line 50 ¶ | skipping to change at line 1596 ¶ | |||
| Each parameter in a SETTINGS frame replaces any existing value for | Each parameter in a SETTINGS frame replaces any existing value for | |||
| that parameter. Settings are processed in the order in which they | that parameter. Settings are processed in the order in which they | |||
| appear, and a receiver of a SETTINGS frame does not need to maintain | appear, and a receiver of a SETTINGS frame does not need to maintain | |||
| any state other than the current value of each setting. Therefore, | 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 | the value of a SETTINGS parameter is the last value that is seen by a | |||
| receiver. | receiver. | |||
| SETTINGS frames are acknowledged by the receiving peer. To enable | SETTINGS frames are acknowledged by the receiving peer. To enable | |||
| this, the SETTINGS frame defines the ACK flag: | this, the SETTINGS frame defines the ACK flag: | |||
| ACK (0x1): When set, the ACK flag indicates that this frame | ACK (0x01): When set, the ACK flag indicates that this frame | |||
| acknowledges receipt and application of the peer's SETTINGS frame. | acknowledges receipt and application of the peer's SETTINGS frame. | |||
| When this bit is set, the frame payload of the SETTINGS frame MUST | 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 | 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 | length field value other than 0 MUST be treated as a connection | |||
| error (Section 5.4.1) of type FRAME_SIZE_ERROR. For more | error (Section 5.4.1) of type FRAME_SIZE_ERROR. For more | |||
| information, see Section 6.5.3 ("Settings Synchronization"). | information, see Section 6.5.3 ("Settings Synchronization"). | |||
| SETTINGS frames always apply to a connection, never a single stream. | SETTINGS frames always apply to a connection, never a single stream. | |||
| The stream identifier for a SETTINGS frame MUST be zero (0x0). If an | The stream identifier for a SETTINGS frame MUST be zero (0x00). If | |||
| endpoint receives a SETTINGS frame whose stream identifier field is | an endpoint receives a SETTINGS frame whose Stream Identifier field | |||
| anything other than 0x0, the endpoint MUST respond with a connection | is anything other than 0x00, the endpoint MUST respond with a | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The SETTINGS frame affects connection state. A badly formed or | The SETTINGS frame affects connection state. A badly formed or | |||
| incomplete SETTINGS frame MUST be treated as a connection error | incomplete SETTINGS frame MUST be treated as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| A SETTINGS frame with a length other than a multiple of 6 octets MUST | 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 | be treated as a connection error (Section 5.4.1) of type | |||
| FRAME_SIZE_ERROR. | FRAME_SIZE_ERROR. | |||
| 6.5.1. SETTINGS Format | 6.5.1. SETTINGS Format | |||
| The frame payload of a SETTINGS frame consists of zero or more | The frame payload of a SETTINGS frame consists of zero or more | |||
| settings, each consisting of an unsigned 16-bit setting identifier | settings, each consisting of an unsigned 16-bit setting identifier | |||
| and an unsigned 32-bit value. | and an unsigned 32-bit value. | |||
| SETTINGS Frame { | SETTINGS Frame { | |||
| Length (24), | Length (24), | |||
| Type (8) = 0x4, | Type (8) = 0x04, | |||
| Unused Flags (7), | Unused Flags (7), | |||
| ACK Flag (1), | ACK Flag (1), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31) = 0, | Stream Identifier (31) = 0, | |||
| Setting (48) ..., | Setting (48) ..., | |||
| } | } | |||
| skipping to change at page 36, line 18 ¶ | skipping to change at line 1657 ¶ | |||
| of: | of: | |||
| Identifier: A 16-bit setting identifier; see Section 6.5.2. | Identifier: A 16-bit setting identifier; see Section 6.5.2. | |||
| Value: A 32-bit value for the setting. | Value: A 32-bit value for the setting. | |||
| 6.5.2. Defined Settings | 6.5.2. Defined Settings | |||
| The following settings are defined: | The following settings are defined: | |||
| SETTINGS_HEADER_TABLE_SIZE (0x1): Allows the sender to inform the | SETTINGS_HEADER_TABLE_SIZE (0x01): This setting allows the sender to | |||
| remote endpoint of the maximum size of the compression table used | inform the remote endpoint of the maximum size of the compression | |||
| to decode field blocks, in units of octets. The encoder can | table used to decode field blocks, in units of octets. The | |||
| select any size equal to or less than this value by using | encoder can select any size equal to or less than this value by | |||
| signaling specific to the compression format inside a field block | using signaling specific to the compression format inside a field | |||
| (see [COMPRESSION]). The initial value is 4,096 octets. | block (see [COMPRESSION]). The initial value is 4,096 octets. | |||
| SETTINGS_ENABLE_PUSH (0x2): This setting can be used to disable | SETTINGS_ENABLE_PUSH (0x02): This setting can be used to enable or | |||
| server push (Section 8.4). A server MUST NOT send a PUSH_PROMISE | disable server push. A server MUST NOT send a PUSH_PROMISE frame | |||
| frame if it receives this parameter set to a value of 0. A client | if it receives this parameter set to a value of 0; see | |||
| that has both set this parameter to 0 and had it acknowledged MUST | Section 8.4. A client that has both set this parameter to 0 and | |||
| treat the receipt of a PUSH_PROMISE frame as a connection error | had it acknowledged MUST treat the receipt of a PUSH_PROMISE frame | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | 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 | The initial value of SETTINGS_ENABLE_PUSH is 1. For a client, | |||
| value indicates that it is willing to receive PUSH_PROMISE frames. | this value indicates that it is willing to receive PUSH_PROMISE | |||
| For a server this initial value has no effect, and is equivalent | frames. For a server, this initial value has no effect, and is | |||
| to the value 0. Any value other than 0 or 1 MUST be treated as a | equivalent to the value 0. Any value other than 0 or 1 MUST be | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | 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 | 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 | 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 | 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 | receipt of a SETTINGS frame with SETTINGS_ENABLE_PUSH set to 1 as | |||
| a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| SETTINGS_MAX_CONCURRENT_STREAMS (0x3): Indicates the maximum number | SETTINGS_MAX_CONCURRENT_STREAMS (0x03): This setting indicates the | |||
| of concurrent streams that the sender will allow. This limit is | maximum number of concurrent streams that the sender will allow. | |||
| directional: it applies to the number of streams that the sender | This limit is directional: it applies to the number of streams | |||
| permits the receiver to create. Initially, there is no limit to | that the sender permits the receiver to create. Initially, there | |||
| this value. It is recommended that this value be no smaller than | is no limit to this value. It is recommended that this value be | |||
| 100, so as to not unnecessarily limit parallelism. | no smaller than 100, so as to not unnecessarily limit parallelism. | |||
| A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be | A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be | |||
| treated as special by endpoints. A zero value does prevent the | treated as special by endpoints. A zero value does prevent the | |||
| creation of new streams; however, this can also happen for any | creation of new streams; however, this can also happen for any | |||
| limit that is exhausted with active streams. Servers SHOULD only | limit that is exhausted with active streams. Servers SHOULD only | |||
| set a zero value for short durations; if a server does not wish to | set a zero value for short durations; if a server does not wish to | |||
| accept requests, closing the connection is more appropriate. | accept requests, closing the connection is more appropriate. | |||
| SETTINGS_INITIAL_WINDOW_SIZE (0x4): Indicates the sender's initial | SETTINGS_INITIAL_WINDOW_SIZE (0x04): This setting indicates the | |||
| window size (in units of octets) for stream-level flow control. | sender's initial window size (in units of octets) for stream-level | |||
| The initial value is 2^16-1 (65,535) octets. | flow control. The initial value is 2^16-1 (65,535) octets. | |||
| This setting affects the window size of all streams (see | This setting affects the window size of all streams (see | |||
| Section 6.9.2). | Section 6.9.2). | |||
| Values above the maximum flow-control window size of 2^31-1 MUST | 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 | be treated as a connection error (Section 5.4.1) of type | |||
| FLOW_CONTROL_ERROR. | FLOW_CONTROL_ERROR. | |||
| SETTINGS_MAX_FRAME_SIZE (0x5): Indicates the size of the largest | SETTINGS_MAX_FRAME_SIZE (0x05): This setting indicates the size of | |||
| frame payload that the sender is willing to receive, in units of | the largest frame payload that the sender is willing to receive, | |||
| octets. | in units of octets. | |||
| The initial value is 2^14 (16,384) octets. The value advertised | The initial value is 2^14 (16,384) octets. The value advertised | |||
| by an endpoint MUST be between this initial value and the maximum | by an endpoint MUST be between this initial value and the maximum | |||
| allowed frame size (2^24-1 or 16,777,215 octets), inclusive. | allowed frame size (2^24-1 or 16,777,215 octets), inclusive. | |||
| Values outside this range MUST be treated as a connection error | Values outside this range MUST be treated as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE (0x6): This advisory setting informs a | SETTINGS_MAX_HEADER_LIST_SIZE (0x06): This advisory setting informs | |||
| peer of the maximum size of field section that the sender is | 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 | prepared to accept, in units of octets. The value is based on the | |||
| uncompressed size of field lines, including the length of the name | uncompressed size of field lines, including the length of the name | |||
| and value in units of octets plus an overhead of 32 octets for | and value in units of octets plus an overhead of 32 octets for | |||
| each field line. | each field line. | |||
| For any given request, a lower limit than what is advertised MAY | For any given request, a lower limit than what is advertised MAY | |||
| be enforced. The initial value of this setting is unlimited. | be enforced. The initial value of this setting is unlimited. | |||
| An endpoint that receives a SETTINGS frame with any unknown or | An endpoint that receives a SETTINGS frame with any unknown or | |||
| unsupported identifier MUST ignore that setting. | unsupported identifier MUST ignore that setting. | |||
| skipping to change at page 38, line 26 ¶ | skipping to change at line 1753 ¶ | |||
| settings MUST be ignored. Once all values have been processed, the | settings MUST be ignored. Once all values have been processed, the | |||
| recipient MUST immediately emit a SETTINGS frame with the ACK flag | recipient MUST immediately emit a SETTINGS frame with the ACK flag | |||
| set. Upon receiving a SETTINGS frame with the ACK flag set, the | 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 | sender of the altered settings can rely on the values from the oldest | |||
| unacknowledged SETTINGS frame having been applied. | unacknowledged SETTINGS frame having been applied. | |||
| If the sender of a SETTINGS frame does not receive an acknowledgment | If the sender of a SETTINGS frame does not receive an acknowledgment | |||
| within a reasonable amount of time, it MAY issue a connection error | 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 | (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 | allowance needs to be made for processing delays at the peer; a | |||
| timeout that is solely based on the round trip time between endpoints | timeout that is solely based on the round-trip time between endpoints | |||
| might result in spurious errors. | might result in spurious errors. | |||
| 6.6. PUSH_PROMISE | 6.6. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | The PUSH_PROMISE frame (type=0x05) is used to notify the peer | |||
| in advance of streams the sender intends to initiate. The | endpoint in advance of streams the sender intends to initiate. The | |||
| PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | |||
| stream the endpoint plans to create along with a field section that | stream the endpoint plans to create along with a field section that | |||
| provides additional context for the stream. Section 8.4 contains a | provides additional context for the stream. Section 8.4 contains a | |||
| thorough description of the use of PUSH_PROMISE frames. | thorough description of the use of PUSH_PROMISE frames. | |||
| PUSH_PROMISE Frame { | PUSH_PROMISE Frame { | |||
| Length (24), | Length (24), | |||
| Type (8) = 0x5, | Type (8) = 0x05, | |||
| Unused Flags (4), | Unused Flags (4), | |||
| PADDED Flag (1), | PADDED Flag (1), | |||
| END_HEADERS Flag (1), | END_HEADERS Flag (1), | |||
| Unused Flags (2), | Unused Flags (2), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31), | Stream Identifier (31), | |||
| [Pad Length (8)], | [Pad Length (8)], | |||
| skipping to change at page 39, line 34 ¶ | skipping to change at line 1794 ¶ | |||
| Figure 8: PUSH_PROMISE Frame Format | Figure 8: PUSH_PROMISE Frame Format | |||
| The Length, Type, Unused Flag(s), Reserved, and Stream Identifier | The Length, Type, Unused Flag(s), Reserved, and Stream Identifier | |||
| fields are described in Section 4. The PUSH_PROMISE frame payload | fields are described in Section 4. The PUSH_PROMISE frame payload | |||
| has the following additional fields: | has the following additional fields: | |||
| Pad Length: An 8-bit field containing the length of the frame | Pad Length: An 8-bit field containing the length of the frame | |||
| padding in units of octets. This field is only present if the | padding in units of octets. This field is only present if the | |||
| PADDED flag is set. | PADDED flag is set. | |||
| Reserved: A single reserved bit. | ||||
| Promised Stream ID: An unsigned 31-bit integer that identifies the | Promised Stream ID: An unsigned 31-bit integer that identifies the | |||
| stream that is reserved by the PUSH_PROMISE. The promised stream | stream that is reserved by the PUSH_PROMISE. The promised stream | |||
| identifier MUST be a valid choice for the next stream sent by the | identifier MUST be a valid choice for the next stream sent by the | |||
| sender (see "new stream identifier" in Section 5.1.1). | sender (see "new stream identifier" in Section 5.1.1). | |||
| Field Block Fragment: A field block fragment (Section 4.3) | Field Block Fragment: A field block fragment (Section 4.3) | |||
| containing request control data and header section. | containing the request control data and a header section. | |||
| Padding: Padding octets that contain no application semantic value. | Padding: Padding octets that contain no application semantic value. | |||
| Padding octets MUST be set to zero when sending. A receiver is | Padding octets MUST be set to zero when sending. A receiver is | |||
| not obligated to verify padding but MAY treat non-zero padding as | not obligated to verify padding but MAY treat non-zero padding as | |||
| a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The PUSH_PROMISE frame defines the following flags: | The PUSH_PROMISE frame defines the following flags: | |||
| PADDED (0x8): When set, the PADDED flag indicates that the Pad | PADDED (0x08): When set, the PADDED flag indicates that the Pad | |||
| Length field and any padding that it describes are present. | Length field and any padding that it describes are present. | |||
| END_HEADERS (0x4): When set, the END_HEADERS flag indicates that | END_HEADERS (0x04): When set, the END_HEADERS flag indicates that | |||
| this frame contains an entire field block (Section 4.3) and is not | this frame contains an entire field block (Section 4.3) and is not | |||
| followed by any CONTINUATION frames. | followed by any CONTINUATION frames. | |||
| A PUSH_PROMISE frame without the END_HEADERS flag set MUST be | A PUSH_PROMISE frame without the END_HEADERS flag set MUST be | |||
| followed by a CONTINUATION frame for the same stream. A receiver | 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 | 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 | different stream as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that | 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 | is in either the "open" or "half-closed (remote)" state. The stream | |||
| identifier of a PUSH_PROMISE frame indicates the stream it is | identifier of a PUSH_PROMISE frame indicates the stream it is | |||
| associated with. If the stream identifier field specifies the value | associated with. If the Stream Identifier field specifies the value | |||
| 0x0, a recipient MUST respond with a connection error (Section 5.4.1) | 0x00, a recipient MUST respond with a connection error | |||
| of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| Promised streams are not required to be used in the order they are | Promised streams are not required to be used in the order they are | |||
| promised. The PUSH_PROMISE only reserves stream identifiers for | promised. The PUSH_PROMISE only reserves stream identifiers for | |||
| later use. | later use. | |||
| PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of | 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 | the peer endpoint is set to 0. An endpoint that has set this setting | |||
| and has received acknowledgment MUST treat the receipt of a | and has received acknowledgment MUST treat the receipt of a | |||
| PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| Recipients of PUSH_PROMISE frames can choose to reject promised | Recipients of PUSH_PROMISE frames can choose to reject promised | |||
| streams by returning a RST_STREAM referencing the promised stream | streams by returning a RST_STREAM referencing the promised stream | |||
| identifier back to the sender of the PUSH_PROMISE. | identifier back to the sender of the PUSH_PROMISE. | |||
| A PUSH_PROMISE frame modifies the connection state in two ways. | A PUSH_PROMISE frame modifies the connection state in two ways. | |||
| First, the inclusion of a field block (Section 4.3) potentially | First, the inclusion of a field block (Section 4.3) potentially | |||
| modifies the state maintained for field section compression. Second, | modifies the state maintained for field section compression. Second, | |||
| PUSH_PROMISE also reserves a stream for later use, causing the | PUSH_PROMISE also reserves a stream for later use, causing the | |||
| promised stream to enter the "reserved" state. A sender MUST NOT | promised stream to enter the "reserved (local)" or "reserved | |||
| send a PUSH_PROMISE on a stream unless that stream is either "open" | (remote)" state. A sender MUST NOT send a PUSH_PROMISE on a stream | |||
| or "half-closed (remote)"; the sender MUST ensure that the promised | unless that stream is either "open" or "half-closed (remote)"; the | |||
| stream is a valid choice for a new stream identifier (Section 5.1.1) | sender MUST ensure that the promised stream is a valid choice for a | |||
| (that is, the promised stream MUST be in the "idle" state). | 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 | Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame | |||
| causes the stream state to become indeterminate. A receiver MUST | causes the stream state to become indeterminate. A receiver MUST | |||
| treat the receipt of a PUSH_PROMISE on a stream that is neither | treat the receipt of a PUSH_PROMISE on a stream that is neither | |||
| "open" nor "half-closed (local)" as a connection error | "open" nor "half-closed (local)" as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. However, an endpoint that | (Section 5.4.1) of type PROTOCOL_ERROR. However, an endpoint that | |||
| has sent RST_STREAM on the associated stream MUST handle PUSH_PROMISE | has sent RST_STREAM on the associated stream MUST handle PUSH_PROMISE | |||
| frames that might have been created before the RST_STREAM frame is | frames that might have been created before the RST_STREAM frame is | |||
| received and processed. | received and processed. | |||
| skipping to change at page 41, line 30 ¶ | skipping to change at line 1879 ¶ | |||
| The total number of padding octets is determined by the value of the | 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 | 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 | frame payload or greater, the recipient MUST treat this as a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| | Note: A frame can be increased in size by one octet by | | Note: A frame can be increased in size by one octet by | |||
| | including a Pad Length field with a value of zero. | | including a Pad Length field with a value of zero. | |||
| 6.7. PING | 6.7. PING | |||
| The PING frame (type=0x6) is a mechanism for measuring a minimal | The PING frame (type=0x06) is a mechanism for measuring a minimal | |||
| round-trip time from the sender, as well as determining whether an | round-trip time from the sender, as well as determining whether an | |||
| idle connection is still functional. PING frames can be sent from | idle connection is still functional. PING frames can be sent from | |||
| any endpoint. | any endpoint. | |||
| PING Frame { | PING Frame { | |||
| Length (24) = 0x8, | Length (24) = 0x08, | |||
| Type (8) = 0x6, | Type (8) = 0x06, | |||
| Unused Flags (7), | Unused Flags (7), | |||
| ACK Flag (1), | ACK Flag (1), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31) = 0, | Stream Identifier (31) = 0, | |||
| Opaque Data (64), | Opaque Data (64), | |||
| } | } | |||
| skipping to change at page 42, line 16 ¶ | skipping to change at line 1913 ¶ | |||
| opaque data in the frame payload. A sender can include any value it | opaque data in the frame payload. A sender can include any value it | |||
| chooses and use those octets in any fashion. | chooses and use those octets in any fashion. | |||
| Receivers of a PING frame that does not include an ACK flag MUST send | 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 | a PING frame with the ACK flag set in response, with an identical | |||
| frame payload. PING responses SHOULD be given higher priority than | frame payload. PING responses SHOULD be given higher priority than | |||
| any other frame. | any other frame. | |||
| The PING frame defines the following flags: | The PING frame defines the following flags: | |||
| ACK (0x1): When set, the ACK flag indicates that this PING frame is | ACK (0x01): When set, the ACK flag indicates that this PING frame is | |||
| a PING response. An endpoint MUST set this flag in PING | a PING response. An endpoint MUST set this flag in PING | |||
| responses. An endpoint MUST NOT respond to PING frames containing | responses. An endpoint MUST NOT respond to PING frames containing | |||
| this flag. | this flag. | |||
| PING frames are not associated with any individual stream. If a PING | PING frames are not associated with any individual stream. If a PING | |||
| frame is received with a stream identifier field value other than | frame is received with a Stream Identifier field value other than | |||
| 0x0, the recipient MUST respond with a connection error | 0x00, the recipient MUST respond with a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| Receipt of a PING frame with a length field value other than 8 MUST | 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 | be treated as a connection error (Section 5.4.1) of type | |||
| FRAME_SIZE_ERROR. | FRAME_SIZE_ERROR. | |||
| 6.8. GOAWAY | 6.8. GOAWAY | |||
| The GOAWAY frame (type=0x7) is used to initiate shutdown of a | The GOAWAY frame (type=0x07) is used to initiate shutdown of a | |||
| connection or to signal serious error conditions. GOAWAY allows an | connection or to signal serious error conditions. GOAWAY allows an | |||
| endpoint to gracefully stop accepting new streams while still | endpoint to gracefully stop accepting new streams while still | |||
| finishing processing of previously established streams. This enables | finishing processing of previously established streams. This enables | |||
| administrative actions, like server maintenance. | administrative actions, like server maintenance. | |||
| There is an inherent race condition between an endpoint starting new | There is an inherent race condition between an endpoint starting new | |||
| streams and the remote sending a GOAWAY frame. To deal with this | streams and the remote peer sending a GOAWAY frame. To deal with | |||
| case, the GOAWAY contains the stream identifier of the last peer- | this case, the GOAWAY contains the stream identifier of the last | |||
| initiated stream that was or might be processed on the sending | peer-initiated stream that was or might be processed on the sending | |||
| endpoint in this connection. For instance, if the server sends a | endpoint in this connection. For instance, if the server sends a | |||
| GOAWAY frame, the identified stream is the highest-numbered stream | GOAWAY frame, the identified stream is the highest-numbered stream | |||
| initiated by the client. | initiated by the client. | |||
| Once sent, the sender will ignore frames sent on streams initiated by | Once the GOAWAY is sent, the sender will ignore frames sent on | |||
| the receiver if the stream has an identifier higher than the included | streams initiated by the receiver if the stream has an identifier | |||
| last stream identifier. Receivers of a GOAWAY frame MUST NOT open | higher than the included last stream identifier. Receivers of a | |||
| additional streams on the connection, although a new connection can | GOAWAY frame MUST NOT open additional streams on the connection, | |||
| be established for new streams. | although a new connection can be established for new streams. | |||
| If the receiver of the GOAWAY has sent data on streams with a higher | 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 | stream identifier than what is indicated in the GOAWAY frame, those | |||
| streams are not or will not be processed. The receiver of the GOAWAY | 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 | 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 | all, thereby allowing those streams to be retried later on a new | |||
| connection. | connection. | |||
| Endpoints SHOULD always send a GOAWAY frame before closing a | Endpoints SHOULD always send a GOAWAY frame before closing a | |||
| connection so that the remote peer can know whether a stream has been | connection so that the remote peer can know whether a stream has been | |||
| skipping to change at page 43, line 30 ¶ | skipping to change at line 1974 ¶ | |||
| An endpoint might choose to close a connection without sending a | An endpoint might choose to close a connection without sending a | |||
| GOAWAY for misbehaving peers. | GOAWAY for misbehaving peers. | |||
| A GOAWAY frame might not immediately precede closing of the | A GOAWAY frame might not immediately precede closing of the | |||
| connection; a receiver of a GOAWAY that has no more use for 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 SHOULD still send a GOAWAY frame before terminating the | |||
| connection. | connection. | |||
| GOAWAY Frame { | GOAWAY Frame { | |||
| Length (24), | Length (24), | |||
| Type (8) = 0x7, | Type (8) = 0x07, | |||
| Unused Flags (8), | Unused Flags (8), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31) = 0, | Stream Identifier (31) = 0, | |||
| Reserved (1), | Reserved (1), | |||
| Last-Stream-ID (31), | Last-Stream-ID (31), | |||
| Error Code (32), | Error Code (32), | |||
| Additional Debug Data (..), | Additional Debug Data (..), | |||
| skipping to change at page 44, line 7 ¶ | skipping to change at line 1996 ¶ | |||
| Figure 10: GOAWAY Frame Format | Figure 10: GOAWAY Frame Format | |||
| The Length, Type, Unused Flag(s), Reserved, and Stream Identifier | The Length, Type, Unused Flag(s), Reserved, and Stream Identifier | |||
| fields are described in Section 4. | fields are described in Section 4. | |||
| The GOAWAY frame does not define any flags. | The GOAWAY frame does not define any flags. | |||
| The GOAWAY frame applies to the connection, not a specific stream. | The GOAWAY frame applies to the connection, not a specific stream. | |||
| An endpoint MUST treat a GOAWAY frame with a stream identifier other | An endpoint MUST treat a GOAWAY frame with a stream identifier other | |||
| than 0x0 as a connection error (Section 5.4.1) of type | than 0x00 as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| The last stream identifier in the GOAWAY frame contains the highest- | The last stream identifier in the GOAWAY frame contains the highest- | |||
| numbered stream identifier for which the sender of the GOAWAY frame | numbered stream identifier for which the sender of the GOAWAY frame | |||
| might have taken some action on or might yet take action on. All | might have taken some action on or might yet take action on. All | |||
| streams up to and including the identified stream might have been | 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 | processed in some way. The last stream identifier can be set to 0 if | |||
| no streams were processed. | no streams were processed. | |||
| | Note: In this context, "processed" means that some data from | | Note: In this context, "processed" means that some data from | |||
| skipping to change at page 44, line 31 ¶ | skipping to change at line 2020 ¶ | |||
| If a connection terminates without a GOAWAY frame, the last stream | If a connection terminates without a GOAWAY frame, the last stream | |||
| identifier is effectively the highest possible stream identifier. | identifier is effectively the highest possible stream identifier. | |||
| On streams with lower- or equal-numbered identifiers that were not | On streams with lower- or equal-numbered identifiers that were not | |||
| closed completely prior to the connection being closed, reattempting | closed completely prior to the connection being closed, reattempting | |||
| requests, transactions, or any protocol activity is not possible, | requests, transactions, or any protocol activity is not possible, | |||
| except for idempotent actions like HTTP GET, PUT, or DELETE. Any | except for idempotent actions like HTTP GET, PUT, or DELETE. Any | |||
| protocol activity that uses higher-numbered streams can be safely | protocol activity that uses higher-numbered streams can be safely | |||
| retried using a new connection. | retried using a new connection. | |||
| Activity on streams numbered lower or equal to the last stream | Activity on streams numbered lower than or equal to the last stream | |||
| identifier might still complete successfully. The sender of a GOAWAY | identifier might still complete successfully. The sender of a GOAWAY | |||
| frame might gracefully shut down a connection by sending a GOAWAY | frame might gracefully shut down a connection by sending a GOAWAY | |||
| frame, maintaining the connection in an "open" state until all in- | frame, maintaining the connection in an "open" state until all in- | |||
| progress streams complete. | progress streams complete. | |||
| An endpoint MAY send multiple GOAWAY frames if circumstances change. | An endpoint MAY send multiple GOAWAY frames if circumstances change. | |||
| For instance, an endpoint that sends GOAWAY with NO_ERROR during | For instance, an endpoint that sends GOAWAY with NO_ERROR during | |||
| graceful shutdown could subsequently encounter a condition that | graceful shutdown could subsequently encounter a condition that | |||
| requires immediate termination of the connection. The last stream | requires immediate termination of the connection. The last stream | |||
| identifier from the last GOAWAY frame received indicates which | identifier from the last GOAWAY frame received indicates which | |||
| skipping to change at page 45, line 14 ¶ | skipping to change at line 2052 ¶ | |||
| requests is prohibited. After allowing time for any in-flight stream | requests is prohibited. After allowing time for any in-flight stream | |||
| creation (at least one round-trip time), the server MAY send another | creation (at least one round-trip time), the server MAY send another | |||
| GOAWAY frame with an updated last stream identifier. This ensures | GOAWAY frame with an updated last stream identifier. This ensures | |||
| that a connection can be cleanly shut down without losing requests. | that a connection can be cleanly shut down without losing requests. | |||
| After sending a GOAWAY frame, the sender can discard frames for | After sending a GOAWAY frame, the sender can discard frames for | |||
| streams initiated by the receiver with identifiers higher than the | streams initiated by the receiver with identifiers higher than the | |||
| identified last stream. However, any frames that alter connection | identified last stream. However, any frames that alter connection | |||
| state cannot be completely ignored. For instance, HEADERS, | state cannot be completely ignored. For instance, HEADERS, | |||
| PUSH_PROMISE, and CONTINUATION frames MUST be minimally processed to | PUSH_PROMISE, and CONTINUATION frames MUST be minimally processed to | |||
| ensure the state maintained for field section compression is | ensure that the state maintained for field section compression is | |||
| consistent (see Section 4.3); similarly, DATA frames MUST be counted | consistent (see Section 4.3); similarly, DATA frames MUST be counted | |||
| toward the connection flow-control window. Failure to process these | toward the connection flow-control window. Failure to process these | |||
| frames can cause flow control or field section compression state to | frames can cause flow control or field section compression state to | |||
| become unsynchronized. | become unsynchronized. | |||
| The GOAWAY frame also contains a 32-bit error code (Section 7) that | The GOAWAY frame also contains a 32-bit error code (Section 7) that | |||
| contains the reason for closing the connection. | contains the reason for closing the connection. | |||
| Endpoints MAY append opaque data to the frame payload of any GOAWAY | Endpoints MAY append opaque data to the frame payload of any GOAWAY | |||
| frame. Additional debug data is intended for diagnostic purposes | frame. Additional debug data is intended for diagnostic purposes | |||
| only and carries no semantic value. Debug information could contain | only and carries no semantic value. Debug information could contain | |||
| security- or privacy-sensitive data. Logged or otherwise | security- or privacy-sensitive data. Logged or otherwise | |||
| persistently stored debug data MUST have adequate safeguards to | persistently stored debug data MUST have adequate safeguards to | |||
| prevent unauthorized access. | prevent unauthorized access. | |||
| 6.9. WINDOW_UPDATE | 6.9. WINDOW_UPDATE | |||
| The WINDOW_UPDATE frame (type=0x8) is used to implement flow control; | The WINDOW_UPDATE frame (type=0x08) is used to implement flow | |||
| see Section 5.2 for an overview. | control; see Section 5.2 for an overview. | |||
| Flow control operates at two levels: on each individual stream and on | Flow control operates at two levels: on each individual stream and on | |||
| the entire connection. | the entire connection. | |||
| Both types of flow control are hop by hop, that is, only between the | Both types of flow control are hop by hop, that is, only between the | |||
| two endpoints. Intermediaries do not forward WINDOW_UPDATE frames | two endpoints. Intermediaries do not forward WINDOW_UPDATE frames | |||
| between dependent connections. However, throttling of data transfer | between dependent connections. However, throttling of data transfer | |||
| by any receiver can indirectly cause the propagation of flow-control | by any receiver can indirectly cause the propagation of flow-control | |||
| information toward the original sender. | information toward the original sender. | |||
| Flow control only applies to frames that are identified as being | Flow control only applies to frames that are identified as being | |||
| subject to flow control. Of the frame types defined in this | subject to flow control. Of the frame types defined in this | |||
| document, this includes only DATA frames. Frames that are exempt | document, this includes only DATA frames. Frames that are exempt | |||
| from flow control MUST be accepted and processed, unless the receiver | from flow control MUST be accepted and processed, unless the receiver | |||
| is unable to assign resources to handling the frame. A receiver MAY | is unable to assign resources to handling the frame. A receiver MAY | |||
| respond with a stream error (Section 5.4.2) or connection error | 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 | (Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable to accept | |||
| a frame. | a frame. | |||
| WINDOW_UPDATE Frame { | WINDOW_UPDATE Frame { | |||
| Length (24) = 0x4, | Length (24) = 0x04, | |||
| Type (8) = 0x8, | Type (8) = 0x08, | |||
| Unused Flags (8), | Unused Flags (8), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31), | Stream Identifier (31), | |||
| Reserved (1), | Reserved (1), | |||
| Window Size Increment (31), | Window Size Increment (31), | |||
| } | } | |||
| skipping to change at page 46, line 42 ¶ | skipping to change at line 2128 ¶ | |||
| indicates the affected stream; in the latter, the value "0" indicates | indicates the affected stream; in the latter, the value "0" indicates | |||
| that the entire connection is the subject of the frame. | that the entire connection is the subject of the frame. | |||
| A receiver MUST treat the receipt of a WINDOW_UPDATE frame with a | 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) | 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 | of type PROTOCOL_ERROR; errors on the connection flow-control window | |||
| MUST be treated as a connection error (Section 5.4.1). | 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 | 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 | END_STREAM flag set. This means that a receiver could receive a | |||
| WINDOW_UPDATE frame on a "half-closed (remote)" or "closed" stream. | WINDOW_UPDATE frame on a stream in a "half-closed (remote)" or | |||
| A receiver MUST NOT treat this as an error (see Section 5.1). | "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 | A receiver that receives a flow-controlled frame MUST always account | |||
| for its contribution against the connection flow-control window, | for its contribution against the connection flow-control window, | |||
| unless the receiver treats this as a connection error | unless the receiver treats this as a connection error | |||
| (Section 5.4.1). This is necessary even if the frame is in 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 sender counts the frame toward the flow-control window, but if | |||
| the receiver does not, the flow-control window at the sender and | the receiver does not, the flow-control window at the sender and | |||
| receiver can become different. | receiver can become different. | |||
| A WINDOW_UPDATE frame with a length other than 4 octets MUST be | A WINDOW_UPDATE frame with a length other than 4 octets MUST be | |||
| skipping to change at page 49, line 24 ¶ | skipping to change at line 2251 ¶ | |||
| window size, a receiver MAY continue to process streams that exceed | window size, a receiver MAY continue to process streams that exceed | |||
| flow-control limits. Allowing streams to continue does not allow the | flow-control limits. Allowing streams to continue does not allow the | |||
| receiver to immediately reduce the space it reserves for flow-control | receiver to immediately reduce the space it reserves for flow-control | |||
| windows. Progress on these streams can also stall, since | windows. Progress on these streams can also stall, since | |||
| WINDOW_UPDATE frames are needed to allow the sender to resume | WINDOW_UPDATE frames are needed to allow the sender to resume | |||
| sending. The receiver MAY instead send a RST_STREAM with an error | sending. The receiver MAY instead send a RST_STREAM with an error | |||
| code of FLOW_CONTROL_ERROR for the affected streams. | code of FLOW_CONTROL_ERROR for the affected streams. | |||
| 6.10. CONTINUATION | 6.10. CONTINUATION | |||
| The CONTINUATION frame (type=0x9) is used to continue a sequence of | The CONTINUATION frame (type=0x09) is used to continue a sequence of | |||
| field block fragments (Section 4.3). Any number of CONTINUATION | field block fragments (Section 4.3). Any number of CONTINUATION | |||
| frames can be sent, as long as the preceding frame is on the same | 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 | stream and is a HEADERS, PUSH_PROMISE, or CONTINUATION frame without | |||
| the END_HEADERS flag set. | the END_HEADERS flag set. | |||
| CONTINUATION Frame { | CONTINUATION Frame { | |||
| Length (24), | Length (24), | |||
| Type (8) = 0x9, | Type (8) = 0x09, | |||
| Unused Flags (5), | Unused Flags (5), | |||
| END_HEADERS Flag (1), | END_HEADERS Flag (1), | |||
| Unused Flags (2), | Unused Flags (2), | |||
| Reserved (1), | Reserved (1), | |||
| Stream Identifier (31), | Stream Identifier (31), | |||
| Field Block Fragment (..), | Field Block Fragment (..), | |||
| } | } | |||
| Figure 12: CONTINUATION Frame Format | Figure 12: CONTINUATION Frame Format | |||
| The Length, Type, Unused Flag(s), Reserved, and Stream Identifier | The Length, Type, Unused Flag(s), Reserved, and Stream Identifier | |||
| fields are described in Section 4. The CONTINUATION frame payload | fields are described in Section 4. The CONTINUATION frame payload | |||
| contains a field block fragment (Section 4.3). | contains a field block fragment (Section 4.3). | |||
| The CONTINUATION frame defines the following flag: | The CONTINUATION frame defines the following flag: | |||
| END_HEADERS (0x4): When set, the END_HEADERS flag indicates that | END_HEADERS (0x04): When set, the END_HEADERS flag indicates that | |||
| this frame ends a field block (Section 4.3). | this frame ends a field block (Section 4.3). | |||
| If the END_HEADERS flag is not set, this frame MUST be followed by | If the END_HEADERS flag is not set, this frame MUST be followed by | |||
| another CONTINUATION frame. A receiver MUST treat the receipt of | another CONTINUATION frame. A receiver MUST treat the receipt of | |||
| any other type of frame or a frame on a different stream as a | any other type of frame or a frame on a different stream as a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The CONTINUATION frame changes the connection state as defined in | The CONTINUATION frame changes the connection state as defined in | |||
| Section 4.3. | Section 4.3. | |||
| CONTINUATION frames MUST be associated with a stream. If a | CONTINUATION frames MUST be associated with a stream. If a | |||
| CONTINUATION frame is received whose stream identifier field is 0x0, | CONTINUATION frame is received with a Stream Identifier field of | |||
| the recipient MUST respond with a connection error (Section 5.4.1) of | 0x00, the recipient MUST respond with a connection error | |||
| type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| A CONTINUATION frame MUST be preceded by a HEADERS, PUSH_PROMISE or | A CONTINUATION frame MUST be preceded by a HEADERS, PUSH_PROMISE or | |||
| CONTINUATION frame without the END_HEADERS flag set. A recipient | CONTINUATION frame without the END_HEADERS flag set. A recipient | |||
| that observes violation of this rule MUST respond with a connection | that observes violation of this rule MUST respond with a connection | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| 7. Error Codes | 7. Error Codes | |||
| Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | 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. | frames to convey the reasons for the stream or connection error. | |||
| Error codes share a common code space. Some error codes apply only | Error codes share a common code space. Some error codes apply only | |||
| to either streams or the entire connection and have no defined | to either streams or the entire connection and have no defined | |||
| semantics in the other context. | semantics in the other context. | |||
| The following error codes are defined: | The following error codes are defined: | |||
| NO_ERROR (0x0): The associated condition is not a result of an | NO_ERROR (0x00): The associated condition is not a result of an | |||
| error. For example, a GOAWAY might include this code to indicate | error. For example, a GOAWAY might include this code to indicate | |||
| graceful shutdown of a connection. | graceful shutdown of a connection. | |||
| PROTOCOL_ERROR (0x1): The endpoint detected an unspecific protocol | PROTOCOL_ERROR (0x01): The endpoint detected an unspecific protocol | |||
| error. This error is for use when a more specific error code is | error. This error is for use when a more specific error code is | |||
| not available. | not available. | |||
| INTERNAL_ERROR (0x2): The endpoint encountered an unexpected | INTERNAL_ERROR (0x02): The endpoint encountered an unexpected | |||
| internal error. | internal error. | |||
| FLOW_CONTROL_ERROR (0x3): The endpoint detected that its peer | FLOW_CONTROL_ERROR (0x03): The endpoint detected that its peer | |||
| violated the flow-control protocol. | violated the flow-control protocol. | |||
| SETTINGS_TIMEOUT (0x4): The endpoint sent a SETTINGS frame but did | SETTINGS_TIMEOUT (0x04): The endpoint sent a SETTINGS frame but did | |||
| not receive a response in a timely manner. See Section 6.5.3 | not receive a response in a timely manner. See Section 6.5.3 | |||
| ("Settings Synchronization"). | ("Settings Synchronization"). | |||
| STREAM_CLOSED (0x5): The endpoint received a frame after a stream | STREAM_CLOSED (0x05): The endpoint received a frame after a stream | |||
| was half-closed. | was half-closed. | |||
| FRAME_SIZE_ERROR (0x6): The endpoint received a frame with an | FRAME_SIZE_ERROR (0x06): The endpoint received a frame with an | |||
| invalid size. | invalid size. | |||
| REFUSED_STREAM (0x7): The endpoint refused the stream prior to | REFUSED_STREAM (0x07): The endpoint refused the stream prior to | |||
| performing any application processing (see Section 8.7 for | performing any application processing (see Section 8.7 for | |||
| details). | details). | |||
| CANCEL (0x8): Used by the endpoint to indicate that the stream is no | CANCEL (0x08): The endpoint uses this error code to indicate that | |||
| longer needed. | the stream is no longer needed. | |||
| COMPRESSION_ERROR (0x9): The endpoint is unable to maintain the | COMPRESSION_ERROR (0x09): The endpoint is unable to maintain the | |||
| field section compression context for the connection. | field section compression context for the connection. | |||
| CONNECT_ERROR (0xa): The connection established in response to a | CONNECT_ERROR (0x0a): The connection established in response to a | |||
| CONNECT request (Section 8.5) was reset or abnormally closed. | CONNECT request (Section 8.5) was reset or abnormally closed. | |||
| ENHANCE_YOUR_CALM (0xb): The endpoint detected that its peer is | ENHANCE_YOUR_CALM (0x0b): The endpoint detected that its peer is | |||
| exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
| INADEQUATE_SECURITY (0xc): The underlying transport has properties | INADEQUATE_SECURITY (0x0c): The underlying transport has properties | |||
| that do not meet minimum security requirements (see Section 9.2). | that do not meet minimum security requirements (see Section 9.2). | |||
| HTTP_1_1_REQUIRED (0xd): The endpoint requires that HTTP/1.1 be used | HTTP_1_1_REQUIRED (0x0d): The endpoint requires that HTTP/1.1 be | |||
| instead of HTTP/2. | used instead of HTTP/2. | |||
| Unknown or unsupported error codes MUST NOT trigger any special | Unknown or unsupported error codes MUST NOT trigger any special | |||
| behavior. These MAY be treated by an implementation as being | behavior. These MAY be treated by an implementation as being | |||
| equivalent to INTERNAL_ERROR. | equivalent to INTERNAL_ERROR. | |||
| 8. Expressing HTTP Semantics in HTTP/2 | 8. Expressing HTTP Semantics in HTTP/2 | |||
| HTTP/2 is an instantiation of the HTTP message abstraction (Section 6 | HTTP/2 is an instantiation of the HTTP message abstraction (Section 6 | |||
| of [HTTP]). | of [HTTP]). | |||
| skipping to change at page 52, line 29 ¶ | skipping to change at line 2401 ¶ | |||
| The last frame in the sequence bears an END_STREAM flag, noting that | 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 | a HEADERS frame with the END_STREAM flag set can be followed by | |||
| CONTINUATION frames that carry any remaining fragments of the field | CONTINUATION frames that carry any remaining fragments of the field | |||
| block. | block. | |||
| Other frames (from any stream) MUST NOT occur between the HEADERS | Other frames (from any stream) MUST NOT occur between the HEADERS | |||
| frame and any CONTINUATION frames that might follow. | frame and any CONTINUATION frames that might follow. | |||
| HTTP/2 uses DATA frames to carry message content. The chunked | HTTP/2 uses DATA frames to carry message content. The chunked | |||
| transfer encoding defined in Section 7.1 of [HTTP11] cannot be used | transfer encoding defined in Section 7.1 of [HTTP/1.1] cannot be used | |||
| in HTTP/2; see Section 8.2.2. | in HTTP/2; see Section 8.2.2. | |||
| Trailer fields are carried in a field block that also terminates the | Trailer fields are carried in a field block that also terminates the | |||
| stream. That is, trailer fields comprise a sequence starting with a | stream. That is, trailer fields comprise a sequence starting with a | |||
| HEADERS frame, followed by zero or more CONTINUATION frames, where | HEADERS frame, followed by zero or more CONTINUATION frames, where | |||
| the HEADERS frame bears an END_STREAM flag. Trailers MUST NOT | the HEADERS frame bears an END_STREAM flag. Trailers MUST NOT | |||
| include pseudo-header fields (Section 8.3). An endpoint that | include pseudo-header fields (Section 8.3). An endpoint that | |||
| receives pseudo-header fields in trailers MUST treat the request or | receives pseudo-header fields in trailers MUST treat the request or | |||
| response as malformed (Section 8.1.1). | response as malformed (Section 8.1.1). | |||
| skipping to change at page 54, line 32 ¶ | skipping to change at line 2494 ¶ | |||
| [COMPRESSION]. | [COMPRESSION]. | |||
| Field names MUST be converted to lowercase when constructing an | Field names MUST be converted to lowercase when constructing an | |||
| HTTP/2 message. | HTTP/2 message. | |||
| 8.2.1. Field Validity | 8.2.1. Field Validity | |||
| The definitions of field names and values in HTTP prohibit some | The definitions of field names and values in HTTP prohibit some | |||
| characters that HPACK might be able to convey. HTTP/2 | characters that HPACK might be able to convey. HTTP/2 | |||
| implementations SHOULD validate field names and values according to | implementations SHOULD validate field names and values according to | |||
| their definitions in Sections 5.1 and 5.5 of [HTTP] respectively and | their definitions in Sections 5.1 and 5.5 of [HTTP], respectively, | |||
| treat messages that contain prohibited characters as malformed | and treat messages that contain prohibited characters as malformed | |||
| (Section 8.1.1). | (Section 8.1.1). | |||
| Failure to validate fields can be exploited for request smuggling | Failure to validate fields can be exploited for request smuggling | |||
| attacks. In particular, unvalidated fields might enable attacks when | attacks. In particular, unvalidated fields might enable attacks when | |||
| messages are forwarded using HTTP 1.1 [HTTP11], where characters such | messages are forwarded using HTTP/1.1 [HTTP/1.1], where characters | |||
| as CR, LF, and COLON are used as delimiters. Implementations MUST | such as carriage return (CR), line feed (LF), and COLON are used as | |||
| perform the following minimal validation of field names and values: | delimiters. Implementations MUST perform the following minimal | |||
| validation of field names and values: | ||||
| o A field name MUST NOT contain characters in the ranges 0x00-0x20, | o A field name MUST NOT contain characters in the ranges 0x00-0x20, | |||
| 0x41-0x5a, or 0x7f-0xff (all ranges inclusive). This specifically | 0x41-0x5a, or 0x7f-0xff (all ranges inclusive). This specifically | |||
| excludes all non-visible ASCII characters, ASCII SP (0x20), and | excludes all non-visible ASCII characters, ASCII SP (0x20), and | |||
| uppercase characters ('A' to 'Z', ASCII 0x41 to 0x5a). | uppercase characters ('A' to 'Z', ASCII 0x41 to 0x5a). | |||
| o With the exception of pseudo-header fields (Section 8.3), which | o With the exception of pseudo-header fields (Section 8.3), which | |||
| have a name that starts with a single colon, field names MUST NOT | have a name that starts with a single colon, field names MUST NOT | |||
| include a colon (ASCII COLON, 0x3a). | include a colon (ASCII COLON, 0x3a). | |||
| o A field value MUST NOT contain the zero value (ASCII NUL, 0x0), | o A field value MUST NOT contain the zero value (ASCII NUL, 0x00), | |||
| line feed (ASCII LF, 0xa), or carriage return (ASCII CR, 0xd) at | line feed (ASCII LF, 0x0a), or carriage return (ASCII CR, 0x0d) at | |||
| any position. | any position. | |||
| o A field value MUST NOT start or end with an ASCII whitespace | o A field value MUST NOT start or end with an ASCII whitespace | |||
| character (ASCII SP or HTAB, 0x20 or 0x9). | character (ASCII SP or HTAB, 0x20 or 0x09). | |||
| | Note: An implementation that validates fields according the | | Note: An implementation that validates fields according to the | |||
| | definitions in Sections 5.1 and 5.5 of [HTTP] only needs an | | definitions in Sections 5.1 and 5.5 of [HTTP] only needs an | |||
| | additional check that field names do not include uppercase | | additional check that field names do not include uppercase | |||
| | characters. | | characters. | |||
| A request or response that contains a field that violates any of | A request or response that contains a field that violates any of | |||
| these conditions MUST be treated as malformed (Section 8.1.1). In | these conditions MUST be treated as malformed (Section 8.1.1). In | |||
| particular, an intermediary that does not process fields when | particular, an intermediary that does not process fields when | |||
| forwarding messages MUST NOT forward fields that contain any of the | forwarding messages MUST NOT forward fields that contain any of the | |||
| values that are listed as prohibited above. | values that are listed as prohibited above. | |||
| skipping to change at page 56, line 19 ¶ | skipping to change at line 2573 ¶ | |||
| | Note: HTTP/2 purposefully does not support upgrade to another | | Note: HTTP/2 purposefully does not support upgrade to another | |||
| | protocol. The handshake methods described in Section 3 are | | protocol. The handshake methods described in Section 3 are | |||
| | believed sufficient to negotiate the use of alternative | | believed sufficient to negotiate the use of alternative | |||
| | protocols. | | protocols. | |||
| 8.2.3. Compressing the Cookie Header Field | 8.2.3. Compressing the Cookie Header Field | |||
| The Cookie header field [COOKIE] uses a semicolon (";") to delimit | The Cookie header field [COOKIE] uses a semicolon (";") to delimit | |||
| cookie-pairs (or "crumbs"). This header field contains multiple | cookie-pairs (or "crumbs"). This header field contains multiple | |||
| values, but does not use a COMMA (",") as a separator, which prevents | values, but does not use a COMMA (",") as a separator, thereby | |||
| cookie-pairs from being sent on multiple field lines (see Section 5.2 | preventing cookie-pairs from being sent on multiple field lines (see | |||
| of [HTTP]). This can significantly reduce compression efficiency as | Section 5.2 of [HTTP]). This can significantly reduce compression | |||
| updates to individual cookie-pairs would invalidate any field lines | efficiency, as updates to individual cookie-pairs would invalidate | |||
| that are stored in the HPACK table. | any field lines that are stored in the HPACK table. | |||
| To allow for better compression efficiency, the Cookie header field | To allow for better compression efficiency, the Cookie header field | |||
| MAY be split into separate header fields, each with one or more | MAY be split into separate header fields, each with one or more | |||
| cookie-pairs. If there are multiple Cookie header fields after | cookie-pairs. If there are multiple Cookie header fields after | |||
| decompression, these MUST be concatenated into a single octet string | decompression, these MUST be concatenated into a single octet string | |||
| using the two-octet delimiter of 0x3b, 0x20 (the ASCII 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 | before being passed into a non-HTTP/2 context, such as an HTTP/1.1 | |||
| connection, or a generic HTTP server application. | connection, or a generic HTTP server application. | |||
| Therefore, the following two lists of Cookie header fields are | Therefore, the following two lists of Cookie header fields are | |||
| semantically equivalent. | semantically equivalent. | |||
| cookie: a=b; c=d; e=f | cookie: a=b; c=d; e=f | |||
| cookie: a=b | cookie: a=b | |||
| cookie: c=d | cookie: c=d | |||
| cookie: e=f | cookie: e=f | |||
| 8.3. HTTP Control Data | 8.3. HTTP Control Data | |||
| HTTP/2 uses special pseudo-header fields beginning with ':' character | HTTP/2 uses special pseudo-header fields beginning with a ':' | |||
| (ASCII 0x3a) to convey message control data (see Section 6.2 of | character (ASCII 0x3a) to convey message control data (see | |||
| [HTTP]). | Section 6.2 of [HTTP]). | |||
| Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT | Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT | |||
| generate pseudo-header fields other than those defined in this | generate pseudo-header fields other than those defined in this | |||
| document. Note that an extension could negotiate the use of | document. Note that an extension could negotiate the use of | |||
| additional pseudo-header fields; see Section 5.5. | additional pseudo-header fields; see Section 5.5. | |||
| Pseudo-header fields are only valid in the context in which they are | Pseudo-header fields are only valid in the context in which they are | |||
| defined. Pseudo-header fields defined for requests MUST NOT appear | defined. Pseudo-header fields defined for requests MUST NOT appear | |||
| in responses; pseudo-header fields defined for responses MUST NOT | in responses; pseudo-header fields defined for responses MUST NOT | |||
| appear in requests. Pseudo-header fields MUST NOT appear in a | appear in requests. Pseudo-header fields MUST NOT appear in a | |||
| skipping to change at page 57, line 27 ¶ | skipping to change at line 2629 ¶ | |||
| The same pseudo-header field name MUST NOT appear more than once in a | 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 | field block. A field block for an HTTP request or response that | |||
| contains a repeated pseudo-header field name MUST be treated as | contains a repeated pseudo-header field name MUST be treated as | |||
| malformed (Section 8.1.1). | malformed (Section 8.1.1). | |||
| 8.3.1. Request Pseudo-Header Fields | 8.3.1. Request Pseudo-Header Fields | |||
| The following pseudo-header fields are defined for HTTP/2 requests: | The following pseudo-header fields are defined for HTTP/2 requests: | |||
| o The :method pseudo-header field includes the HTTP method | o The ":method" pseudo-header field includes the HTTP method | |||
| (Section 9 of [HTTP]). | (Section 9 of [HTTP]). | |||
| o The :scheme pseudo-header field includes the scheme portion of the | o The ":scheme" pseudo-header field includes the scheme portion of | |||
| request target. The scheme is taken from the target URI | the request target. The scheme is taken from the target URI | |||
| (Section 3.1 of [RFC3986]) when generating a request directly, or | (Section 3.1 of [RFC3986]) when generating a request directly, or | |||
| from the scheme of a translated request (for example, see | from the scheme of a translated request (for example, see | |||
| Section 3.3 of [HTTP11]). Scheme is omitted for CONNECT requests | Section 3.3 of [HTTP/1.1]). Scheme is omitted for CONNECT | |||
| (Section 8.5). | requests (Section 8.5). | |||
| :scheme is not restricted to http and https schemed URIs. A proxy | ":scheme" is not restricted to "http" and "https" schemed URIs. A | |||
| or gateway can translate requests for non-HTTP schemes, enabling | proxy or gateway can translate requests for non-HTTP schemes, | |||
| the use of HTTP to interact with non-HTTP services. | enabling the use of HTTP to interact with non-HTTP services. | |||
| o The :authority pseudo-header field conveys the authority portion | o The ":authority" pseudo-header field conveys the authority portion | |||
| (Section 3.2 of [RFC3986]) of the target URI (Section 7.1 of | (Section 3.2 of [RFC3986]) of the target URI (Section 7.1 of | |||
| [HTTP]). The recipient of a HTTP/2 request MUST NOT use the Host | [HTTP]). The recipient of an HTTP/2 request MUST NOT use the Host | |||
| header field to determine the target URI if :authority is present. | header field to determine the target URI if ":authority" is | |||
| present. | ||||
| Clients that generate HTTP/2 requests directly MUST use the | Clients that generate HTTP/2 requests directly MUST use the | |||
| :authority pseudo-header field to convey authority information, | ":authority" pseudo-header field to convey authority information, | |||
| unless there is no authority information to convey (in which case | unless there is no authority information to convey (in which case | |||
| it MUST NOT generate :authority). | it MUST NOT generate ":authority"). | |||
| Clients MUST NOT generate a request with a Host header field that | Clients MUST NOT generate a request with a Host header field that | |||
| differs from the :authority pseudo-header field. A server SHOULD | differs from the ":authority" pseudo-header field. A server | |||
| treat a request as malformed if it contains a Host header field | SHOULD treat a request as malformed if it contains a Host header | |||
| that identifies a different entity to the :authority pseudo-header | field that identifies an entity that differs from the entity in | |||
| field. The values of fields need to be normalized to compare them | the ":authority" pseudo-header field. The values of fields need | |||
| (see Section 6.2 of [RFC3986]). An origin server can apply any | to be normalized to compare them (see Section 6.2 of [RFC3986]). | |||
| normalization method, whereas other servers MUST perform scheme- | An origin server can apply any normalization method, whereas other | |||
| based normalization (see Section 6.2.3 of [RFC3986]) of the two | servers MUST perform scheme-based normalization (see Section 6.2.3 | |||
| fields. | of [RFC3986]) of the two fields. | |||
| An intermediary that forwards a request over HTTP/2 MUST construct | An intermediary that forwards a request over HTTP/2 MUST construct | |||
| an :authority pseudo-header field using the authority information | an ":authority" pseudo-header field using the authority | |||
| from the control data of the original request, unless the original | information from the control data of the original request, unless | |||
| request's target URI does not contain authority information (in | the original request's target URI does not contain authority | |||
| which case it MUST NOT generate :authority). Note that the Host | information (in which case it MUST NOT generate ":authority"). | |||
| header field is not the sole source of this information; see | Note that the Host header field is not the sole source of this | |||
| Section 7.2 of [HTTP]. | information; see Section 7.2 of [HTTP]. | |||
| An intermediary that needs to generate a Host header field (which | An intermediary that needs to generate a Host header field (which | |||
| might be necessary to construct an HTTP/1.1 request) MUST use the | 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 | value from the ":authority" pseudo-header field as the value of | |||
| Host field, unless the intermediary also changes the request | the Host field, unless the intermediary also changes the request | |||
| target. This replaces any existing Host field to avoid potential | target. This replaces any existing Host field to avoid potential | |||
| vulnerabilities in HTTP routing. | vulnerabilities in HTTP routing. | |||
| An intermediary that forwards a request over HTTP/2 MAY retain any | An intermediary that forwards a request over HTTP/2 MAY retain any | |||
| Host header field. | Host header field. | |||
| Note that request targets for CONNECT or asterisk-form OPTIONS | Note that request targets for CONNECT or asterisk-form OPTIONS | |||
| requests never include authority information; see Section 7.1 of | requests never include authority information; see Sections 7.1 and | |||
| [HTTP]. | 7.2 of [HTTP]. | |||
| :authority MUST NOT include the deprecated userinfo subcomponent | ":authority" MUST NOT include the deprecated userinfo subcomponent | |||
| for http or https schemed URIs. | for "http" or "https" schemed URIs. | |||
| o The :path pseudo-header field includes the path and query parts of | o The ":path" pseudo-header field includes the path and query parts | |||
| the target URI (the absolute-path production and optionally a '?' | of the target URI (the absolute-path production and, optionally, a | |||
| character followed by the query production; see Section 4.1 of | '?' character followed by the query production; see Section 4.1 of | |||
| [HTTP]). A request in asterisk form (for OPTIONS) includes the | [HTTP]). A request in asterisk form (for OPTIONS) includes the | |||
| value '*' for the :path pseudo-header field. | value '*' for the ":path" pseudo-header field. | |||
| This pseudo-header field MUST NOT be empty for http or https URIs; | This pseudo-header field MUST NOT be empty for "http" or "https" | |||
| http or https URIs that do not contain a path component MUST | URIs; "http" or "https" URIs that do not contain a path component | |||
| include a value of '/'. The exceptions to this rule are: | MUST include a value of '/'. The exceptions to this rule are: | |||
| * an OPTIONS request for an http or https URI that does not | * an OPTIONS request for an "http" or "https" URI that does not | |||
| include a path component; these MUST include a :path pseudo- | include a path component; these MUST include a ":path" pseudo- | |||
| header field with a value of '*' (see Section 7.1 of [HTTP]) | header field with a value of '*' (see Section 7.1 of [HTTP]). | |||
| * CONNECT requests (Section 8.5), where the :path pseudo-header | * CONNECT requests (Section 8.5), where the ":path" pseudo-header | |||
| field is omitted. | field is omitted. | |||
| All HTTP/2 requests MUST include exactly one valid value for the | All HTTP/2 requests MUST include exactly one valid value for the | |||
| :method, :scheme, and :path pseudo-header fields, unless it is a | ":method", ":scheme", and ":path" pseudo-header fields, unless they | |||
| CONNECT request (Section 8.5). An HTTP request that omits mandatory | are CONNECT requests (Section 8.5). An HTTP request that omits | |||
| pseudo-header fields is malformed (Section 8.1.1). | mandatory pseudo-header fields is malformed (Section 8.1.1). | |||
| Individual HTTP/2 requests do not carry an explicit indicator of | Individual HTTP/2 requests do not carry an explicit indicator of | |||
| protocol version. All HTTP/2 requests implicitly have a protocol | protocol version. All HTTP/2 requests implicitly have a protocol | |||
| version of "2.0" (see Section 6.2 of [HTTP]). | version of "2.0" (see Section 6.2 of [HTTP]). | |||
| 8.3.2. Response Pseudo-Header Fields | 8.3.2. Response Pseudo-Header Fields | |||
| For HTTP/2 responses, a single :status pseudo-header field is defined | For HTTP/2 responses, a single ":status" pseudo-header field is | |||
| that carries the HTTP status code field (see Section 15 of [HTTP]). | defined that carries the HTTP status code field (see Section 15 of | |||
| This pseudo-header field MUST be included in all responses, including | [HTTP]). This pseudo-header field MUST be included in all responses, | |||
| interim responses; otherwise, the response is malformed | including interim responses; otherwise, the response is malformed | |||
| (Section 8.1.1). | (Section 8.1.1). | |||
| HTTP/2 responses implicitly have a protocol version of "2.0". | HTTP/2 responses implicitly have a protocol version of "2.0". | |||
| 8.4. Server Push | 8.4. Server Push | |||
| HTTP/2 allows a server to preemptively send (or "push") responses | HTTP/2 allows a server to preemptively send (or "push") responses | |||
| (along with corresponding "promised" requests) to a client in | (along with corresponding "promised" requests) to a client in | |||
| association with a previous client-initiated request. | association with a previous client-initiated request. | |||
| skipping to change at page 59, line 47 ¶ | skipping to change at line 2745 ¶ | |||
| stylesheets and scripts referenced by that page. When these requests | stylesheets and scripts referenced by that page. When these requests | |||
| are pushed, the client does not need to wait to receive the | are pushed, the client does not need to wait to receive the | |||
| references to them in the HTML and issue separate requests. | references to them in the HTML and issue separate requests. | |||
| In practice, server push is difficult to use effectively, because it | In practice, server push is difficult to use effectively, because it | |||
| requires the server to correctly anticipate the additional requests | requires the server to correctly anticipate the additional requests | |||
| the client will make, taking into account factors such as caching, | the client will make, taking into account factors such as caching, | |||
| content negotiation, and user behavior. Errors in prediction can | content negotiation, and user behavior. Errors in prediction can | |||
| lead to performance degradation, due to the opportunity cost that the | lead to performance degradation, due to the opportunity cost that the | |||
| additional data on the wire represents. In particular, pushing any | additional data on the wire represents. In particular, pushing any | |||
| significant amount of data can cause contention issues with more- | significant amount of data can cause contention issues with responses | |||
| important responses. | that are more important. | |||
| A client can request that server push be disabled, though this is | A client can request that server push be disabled, though this is | |||
| negotiated for each hop independently. The SETTINGS_ENABLE_PUSH | negotiated for each hop independently. The SETTINGS_ENABLE_PUSH | |||
| setting can be set to 0 to indicate that server push is disabled. | 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 | Promised requests MUST be safe (see Section 9.2.1 of [HTTP]) and | |||
| cacheable (see Section 9.2.3 of [HTTP]). Promised requests cannot | cacheable (see Section 9.2.3 of [HTTP]). Promised requests cannot | |||
| include any content or a trailer section. Clients that receive a | include any content or a trailer section. Clients that receive a | |||
| promised request that is not cacheable, that is not known to be safe, | promised request that is not cacheable, that is not known to be safe, | |||
| or that indicates the presence of request content MUST reset the | or that indicates the presence of request content MUST reset the | |||
| promised stream with a stream error (Section 5.4.2) of type | promised stream with a stream error (Section 5.4.2) of type | |||
| PROTOCOL_ERROR. Note this could result in the promised stream being | PROTOCOL_ERROR. Note that this could result in the promised stream | |||
| reset if the client does not recognize a newly defined method as | being reset if the client does not recognize a newly defined method | |||
| being safe. | as being safe. | |||
| Pushed responses that are cacheable (see Section 3 of [CACHE]) can be | Pushed responses that are cacheable (see Section 3 of [CACHING]) can | |||
| stored by the client, if it implements an HTTP cache. Pushed | be stored by the client, if it implements an HTTP cache. Pushed | |||
| responses are considered successfully validated on the origin server | responses are considered successfully validated on the origin server | |||
| (e.g., if the "no-cache" cache response directive is present; see | (e.g., if the "no-cache" cache response directive is present; see | |||
| Section 5.2.2.4 of [CACHE]) while the stream identified by the | Section 5.2.2.4 of [CACHING]) while the stream identified by the | |||
| promised stream ID is still open. | promised stream identifier is still open. | |||
| Pushed responses that are not cacheable MUST NOT be stored by any | Pushed responses that are not cacheable MUST NOT be stored by any | |||
| HTTP cache. They MAY be made available to the application | HTTP cache. They MAY be made available to the application | |||
| separately. | separately. | |||
| The server MUST include a value in the :authority pseudo-header field | The server MUST include a value in the ":authority" pseudo-header | |||
| for which the server is authoritative (see Section 10.1). A client | field for which the server is authoritative (see Section 10.1). A | |||
| MUST treat a PUSH_PROMISE for which the server is not authoritative | client MUST treat a PUSH_PROMISE for which the server is not | |||
| as a stream error (Section 5.4.2) of type PROTOCOL_ERROR. | 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 | 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 | forward them on to the client. In other words, how to make use of | |||
| the pushed information is up to that intermediary. Equally, the | the pushed information is up to that intermediary. Equally, the | |||
| intermediary might choose to make additional pushes to the client, | intermediary might choose to make additional pushes to the client, | |||
| without any action taken by the server. | without any action taken by the server. | |||
| A client cannot push. Thus, servers MUST treat the receipt of a | 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 | PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. A server cannot set the SETTINGS_ENABLE_PUSH setting | PROTOCOL_ERROR. A server cannot set the SETTINGS_ENABLE_PUSH setting | |||
| skipping to change at page 61, line 13 ¶ | skipping to change at line 2809 ¶ | |||
| a request that includes message content. | a request that includes message content. | |||
| Promised requests are always associated with an explicit request from | Promised requests are always associated with an explicit request from | |||
| the client. The PUSH_PROMISE frames sent by the server are sent on | the client. The PUSH_PROMISE frames sent by the server are sent on | |||
| that explicit request's stream. The PUSH_PROMISE frame also includes | that explicit request's stream. The PUSH_PROMISE frame also includes | |||
| a promised stream identifier, chosen from the stream identifiers | a promised stream identifier, chosen from the stream identifiers | |||
| available to the server (see Section 5.1.1). | available to the server (see Section 5.1.1). | |||
| The header fields in PUSH_PROMISE and any subsequent CONTINUATION | The header fields in PUSH_PROMISE and any subsequent CONTINUATION | |||
| frames MUST be a valid and complete set of request header fields | 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 | (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 | 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 | a PUSH_PROMISE that does not include a complete and valid set of | |||
| header fields or the :method pseudo-header field identifies a method | header fields or the ":method" pseudo-header field identifies a | |||
| that is not safe, it MUST respond on the promised stream with a | method that is not safe, it MUST respond on the promised stream with | |||
| stream error (Section 5.4.2) of type PROTOCOL_ERROR. | a stream error (Section 5.4.2) of type PROTOCOL_ERROR. | |||
| The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | |||
| sending any frames that reference the promised responses. This | sending any frames that reference the promised responses. This | |||
| avoids a race where clients issue requests prior to receiving any | avoids a race where clients issue requests prior to receiving any | |||
| PUSH_PROMISE frames. | PUSH_PROMISE frames. | |||
| For example, if the server receives a request for a document | For example, if the server receives a request for a document | |||
| containing embedded links to multiple image files and the server | containing embedded links to multiple image files and the server | |||
| chooses to push those additional images to the client, sending | chooses to push those additional images to the client, sending | |||
| PUSH_PROMISE frames before the DATA frames that contain the image | PUSH_PROMISE frames before the DATA frames that contain the image | |||
| skipping to change at page 62, line 11 ¶ | skipping to change at line 2850 ¶ | |||
| Sending a PUSH_PROMISE frame creates a new stream and puts the stream | Sending a PUSH_PROMISE frame creates a new stream and puts the stream | |||
| into the "reserved (local)" state for the server and the "reserved | into the "reserved (local)" state for the server and the "reserved | |||
| (remote)" state for the client. | (remote)" state for the client. | |||
| 8.4.2. Push Responses | 8.4.2. Push Responses | |||
| After sending the PUSH_PROMISE frame, the server can begin delivering | After sending the PUSH_PROMISE frame, the server can begin delivering | |||
| the pushed response as a response (Section 8.3.2) on a server- | the pushed response as a response (Section 8.3.2) on a server- | |||
| initiated stream that uses the promised stream identifier. The | initiated stream that uses the promised stream identifier. The | |||
| server uses this stream to transmit an HTTP response, using the same | server uses this stream to transmit an HTTP response, using the same | |||
| sequence of frames as defined in Section 8.1. This stream becomes | sequence of frames as that defined in Section 8.1. This stream | |||
| "half-closed" to the client (Section 5.1) after the initial HEADERS | becomes "half-closed" to the client (Section 5.1) after the initial | |||
| frame is sent. | HEADERS frame is sent. | |||
| Once a client receives a PUSH_PROMISE frame and chooses to accept the | Once a client receives a PUSH_PROMISE frame and chooses to accept the | |||
| pushed response, the client SHOULD NOT issue any requests for the | pushed response, the client SHOULD NOT issue any requests for the | |||
| promised response until after the promised stream has closed. | promised response until after the promised stream has closed. | |||
| If the client determines, for any reason, that it does not wish to | 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 | receive the pushed response from the server or if the server takes | |||
| too long to begin sending the promised response, the client can send | too long to begin sending the promised response, the client can send | |||
| a RST_STREAM frame, using either the CANCEL or REFUSED_STREAM code | a RST_STREAM frame, using either the CANCEL or REFUSED_STREAM code | |||
| and referencing the pushed stream's identifier. | and referencing the pushed stream's identifier. | |||
| A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | |||
| the number of responses that can be concurrently pushed by a server. | the number of responses that can be concurrently pushed by a server. | |||
| Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero prevents | Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero prevents | |||
| the server from opening the streams necessary to push responses. | the server from opening the streams necessary to push responses. | |||
| However, this does not prevent the server from reserving streams | However, this does not prevent the server from reserving streams | |||
| using PUSH_PROMISE frames, because "reserved" streams do not count | using PUSH_PROMISE frames, because reserved streams do not count | |||
| toward the concurrent stream limit. Clients that do not wish to | toward the concurrent stream limit. Clients that do not wish to | |||
| receive pushed resources need to reset any unwanted reserved streams | receive pushed resources need to reset any unwanted reserved streams | |||
| or set SETTINGS_ENABLE_PUSH to 0. | or set SETTINGS_ENABLE_PUSH to 0. | |||
| Clients receiving a pushed response MUST validate that either the | Clients receiving a pushed response MUST validate that either the | |||
| server is authoritative (see Section 10.1) or the proxy that provided | server is authoritative (see Section 10.1) or the proxy that provided | |||
| the pushed response is configured for the corresponding request. For | the pushed response is configured for the corresponding request. For | |||
| example, a server that offers a certificate for only the example.com | example, a server that offers a certificate for only the example.com | |||
| DNS-ID (see [RFC6125]) is not permitted to push a response for | DNS-ID (see [RFC6125]) is not permitted to push a response for | |||
| https://www.example.org/doc. | <https://www.example.org/doc>. | |||
| The response for a PUSH_PROMISE stream begins with a HEADERS frame, | The response for a PUSH_PROMISE stream begins with a HEADERS frame, | |||
| which immediately puts the stream into the "half-closed (remote)" | which immediately puts the stream into the "half-closed (remote)" | |||
| state for the server and "half-closed (local)" state for the client, | 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 | and ends with a frame with the END_STREAM flag set, which places the | |||
| stream in the "closed" state. | stream in the "closed" state. | |||
| | Note: The client never sends a frame with the END_STREAM flag | | Note: The client never sends a frame with the END_STREAM flag | |||
| | set for a server push. | | set for a server push. | |||
| 8.5. The CONNECT Method | 8.5. The CONNECT Method | |||
| The CONNECT method (Section 9.3.6 of [HTTP]) is used to convert an | 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 | HTTP connection into a tunnel to a remote host. CONNECT is primarily | |||
| used with HTTP proxies to establish a TLS session with an origin | used with HTTP proxies to establish a TLS session with an origin | |||
| server for the purposes of interacting with https resources. | server for the purposes of interacting with "https" resources. | |||
| In HTTP/2, the CONNECT method establishes a tunnel over a single | In HTTP/2, the CONNECT method establishes a tunnel over a single | |||
| HTTP/2 stream to a remote host, rather than converting the entire | HTTP/2 stream to a remote host, rather than converting the entire | |||
| connection to a tunnel. A CONNECT header section is constructed as | connection to a tunnel. A CONNECT header section is constructed as | |||
| defined in Section 8.3.1 ("Request Pseudo-Header Fields"), with a few | defined in Section 8.3.1 ("Request Pseudo-Header Fields"), with a few | |||
| differences. Specifically: | differences. Specifically: | |||
| o The :method pseudo-header field is set to CONNECT. | o The ":method" pseudo-header field is set to CONNECT. | |||
| o The :scheme and :path pseudo-header fields MUST be omitted. | o The ":scheme" and ":path" pseudo-header fields MUST be omitted. | |||
| o The :authority pseudo-header field contains the host and port to | o The ":authority" pseudo-header field contains the host and port to | |||
| connect to (equivalent to the authority-form of the request-target | connect to (equivalent to the authority-form of the request-target | |||
| of CONNECT requests; see Section 3.2.3 of [HTTP11]). | of CONNECT requests; see Section 3.2.3 of [HTTP/1.1]). | |||
| A CONNECT request that does not conform to these restrictions is | A CONNECT request that does not conform to these restrictions is | |||
| malformed (Section 8.1.1). | malformed (Section 8.1.1). | |||
| A proxy that supports CONNECT establishes a TCP connection [TCP] to | A proxy that supports CONNECT establishes a TCP connection [TCP] to | |||
| the host and port identified in the :authority pseudo-header field. | the host and port identified in the ":authority" pseudo-header field. | |||
| Once this connection is successfully established, the proxy sends a | Once this connection is successfully established, the proxy sends a | |||
| HEADERS frame containing a 2xx series status code to the client, as | HEADERS frame containing a 2xx-series status code to the client, as | |||
| defined in Section 9.3.6 of [HTTP]. | defined in Section 9.3.6 of [HTTP]. | |||
| After the initial HEADERS frame sent by each peer, all subsequent | After the initial HEADERS frame sent by each peer, all subsequent | |||
| DATA frames correspond to data sent on the TCP connection. The frame | 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 | 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 | proxy to the TCP server; data received from the TCP server is | |||
| assembled into DATA frames by the proxy. Frame types other than DATA | assembled into DATA frames by the proxy. Frame types other than DATA | |||
| or stream management frames (RST_STREAM, WINDOW_UPDATE, and PRIORITY) | or stream management frames (RST_STREAM, WINDOW_UPDATE, and PRIORITY) | |||
| MUST NOT be sent on a connected stream and MUST be treated as a | MUST NOT be sent on a connected stream and MUST be treated as a | |||
| stream error (Section 5.4.2) if received. | stream error (Section 5.4.2) if received. | |||
| skipping to change at page 64, line 19 ¶ | skipping to change at line 2953 ¶ | |||
| with the RST bit set if it detects an error with the stream or the | with the RST bit set if it detects an error with the stream or the | |||
| HTTP/2 connection. | HTTP/2 connection. | |||
| 8.6. The Upgrade Header Field | 8.6. The Upgrade Header Field | |||
| HTTP/2 does not support the 101 (Switching Protocols) informational | HTTP/2 does not support the 101 (Switching Protocols) informational | |||
| status code (Section 15.2.2 of [HTTP]). | status code (Section 15.2.2 of [HTTP]). | |||
| The semantics of 101 (Switching Protocols) aren't applicable to a | The semantics of 101 (Switching Protocols) aren't applicable to a | |||
| multiplexed protocol. Similar functionality might be enabled through | multiplexed protocol. Similar functionality might be enabled through | |||
| the use of extended CONNECT [RFC8441] and other protocols are able to | the use of extended CONNECT [RFC8441], and other protocols are able | |||
| use the same mechanisms that HTTP/2 uses to negotiate their use (see | to use the same mechanisms that HTTP/2 uses to negotiate their use | |||
| Section 3). | (see Section 3). | |||
| 8.7. Request Reliability | 8.7. Request Reliability | |||
| In general, an HTTP client is unable to retry a non-idempotent | In general, an HTTP client is unable to retry a non-idempotent | |||
| request when an error occurs because there is no means to determine | 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 | the nature of the error (see Section 9.2.2 of [HTTP]). It is | |||
| possible that some server processing occurred prior to the error, | possible that some server processing occurred prior to the error, | |||
| which could result in undesirable effects if the request were | which could result in undesirable effects if the request were | |||
| reattempted. | reattempted. | |||
| skipping to change at page 65, line 7 ¶ | skipping to change at line 2990 ¶ | |||
| A server MUST NOT indicate that a stream has not been processed | 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 | unless it can guarantee that fact. If frames that are on a stream | |||
| are passed to the application layer for any stream, then | are passed to the application layer for any stream, then | |||
| REFUSED_STREAM MUST NOT be used for that stream, and a GOAWAY frame | 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 | MUST include a stream identifier that is greater than or equal to the | |||
| given stream identifier. | given stream identifier. | |||
| In addition to these mechanisms, the PING frame provides a way for a | In addition to these mechanisms, the PING frame provides a way for a | |||
| client to easily test a connection. Connections that remain idle can | client to easily test a connection. Connections that remain idle can | |||
| become broken as some middleboxes (for instance, network address | become broken, because some middleboxes (for instance, network | |||
| translators or load balancers) silently discard connection bindings. | address translators or load balancers) silently discard connection | |||
| The PING frame allows a client to safely test whether a connection is | bindings. The PING frame allows a client to safely test whether a | |||
| still active without sending a request. | connection is still active without sending a request. | |||
| 8.8. Examples | 8.8. Examples | |||
| This section shows HTTP/1.1 requests and responses, with | This section shows HTTP/1.1 requests and responses, with | |||
| illustrations of equivalent HTTP/2 requests and responses. | illustrations of equivalent HTTP/2 requests and responses. | |||
| 8.8.1. Simple Request | 8.8.1. Simple Request | |||
| An HTTP GET request includes control data and a request header with | An HTTP GET request includes control data and a request header with | |||
| no message content and is therefore transmitted as a single HEADERS | no message content and is therefore transmitted as a single HEADERS | |||
| skipping to change at page 66, line 8 ¶ | skipping to change at line 3036 ¶ | |||
| HTTP/1.1 304 Not Modified HEADERS | HTTP/1.1 304 Not Modified HEADERS | |||
| ETag: "xyzzy" ==> + END_STREAM | ETag: "xyzzy" ==> + END_STREAM | |||
| Expires: Thu, 23 Jan ... + END_HEADERS | Expires: Thu, 23 Jan ... + END_HEADERS | |||
| :status = 304 | :status = 304 | |||
| etag = "xyzzy" | etag = "xyzzy" | |||
| expires = Thu, 23 Jan ... | expires = Thu, 23 Jan ... | |||
| 8.8.3. Complex Request | 8.8.3. Complex Request | |||
| An HTTP POST request that includes control data and a request header | An HTTP POST request that includes control data and a request header | |||
| and message content is transmitted as one HEADERS frame, followed by | with message content is transmitted as one HEADERS frame, followed by | |||
| zero or more CONTINUATION frames containing the request header, | zero or more CONTINUATION frames containing the request header, | |||
| followed by one or more DATA frames, with the last CONTINUATION (or | followed by one or more DATA frames, with the last CONTINUATION (or | |||
| HEADERS) frame having the END_HEADERS flag set and the final DATA | HEADERS) frame having the END_HEADERS flag set and the final DATA | |||
| frame having the END_STREAM flag set: | frame having the END_STREAM flag set: | |||
| POST /resource HTTP/1.1 HEADERS | POST /resource HTTP/1.1 HEADERS | |||
| Host: example.org ==> - END_STREAM | Host: example.org ==> - END_STREAM | |||
| Content-Type: image/jpeg - END_HEADERS | Content-Type: image/jpeg - END_HEADERS | |||
| Content-Length: 123 :method = POST | Content-Length: 123 :method = POST | |||
| :authority = example.org | :authority = example.org | |||
| skipping to change at page 66, line 38 ¶ | skipping to change at line 3066 ¶ | |||
| DATA | DATA | |||
| + END_STREAM | + END_STREAM | |||
| {binary data} | {binary data} | |||
| Note that data contributing to any given field line could be spread | Note that data contributing to any given field line could be spread | |||
| between field block fragments. The allocation of field lines to | between field block fragments. The allocation of field lines to | |||
| frames in this example is illustrative only. | frames in this example is illustrative only. | |||
| 8.8.4. Response with Body | 8.8.4. Response with Body | |||
| A response that includes control data and a response header and | A response that includes control data and a response header with | |||
| message content is transmitted as a HEADERS frame, followed by zero | message content is transmitted as a HEADERS frame, followed by zero | |||
| or more CONTINUATION frames, followed by one or more DATA frames, | or more CONTINUATION frames, followed by one or more DATA frames, | |||
| with the last DATA frame in the sequence having the END_STREAM flag | with the last DATA frame in the sequence having the END_STREAM flag | |||
| set: | set: | |||
| HTTP/1.1 200 OK HEADERS | HTTP/1.1 200 OK HEADERS | |||
| Content-Type: image/jpeg ==> - END_STREAM | Content-Type: image/jpeg ==> - END_STREAM | |||
| Content-Length: 123 + END_HEADERS | Content-Length: 123 + END_HEADERS | |||
| :status = 200 | :status = 200 | |||
| {binary data} content-type = image/jpeg | {binary data} content-type = image/jpeg | |||
| skipping to change at page 68, line 7 ¶ | skipping to change at line 3122 ¶ | |||
| Foo: bar - END_STREAM | Foo: bar - END_STREAM | |||
| {binary data} | {binary data} | |||
| HEADERS | HEADERS | |||
| + END_STREAM | + END_STREAM | |||
| + END_HEADERS | + END_HEADERS | |||
| foo = bar | foo = bar | |||
| 9. HTTP/2 Connections | 9. HTTP/2 Connections | |||
| This section outlines attributes of the HTTP protocol that improve | This section outlines attributes of HTTP that improve | |||
| interoperability, reduce exposure to known security vulnerabilities, | interoperability, reduce exposure to known security vulnerabilities, | |||
| or reduce the potential for implementation variation. | or reduce the potential for implementation variation. | |||
| 9.1. Connection Management | 9.1. Connection Management | |||
| HTTP/2 connections are persistent. For best performance, it is | HTTP/2 connections are persistent. For best performance, it is | |||
| expected that clients will not close connections until it is | expected that clients will not close connections until it is | |||
| determined that no further communication with a server is necessary | determined that no further communication with a server is necessary | |||
| (for example, when a user navigates away from a particular web page) | (for example, when a user navigates away from a particular web page) | |||
| or until the server closes the connection. | or until the server closes the connection. | |||
| skipping to change at page 69, line 5 ¶ | skipping to change at line 3166 ¶ | |||
| 9.1.1. Connection Reuse | 9.1.1. Connection Reuse | |||
| Connections that are made to an origin server, either directly or | Connections that are made to an origin server, either directly or | |||
| through a tunnel created using the CONNECT method (Section 8.5), MAY | through a tunnel created using the CONNECT method (Section 8.5), MAY | |||
| be reused for requests with multiple different URI authority | be reused for requests with multiple different URI authority | |||
| components. A connection can be reused as long as the origin server | components. A connection can be reused as long as the origin server | |||
| is authoritative (Section 10.1). For TCP connections without TLS, | is authoritative (Section 10.1). For TCP connections without TLS, | |||
| this depends on the host having resolved to the same IP address. | this depends on the host having resolved to the same IP address. | |||
| For https resources, connection reuse additionally depends on having | For "https" resources, connection reuse additionally depends on | |||
| a certificate that is valid for the host in the URI. The certificate | having a certificate that is valid for the host in the URI. The | |||
| presented by the server MUST satisfy any checks that the client would | certificate presented by the server MUST satisfy any checks that the | |||
| perform when forming a new TLS connection for the host in the URI. A | client would perform when forming a new TLS connection for the host | |||
| single certificate can be used to establish authority for multiple | in the URI. A single certificate can be used to establish authority | |||
| origins. Section 4.3 of [HTTP] describes how a client determines | for multiple origins. Section 4.3 of [HTTP] describes how a client | |||
| whether a server is authoritative for a URI. | determines whether a server is authoritative for a URI. | |||
| In some deployments, reusing a connection for multiple origins can | In some deployments, reusing a connection for multiple origins can | |||
| result in requests being directed to the wrong origin server. For | result in requests being directed to the wrong origin server. For | |||
| example, TLS termination might be performed by a middlebox that uses | example, TLS termination might be performed by a middlebox that uses | |||
| the TLS Server Name Indication (SNI) [TLS-EXT] extension to select an | the TLS Server Name Indication [TLS-EXT] extension to select an | |||
| origin server. This means that it is possible for clients to send | origin server. This means that it is possible for clients to send | |||
| requests to servers that might not be the intended target for the | requests to servers that might not be the intended target for the | |||
| request, even though the server is otherwise authoritative. | request, even though the server is otherwise authoritative. | |||
| A server that does not wish clients to reuse connections can indicate | A server that does not wish clients to reuse connections can indicate | |||
| that it is not authoritative for a request by sending a 421 | that it is not authoritative for a request by sending a 421 | |||
| (Misdirected Request) status code in response to the request (see | (Misdirected Request) status code in response to the request (see | |||
| Section 15.5.20 of [HTTP]). | Section 15.5.20 of [HTTP]). | |||
| A client that is configured to use a proxy over HTTP/2 directs | A client that is configured to use a proxy over HTTP/2 directs | |||
| skipping to change at page 69, line 44 ¶ | skipping to change at line 3205 ¶ | |||
| SHOULD be followed, with some additional restrictions that are | SHOULD be followed, with some additional restrictions that are | |||
| specific to HTTP/2. | specific to HTTP/2. | |||
| The TLS implementation MUST support the Server Name Indication (SNI) | The TLS implementation MUST support the Server Name Indication (SNI) | |||
| [TLS-EXT] extension to TLS. If the server is identified by a domain | [TLS-EXT] extension to TLS. If the server is identified by a domain | |||
| name [DNS-TERMS], clients MUST send the server_name TLS extension | name [DNS-TERMS], clients MUST send the server_name TLS extension | |||
| unless an alternative mechanism to indicate the target host is used. | unless an alternative mechanism to indicate the target host is used. | |||
| Requirements for deployments of HTTP/2 that negotiate TLS 1.3 [TLS13] | 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 | are included in Section 9.2.3. Deployments of TLS 1.2 are subject to | |||
| the requirements in Section 9.2.1 and Section 9.2.2. Implementations | the requirements in Sections 9.2.1 and 9.2.2. Implementations are | |||
| are encouraged to provide defaults that comply, but it is recognized | encouraged to provide defaults that comply, but it is recognized that | |||
| that deployments are ultimately responsible for compliance. | deployments are ultimately responsible for compliance. | |||
| 9.2.1. TLS 1.2 Features | 9.2.1. TLS 1.2 Features | |||
| This section describes restrictions on the TLS 1.2 feature set that | 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 | can be used with HTTP/2. Due to deployment limitations, it might not | |||
| be possible to fail TLS negotiation when these restrictions are not | be possible to fail TLS negotiation when these restrictions are not | |||
| met. An endpoint MAY immediately terminate an HTTP/2 connection that | met. An endpoint MAY immediately terminate an HTTP/2 connection that | |||
| does not meet these TLS requirements with a connection error | does not meet these TLS requirements with a connection error | |||
| (Section 5.4.1) of type INADEQUATE_SECURITY. | (Section 5.4.1) of type INADEQUATE_SECURITY. | |||
| A deployment of HTTP/2 over TLS 1.2 MUST disable compression. TLS | A deployment of HTTP/2 over TLS 1.2 MUST disable compression. TLS | |||
| compression can lead to the exposure of information that would not | compression can lead to the exposure of information that would not | |||
| otherwise be revealed [RFC3749]. Generic compression is unnecessary | otherwise be revealed [RFC3749]. Generic compression is unnecessary, | |||
| since HTTP/2 provides compression features that are more aware of | since HTTP/2 provides compression features that are more aware of | |||
| context and therefore likely to be more appropriate for use for | context and therefore likely to be more appropriate for use for | |||
| performance, security, or other reasons. | performance, security, or other reasons. | |||
| A deployment of HTTP/2 over TLS 1.2 MUST disable renegotiation. An | A deployment of HTTP/2 over TLS 1.2 MUST disable renegotiation. An | |||
| endpoint MUST treat a TLS renegotiation as a connection error | endpoint MUST treat a TLS renegotiation as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. Note that disabling | (Section 5.4.1) of type PROTOCOL_ERROR. Note that disabling | |||
| renegotiation can result in long-lived connections becoming unusable | renegotiation can result in long-lived connections becoming unusable | |||
| due to limits on the number of messages the underlying cipher suite | due to limits on the number of messages the underlying cipher suite | |||
| can encipher. | can encipher. | |||
| skipping to change at page 70, line 38 ¶ | skipping to change at line 3242 ¶ | |||
| An endpoint MAY use renegotiation to provide confidentiality | An endpoint MAY use renegotiation to provide confidentiality | |||
| protection for client credentials offered in the handshake, but any | protection for client credentials offered in the handshake, but any | |||
| renegotiation MUST occur prior to sending the connection preface. A | renegotiation MUST occur prior to sending the connection preface. A | |||
| server SHOULD request a client certificate if it sees a renegotiation | server SHOULD request a client certificate if it sees a renegotiation | |||
| request immediately after establishing a connection. | request immediately after establishing a connection. | |||
| This effectively prevents the use of renegotiation in response to a | This effectively prevents the use of renegotiation in response to a | |||
| request for a specific protected resource. A future specification | request for a specific protected resource. A future specification | |||
| might provide a way to support this use case. Alternatively, a | 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 | server might use an error (Section 5.4) of type HTTP_1_1_REQUIRED to | |||
| request the client use a protocol that supports renegotiation. | request that the client use a protocol that supports renegotiation. | |||
| Implementations MUST support ephemeral key exchange sizes of at least | Implementations MUST support ephemeral key exchange sizes of at least | |||
| 2048 bits for cipher suites that use ephemeral finite field Diffie- | 2048 bits for cipher suites that use ephemeral finite field Diffie- | |||
| Hellman (DHE) (Section 8.1.2 of [TLS12] and 224 bits for cipher | Hellman (DHE) (Section 8.1.2 of [TLS12]) and 224 bits for cipher | |||
| suites that use ephemeral elliptic curve Diffie-Hellman (ECDHE) | suites that use ephemeral elliptic curve Diffie-Hellman (ECDHE) | |||
| [RFC8422]. Clients MUST accept DHE sizes of up to 4096 bits. | [RFC8422]. Clients MUST accept DHE sizes of up to 4096 bits. | |||
| Endpoints MAY treat negotiation of key sizes smaller than the lower | Endpoints MAY treat negotiation of key sizes smaller than the lower | |||
| limits as a connection error (Section 5.4.1) of type | limits as a connection error (Section 5.4.1) of type | |||
| INADEQUATE_SECURITY. | INADEQUATE_SECURITY. | |||
| 9.2.2. TLS 1.2 Cipher Suites | 9.2.2. TLS 1.2 Cipher Suites | |||
| A deployment of HTTP/2 over TLS 1.2 SHOULD NOT use any of the cipher | A deployment of HTTP/2 over TLS 1.2 SHOULD NOT use any of the | |||
| suites that are listed in the list of prohibited cipher suites | prohibited cipher suites listed in Appendix A. | |||
| (Appendix A). | ||||
| Endpoints MAY choose to generate a connection error (Section 5.4.1) | Endpoints MAY choose to generate a connection error (Section 5.4.1) | |||
| of type INADEQUATE_SECURITY if one of the prohibited cipher suites is | of type INADEQUATE_SECURITY if one of the prohibited cipher suites is | |||
| negotiated. A deployment that chooses to use a prohibited cipher | negotiated. A deployment that chooses to use a prohibited cipher | |||
| suite risks triggering a connection error unless the set of potential | suite risks triggering a connection error unless the set of potential | |||
| peers is known to accept that cipher suite. | peers is known to accept that cipher suite. | |||
| Implementations MUST NOT generate this error in reaction to the | Implementations MUST NOT generate this error in reaction to the | |||
| negotiation of a cipher suite that is not prohibited. Consequently, | negotiation of a cipher suite that is not prohibited. Consequently, | |||
| when clients offer a cipher suite that is not prohibited, they have | when clients offer a cipher suite that is not prohibited, they have | |||
| to be prepared to use that cipher suite with HTTP/2. | to be prepared to use that cipher suite with HTTP/2. | |||
| The list of prohibited cipher suites includes the cipher suite that | The list of prohibited cipher suites includes the cipher suite that | |||
| TLS 1.2 makes mandatory, which means that TLS 1.2 deployments could | TLS 1.2 makes mandatory, which means that TLS 1.2 deployments could | |||
| have non-intersecting sets of permitted cipher suites. To avoid this | have non-intersecting sets of permitted cipher suites. To avoid this | |||
| problem causing TLS handshake failures, deployments of HTTP/2 that | problem, which causes TLS handshake failures, deployments of HTTP/2 | |||
| use TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | that use TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | |||
| [TLS-ECDHE] with the P-256 elliptic curve [RFC8422]. | [TLS-ECDHE] with the P-256 elliptic curve [RFC8422]. | |||
| Note that clients might advertise support of cipher suites that are | Note that clients might advertise support of cipher suites that are | |||
| prohibited in order to allow for connection to servers that do not | 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 | 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 | suite that is prohibited in HTTP/2. However, this can result in | |||
| HTTP/2 being negotiated with a prohibited cipher suite if the | HTTP/2 being negotiated with a prohibited cipher suite if the | |||
| application protocol and cipher suite are independently selected. | application protocol and cipher suite are independently selected. | |||
| 9.2.3. TLS 1.3 Features | 9.2.3. TLS 1.3 Features | |||
| skipping to change at page 73, line 18 ¶ | skipping to change at line 3361 ¶ | |||
| treated as delimiters in other HTTP versions. An intermediary that | treated as delimiters in other HTTP versions. An intermediary that | |||
| translates an HTTP/2 request or response MUST validate fields | translates an HTTP/2 request or response MUST validate fields | |||
| according to the rules in Section 8.2 before translating a message to | according to the rules in Section 8.2 before translating a message to | |||
| another HTTP version. Translating a field that includes invalid | another HTTP version. Translating a field that includes invalid | |||
| delimiters could be used to cause recipients to incorrectly interpret | delimiters could be used to cause recipients to incorrectly interpret | |||
| a message, which could be exploited by an attacker. | a message, which could be exploited by an attacker. | |||
| Section 8.2 does not include specific rules for validation of pseudo- | Section 8.2 does not include specific rules for validation of pseudo- | |||
| header fields. If the values of these fields are used, additional | header fields. If the values of these fields are used, additional | |||
| validation is necessary. This is particularly important where | validation is necessary. This is particularly important where | |||
| :scheme, :authority, and :path are combined to form a single URI | ":scheme", ":authority", and ":path" are combined to form a single | |||
| string ([RFC3986]). Similar problems might occur when that URI or | URI string [RFC3986]. Similar problems might occur when that URI or | |||
| just :path are combined with :method to construct a request line (as | just ":path" is combined with ":method" to construct a request line | |||
| in Section 3 of [HTTP11]). Simple concatenation is not secure unless | (as in Section 3 of [HTTP/1.1]). Simple concatenation is not secure | |||
| the input values are fully validated. | unless the input values are fully validated. | |||
| An intermediary can reject fields that contain invalid field names or | An intermediary can reject fields that contain invalid field names or | |||
| values for other reasons, in particular those that do not conform to | values for other reasons -- in particular, those fields that do not | |||
| the HTTP ABNF grammar from Section 5 of [HTTP]. Intermediaries that | conform to the HTTP ABNF grammar from Section 5 of [HTTP]. | |||
| do not perform any validation of fields other than the minimum | Intermediaries that do not perform any validation of fields other | |||
| required by Section 8.2 could forward messages that contain invalid | than the minimum required by Section 8.2 could forward messages that | |||
| field names or values. | contain invalid field names or values. | |||
| An intermediary that receives any field that requires removal before | An intermediary that receives any fields that require removal before | |||
| forwarding (see Section 7.6.1 of [HTTP]) MUST remove or replace those | forwarding (see Section 7.6.1 of [HTTP]) MUST remove or replace those | |||
| header fields when forwarding messages. Additionally, intermediaries | header fields when forwarding messages. Additionally, intermediaries | |||
| should take care when forwarding messages containing Content-Length | should take care when forwarding messages containing Content-Length | |||
| fields to ensure that the message is well-formed (Section 8.1.1). | 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 | This ensures that if the message is translated into HTTP/1.1 at any | |||
| point the framing will be correct. | point, the framing will be correct. | |||
| 10.4. Cacheability of Pushed Responses | 10.4. Cacheability of Pushed Responses | |||
| Pushed responses do not have an explicit request from the client; the | Pushed responses do not have an explicit request from the client; the | |||
| request is provided by the server in the PUSH_PROMISE frame. | request is provided by the server in the PUSH_PROMISE frame. | |||
| Caching responses that are pushed is possible based on the guidance | Caching responses that are pushed is possible based on the guidance | |||
| provided by the origin server in the Cache-Control header field. | provided by the origin server in the Cache-Control header field. | |||
| However, this can cause issues if a single server hosts more than one | However, this can cause issues if a single server hosts more than one | |||
| tenant. For example, a server might offer multiple users each a | tenant. For example, a server might offer multiple users each a | |||
| skipping to change at page 74, line 14 ¶ | skipping to change at line 3406 ¶ | |||
| this would allow a tenant to provide a representation that would be | this would allow a tenant to provide a representation that would be | |||
| served out of cache, overriding the actual representation that the | served out of cache, overriding the actual representation that the | |||
| authoritative tenant provides. | authoritative tenant provides. | |||
| Pushed responses for which an origin server is not authoritative (see | Pushed responses for which an origin server is not authoritative (see | |||
| Section 10.1) MUST NOT be used or cached. | Section 10.1) MUST NOT be used or cached. | |||
| 10.5. Denial-of-Service Considerations | 10.5. Denial-of-Service Considerations | |||
| An HTTP/2 connection can demand a greater commitment of resources to | An HTTP/2 connection can demand a greater commitment of resources to | |||
| operate than an HTTP/1.1 connection. The use of field section | operate than an HTTP/1.1 connection. Both field section compression | |||
| compression and flow control depend on a commitment of resources for | and flow control depend on a commitment of a greater amount of state. | |||
| storing a greater amount of state. Settings for these features | Settings for these features ensure that memory commitments for these | |||
| ensure that memory commitments for these features are strictly | features are strictly bounded. | |||
| bounded. | ||||
| The number of PUSH_PROMISE frames is not constrained in the same | The number of PUSH_PROMISE frames is not constrained in the same | |||
| fashion. A client that accepts server push SHOULD limit the number | fashion. A client that accepts server push SHOULD limit the number | |||
| of streams it allows to be in the "reserved (remote)" state. An | of streams it allows to be in the "reserved (remote)" state. An | |||
| excessive number of server push streams can be treated as a stream | excessive number of server push streams can be treated as a stream | |||
| error (Section 5.4.2) of type ENHANCE_YOUR_CALM. | error (Section 5.4.2) of type ENHANCE_YOUR_CALM. | |||
| A number of HTTP/2 implementations were found to be vulnerable to | A number of HTTP/2 implementations were found to be vulnerable to | |||
| denial of service [NFLX-2019-002]. The following lists known ways | denial of service [NFLX-2019-002]. Below is a list of known ways | |||
| that implementations might be subject to denial of service attack: | that implementations might be subject to denial-of-service attacks: | |||
| o Inefficient tracking of outstanding outbound frames can lead to | o Inefficient tracking of outstanding outbound frames can lead to | |||
| overload if an adversary can cause large numbers of frames to be | overload if an adversary can cause large numbers of frames to be | |||
| enqueued for sending. A peer could use one of several techniques | enqueued for sending. A peer could use one of several techniques | |||
| to cause large numbers of frames to be generated: | to cause large numbers of frames to be generated: | |||
| * Providing tiny increments to flow control in WINDOW_UPDATE | * Providing tiny increments to flow control in WINDOW_UPDATE | |||
| frames can cause a sender to generate a large number of DATA | frames can cause a sender to generate a large number of DATA | |||
| frames. | frames. | |||
| * An endpoint is required to respond to a PING frame. | * An endpoint is required to respond to a PING frame. | |||
| * Each SETTINGS frame requires acknowledgment. | * Each SETTINGS frame requires acknowledgment. | |||
| * An invalid request (or server push) can cause a peer to send | * An invalid request (or server push) can cause a peer to send | |||
| RST_STREAM frames in response. | RST_STREAM frames in response. | |||
| o An attacker can provide large amounts of flow control credit at | o An attacker can provide large amounts of flow-control credit at | |||
| the HTTP/2 layer, but withhold credit at the TCP layer, preventing | the HTTP/2 layer but withhold credit at the TCP layer, preventing | |||
| frames from being sent. An endpoint that constructs and remembers | frames from being sent. An endpoint that constructs and remembers | |||
| frames for sending without considering TCP limits might be subject | frames for sending without considering TCP limits might be subject | |||
| to resource exhaustion. | to resource exhaustion. | |||
| o Large numbers of small or empty frames can be abused to cause a | o Large numbers of small or empty frames can be abused to cause a | |||
| peer to expend time processing frame headers. Caution is required | peer to expend time processing frame headers. Caution is required | |||
| here as some uses of small frames are entirely legitimate, such as | 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 | the sending of an empty DATA or CONTINUATION frame at the end of a | |||
| stream. | stream. | |||
| o The SETTINGS frame might also be abused to cause a peer to expend | o The SETTINGS frame might also be abused to cause a peer to expend | |||
| additional processing time. This might be done by pointlessly | additional processing time. This might be done by pointlessly | |||
| changing settings, sending multiple undefined settings, or | changing settings, sending multiple undefined settings, or | |||
| changing the same setting multiple times in the same frame. | changing the same setting multiple times in the same frame. | |||
| o Handling reprioritization with PRIORITY frames can require | o Handling reprioritization with PRIORITY frames can require | |||
| significant processing time and can lead to overload if many | significant processing time and can lead to overload if many | |||
| PRIORITY frames are sent. | PRIORITY frames are sent. | |||
| o Field section compression also offers some opportunities to waste | o Field section compression also provides opportunities for an | |||
| processing resources; see Section 7 of [COMPRESSION] for more | attacker to waste processing resources; see Section 7 of | |||
| details on potential abuses. | [COMPRESSION] for more details on potential abuses. | |||
| o Limits in SETTINGS cannot be reduced instantaneously, which leaves | o Limits in SETTINGS cannot be reduced instantaneously, which leaves | |||
| an endpoint exposed to behavior from a peer that could exceed the | an endpoint exposed to behavior from a peer that could exceed the | |||
| new limits. In particular, immediately after establishing a | new limits. In particular, immediately after establishing a | |||
| connection, limits set by a server are not known to clients and | connection, limits set by a server are not known to clients and | |||
| could be exceeded without being an obvious protocol violation. | could be exceeded without being an obvious protocol violation. | |||
| Most of the features that might be exploited for denial of service -- | Most of the features that might be exploited for denial of service -- | |||
| i.e., SETTINGS changes, small frames, field section compression -- | such as SETTINGS changes, small frames, field section compression -- | |||
| have legitimate uses. These features become a burden only when they | have legitimate uses. These features become a burden only when they | |||
| are used unnecessarily or to excess. | are used unnecessarily or to excess. | |||
| An endpoint that doesn't monitor use of these features exposes itself | An endpoint that doesn't monitor use of these features exposes itself | |||
| to a risk of denial of service. Implementations SHOULD track the use | 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 | 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 | activity that is suspicious as a connection error (Section 5.4.1) of | |||
| type ENHANCE_YOUR_CALM. | type ENHANCE_YOUR_CALM. | |||
| 10.5.1. Limits on Field Block Size | 10.5.1. Limits on Field Block Size | |||
| skipping to change at page 76, line 41 ¶ | skipping to change at line 3526 ¶ | |||
| 10.6. Use of Compression | 10.6. Use of Compression | |||
| Compression can allow an attacker to recover secret data when it is | Compression can allow an attacker to recover secret data when it is | |||
| compressed in the same context as data under attacker control. | compressed in the same context as data under attacker control. | |||
| HTTP/2 enables compression of field lines (Section 4.3); the | HTTP/2 enables compression of field lines (Section 4.3); the | |||
| following concerns also apply to the use of HTTP compressed content- | following concerns also apply to the use of HTTP compressed content- | |||
| codings (Section 8.4.1 of [HTTP]). | codings (Section 8.4.1 of [HTTP]). | |||
| There are demonstrable attacks on compression that exploit the | There are demonstrable attacks on compression that exploit the | |||
| characteristics of the web (e.g., [BREACH]). The attacker induces | characteristics of the Web (e.g., [BREACH]). The attacker induces | |||
| multiple requests containing varying plaintext, observing the length | multiple requests containing varying plaintext, observing the length | |||
| of the resulting ciphertext in each, which reveals a shorter length | of the resulting ciphertext in each, which reveals a shorter length | |||
| when a guess about the secret is correct. | when a guess about the secret is correct. | |||
| Implementations communicating on a secure channel MUST NOT compress | Implementations communicating on a secure channel MUST NOT compress | |||
| content that includes both confidential and attacker-controlled data | content that includes both confidential and attacker-controlled data | |||
| unless separate compression dictionaries are used for each source of | unless separate compression dictionaries are used for each source of | |||
| data. Compression MUST NOT be used if the source of data cannot be | data. Compression MUST NOT be used if the source of data cannot be | |||
| reliably determined. Generic stream compression, such as that | reliably determined. Generic stream compression, such as that | |||
| provided by TLS, MUST NOT be used with HTTP/2 (see Section 9.2). | provided by TLS, MUST NOT be used with HTTP/2 (see Section 9.2). | |||
| skipping to change at page 77, line 19 ¶ | skipping to change at line 3552 ¶ | |||
| Padding within HTTP/2 is not intended as a replacement for general | Padding within HTTP/2 is not intended as a replacement for general | |||
| purpose padding, such as that provided by TLS [TLS13]. Redundant | purpose padding, such as that provided by TLS [TLS13]. Redundant | |||
| padding could even be counterproductive. Correct application can | padding could even be counterproductive. Correct application can | |||
| depend on having specific knowledge of the data that is being padded. | depend on having specific knowledge of the data that is being padded. | |||
| To mitigate attacks that rely on compression, disabling or limiting | To mitigate attacks that rely on compression, disabling or limiting | |||
| compression might be preferable to padding as a countermeasure. | compression might be preferable to padding as a countermeasure. | |||
| Padding can be used to obscure the exact size of frame content and is | Padding can be used to obscure the exact size of frame content and is | |||
| provided to mitigate specific attacks within HTTP, for example, | provided to mitigate specific attacks within HTTP -- for example, | |||
| attacks where compressed content includes both attacker-controlled | attacks where compressed content includes both attacker-controlled | |||
| plaintext and secret data (e.g., [BREACH]). | plaintext and secret data (e.g., [BREACH]). | |||
| Use of padding can result in less protection than might seem | Use of padding can result in less protection than might seem | |||
| immediately obvious. At best, padding only makes it more difficult | immediately obvious. At best, padding only makes it more difficult | |||
| for an attacker to infer length information by increasing the number | for an attacker to infer length information by increasing the number | |||
| of frames an attacker has to observe. Incorrectly implemented | of frames an attacker has to observe. Incorrectly implemented | |||
| padding schemes can be easily defeated. In particular, randomized | padding schemes can be easily defeated. In particular, randomized | |||
| padding with a predictable distribution provides very little | padding with a predictable distribution provides very little | |||
| protection; similarly, padding frame payloads to a fixed size exposes | protection; similarly, padding frame payloads to a fixed size exposes | |||
| information as frame payload sizes cross the fixed-sized boundary, | information as frame payload sizes cross the fixed-sized boundary, | |||
| which could be possible if an attacker can control plaintext. | which could be possible if an attacker can control plaintext. | |||
| Intermediaries SHOULD retain padding for DATA frames, but MAY drop | Intermediaries SHOULD retain padding for DATA frames but MAY drop | |||
| padding for HEADERS and PUSH_PROMISE frames. A valid reason for an | padding for HEADERS and PUSH_PROMISE frames. A valid reason for an | |||
| intermediary to change the amount of padding of frames is to improve | intermediary to change the amount of padding of frames is to improve | |||
| the protections that padding provides. | the protections that padding provides. | |||
| 10.8. Privacy Considerations | 10.8. Privacy Considerations | |||
| Several characteristics of HTTP/2 provide an observer an opportunity | Several characteristics of HTTP/2 provide an observer an opportunity | |||
| to correlate actions of a single client or server over time. These | to correlate actions of a single client or server over time. These | |||
| include the value of settings, the manner in which flow-control | include the values of settings, the manner in which flow-control | |||
| windows are managed, the way priorities are allocated to streams, the | windows are managed, the way priorities are allocated to streams, the | |||
| timing of reactions to stimulus, and the handling of any features | timing of reactions to stimulus, and the handling of any features | |||
| that are controlled by settings. | that are controlled by settings. | |||
| As far as these create observable differences in behavior, they could | As far as these create observable differences in behavior, they could | |||
| be used as a basis for fingerprinting a specific client, as defined | be used as a basis for fingerprinting a specific client, as defined | |||
| in Section 3.2 of [PRIVACY]. | in Section 3.2 of [PRIVACY]. | |||
| HTTP/2's preference for using a single TCP connection allows | HTTP/2's preference for using a single TCP connection allows | |||
| correlation of a user's activity on a site. Reusing connections for | correlation of a user's activity on a site. Reusing connections for | |||
| skipping to change at page 78, line 25 ¶ | skipping to change at line 3604 ¶ | |||
| Remote timing attacks extract secrets from servers by observing | Remote timing attacks extract secrets from servers by observing | |||
| variations in the time that servers take when processing requests | variations in the time that servers take when processing requests | |||
| that use secrets. HTTP/2 enables concurrent request creation and | that use secrets. HTTP/2 enables concurrent request creation and | |||
| processing, which can give attackers better control over when request | processing, which can give attackers better control over when request | |||
| processing commences. Multiple HTTP/2 requests can be included in | processing commences. Multiple HTTP/2 requests can be included in | |||
| the same IP packet or TLS record. HTTP/2 can therefore make remote | the same IP packet or TLS record. HTTP/2 can therefore make remote | |||
| timing attacks more efficient by eliminating variability in request | timing attacks more efficient by eliminating variability in request | |||
| delivery, leaving only request order and the delivery of responses as | delivery, leaving only request order and the delivery of responses as | |||
| sources of timing variability. | sources of timing variability. | |||
| Ensuring that processing time is not dependent on the value of | Ensuring that processing time is not dependent on the value of a | |||
| secrets is the best defense against any form of timing attack. | secret is the best defense against any form of timing attack. | |||
| 11. IANA Considerations | 11. IANA Considerations | |||
| This revision of the document marks the HTTP2-Settings header field | This revision of HTTP/2 marks the HTTP2-Settings header field and the | |||
| and the h2c Upgrade token, both defined in [RFC7540], as obsolete. | h2c upgrade token, both defined in [RFC7540], as obsolete. | |||
| Section 11 of [RFC7540] registered the h2 and h2c ALPN identifiers | Section 11 of [RFC7540] registered the h2 and h2c ALPN identifiers | |||
| along with the PRI HTTP method. RFC 7540 also established a registry | along with the PRI HTTP method. RFC 7540 also established a registry | |||
| for frame types, settings, and error codes. These registrations and | for frame types, settings, and error codes. These registrations and | |||
| registries apply to HTTP/2, but are not redefined in this document. | registries apply to HTTP/2, but are not redefined in this document. | |||
| IANA is requested to update references to RFC 7540 in the following | IANA has updated references to RFC 7540 in the following registries | |||
| registries to refer to this document: Application-Layer Protocol | to refer to this document: "TLS Application-Layer Protocol | |||
| Negotiation (ALPN) Protocol IDs, HTTP/2 Frame Type, HTTP/2 Settings, | Negotiation (ALPN) Protocol IDs", "HTTP/2 Frame Type", "HTTP/2 | |||
| HTTP/2 Error Code, and HTTP Method Registry. The registration of the | Settings", "HTTP/2 Error Code", and "HTTP Method Registry". The | |||
| PRI method needs to be updated to refer to Section 3.4; all other | registration of the PRI method has been updated to refer to | |||
| section numbers have not changed. | Section 3.4; all other section numbers have not changed. | |||
| IANA is requested to change the policy on those portions of the | IANA has changed the policy on those portions of the "HTTP/2 Frame | |||
| "HTTP/2 Frame Type" and "HTTP/2 Settings" registries that were | Type" and "HTTP/2 Settings" registries that were reserved for | |||
| reserved for Experimental Use in RFC 7540. These portions of the | Experimental Use in RFC 7540. These portions of the registries shall | |||
| registry shall operate on the same policy as the remainder of each | operate on the same policy as the remainder of each registry. | |||
| registry. | ||||
| 11.1. HTTP2-Settings Header Field Registration | 11.1. HTTP2-Settings Header Field Registration | |||
| This section marks the HTTP2-Settings header field registered by | This section marks the HTTP2-Settings header field registered by | |||
| Section 11.5 of [RFC7540] in the Hypertext Transfer Protocol (HTTP) | Section 11.5 of [RFC7540] in the "Hypertext Transfer Protocol (HTTP) | |||
| Field Name Registry as obsolete. This capability has been removed: | Field Name Registry" as obsolete. This capability has been removed: | |||
| see Section 3.1. The registration is updated to include the details | see Section 3.1. The registration is updated to include the details | |||
| as required by Section 18.4 of [HTTP]: | as required by Section 18.4 of [HTTP]: | |||
| Field Name: HTTP2-Settings | Field Name: HTTP2-Settings | |||
| Status: Standard | Status: obsoleted | |||
| Ref.: Section 3.2.1 of [RFC7540] | Reference: Section 3.2.1 of [RFC7540] | |||
| Comments: Obsolete; see Section 11.1 of this document | Comments: Obsolete; see Section 11.1 of this document. | |||
| 11.2. The h2c Upgrade Token | 11.2. The h2c Upgrade Token | |||
| This section records the h2c upgrade token registered by Section 11.8 | This section records the h2c upgrade token registered by Section 11.8 | |||
| of [RFC7540] in the Hypertext Transfer Protocol (HTTP) Upgrade Token | of [RFC7540] in the "Hypertext Transfer Protocol (HTTP) Upgrade Token | |||
| Registry as obsolete. This capability has been removed: see | Registry" as obsolete. This capability has been removed: see | |||
| Section 3.1. The registration is updated as follows: | Section 3.1. The registration is updated as follows: | |||
| Value: h2c | Value: h2c | |||
| Description: Hypertext Transfer Protocol version 2 (HTTP/2) | Description: (OBSOLETE) Hypertext Transfer Protocol version 2 | |||
| (HTTP/2) | ||||
| Expected Version Tokens: None | Expected Version Tokens: None | |||
| Reference: Section 3.1 of this document | Reference: Section 3.1 of this document | |||
| 12. References | 12. References | |||
| 12.1. Normative References | 12.1. Normative References | |||
| [CACHE] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [CACHING] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP Caching", Work in Progress, Internet-Draft, | Ed., "HTTP Caching", RFC 9111, DOI 10.17487/RFC9111, March | |||
| draft-ietf-httpbis-cache-18, Internet-Draft, draft-ietf- | 2022, <https://www.rfc-editor.org/info/rfc9111>. | |||
| httpbis-cache-18, August 18, 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| cache-18>. | ||||
| [COMPRESSION] | [COMPRESSION] | |||
| Peon, R. and H. Ruellan, "HPACK: Header Compression for | Peon, R. and H. Ruellan, "HPACK: Header Compression for | |||
| HTTP/2", RFC 7541, DOI 10.17487/RFC7541, RFC 7541, | HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | |||
| DOI 10.17487/RFC7541, May 2015, | <https://www.rfc-editor.org/info/rfc7541>. | |||
| <https://www.rfc-editor.org/rfc/rfc7541>. | ||||
| [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
| DOI 10.17487/RFC6265, RFC 6265, DOI 10.17487/RFC6265, | DOI 10.17487/RFC6265, April 2011, | |||
| April 2011, <https://www.rfc-editor.org/rfc/rfc6265>. | <https://www.rfc-editor.org/info/rfc6265>. | |||
| [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | Ed., "HTTP Semantics", RFC 9110, DOI 10.17487/RFC9110, | |||
| draft-ietf-httpbis-semantics-18, Internet-Draft, draft- | March 2022, <https://www.rfc-editor.org/info/rfc9110>. | |||
| ietf-httpbis-semantics-18, August 18, 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| semantics-18>. | ||||
| [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
| DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
| <https://www.rfc-editor.org/info/rfc9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, BCP 14, RFC 2119, | ||||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/rfc/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| RFC 3986, DOI 10.17487/RFC3986, STD 66, RFC 3986, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
| DOI 10.17487/RFC3986, January 2005, | <https://www.rfc-editor.org/info/rfc3986>. | |||
| <https://www.rfc-editor.org/rfc/rfc3986>. | ||||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, "Elliptic | [RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, "Elliptic | |||
| Curve Cryptography (ECC) Cipher Suites for Transport Layer | Curve Cryptography (ECC) Cipher Suites for Transport Layer | |||
| Security (TLS) Versions 1.2 and Earlier", RFC 8422, | Security (TLS) Versions 1.2 and Earlier", RFC 8422, | |||
| DOI 10.17487/RFC8422, RFC 8422, DOI 10.17487/RFC8422, | DOI 10.17487/RFC8422, August 2018, | |||
| August 2018, <https://www.rfc-editor.org/info/rfc8422>. | <https://www.rfc-editor.org/info/rfc8422>. | |||
| [RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | [RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | |||
| Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, RFC 8470, | Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | |||
| DOI 10.17487/RFC8470, September 2018, | 2018, <https://www.rfc-editor.org/info/rfc8470>. | |||
| <https://www.rfc-editor.org/rfc/rfc8470>. | ||||
| [TCP] Postel, J., "Transmission Control Protocol", STD 7, | [TCP] Postel, J., "Transmission Control Protocol", RFC 793, | |||
| RFC 793, DOI 10.17487/RFC793, STD 7, RFC 793, | DOI 10.17487/RFC0793, September 1981, | |||
| DOI 10.17487/RFC793, September 1981, | <https://www.rfc-editor.org/info/rfc793>. | |||
| <https://www.rfc-editor.org/rfc/rfc793>. | ||||
| [TLS-ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [TLS-ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| RFC 7301, DOI 10.17487/RFC7301, July 2014, | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| <https://www.rfc-editor.org/rfc/rfc7301>. | ||||
| [TLS-ECDHE] | [TLS-ECDHE] | |||
| Rescorla, E., "TLS Elliptic Curve Cipher Suites with SHA- | Rescorla, E., "TLS Elliptic Curve Cipher Suites with SHA- | |||
| 256/384 and AES Galois Counter Mode (GCM)", RFC 5289, | 256/384 and AES Galois Counter Mode (GCM)", RFC 5289, | |||
| DOI 10.17487/RFC5289, RFC 5289, DOI 10.17487/RFC5289, | DOI 10.17487/RFC5289, August 2008, | |||
| August 2008, <https://www.rfc-editor.org/rfc/rfc5289>. | <https://www.rfc-editor.org/info/rfc5289>. | |||
| [TLS-EXT] Eastlake 3rd, D., "Transport Layer Security (TLS) | [TLS-EXT] Eastlake 3rd, D., "Transport Layer Security (TLS) | |||
| Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
| DOI 10.17487/RFC6066, RFC 6066, DOI 10.17487/RFC6066, | DOI 10.17487/RFC6066, January 2011, | |||
| January 2011, <https://www.rfc-editor.org/rfc/rfc6066>. | <https://www.rfc-editor.org/info/rfc6066>. | |||
| [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security | [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
| (TLS) Protocol Version 1.2", RFC 5246, | (TLS) Protocol Version 1.2", RFC 5246, | |||
| DOI 10.17487/RFC5246, RFC 5246, DOI 10.17487/RFC5246, | DOI 10.17487/RFC5246, August 2008, | |||
| August 2008, <https://www.rfc-editor.org/rfc/rfc5246>. | <https://www.rfc-editor.org/info/rfc5246>. | |||
| [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, RFC 8446, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| DOI 10.17487/RFC8446, August 2018, | <https://www.rfc-editor.org/info/rfc8446>. | |||
| <https://www.rfc-editor.org/rfc/rfc8446>. | ||||
| [TLSBCP] Sheffer, Y., Holz, R., and P. Saint-Andre, | [TLSBCP] Sheffer, Y., Holz, R., and P. Saint-Andre, | |||
| "Recommendations for Secure Use of Transport Layer | "Recommendations for Secure Use of Transport Layer | |||
| Security (TLS) and Datagram Transport Layer Security | Security (TLS) and Datagram Transport Layer Security | |||
| (DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, BCP 195, | (DTLS)", RFC 7525, DOI 10.17487/RFC7525, May 2015, | |||
| RFC 7525, DOI 10.17487/RFC7525, May 2015, | <https://www.rfc-editor.org/info/rfc7525>. | |||
| <https://www.rfc-editor.org/rfc/rfc7525>. | ||||
| 12.2. Informative References | 12.2. Informative References | |||
| [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| RFC 7838, DOI 10.17487/RFC7838, April 2016, | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| <https://www.rfc-editor.org/rfc/rfc7838>. | ||||
| [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | |||
| CRIME Attack", July 12, 2013, | CRIME Attack", July 12, 2013, | |||
| <https://breachattack.com/resources/ | <https://breachattack.com/resources/ | |||
| BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | |||
| [DNS-TERMS] | [DNS-TERMS] | |||
| Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | |||
| Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, | Terminology", RFC 8499, DOI 10.17487/RFC8499, January | |||
| BCP 219, RFC 8499, DOI 10.17487/RFC8499, January 2019, | 2019, <https://www.rfc-editor.org/info/rfc8499>. | |||
| <https://www.rfc-editor.org/rfc/rfc8499>. | ||||
| [HTTP11] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | ||||
| ietf-httpbis-messaging-18, Internet-Draft, draft-ietf- | ||||
| httpbis-messaging-18, August 18, 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| messaging-18>. | ||||
| [I-D.ietf-httpbis-priority] | [HTTP-PRIORITY] | |||
| Oku, K. and L. Pardue, "Extensible Prioritization Scheme | Oku, K. and L. Pardue, "Extensible Prioritization Scheme | |||
| for HTTP", Work in Progress, Internet-Draft, draft-ietf- | for HTTP", RFC 9218, DOI 10.17487/RFC9218, March 2022, | |||
| httpbis-priority-12, January 17, 2022, | <https://www.rfc-editor.org/info/rfc9218>. | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| priority-12>. | [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP/1.1", RFC 9112, DOI 10.17487/RFC9112, March | ||||
| 2022, <https://www.rfc-editor.org/info/rfc9112>. | ||||
| [NFLX-2019-002] | [NFLX-2019-002] | |||
| Netflix, "HTTP/2 Denial of Service Advisory", August 13, | Netflix, "HTTP/2 Denial of Service Advisory", August 13, | |||
| 2019, <https://github.com/Netflix/security- | 2019, <https://github.com/Netflix/security- | |||
| bulletins/blob/master/advisories/third-party/2019-002.md>. | bulletins/blob/master/advisories/third-party/2019-002.md>. | |||
| [PRIVACY] Cooper, A., Tschofenig, H., Aboba, B., Peterson, J., | [PRIVACY] Cooper, A., Tschofenig, H., Aboba, B., Peterson, J., | |||
| Morris, J., Hansen, M., and R. Smith, "Privacy | Morris, J., Hansen, M., and R. Smith, "Privacy | |||
| Considerations for Internet Protocols", RFC 6973, | Considerations for Internet Protocols", RFC 6973, | |||
| DOI 10.17487/RFC6973, RFC 6973, DOI 10.17487/RFC6973, July | DOI 10.17487/RFC6973, July 2013, | |||
| 2013, <https://www.rfc-editor.org/rfc/rfc6973>. | <https://www.rfc-editor.org/info/rfc6973>. | |||
| [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - | [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - | |||
| Communication Layers", RFC 1122, DOI 10.17487/RFC1122, | Communication Layers", STD 3, RFC 1122, | |||
| RFC 1122, DOI 10.17487/RFC1122, October 1989, | DOI 10.17487/RFC1122, October 1989, | |||
| <https://www.rfc-editor.org/rfc/rfc1122>. | <https://www.rfc-editor.org/info/rfc1122>. | |||
| [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | |||
| Compression Methods", RFC 3749, DOI 10.17487/RFC3749, | Compression Methods", RFC 3749, DOI 10.17487/RFC3749, May | |||
| RFC 3749, DOI 10.17487/RFC3749, May 2004, | 2004, <https://www.rfc-editor.org/info/rfc3749>. | |||
| <https://www.rfc-editor.org/rfc/rfc3749>. | ||||
| [RFC6125] Saint-Andre, P. and J. Hodges, "Representation and | [RFC6125] Saint-Andre, P. and J. Hodges, "Representation and | |||
| Verification of Domain-Based Application Service Identity | Verification of Domain-Based Application Service Identity | |||
| within Internet Public Key Infrastructure Using X.509 | within Internet Public Key Infrastructure Using X.509 | |||
| (PKIX) Certificates in the Context of Transport Layer | (PKIX) Certificates in the Context of Transport Layer | |||
| Security (TLS)", RFC 6125, DOI 10.17487/RFC6125, RFC 6125, | Security (TLS)", RFC 6125, DOI 10.17487/RFC6125, March | |||
| DOI 10.17487/RFC6125, March 2011, | 2011, <https://www.rfc-editor.org/info/rfc6125>. | |||
| <https://www.rfc-editor.org/info/rfc6125>. | ||||
| [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | |||
| Codes", RFC 6585, DOI 10.17487/RFC6585, RFC 6585, | Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012, | |||
| DOI 10.17487/RFC6585, April 2012, | <https://www.rfc-editor.org/info/rfc6585>. | |||
| <https://www.rfc-editor.org/rfc/rfc6585>. | ||||
| [RFC7323] Borman, D., Braden, B., Jacobson, V., and R. | [RFC7323] Borman, D., Braden, B., Jacobson, V., and R. | |||
| Scheffenegger, Ed., "TCP Extensions for High Performance", | Scheffenegger, Ed., "TCP Extensions for High Performance", | |||
| RFC 7323, DOI 10.17487/RFC7323, RFC 7323, | RFC 7323, DOI 10.17487/RFC7323, September 2014, | |||
| DOI 10.17487/RFC7323, September 2014, | <https://www.rfc-editor.org/info/rfc7323>. | |||
| <https://www.rfc-editor.org/rfc/rfc7323>. | ||||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, RFC 7540, DOI 10.17487/RFC7540, May | DOI 10.17487/RFC7540, May 2015, | |||
| 2015, <https://www.rfc-editor.org/rfc/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
| [RFC8441] McManus, P., "Bootstrapping WebSockets with HTTP/2", | [RFC8441] McManus, P., "Bootstrapping WebSockets with HTTP/2", | |||
| RFC 8441, DOI 10.17487/RFC8441, RFC 8441, | RFC 8441, DOI 10.17487/RFC8441, September 2018, | |||
| DOI 10.17487/RFC8441, September 2018, | <https://www.rfc-editor.org/info/rfc8441>. | |||
| <https://www.rfc-editor.org/rfc/rfc8441>. | ||||
| [RFC8740] Benjamin, D., "Using TLS 1.3 with HTTP/2", RFC 8740, | [RFC8740] Benjamin, D., "Using TLS 1.3 with HTTP/2", RFC 8740, | |||
| DOI 10.17487/RFC8740, RFC 8740, DOI 10.17487/RFC8740, | DOI 10.17487/RFC8740, February 2020, | |||
| February 2020, <https://www.rfc-editor.org/rfc/rfc8740>. | <https://www.rfc-editor.org/info/rfc8740>. | |||
| [TALKING] Huang, L., Chen, E., Barth, A., Rescorla, E., and C. | [TALKING] Huang, L., Chen, E., Barth, A., Rescorla, E., and C. | |||
| Jackson, "Talking to Yourself for Fun and Profit", 2011, | Jackson, "Talking to Yourself for Fun and Profit", 2011, | |||
| <https://www.adambarth.com/papers/2011/huang-chen-barth- | <https://www.adambarth.com/papers/2011/huang-chen-barth- | |||
| rescorla-jackson.pdf>. | rescorla-jackson.pdf>. | |||
| Appendix A. Prohibited TLS 1.2 Cipher Suites | Appendix A. Prohibited TLS 1.2 Cipher Suites | |||
| An HTTP/2 implementation MAY treat the negotiation of any of the | An HTTP/2 implementation MAY treat the negotiation of any of the | |||
| following cipher suites with TLS 1.2 as a connection error | following cipher suites with TLS 1.2 as a connection error | |||
| skipping to change at page 89, line 37 ¶ | skipping to change at line 4116 ¶ | |||
| o TLS_PSK_WITH_AES_256_CCM_8 | o TLS_PSK_WITH_AES_256_CCM_8 | |||
| | Note: This list was assembled from the set of registered TLS | | Note: This list was assembled from the set of registered TLS | |||
| | cipher suites when [RFC7540] was developed. This list includes | | cipher suites when [RFC7540] was developed. This list includes | |||
| | those cipher suites that do not offer an ephemeral key exchange | | those cipher suites that do not offer an ephemeral key exchange | |||
| | and those that are based on the TLS null, stream, or block | | and those that are based on the TLS null, stream, or block | |||
| | cipher type (as defined in Section 6.2.3 of [TLS12]). | | cipher type (as defined in Section 6.2.3 of [TLS12]). | |||
| | Additional cipher suites with these properties could be | | Additional cipher suites with these properties could be | |||
| | defined; these would not be explicitly prohibited. | | defined; these would not be explicitly prohibited. | |||
| For more details, see Section 9.2.2 | For more details, see Section 9.2.2. | |||
| Appendix B. Changes from RFC 7540 | Appendix B. Changes from RFC 7540 | |||
| This revision includes the following substantive changes: | This revision includes the following substantive changes: | |||
| o Use of TLS 1.3 was defined based on RFC 8740, which this document | o Use of TLS 1.3 was defined based on [RFC8740], which this document | |||
| obsoletes. | obsoletes. | |||
| o The priority scheme defined in RFC 7540 is deprecated. | o The priority scheme defined in RFC 7540 is deprecated. | |||
| Definitions for the format of the PRIORITY frame and the priority | Definitions for the format of the PRIORITY frame and the priority | |||
| fields in the HEADERS frame have been retained, plus the rules | fields in the HEADERS frame have been retained, plus the rules | |||
| governing when PRIORITY frames can be sent and received, but the | governing when PRIORITY frames can be sent and received, but the | |||
| semantics of these fields are only described in RFC 7540. The | semantics of these fields are only described in RFC 7540. The | |||
| priority signaling scheme from RFC 7540 was not successful. Using | priority signaling scheme from RFC 7540 was not successful. Using | |||
| the simpler successor signaling [I-D.ietf-httpbis-priority] is | the simpler signaling in [HTTP-PRIORITY] is recommended. | |||
| recommended. | ||||
| o The HTTP/1.1 Upgrade mechanism is deprecated and no longer | o The HTTP/1.1 Upgrade mechanism is deprecated and no longer | |||
| specified in this document. It was never widely deployed, with | specified in this document. It was never widely deployed, with | |||
| plaintext HTTP/2 users choosing to use the prior-knowledge | plaintext HTTP/2 users choosing to use the prior-knowledge | |||
| implementation instead. | implementation instead. | |||
| o Validation for field names and values has been narrowed. The | o Validation for field names and values has been narrowed. The | |||
| validation that is mandatory for intermediaries is precisely | validation that is mandatory for intermediaries is precisely | |||
| defined and error reporting for requests has been amended to | defined, and error reporting for requests has been amended to | |||
| encourage sending 400-series status codes. | encourage sending 400-series status codes. | |||
| o The ranges of codepoints for settings and frame types that were | o The ranges of codepoints for settings and frame types that were | |||
| reserved for "Experimental Use" are now available for general use. | reserved for Experimental Use are now available for general use. | |||
| o Connection-specific header fields - which are prohibited - are | o Connection-specific header fields -- which are prohibited -- are | |||
| more precisely and comprehensively identified. | more precisely and comprehensively identified. | |||
| o Host and :authority are no longer permitted to disagree. | o Host and ":authority" are no longer permitted to disagree. | |||
| o Rules for sending Dynamic Table Size Update instructions after | o Rules for sending Dynamic Table Size Update instructions after | |||
| changes in settings have been clarified in Section 4.3.1. | changes in settings have been clarified in Section 4.3.1. | |||
| Editorial changes are also included. In particular, changes to | Editorial changes are also included. In particular, changes to | |||
| terminology and document structure are in response to updates to core | terminology and document structure are in response to updates to core | |||
| HTTP semantics [HTTP]. Those documents now include some concepts | HTTP semantics [HTTP]. Those documents now include some concepts | |||
| that were first defined in RFC 7540, such as the 421 status code or | that were first defined in RFC 7540, such as the 421 status code or | |||
| connection coalescing. | connection coalescing. | |||
| Contributors | ||||
| The previous version of this document was authored by Mike Belshe and | ||||
| Roberto Peon. | ||||
| Acknowledgments | Acknowledgments | |||
| Credit for non-trivial input to this document is owed to a large | 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 | number of people who have contributed to the HTTP Working Group over | |||
| the years. [RFC7540] contains a more extensive list of people that | the years. [RFC7540] contains a more extensive list of people that | |||
| deserve acknowledgment for their contributions. | deserve acknowledgment for their contributions. | |||
| Contributors | ||||
| Mike Belshe and Roberto Peon authored the text that this document is | ||||
| based on. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Martin Thomson (editor) | Martin Thomson (editor) | |||
| Mozilla | Mozilla | |||
| Australia | Australia | |||
| Email: mt@lowentropy.net | Email: mt@lowentropy.net | |||
| Cory Benfield (editor) | Cory Benfield (editor) | |||
| Apple Inc. | Apple Inc. | |||
| Email: cbenfield@apple.com | Email: cbenfield@apple.com | |||
| End of changes. 239 change blocks. | ||||
| 602 lines changed or deleted | 567 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||