| draft-ietf-httpbis-http2-03.txt | draft-ietf-httpbis-http2-04.txt | |||
|---|---|---|---|---|
| HTTPbis Working Group M. Belshe | HTTPbis Working Group M. Belshe | |||
| Internet-Draft Twist | Internet-Draft Twist | |||
| Intended status: Standards Track R. Peon | Intended status: Standards Track R. Peon | |||
| Expires: November 30, 2013 Google, Inc | Expires: January 9, 2014 Google, Inc | |||
| M. Thomson, Ed. | M. Thomson, Ed. | |||
| Microsoft | Microsoft | |||
| A. Melnikov, Ed. | A. Melnikov, Ed. | |||
| Isode Ltd | Isode Ltd | |||
| May 29, 2013 | July 8, 2013 | |||
| Hypertext Transfer Protocol version 2.0 | Hypertext Transfer Protocol version 2.0 | |||
| draft-ietf-httpbis-http2-03 | draft-ietf-httpbis-http2-04 | |||
| Abstract | Abstract | |||
| This specification describes an optimized expression of the syntax of | This specification describes an optimized expression of the syntax of | |||
| the Hypertext Transfer Protocol (HTTP). The HTTP/2.0 encapsulation | the Hypertext Transfer Protocol (HTTP). The HTTP/2.0 encapsulation | |||
| enables more efficient use of network resources and reduced | enables more efficient use of network resources and reduced | |||
| perception of latency by allowing header field compression and | perception of latency by allowing header field compression and | |||
| multiple concurrent messages on the same connection. It also | multiple concurrent messages on the same connection. It also | |||
| introduces unsolicited push of representations from servers to | introduces unsolicited push of representations from servers to | |||
| clients. | clients. | |||
| This document is an alternative to, but does not obsolete the | This document is an alternative to, but does not obsolete the | |||
| HTTP/1.1 message format or protocol. HTTP's existing semantics | HTTP/1.1 message format or protocol. HTTP's existing semantics | |||
| remain unchanged. | remain unchanged. | |||
| This version of the draft has been marked for implementation. | ||||
| Interoperability testing will occur in the HTTP/2.0 interim in | ||||
| Hamburg, DE, starting 2013-08-05. | ||||
| Editorial Note (To be removed by RFC Editor) | Editorial Note (To be removed by RFC Editor) | |||
| Discussion of this draft takes place on the HTTPBIS working group | Discussion of this draft takes place on the HTTPBIS working group | |||
| mailing list (ietf-http-wg@w3.org), which is archived at | mailing list (ietf-http-wg@w3.org), which is archived at | |||
| <http://lists.w3.org/Archives/Public/ietf-http-wg/>. | <http://lists.w3.org/Archives/Public/ietf-http-wg/>. | |||
| Working Group information and related documents can be found at | Working Group information and related documents can be found at | |||
| <http://tools.ietf.org/wg/httpbis/> (Wiki) and | <http://tools.ietf.org/wg/httpbis/> (Wiki) and | |||
| <https://github.com/http2/http2-spec> (source code and issues | <https://github.com/http2/http2-spec> (source code and issues | |||
| tracker). | tracker). | |||
| skipping to change at page 2, line 12 ¶ | skipping to change at page 2, line 16 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on November 30, 2013. | This Internet-Draft will expire on January 9, 2014. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2013 IETF Trust and the persons identified as the | Copyright (c) 2013 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 | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 34 ¶ | skipping to change at page 2, line 38 ¶ | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.1. Document Organization . . . . . . . . . . . . . . . . . . 5 | 1.1. Document Organization . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 1.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | |||
| 2. Starting HTTP/2.0 . . . . . . . . . . . . . . . . . . . . . . 6 | 2. HTTP/2.0 Protocol Overview . . . . . . . . . . . . . . . . . . 6 | |||
| 2.1. HTTP/2.0 Version Identification . . . . . . . . . . . . . 7 | 2.1. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.2. Starting HTTP/2.0 for "http:" URIs . . . . . . . . . . . . 8 | 2.2. HTTP Multiplexing . . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.3. Starting HTTP/2.0 for "https:" URIs . . . . . . . . . . . 8 | 2.3. HTTP Semantics . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.4. Starting HTTP/2.0 with Prior Knowledge . . . . . . . . . . 9 | 3. Starting HTTP/2.0 . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3. HTTP/2.0 Framing Layer . . . . . . . . . . . . . . . . . . . . 9 | 3.1. HTTP/2.0 Version Identification . . . . . . . . . . . . . 8 | |||
| 3.1. Connection . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3.2. Starting HTTP/2.0 for "http" URIs . . . . . . . . . . . . 8 | |||
| 3.2. Connection Header . . . . . . . . . . . . . . . . . . . . 9 | 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | |||
| 3.3. Framing . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 3.3. Starting HTTP/2.0 for "https" URIs . . . . . . . . . . . . 10 | |||
| 3.3.1. Frame Header . . . . . . . . . . . . . . . . . . . . . 10 | 3.4. Starting HTTP/2.0 with Prior Knowledge . . . . . . . . . . 10 | |||
| 3.3.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . 12 | 3.5. Connection Header . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.4. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.4.1. Stream Creation . . . . . . . . . . . . . . . . . . . 13 | 4.1. Frame Header . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.4.2. Stream priority . . . . . . . . . . . . . . . . . . . 13 | 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 3.4.3. Stream half-close . . . . . . . . . . . . . . . . . . 14 | 4.3. Header Compression and Decompression . . . . . . . . . . . 13 | |||
| 3.4.4. Stream close . . . . . . . . . . . . . . . . . . . . . 14 | 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.5. Error Handling . . . . . . . . . . . . . . . . . . . . . . 15 | 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.5.1. Connection Error Handling . . . . . . . . . . . . . . 15 | 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 18 | |||
| 3.5.2. Stream Error Handling . . . . . . . . . . . . . . . . 16 | 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 18 | |||
| 3.5.3. Error Codes . . . . . . . . . . . . . . . . . . . . . 16 | 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 3.6. Stream Flow Control . . . . . . . . . . . . . . . . . . . 17 | 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 19 | |||
| 3.6.1. Flow Control Principles . . . . . . . . . . . . . . . 17 | 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 20 | |||
| 3.6.2. Appropriate Use of Flow Control . . . . . . . . . . . 18 | 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 3.7. Header Blocks . . . . . . . . . . . . . . . . . . . . . . 19 | 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 3.8. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 19 | 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 21 | |||
| 3.8.1. DATA Frames . . . . . . . . . . . . . . . . . . . . . 20 | 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 22 | |||
| 3.8.2. HEADERS+PRIORITY . . . . . . . . . . . . . . . . . . . 20 | 5.4.3. Connection Termination . . . . . . . . . . . . . . . . 22 | |||
| 3.8.3. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . 21 | 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 3.8.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . 21 | 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 3.8.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . 25 | 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 3.8.6. PING . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 3.8.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . 26 | 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 3.8.8. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 28 | 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 3.8.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . 29 | 6.5.1. Setting Format . . . . . . . . . . . . . . . . . . . . 26 | |||
| 4. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 32 | 6.5.2. Defined Settings . . . . . . . . . . . . . . . . . . . 27 | |||
| 4.1. Connection Management . . . . . . . . . . . . . . . . . . 32 | 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 4.2. HTTP Request/Response . . . . . . . . . . . . . . . . . . 33 | 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 4.2.1. HTTP Header Fields and HTTP/2.0 Headers . . . . . . . 33 | 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 4.2.2. Request . . . . . . . . . . . . . . . . . . . . . . . 33 | 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 4.2.3. Response . . . . . . . . . . . . . . . . . . . . . . . 34 | 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 32 | |||
| 4.3. Server Push Transactions . . . . . . . . . . . . . . . . . 35 | 6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 33 | |||
| 4.3.1. Server implementation . . . . . . . . . . . . . . . . 36 | 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 34 | |||
| 4.3.2. Client implementation . . . . . . . . . . . . . . . . 37 | 6.9.4. Ending Flow Control . . . . . . . . . . . . . . . . . 34 | |||
| 5. Design Rationale and Notes . . . . . . . . . . . . . . . . . . 38 | 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 5.1. Separation of Framing Layer and Application Layer . . . . 38 | 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 36 | |||
| 5.2. Error handling - Framing Layer . . . . . . . . . . . . . . 39 | 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 36 | |||
| 5.3. One Connection per Domain . . . . . . . . . . . . . . . . 39 | 8.1.1. Examples . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 5.4. Fixed vs Variable Length Fields . . . . . . . . . . . . . 39 | 8.1.2. Request Header Fields . . . . . . . . . . . . . . . . 38 | |||
| 5.5. Server Push . . . . . . . . . . . . . . . . . . . . . . . 40 | 8.1.3. Response Header Fields . . . . . . . . . . . . . . . . 39 | |||
| 6. Security Considerations . . . . . . . . . . . . . . . . . . . 40 | 8.1.4. GZip Content-Encoding . . . . . . . . . . . . . . . . 40 | |||
| 6.1. Server Authority and Same-Origin . . . . . . . . . . . . . 40 | 8.1.5. Request Reliability Mechanisms in HTTP/2.0 . . . . . . 40 | |||
| 6.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 40 | 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.3. Cacheability of Pushed Resources . . . . . . . . . . . . . 41 | 9. Additional HTTP Requirements/Considerations . . . . . . . . . 43 | |||
| 7. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 41 | 9.1. Frame Size Limits for HTTP . . . . . . . . . . . . . . . . 43 | |||
| 7.1. Long Lived Connections . . . . . . . . . . . . . . . . . . 41 | 9.2. Connection Management . . . . . . . . . . . . . . . . . . 43 | |||
| 7.2. SETTINGS frame . . . . . . . . . . . . . . . . . . . . . . 41 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 43 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 42 | 10.1. Server Authority and Same-Origin . . . . . . . . . . . . . 43 | |||
| 8.1. Frame Type Registry . . . . . . . . . . . . . . . . . . . 42 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 44 | |||
| 8.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 43 | 10.3. Cacheability of Pushed Resources . . . . . . . . . . . . . 44 | |||
| 8.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 43 | 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 45 | |||
| 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 44 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 44 | 12.1. Frame Type Registry . . . . . . . . . . . . . . . . . . . 45 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . . 44 | 12.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . . 45 | 12.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 47 | |||
| 12.4. HTTP2-Settings Header Field Registration . . . . . . . . . 47 | ||||
| 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 48 | ||||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 48 | ||||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . . 48 | ||||
| 14.2. Informative References . . . . . . . . . . . . . . . . . . 50 | ||||
| Appendix A. Change Log (to be removed by RFC Editor before | Appendix A. Change Log (to be removed by RFC Editor before | |||
| publication) . . . . . . . . . . . . . . . . . . . . 46 | publication) . . . . . . . . . . . . . . . . . . . . 50 | |||
| A.1. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 50 | ||||
| A.1. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 46 | A.2. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 50 | |||
| A.2. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 46 | A.3. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 50 | |||
| A.3. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 47 | A.4. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 51 | |||
| A.4. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 47 | A.5. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 51 | |||
| 1. Introduction | 1. Introduction | |||
| The Hypertext Transfer Protocol (HTTP) is a wildly successful | The Hypertext Transfer Protocol (HTTP) is a wildly successful | |||
| protocol. However, the HTTP/1.1 message encapsulation ([HTTP-p1], | protocol. However, the HTTP/1.1 message format ([HTTP-p1], Section | |||
| Section 3) is optimized for implementation simplicity and | 3) is optimized for implementation simplicity and accessibility, not | |||
| accessibility, not application performance. As such it has several | application performance. As such it has several characteristics that | |||
| characteristics that have a negative overall effect on application | have a negative overall effect on application performance. | |||
| performance. | ||||
| In particular, HTTP/1.0 only allows one request to be delivered at a | In particular, HTTP/1.0 only allows one request to be delivered at a | |||
| time on a given connection. HTTP/1.1 pipelining only partially | time on a given connection. HTTP/1.1 pipelining only partially | |||
| addressed request concurrency, and is not widely deployed. | addressed request concurrency, and is not widely deployed. | |||
| Therefore, clients that need to make many requests (as is common on | Therefore, clients that need to make many requests (as is common on | |||
| the Web) typically use multiple connections to a server in order to | the Web) typically use multiple connections to a server in order to | |||
| reduce perceived latency. | reduce perceived latency. | |||
| Furthermore, HTTP/1.1 header fields are often repetitive and verbose, | Furthermore, HTTP/1.1 header fields are often repetitive and verbose, | |||
| which, in addition to generating more or larger network packets, can | which, in addition to generating more or larger network packets, can | |||
| skipping to change at page 5, line 47 ¶ | skipping to change at page 5, line 46 ¶ | |||
| HTTP/1.x. This means less competition with other flows, and longer- | HTTP/1.x. This means less competition with other flows, and longer- | |||
| lived connections, which in turn leads to better utilization of | lived connections, which in turn leads to better utilization of | |||
| available network capacity. | available network capacity. | |||
| Finally, this encapsulation also enables more scalable processing of | Finally, this encapsulation also enables more scalable processing of | |||
| messages through use of binary message framing. | messages through use of binary message framing. | |||
| 1.1. Document Organization | 1.1. Document Organization | |||
| The HTTP/2.0 Specification is split into three parts: starting | The HTTP/2.0 Specification is split into three parts: starting | |||
| HTTP/2.0 (Section 2), which covers how a HTTP/2.0 connection is | HTTP/2.0 (Section 3), which covers how a HTTP/2.0 connection is | |||
| initiated; a framing layer (Section 3), which multiplexes a single | initiated; a framing layer (Section 4), which multiplexes a single | |||
| TCP connection into independent frames of various types; and an HTTP | TCP connection into independent frames of various types; and an HTTP | |||
| layer (Section 4), which specifies the mechanism for expressing HTTP | layer (Section 8), which specifies the mechanism for expressing HTTP | |||
| interactions using the framing layer. While some of the framing | interactions using the framing layer. While some of the framing | |||
| layer concepts are isolated from HTTP, building a generic framing | layer concepts are isolated from HTTP, building a generic framing | |||
| layer has not been a goal. The framing layer is tailored to the | layer has not been a goal. The framing layer is tailored to the | |||
| needs of the HTTP protocol and server push. | needs of the HTTP protocol and server push. | |||
| 1.2. Conventions and Terminology | 1.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", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
| skipping to change at page 6, line 47 ¶ | skipping to change at page 6, line 46 ¶ | |||
| server: The endpoint which did not initiate the HTTP connection. | server: The endpoint which did not initiate the HTTP connection. | |||
| connection error: An error on the HTTP/2.0 connection. | connection error: An error on the HTTP/2.0 connection. | |||
| stream: A bi-directional flow of frames across a virtual channel | stream: A bi-directional flow of frames across a virtual channel | |||
| within the HTTP/2.0 connection. | within the HTTP/2.0 connection. | |||
| stream error: An error on the individual HTTP/2.0 stream. | stream error: An error on the individual HTTP/2.0 stream. | |||
| 2. Starting HTTP/2.0 | 2. HTTP/2.0 Protocol Overview | |||
| HTTP/2.0 uses the same "http:" and "https:" URI schemes used by | HTTP/2.0 provides an optimized transport for HTTP semantics. | |||
| HTTP/1.1. As a result, implementations processing requests for | ||||
| target resource URIs like "http://example.org/foo" or | An HTTP/2.0 connection is an application level protocol running on | |||
| "https://example.com/bar" are required to first discover whether the | top of a TCP connection ([RFC0793]). The client is the TCP | |||
| upstream server (the immediate peer to which the client wishes to | connection initiator. | |||
| establish a connection) supports HTTP/2.0. | ||||
| This document describes the HTTP/2.0 protocol using a logical | ||||
| structure that is formed of three parts: framing, streams, and | ||||
| application mapping. This structure is provided primarily as an aid | ||||
| to specification, implementations are free to diverge from this | ||||
| structure as necessary. | ||||
| 2.1. HTTP Frames | ||||
| HTTP/2.0 provides an efficient serialization of HTTP semantics. HTTP | ||||
| requests and responses are encoded into length-prefixed frames (see | ||||
| Section 4.1). | ||||
| HTTP headers are compressed into a series of frames that contain | ||||
| header block fragments (see Section 4.3). | ||||
| 2.2. HTTP Multiplexing | ||||
| HTTP/2.0 provides the ability to multiplex multiple HTTP requests and | ||||
| responses onto a single connection. Multiple requests or responses | ||||
| can be sent concurrently on a connection using streams (Section 5). | ||||
| In order to maintain independent streams, flow control and | ||||
| prioritization are necessary. | ||||
| 2.3. HTTP Semantics | ||||
| HTTP/2.0 defines how HTTP requests and responses are mapped to | ||||
| streams (see Section 8) and introduces a new interaction model, | ||||
| server push (Section 8.2). | ||||
| 3. Starting HTTP/2.0 | ||||
| HTTP/2.0 uses the same "http" and "https" URI schemes used by | ||||
| HTTP/1.1. HTTP/2.0 shares the same default port numbers: 80 for | ||||
| "http" URIs and 443 for "https" URIs. As a result, implementations | ||||
| processing requests for target resource URIs like | ||||
| "http://example.org/foo" or "https://example.com/bar" are required to | ||||
| first discover whether the upstream server (the immediate peer to | ||||
| which the client wishes to establish a connection) supports HTTP/2.0. | ||||
| The means by which support for HTTP/2.0 is determined is different | The means by which support for HTTP/2.0 is determined is different | |||
| for "http" and "https" URIs. Discovery for "https:" URIs is | for "http" and "https" URIs. Discovery for "http" URIs is described | |||
| described in Section 2.3. Discovery for "http" URIs is described | in Section 3.2. Discovery for "https" URIs is described in | |||
| here. | Section 3.3. | |||
| 2.1. HTTP/2.0 Version Identification | 3.1. HTTP/2.0 Version Identification | |||
| The protocol defined in this document is identified using the string | The protocol defined in this document is identified using the string | |||
| "HTTP/2.0". This identification is used in the HTTP/1.1 Upgrade | "HTTP/2.0". This identification is used in the HTTP/1.1 Upgrade | |||
| header field, in the TLS application layer protocol negotiation | header field, in the TLS application layer protocol negotiation | |||
| extension [TLSALPN] field and other places where protocol | extension [TLSALPN] field, and other places where protocol | |||
| identification is required. | identification is required. | |||
| Negotiating "HTTP/2.0" implies the use of the transport, security, | Negotiating "HTTP/2.0" implies the use of the transport, security, | |||
| framing and message semantics described in this document. | framing and message semantics described in this document. | |||
| [[anchor3: Editor's Note: please remove the following text prior to | [[anchor6: Editor's Note: please remove the following text prior to | |||
| the publication of a final version of this document.]] | the publication of a final version of this document.]] | |||
| Only implementations of the final, published RFC can identify | Only implementations of the final, published RFC can identify | |||
| themselves as "HTTP/2.0". Until such an RFC exists, implementations | themselves as "HTTP/2.0". Until such an RFC exists, implementations | |||
| MUST NOT identify themselves using "HTTP/2.0". | MUST NOT identify themselves using "HTTP/2.0". | |||
| Examples and text throughout the rest of this document use "HTTP/2.0" | Examples and text throughout the rest of this document use "HTTP/2.0" | |||
| as a matter of editorial convenience only. Implementations of draft | as a matter of editorial convenience only. Implementations of draft | |||
| versions MUST NOT identify using this string. | versions MUST NOT identify using this string. | |||
| skipping to change at page 8, line 5 ¶ | skipping to change at page 8, line 41 ¶ | |||
| Non-compatible experiments that are based on these draft versions | Non-compatible experiments that are based on these draft versions | |||
| MUST instead replace the string "draft" with a different identifier. | MUST instead replace the string "draft" with a different identifier. | |||
| For example, an experimental implementation of packet mood-based | For example, an experimental implementation of packet mood-based | |||
| encoding based on draft-ietf-httpbis-http2-07 might identify itself | encoding based on draft-ietf-httpbis-http2-07 might identify itself | |||
| as "HTTP-emo-07/2.0". Note that any label MUST conform to the | as "HTTP-emo-07/2.0". Note that any label MUST conform to the | |||
| "token" syntax defined in Section 3.2.6 of [HTTP-p1]. Experimenters | "token" syntax defined in Section 3.2.6 of [HTTP-p1]. Experimenters | |||
| are encouraged to coordinate their experiments on the | are encouraged to coordinate their experiments on the | |||
| ietf-http-wg@w3.org mailing list. | ietf-http-wg@w3.org mailing list. | |||
| 2.2. Starting HTTP/2.0 for "http:" URIs | 3.2. Starting HTTP/2.0 for "http" URIs | |||
| A client that makes a request to an "http:" URI without prior | A client that makes a request to an "http" URI without prior | |||
| knowledge about support for HTTP/2.0 uses the HTTP Upgrade mechanism | knowledge about support for HTTP/2.0 uses the HTTP Upgrade mechanism | |||
| (Section 6.7 of [HTTP-p1]). The client makes an HTTP/1.1 request | (Section 6.7 of [HTTP-p1]). The client makes an HTTP/1.1 request | |||
| that includes an Upgrade header field identifying HTTP/2.0. | that includes an Upgrade header field identifying HTTP/2.0. The | |||
| HTTP/1.1 request MUST include an HTTP2-Settings (Section 3.2.1) | ||||
| header field. | ||||
| For example: | For example: | |||
| GET /default.htm HTTP/1.1 | GET /default.htm HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Connection: Upgrade | Connection: Upgrade, HTTP2-Settings | |||
| Upgrade: HTTP/2.0 | Upgrade: HTTP/2.0 | |||
| HTTP2-Settings: <base64url encoding of HTTP/2.0 SETTINGS payload> | ||||
| Requests that contain a request entity body MUST be sent in their | ||||
| entirety before the client can send HTTP/2.0 frames. This means that | ||||
| a large request entity can block the use of the connection until it | ||||
| is completely sent. | ||||
| If concurrency of an initial request with subsequent requests is | ||||
| important, a small request can be used to perform the upgrade to | ||||
| HTTP/2.0, at the cost of an additional round trip. | ||||
| A server that does not support HTTP/2.0 can respond to the request as | A server that does not support HTTP/2.0 can respond to the request as | |||
| though the Upgrade header field were absent: | though the Upgrade header field were absent: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-length: 243 | Content-length: 243 | |||
| Content-type: text/html | Content-type: text/html | |||
| ... | ||||
| A server that supports HTTP/2.0 can accept the upgrade with a 101 | ... | |||
| A server that supports HTTP/2.0 accepts the upgrade with a 101 | ||||
| (Switching Protocols) status code. After the empty line that | (Switching Protocols) status code. After the empty line that | |||
| terminates the 101 response, the server can begin sending HTTP/2.0 | terminates the 101 response, the server can begin sending HTTP/2.0 | |||
| frames. These frames MUST include a response to the request that | frames. These frames MUST include a response to the request that | |||
| initiated the Upgrade. | initiated the Upgrade. | |||
| HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Upgrade: HTTP/2.0 | Upgrade: HTTP/2.0 | |||
| [ HTTP/2.0 connection ... | [ HTTP/2.0 connection ... | |||
| The first HTTP/2.0 frame sent by the server is a SETTINGS frame | The first HTTP/2.0 frame sent by the server is a SETTINGS frame | |||
| (Section 3.8.4). Upon receiving the 101 response, the client sends a | (Section 6.5). Upon receiving the 101 response, the client sends a | |||
| connection header (Section 3.2), which includes a SETTINGS frame. | connection header (Section 3.5), which includes a SETTINGS frame. | |||
| 2.3. Starting HTTP/2.0 for "https:" URIs | The HTTP/1.1 request that is sent prior to upgrade is associated with | |||
| stream 1 and is assigned the highest possible priority. Stream 1 is | ||||
| implicitly half closed from the client toward the server, since the | ||||
| request is completed as an HTTP/1.1 request. After commencing the | ||||
| HTTP/2.0 connection, stream 1 is used for the response. | ||||
| A client that makes a request to an "https:" URI without prior | 3.2.1. HTTP2-Settings Header Field | |||
| A client that upgrades from HTTP/1.1 to HTTP/2.0 MUST include an | ||||
| "HTTP2-Settings" header field. The "HTTP2-Settings" header field is | ||||
| a hop-by-hop header field that includes settings that govern the | ||||
| HTTP/2.0 connection, provided in anticipation of the server accepting | ||||
| the request to upgrade. A server MUST reject an attempt to upgrade | ||||
| if this header is not present. | ||||
| HTTP2-Settings = token68 | ||||
| The content of the "HTTP2-Settings" header field is the payload of a | ||||
| SETTINGS frame (Section 6.5), encoded as a base64url string (that is, | ||||
| the URL- and filename-safe Base64 encoding described in Section 5 of | ||||
| [RFC4648], with any trailing '=' characters omitted). The ABNF | ||||
| [RFC5234] production for "token68" is defined in Section 2.1 of | ||||
| [HTTP-p7]. | ||||
| The client MUST include values for the following settings | ||||
| (Section 6.5.1): | ||||
| o SETTINGS_MAX_CONCURRENT_STREAMS | ||||
| o SETTINGS_INITIAL_WINDOW_SIZE | ||||
| As a hop-by-hop header field, the "Connection" header field MUST | ||||
| include a value of "HTTP2-Settings" in addition to "Upgrade" when | ||||
| upgrading to HTTP/2.0. | ||||
| A server decodes and interprets these values as it would any other | ||||
| SETTINGS frame. Providing these values in the Upgrade request | ||||
| ensures that the protocol does not require default values for the | ||||
| above settings, and gives a client an opportunity to provide other | ||||
| settings prior to receiving any frames from the server. | ||||
| 3.3. Starting HTTP/2.0 for "https" URIs | ||||
| A client that makes a request to an "https" URI without prior | ||||
| knowledge about support for HTTP/2.0 uses TLS [RFC5246] with the | knowledge about support for HTTP/2.0 uses TLS [RFC5246] with the | |||
| application layer protocol negotiation extension [TLSALPN]. | application layer protocol negotiation extension [TLSALPN]. | |||
| Once TLS negotiation is complete, both the client and the server send | Once TLS negotiation is complete, both the client and the server send | |||
| a connection header (Section 3.2). | a connection header (Section 3.5). | |||
| 2.4. Starting HTTP/2.0 with Prior Knowledge | 3.4. Starting HTTP/2.0 with Prior Knowledge | |||
| A client can learn that a particular server supports HTTP/2.0 by | A client can learn that a particular server supports HTTP/2.0 by | |||
| other means. A client MAY immediately send HTTP/2.0 frames to a | other means. A client MAY immediately send HTTP/2.0 frames to a | |||
| server that is known to support HTTP/2.0. This only affects the | server that is known to support HTTP/2.0, after the connection header | |||
| resolution of "http:" URIs, servers supporting HTTP/2.0 are required | (Section 3.5). This only affects the resolution of "http" URIs; | |||
| to support protocol negotiation in TLS [TLSALPN] for "https:" URIs. | servers supporting HTTP/2.0 are required to support protocol | |||
| negotiation in TLS [TLSALPN] for "https" URIs. | ||||
| Prior support for HTTP/2.0 is not a strong signal that a given server | Prior support for HTTP/2.0 is not a strong signal that a given server | |||
| will support HTTP/2.0 for future connections. It is possible for | will support HTTP/2.0 for future connections. It is possible for | |||
| server configurations to change or for configurations to differ | server configurations to change or for configurations to differ | |||
| between instances in clustered server. Interception proxies (a.k.a. | between instances in clustered server. Interception proxies (a.k.a. | |||
| "transparent" proxies) are another source of variability. | "transparent" proxies) are another source of variability. | |||
| 3. HTTP/2.0 Framing Layer | 3.5. Connection Header | |||
| 3.1. Connection | ||||
| The HTTP/2.0 connection is an Application Level protocol running on | ||||
| top of a TCP connection ([RFC0793]). The client is the TCP | ||||
| connection initiator. | ||||
| HTTP/2.0 connections are persistent. That is, for best performance, | ||||
| it is expected a clients will not close connections until it is | ||||
| determined that no further communication with a server is necessary | ||||
| (for example, when a user navigates away from a particular web page), | ||||
| or until the server closes the connection. | ||||
| Servers are encouraged to maintain open connections for as long as | ||||
| possible, but are permitted to terminate idle connections if | ||||
| necessary. When either endpoint chooses to close the transport-level | ||||
| TCP connection, the terminating endpoint MUST first send a GOAWAY | ||||
| (Section 3.8.7) frame so that both endpoints can reliably determine | ||||
| whether previously sent frames have been processed and gracefully | ||||
| complete or terminate any necessary remaining tasks. | ||||
| 3.2. Connection Header | ||||
| Upon establishment of a TCP connection and determination that | Upon establishment of a TCP connection and determination that | |||
| HTTP/2.0 will be used by both peers to communicate, each endpoint | HTTP/2.0 will be used by both peers, each endpoint MUST send a | |||
| MUST send a connection header as a final confirmation and to | connection header as a final confirmation and to establish the | |||
| establish the default parameters for the HTTP/2.0 connection. | initial settings for the HTTP/2.0 connection. | |||
| The client connection header is a sequence of 24 octets (in hex | The client connection header is a sequence of 24 octets, which in hex | |||
| notation) | notation are: | |||
| 464f4f202a20485454502f322e300d0a0d0a42410d0a0d0a | 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | |||
| (the string "FOO * HTTP/2.0\r\n\r\nBA\r\n\r\n") followed by a | ||||
| SETTINGS frame (Section 3.8.4). The client sends the client | (the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n") followed by a | |||
| connection header immediately upon receipt of a 101 Switching | SETTINGS frame (Section 6.5). The client sends the client connection | |||
| Protocols response (indicating a successful upgrade), or after | header immediately upon receipt of a 101 Switching Protocols response | |||
| receiving a TLS Finished message from the server. If starting an | (indicating a successful upgrade), or after receiving a TLS Finished | |||
| HTTP/2.0 connection with prior knowledge of server support for the | message from the server. If starting an HTTP/2.0 connection with | |||
| protocol, the client connection header is sent upon connection | prior knowledge of server support for the protocol, the client | |||
| establishment. | connection header is sent upon connection establishment. | |||
| The client connection header is selected so that a large | The client connection header is selected so that a large | |||
| proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do | proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do | |||
| not attempt to process further frames. Note that this does not | not attempt to process further frames. Note that this does not | |||
| address the concerns raised in [TALKING]. | address the concerns raised in [TALKING]. | |||
| The server connection header consists of just a SETTINGS frame | The server connection header consists of just a SETTINGS frame | |||
| (Section 3.8.4) that MUST be the first frame the server sends in the | (Section 6.5) that MUST be the first frame the server sends in the | |||
| HTTP/2.0 connection. | HTTP/2.0 connection. | |||
| To avoid unnecessary latency, clients are permitted to send | To avoid unnecessary latency, clients are permitted to send | |||
| additional frames to the server immediately after sending the client | additional frames to the server immediately after sending the client | |||
| connection header, without waiting to receive the server connection | connection header, without waiting to receive the server connection | |||
| header. It is important to note, however, that the server connection | header. It is important to note, however, that the server connection | |||
| header SETTINGS frame might include parameters that necessarily alter | header SETTINGS frame might include parameters that necessarily alter | |||
| how a client is expected to communicate with the server. Upon | how a client is expected to communicate with the server. Upon | |||
| receiving the SETTINGS frame, the client is expected to honor any | receiving the SETTINGS frame, the client is expected to honor any | |||
| parameters established. | parameters established. | |||
| Clients and servers MUST terminate the TCP connection if either peer | Clients and servers MUST terminate the TCP connection if either peer | |||
| does not begin with a valid connection header. A GOAWAY frame | does not begin with a valid connection header. A GOAWAY frame | |||
| (Section 3.8.7) MAY be omitted if it is clear that the peer is not | (Section 6.8) MAY be omitted if it is clear that the peer is not | |||
| using HTTP/2.0. | using HTTP/2.0. | |||
| 3.3. Framing | 4. HTTP Frames | |||
| Once the HTTP/2.0 connection is established, clients and servers can | Once the HTTP/2.0 connection is established, endpoints can begin | |||
| begin exchanging frames. | exchanging frames. | |||
| 3.3.1. Frame Header | 4.1. Frame Header | |||
| HTTP/2.0 frames share a common base format consisting of an 8-byte | All frames begin with an 8-octet header followed by a payload of | |||
| header followed by 0 to 65535 bytes of data. | between 0 and 65,535 octets. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (16) | Type (8) | Flags (8) | | | Length (16) | Type (8) | Flags (8) | | |||
| +-+-------------+---------------+-------------------------------+ | +-+-------------+---------------+-------------------------------+ | |||
| |R| Stream Identifier (31) | | |R| Stream Identifier (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| | Frame Data (0...) ... | | Frame Payload (0...) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Frame Header | Frame Header | |||
| The fields of the frame header are defined as: | The fields of the frame header are defined as: | |||
| Length: The length of the frame data expressed as an unsigned 16-bit | Length: The length of the frame payload expressed as an unsigned 16- | |||
| integer. The 8 bytes of the frame header are not included in this | bit integer. The 8 octets of the frame header are not included in | |||
| value. | this value. | |||
| Type: The 8-bit type of the frame. The frame type determines how | Type: The 8-bit type of the frame. The frame type determines how | |||
| the remainder of the frame header and data are interpreted. | the remainder of the frame header and payload are interpreted. | |||
| Implementations MUST ignore unsupported and unrecognized frame | Implementations MUST ignore unsupported and unrecognized frame | |||
| types. | types. | |||
| Flags: An 8-bit field reserved for frame-type specific boolean | Flags: An 8-bit field reserved for frame-type specific boolean | |||
| flags. | flags. | |||
| The least significant bit (0x1) - the FINAL bit - is defined for | Flags are assigned semantics specific to the indicated frame type. | |||
| all frame types as an indication that this frame is the last the | Flags that have no defined semantics for a particular frame type | |||
| endpoint will send for the identified stream. Setting this flag | MUST be ignored, and MUST be left unset (0) when sending. | |||
| causes the stream to enter the half-closed state (Section 3.4.3). | ||||
| Implementations MUST process the FINAL bit for all frames whose | ||||
| stream identifier field is not 0x0. The FINAL bit MUST NOT be set | ||||
| on frames that use a stream identifier of 0. | ||||
| The remaining flags can be assigned semantics specific to the | ||||
| indicated frame type. Flags that have no defined semantics for a | ||||
| particular frame type MUST be ignored, and MUST be left unset (0) | ||||
| when sending. | ||||
| R: A reserved 1-bit field. The semantics of this bit are undefined | R: A reserved 1-bit field. The semantics of this bit are undefined | |||
| and the bit MUST remain unset (0) when sending and MUST be ignored | and the bit MUST remain unset (0) when sending and MUST be ignored | |||
| when receiving. | when receiving. | |||
| Stream Identifier: A 31-bit stream identifier (see Section 3.4.1). | Stream Identifier: A 31-bit stream identifier (see Section 5.1.1). | |||
| A value 0 is reserved for frames that are associated with the | A value 0 is reserved for frames that are associated with the | |||
| connection as a whole as opposed to an individual stream. | connection as a whole as opposed to an individual stream. | |||
| The structure and content of the remaining frame data is dependent | The structure and content of the frame payload is dependent entirely | |||
| entirely on the frame type. | on the frame type. | |||
| 3.3.2. Frame Size | 4.2. Frame Size | |||
| Implementations with limited resources might not be capable of | The maximum size of a frame payload varies by frame type and use. | |||
| processing large frame sizes. Such implementations MAY choose to | The absolute maximum size is 65,535 octets. All implementations | |||
| place additional limits on the maximum frame size. However, all | SHOULD be capable of receiving and minimally processing frames up to | |||
| implementations MUST be capable of receiving and processing frames | this size. | |||
| containing at least 8192 octets of data. [[anchor6: Ed. Question: | ||||
| Does this minimum include the 8-byte header or just the frame data?]] | ||||
| An implementation MUST terminate a stream immediately if it is unable | Certain frame types, such as PING (see Section 6.7), impose | |||
| to process a frame due it's size. This is done by sending an | additional limits on the amount of payload data allowed. Likewise, | |||
| RST_STREAM frame (Section 3.8.3) containing the FRAME_TOO_LARGE error | additional size limits can be set by specific application uses (see | |||
| code. | Section 9). | |||
| [[anchor7: <https://github.com/http2/http2-spec/issues/28>: Need a | If a frame size exceeds any defined limit, or is too small to contain | |||
| way to signal the maximum frame size; no way to RST_STREAM on non- | mandatory frame data, the endpoint MUST send a FRAME_TOO_LARGE error. | |||
| stream-related frames.]] | Frame size errors in frames that affect connection-level state MUST | |||
| be treated as a connection error (Section 5.4.1). | ||||
| 3.4. Streams | 4.3. Header Compression and Decompression | |||
| A "stream" is an independent, bi-directional sequence of frames | A header in HTTP/2.0 is a name-value pair with one or more associated | |||
| exchanged between the client and server within an HTTP/2.0 | values. They are used within HTTP request and response messages as | |||
| connection. Streams have several important characteristics: | well as server push operations (see Section 8.2). | |||
| o Streams can be established and used unilaterally or shared by | Header sets are logical collections of zero or more header fields | |||
| either the client or server. | arranged at the application layer. When transmitted over a | |||
| connection, the header set is serialized into a header block using | ||||
| HTTP Header Compression [COMPRESSION]. The serialized header block | ||||
| is then divided into one or more octet sequences, called header block | ||||
| fragments, and transmitted within the payload of HEADERS | ||||
| (Section 6.2) or PUSH_PROMISE (Section 6.6) frames. The receiving | ||||
| endpoint reassembles the header block by concatenating the individual | ||||
| fragments, then decompresses the block to reconstruct the header set. | ||||
| o Streams can be rejected or cancelled by either endpoint. | Header block fragments can only be sent as the payload of HEADERS or | |||
| PUSH_PROMISE frames. | ||||
| o Multiple types of frames can be sent by either endpoint within a | A compressed and encoded header block is transmitted in one or more | |||
| single stream. | HEADERS or PUSH_PROMISE frames. If the number of octets in the block | |||
| is greater than the space remaining in the frame, the block is | ||||
| divided into multiple fragments, which are then transmitted in | ||||
| multiple frames. | ||||
| o The order in which frames are sent within a stream is significant. | Header blocks MUST be transmitted as a contiguous sequence of frames, | |||
| Recipients are required to process frames in the order they are | with no interleaved frames of any other type, or from any other | |||
| received. | stream. The last frame in a sequence of HEADERS frames MUST have the | |||
| END_HEADERS flag set. The last frame in a sequence of PUSH_PROMISE | ||||
| frames MUST have the END_PUSH_PROMISE flag set. | ||||
| o Streams optionally carry a set of name-value header pairs that are | HEADERS and PUSH_PROMISE frames carry data that can modify the | |||
| expressed within the headers block of HEADERS+PRIORITY, HEADERS, | compression context maintained by a receiver. An endpoint receiving | |||
| or PUSH_PROMISE frames. | HEADERS or PUSH_PROMISE frames MUST reassemble header blocks and | |||
| perform decompression even if the frames are to be discarded, which | ||||
| is likely to occur after a stream is reset. A receiver MUST | ||||
| terminate the connection with a connection error (Section 5.4.1) of | ||||
| type COMPRESSION_ERROR, if it does not decompress a header block. | ||||
| 5. Streams and Multiplexing | ||||
| A "stream" is an independent, bi-directional sequence of HEADER and | ||||
| DATA frames exchanged between the client and server within an | ||||
| HTTP/2.0 connection. Streams have several important characteristics: | ||||
| o A single HTTP/2.0 connection can contain multiple concurrently | o A single HTTP/2.0 connection can contain multiple concurrently | |||
| active streams, with either endpoint interleaving frames from | active streams, with either endpoint interleaving frames from | |||
| multiple streams. | multiple streams. | |||
| 3.4.1. Stream Creation | o Streams can be established and used unilaterally or shared by | |||
| either the client or server. | ||||
| There is no coordination or shared action between the client and | ||||
| server required to create a stream. Rather, new streams are | ||||
| established by sending a frame whose stream identifier field | ||||
| references a previously unused stream identifier. | ||||
| All streams are identified by an unsigned 31-bit integer. Streams | ||||
| initiated by a client use odd numbered stream identifiers; those | ||||
| initiated by the server use even numbered stream identifiers. A | ||||
| stream identifier of zero MUST NOT be used to establish a new stream. | ||||
| The identifier of a newly established stream MUST be numerically | ||||
| greater than all previously established streams from that endpoint | ||||
| within the HTTP/2.0 connection, unless the identifier has been | ||||
| reserved using a PUSH_PROMISE (Section 3.8.5) frame. An endpoint | ||||
| that receives an unexpected stream identifier MUST respond with a | ||||
| connection error (Section 3.5.1) of type PROTOCOL_ERROR. | ||||
| A peer can limit the total number of concurrently active streams | ||||
| using the SETTINGS_MAX_CONCURRENT_STREAMS parameters within a | ||||
| SETTINGS frame. The maximum concurrent streams setting is specific | ||||
| to each endpoint and applies only to the peer. That is, clients | ||||
| specify the maximum number of concurrent streams the server can | ||||
| initiate, and servers specify the maximum number of concurrent | ||||
| streams the client can initiate. Peer endpoints MUST NOT exceed this | ||||
| limit. All concurrently active streams initiated by an endpoint, | ||||
| including streams that are half-open (Section 3.4.3) in any | ||||
| direction, count toward that endpoint's limit. | ||||
| Stream identifiers cannot be reused within a connection. Long-lived | ||||
| connections can cause an endpoint to exhaust the available range of | ||||
| stream identifiers. A client that is unable to establish a new | ||||
| stream identifier can establish a new connection for new streams. | ||||
| Either endpoint can request the early termination of an unwanted | ||||
| stream by sending an RST_STREAM frame (Section 3.5.2) with an error | ||||
| code of either REFUSED_STREAM (if no frames have been processed) or | ||||
| CANCEL (if at least one frame has been processed). Such termination | ||||
| might not take effect immediately as the peer might have sent | ||||
| additional frames on the stream prior to receiving the termination | ||||
| request. | ||||
| 3.4.2. Stream priority | ||||
| The endpoint establishing a new stream can assign a priority for the | o Streams can be closed by either endpoint. | |||
| stream. Priority is represented as an unsigned 31-bit integer. 0 | ||||
| represents the highest priority and 2^31-1 represents the lowest | ||||
| priority. | ||||
| The purpose of this value is to allow the initiating endpoint to | o The order in which frames are sent within a stream is significant. | |||
| request that frames for the stream be processed with higher priority | Recipients process frames in the order they are received. | |||
| relative to any other concurrently active streams. That is, if an | ||||
| endpoint receives interleaved frames for multiple streams, the | ||||
| endpoint ought to make a best-effort attempt at processing frames for | ||||
| higher priority streams before processing those for lower priority | ||||
| streams. | ||||
| Explicitly setting the priority for a stream does not guarantee any | o Streams are identified by an integer. Stream identifiers are | |||
| particular processing order for the stream relative to any other | assigned to streams by the endpoint that initiates a stream. | |||
| stream. Nor is there is any mechanism provided by which the | ||||
| initiator of a stream can force or require a receiving endpoint to | ||||
| process frames from one stream before processing frames from another. | ||||
| 3.4.3. Stream half-close | 5.1. Stream States | |||
| When an endpoint sends a frame for a stream with the FINAL flag set, | The lifecycle of a stream is shown in Figure 1. | |||
| the stream is considered to be half-closed for that endpoint. | ||||
| Subsequent frames MUST NOT be sent by that endpoint for the half | ||||
| closed stream for the remaining duration of the HTTP/2.0 connection. | ||||
| When both endpoints have sent frames with the FINAL flag set, the | ||||
| stream is considered to be fully closed. | ||||
| If an endpoint receives additional frames for a stream that was | +--------+ | |||
| previously half-closed by the sending peer, the recipient MUST | PP | | PP | |||
| respond with a stream error (Section 3.5.2) of type STREAM_CLOSED. | ,--------| idle |--------. | |||
| / | | \ | ||||
| v +--------+ v | ||||
| +----------+ | +----------+ | ||||
| | | | H | | | ||||
| ,---| reserved | | | reserved |---. | ||||
| | | (local) | v | (remote) | | | ||||
| | +----------+ +--------+ +----------+ | | ||||
| | | ES | | ES | | | ||||
| | | H ,-------| open |-------. | H | | ||||
| | | / | | \ | | | ||||
| | v v +--------+ v v | | ||||
| | +----------+ | +----------+ | | ||||
| | | half | | | half | | | ||||
| | | closed | | R | closed | | | ||||
| | | (remote) | | | (local) | | | ||||
| | +----------+ | +----------+ | | ||||
| | | v | | | ||||
| | | ES / R +--------+ ES / R | | | ||||
| | `----------->| |<-----------' | | ||||
| | R | closed | R | | ||||
| `-------------------->| |<--------------------' | ||||
| +--------+ | ||||
| An endpoint that has not yet half-closed a stream by sending the | Figure 1: Stream States | |||
| FINAL flag can continue sending frames on the stream. | ||||
| It is not necessary for an endpoint to half-close a stream for which | Both endpoints have a subjective view of the state of a stream that | |||
| it has not sent any frames. This allows endpoints to use fully | could be different when frames are in transit. Endpoints do not | |||
| unidirectional streams that do not require explicit action or | coordinate the creation of streams, they are created unilaterally by | |||
| acknowledgement from the receiver. | either endpoint. The negative consequences of a mismatch in states | |||
| are limited to the "closed" state after sending RST_STREAM, where | ||||
| frames might be received for some time after closing. | ||||
| 3.4.4. Stream close | Streams have the following states: | |||
| Streams can be terminated in the following ways: | idle: | |||
| All streams start in the "idle" state. In this state, no frames | ||||
| have been exchanged. | ||||
| Normal termination: Normal stream termination occurs when both | The following transitions are valid from this state: | |||
| client and server have half-closed the stream by sending a frame | ||||
| containing a FINAL flag (Section 3.3.1). | ||||
| Half-close on unidirectional stream: A stream that only has frames | * Sending or receiving a HEADERS frame causes the stream to | |||
| sent in one direction can be tentatively considered to be closed | become "open". The stream identifier is selected as described | |||
| once a frame containing a FINAL flag is sent. The active sender | in Section 5.1.1. | |||
| on the stream MUST be prepared to receive frames after closing the | ||||
| stream. | ||||
| Abrupt termination: Either peer can send a RST_STREAM control frame | * Sending a PUSH_PROMISE frame marks the associated stream for | |||
| at any time to terminate an active stream. RST_STREAM contains an | later use. The stream state for the reserved stream | |||
| error code to indicate the reason for termination. A RST_STREAM | transitions to "reserved (local)". | |||
| indicates that the sender will transmit no further data on the | ||||
| stream and that the receiver is advised to cease transmission on | ||||
| it. | ||||
| The sender of a RST_STREAM frame MUST allow for frames that have | * Receiving a PUSH_PROMISE frame marks the associated stream as | |||
| already been sent by the peer prior to the RST_STREAM being | reserved by the remote peer. The state of the stream becomes | |||
| processed. If in-transit frames alter connection state, these | "reserved (remote)". | |||
| frames cannot be safely discarded. See Stream Error Handling | ||||
| (Section 3.5.2) for more details. | ||||
| TCP connection teardown: If the TCP connection is torn down while | reserved (local): | |||
| un-closed streams exist, then the endpoint MUST assume that the | A stream in the "reserved (local)" state is one that has been | |||
| stream was abnormally interrupted and may be incomplete. | promised by sending a PUSH_PROMISE frame. A PUSH_PROMISE frame | |||
| reserves an idle stream by associating the stream with an open | ||||
| stream that was initiated by the remote peer (see Section 8.2). | ||||
| 3.5. Error Handling | In this state, only the following transitions are possible: | |||
| HTTP/2.0 framing permits two classes of error: | * The endpoint can send a HEADERS frame. This causes the stream | |||
| to open in a "half closed (remote)" state. | ||||
| o An error condition that renders the entire connection unusable is | * Either endpoint can send a RST_STREAM frame to cause the stream | |||
| a connection error. | to become "closed". This releases the stream reservation. | |||
| o An error in an individual stream is a stream error. | An endpoint MUST NOT send any other type of frame in this state. | |||
| 3.5.1. Connection Error Handling | reserved (remote): | |||
| A stream in the "reserved (remote)" state has been reserved by a | ||||
| remote peer. | ||||
| A connection error is any error which prevents further processing of | In this state, only the following transitions are possible: | |||
| the framing layer or which corrupts any connection state. | ||||
| An endpoint that encounters a connection error MUST first send a | * Receiving a HEADERS frame causes the stream to transition to | |||
| GOAWAY (Section 3.8.7) frame with the stream identifier of the last | "half closed (local)". | |||
| stream that it successfully received from its peer. The GOAWAY frame | ||||
| includes an error code that indicates why the connection is | ||||
| terminating. After sending the GOAWAY frame, the endpoint MUST close | ||||
| the TCP connection. | ||||
| It is possible that the GOAWAY will not be reliably received by the | * Either endpoint can send a RST_STREAM frame to cause the stream | |||
| receiving endpoint. In the event of a connection error, GOAWAY only | to become "closed". This releases the stream reservation. | |||
| provides a best-effort attempt to communicate with the peer about why | ||||
| the connection is being terminated. | ||||
| An endpoint can end a connection at any time. In particular, an | Receiving any other type of frame MUST be treated as a stream | |||
| endpoint MAY choose to treat a stream error as a connection error if | error (Section 5.4.2) of type PROTOCOL_ERROR. | |||
| the error is recurrent. Endpoints SHOULD send a GOAWAY frame when | ||||
| ending a connection, as long as circumstances permit it. | ||||
| 3.5.2. Stream Error Handling | open: | |||
| The "open" state is where both peers can send frames. In this | ||||
| state, sending peers observe advertised stream level flow control | ||||
| limits (Section 5.2). | ||||
| A stream error is an error related to a specific stream identifier | From this state either endpoint can send a frame with a END_STREAM | |||
| that does not affect processing of other streams at the framing | flag set, which causes the stream to transition into one of the | |||
| layer. | "half closed" states: an endpoint sending a END_STREAM flag causes | |||
| the stream state to become "half closed (local)"; an endpoint | ||||
| receiving a END_STREAM flag causes the stream state to become | ||||
| "half closed (remote)". | ||||
| An endpoint that detects a stream error sends a RST_STREAM | Either endpoint can send a RST_STREAM frame from this state, | |||
| (Section 3.8.3) frame that contains the stream identifier of the | causing it to transition immediately to "closed". | |||
| stream where the error occurred. The RST_STREAM frame includes an | ||||
| error code that indicates the type of error. | ||||
| A RST_STREAM is the last frame that an endpoint can send on a stream. | half closed (local): | |||
| The peer that sends the RST_STREAM frame MUST be prepared to receive | A stream that is "half closed (local)" cannot be used for sending | |||
| any frames that were sent or enqueued for sending by the remote peer. | frames. | |||
| These frames can be ignored, except where they modify connection | ||||
| state (such as the state maintained for header compression | ||||
| (Section 3.7)). | ||||
| Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame | A stream transitions from this state to "closed" when a frame that | |||
| for any stream. However, an endpoint MAY send additional RST_STREAM | contains a END_STREAM flag is received, or when either peer sends | |||
| frames if it receives frames on a closed stream after more than a | a RST_STREAM frame. | |||
| round trip time. This behavior is permitted to deal with misbehaving | ||||
| implementations. | ||||
| An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | half closed (remote): | |||
| frame, to avoid looping. | A stream that is "half closed (remote)" is no longer being used by | |||
| the peer to send frames. In this state, an endpoint is no longer | ||||
| obligated to maintain a receiver flow control window if it | ||||
| performs flow control. | ||||
| 3.5.3. Error Codes | If an endpoint receives additional frames for a stream that is in | |||
| this state it MUST respond with a stream error (Section 5.4.2) of | ||||
| type STREAM_CLOSED. | ||||
| Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | A stream can transition from this state to "closed" by sending a | |||
| frames to convey the reasons for the stream or connection error. | frame that contains a END_STREAM flag, or when either peer sends a | |||
| RST_STREAM frame. | ||||
| Error codes share a common code space. Some error codes only apply | closed: | |||
| to specific conditions and have no defined semantics in certain frame | The "closed" state is the terminal state. | |||
| types. | ||||
| The following error codes are defined: | An endpoint MUST NOT send frames on a closed stream. An endpoint | |||
| that receives a frame after receiving a RST_STREAM or a frame | ||||
| containing a END_STREAM flag on that stream MUST treat that as a | ||||
| stream error (Section 5.4.2) of type STREAM_CLOSED. | ||||
| NO_ERROR (0): The associated condition is not as a result of an | If this state is reached as a result of sending a RST_STREAM | |||
| error. For example, a GOAWAY might include this code to indicate | frame, the peer that receives the RST_STREAM might have already | |||
| graceful shutdown of a connection. | sent - or enqueued for sending - frames on the stream that cannot | |||
| be withdrawn. An endpoint that sends a RST_STREAM frame MUST | ||||
| ignore frames that it receives on closed streams after it has sent | ||||
| a RST_STREAM frame. An endpoint MAY choose to limit the period | ||||
| over which it ignores frames and treat frames that arrive after | ||||
| this time as being in error. | ||||
| PROTOCOL_ERROR (1): The endpoint detected an unspecific protocol | An endpoint might receive a PUSH_PROMISE frame after it sends | |||
| error. This error is for use when a more specific error code is | RST_STREAM. PUSH_PROMISE causes a stream to become "reserved". | |||
| not available. | If promised streams are not desired, a RST_STREAM can be used to | |||
| close any of those streams. | ||||
| INTERNAL_ERROR (2): The endpoint encountered an unexpected internal | 5.1.1. Stream Identifiers | |||
| error. | ||||
| FLOW_CONTROL_ERROR (3): The endpoint detected that its peer violated | Streams are identified with an unsigned 31-bit integer. Streams | |||
| the flow control protocol. | initiated by a client MUST use odd-numbered stream identifiers; those | |||
| initiated by the server MUST use even-numbered stream identifiers. A | ||||
| stream identifier of zero (0x0) is used for connection control | ||||
| message; the stream identifier zero MUST NOT be used to establish a | ||||
| new stream. | ||||
| INVALID_STREAM (4): The endpoint received a frame for an inactive | The identifier of a newly established stream MUST be numerically | |||
| stream. | greater than all streams that the initiating endpoint has opened or | |||
| reserved. This governs streams that are opened using a HEADERS frame | ||||
| and streams that are reserved using PUSH_PROMISE. An endpoint that | ||||
| receives an unexpected stream identifier MUST respond with a | ||||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| STREAM_CLOSED (5): The endpoint received a frame after a stream was | Stream identifiers cannot be reused. Long-lived connections can | |||
| half-closed. | result in endpoint exhausting the available range of stream | |||
| identifiers. A client that is unable to establish a new stream | ||||
| identifier can establish a new connection for new streams. | ||||
| FRAME_TOO_LARGE (6): The endpoint received a frame that was larger | 5.1.2. Stream Concurrency | |||
| than the maximum size that it supports. | ||||
| REFUSED_STREAM (7): The endpoint is refusing the stream before | A peer can limit the number of concurrently active streams using the | |||
| processing its payload. | SETTINGS_MAX_CONCURRENT_STREAMS parameters within a SETTINGS frame. | |||
| The maximum concurrent streams setting is specific to each endpoint | ||||
| and applies only to the peer that receives the setting. That is, | ||||
| clients specify the maximum number of concurrent streams the server | ||||
| can initiate, and servers specify the maximum number of concurrent | ||||
| streams the client can initiate. Endpoints MUST NOT exceed the limit | ||||
| set by their peer. | ||||
| CANCEL (8): Used by the creator of a stream to indicate that the | Streams that are in the "open" state, or either of the "half closed" | |||
| stream is no longer needed. | states count toward the maximum number of streams that an endpoint is | |||
| permitted to open. Streams in any of these three states count toward | ||||
| the limit advertised in the SETTINGS_MAX_CONCURRENT_STREAMS setting | ||||
| (see Section 6.5.2). | ||||
| COMPRESSION_ERROR (9): The endpoint is unable to maintain the | Streams in either of the "reserved" states do not count as open, even | |||
| compression context for the connection. | if a small amount of application state is retained to ensure that the | |||
| promised stream can be successfully used. | ||||
| 3.6. Stream 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. | interfere with each other. Flow control is used for both individual | |||
| streams and for the connection as a whole. | ||||
| HTTP/2.0 provides for flow control through use of the WINDOW_UPDATE | HTTP/2.0 provides for flow control through use of the WINDOW_UPDATE | |||
| (Section 3.8.9) frame type. | (Section 6.9) frame type. | |||
| 3.6.1. Flow Control Principles | 5.2.1. Flow Control Principles | |||
| Experience with TCP congestion control has shown that algorithms can | Experience with TCP congestion control has shown that algorithms can | |||
| evolve over time to become more sophisticated without requiring | evolve over time to become more sophisticated without requiring | |||
| protocol changes. TCP congestion control and its evolution is | protocol changes. TCP congestion control and its evolution is | |||
| clearly different from HTTP/2.0 flow control, though the evolution of | clearly different from HTTP/2.0 flow control, though the evolution of | |||
| TCP congestion control algorithms shows that a similar approach could | TCP congestion control algorithms shows that a similar approach could | |||
| be feasible for HTTP/2.0 flow control. | be feasible for HTTP/2.0 flow control. | |||
| HTTP/2.0 stream flow control aims to allow for future improvements to | HTTP/2.0 stream flow control aims to allow for future improvements to | |||
| flow control algorithms without requiring protocol changes. Flow | flow control algorithms without requiring protocol changes. Flow | |||
| control in HTTP/2.0 has the following characteristics: | control in HTTP/2.0 has the following characteristics: | |||
| 1. Flow control is hop-by-hop, not end-to-end. | 1. Flow control is hop-by-hop, not end-to-end. | |||
| 2. Flow control is based on window update frames. Receivers | 2. Flow control is based on window update frames. Receivers | |||
| advertise how many octets they are prepared to receive on a | advertise how many bytes they are prepared to receive on a stream | |||
| stream. This is a credit-based scheme. | and for the entire connection. This is a credit-based scheme. | |||
| 3. Flow control is directional with overall control provided by the | 3. Flow control is directional with overall control provided by the | |||
| receiver. A receiver MAY choose to set any window size that it | receiver. A receiver MAY choose to set any window size that it | |||
| desires for each stream and for the entire connection. A sender | desires for each stream and for the entire connection. A sender | |||
| MUST respect flow control limits imposed by a receiver. Clients, | MUST respect flow control limits imposed by a receiver. Clients, | |||
| servers and intermediaries all independently advertise their flow | servers and intermediaries all independently advertise their flow | |||
| control preferences as a receiver and abide by the flow control | control preferences as a receiver and abide by the flow control | |||
| limits set by their peer when sending. | limits set by their peer when sending. | |||
| 4. The initial value for the flow control window is 65536 bytes for | 4. The initial value for the flow control window is 65536 bytes for | |||
| both new streams and the overall connection. | 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. Flow control can be disabled by a receiver. A receiver can | 6. Flow control can be disabled by a receiver. A receiver can | |||
| choose to either disable flow control for a stream or connection | choose to either disable flow control for a stream or connection | |||
| by declaring an infinite flow control limit. | by sending a window update frame with a specific flag. See | |||
| Ending Flow Control (Section 6.9.4) for more details. | ||||
| 7. HTTP/2.0 standardizes only the format of the window update frame | 7. HTTP/2.0 standardizes only the format of the WINDOW_UPDATE frame | |||
| (Section 3.8.9). This does not stipulate how a receiver decides | (Section 6.9). This does not stipulate how a receiver decides | |||
| when to send this frame or the value that it sends. Nor does it | when to send this frame or the value that it sends. Nor does it | |||
| specify how a sender chooses to send packets. Implementations | specify how a sender chooses to send packets. Implementations | |||
| are able to select any algorithm that suits their needs. | are able to select any algorithm that suits their needs. | |||
| Implementations are also responsible for managing how requests and | Implementations are also responsible for managing how requests and | |||
| responses are sent based on priority; choosing how to avoid head of | responses are sent based on priority; choosing how to avoid head of | |||
| line blocking for requests; and managing the creation of new streams. | line blocking for requests; and managing the creation of new streams. | |||
| Algorithm choices for these could interact with any flow control | Algorithm choices for these could interact with any flow control | |||
| algorithm. | algorithm. | |||
| 3.6.2. Appropriate Use of Flow Control | 5.2.2. Appropriate Use of Flow Control | |||
| Flow control is defined to protect endpoints (client, server or | Flow control is defined to protect endpoints that are operating under | |||
| intermediary) that are operating under resource constraints. For | resource constraints. For example, a proxy needs to share memory | |||
| example, a proxy needs to share memory between many connections, and | between many connections, and also might have a slow upstream | |||
| also might have a slow upstream connection and a fast downstream one. | connection and a fast downstream one. Flow control addresses cases | |||
| Flow control addresses cases where the receiver is unable process | where the receiver is unable process data on one stream, yet wants to | |||
| data on one stream, yet wants to continue to process other streams in | continue to process other streams in the same connection. | |||
| the same connection. | ||||
| Deployments that do not require this capability SHOULD disable flow | Deployments that do not require this capability SHOULD disable flow | |||
| control for data that is being received. Note that flow control | control for data that is being received. Note that flow control | |||
| cannot be disabled for sending. Sending data is always subject to | cannot be disabled for sending. Sending data is always subject to | |||
| the flow control window advertised by the receiver. | the flow control window advertised by the receiver. | |||
| Deployments with constrained resources (for example, memory) MAY | Deployments with constrained resources (for example, memory) MAY | |||
| 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 [RFC1323]). | bandwidth-delay product (see [RFC1323]). | |||
| Even with full awareness of the current bandwidth-delay product, | Even with full awareness of the current bandwidth-delay product, | |||
| implementation of flow control is difficult. However, it can ensure | implementation of flow control is difficult. However, it can ensure | |||
| that constrained resources are protected without any reduction in | that constrained resources are protected without any reduction in | |||
| connection utilization. | connection utilization. | |||
| 3.7. Header Blocks | 5.3. Stream priority | |||
| The header block is found in the HEADERS, HEADERS+PRIORITY and | The endpoint establishing a new stream can assign a priority for the | |||
| PUSH_PROMISE frames. The header block consists of a set of header | stream. Priority is represented as an unsigned 31-bit integer. 0 | |||
| fields, which are name-value pairs. Headers are compressed using | represents the highest priority and 2^31-1 represents the lowest | |||
| black magic. | priority. | |||
| Compression of header fields is a work in progress, as is the format | The purpose of this value is to allow the initiating endpoint to | |||
| of this block. | request that frames for the stream be processed with a specified | |||
| priority relative to other concurrently active streams. That is, if | ||||
| an endpoint receives interleaved frames for multiple streams, the | ||||
| endpoint ought to make a best-effort attempt at processing frames for | ||||
| higher priority streams before processing those for lower priority | ||||
| streams. | ||||
| The contents of header blocks MUST be processed by the compression | Explicitly setting the priority for a stream does not guarantee any | |||
| context, even if stream has been reset or the frame is discarded. If | particular processing order for the stream relative to any other | |||
| header blocks cannot be processed, the receiver MUST treat the | stream. Nor is there any mechanism provided by which the initiator | |||
| connection with a connection error (Section 3.5.1) of type | of a stream can force or require a receiving endpoint to process | |||
| COMPRESSION_ERROR. | frames from one stream before processing frames from another. | |||
| 3.8. Frame Types | Unless explicitly specified in the HEADERS frame (Section 6.2) during | |||
| stream creation, the default stream priority is 2^30. Pushed streams | ||||
| (Section 8.2) are assumed to inherit the priority of the associated | ||||
| stream plus one (or 2^31-1 if the the associated stream priority is | ||||
| 2^31-1), i.e. they have priority one lower than the associated | ||||
| stream. | ||||
| 5.4. Error Handling | ||||
| HTTP/2.0 framing permits two classes of error: | ||||
| o An error condition that renders the entire connection unusable is | ||||
| a connection error. | ||||
| o An error in an individual stream is a stream error. | ||||
| A list of error codes is included in Section 7. | ||||
| 5.4.1. Connection Error Handling | ||||
| A connection error is any error which prevents further processing of | ||||
| the framing layer or which corrupts any connection state. | ||||
| An endpoint that encounters a connection error SHOULD first send a | ||||
| GOAWAY (Section 6.8) frame with the stream identifier of the last | ||||
| stream that it successfully received from its peer. The GOAWAY frame | ||||
| includes an error code that indicates why the connection is | ||||
| terminating. After sending the GOAWAY frame, the endpoint MUST close | ||||
| the TCP connection. | ||||
| It is possible that the GOAWAY will not be reliably received by the | ||||
| receiving endpoint. In the event of a connection error, GOAWAY only | ||||
| provides a best-effort attempt to communicate with the peer about why | ||||
| the connection is being terminated. | ||||
| An endpoint can end a connection at any time. In particular, an | ||||
| endpoint MAY choose to treat a stream error as a connection error if | ||||
| the error is recurrent. Endpoints SHOULD send a GOAWAY frame when | ||||
| ending a connection, as long as circumstances permit it. | ||||
| 5.4.2. Stream Error Handling | ||||
| A stream error is an error related to a specific stream identifier | ||||
| that does not affect processing of other streams. | ||||
| An endpoint that detects a stream error sends a RST_STREAM | ||||
| (Section 6.4) frame that contains the stream identifier of the stream | ||||
| where the error occurred. The RST_STREAM frame includes an error | ||||
| code that indicates the type of error. | ||||
| A RST_STREAM is the last frame that an endpoint can send on a stream. | ||||
| The peer that sends the RST_STREAM frame MUST be prepared to receive | ||||
| any frames that were sent or enqueued for sending by the remote peer. | ||||
| These frames can be ignored, except where they modify connection | ||||
| state (such as the state maintained for header compression | ||||
| (Section 4.3)). | ||||
| Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame | ||||
| for any stream. However, an endpoint MAY send additional RST_STREAM | ||||
| frames if it receives frames on a closed stream after more than a | ||||
| round trip time. This behavior is permitted to deal with misbehaving | ||||
| implementations. | ||||
| An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | ||||
| frame, to avoid looping. | ||||
| 5.4.3. Connection Termination | ||||
| If the TCP connection is torn down while streams remain in open or | ||||
| half closed states, then the endpoint MUST assume that the stream was | ||||
| abnormally interrupted and could be incomplete. | ||||
| 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 either in the establishment and management of the connection | purpose either in the establishment and management of the connection | |||
| as a whole, or of individual streams. | as a whole, or of 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 | |||
| any given frame. Accordingly, while it is expected that new frame | any given frame. Accordingly, while it is expected that new frame | |||
| types will be introduced by extensions to this protocol, only frames | types will be introduced by extensions to this protocol, only frames | |||
| defined by this document are permitted to alter the connection state. | defined by this document are permitted to alter the connection state. | |||
| 3.8.1. DATA Frames | 6.1. DATA | |||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
| octets associated with a stream. One or more DATA frames are used, | octets associated with a stream. One or more DATA frames are used, | |||
| for instance, to carry HTTP request or response payloads. | for instance, to carry HTTP request or response payloads. | |||
| The DATA frame does not define any type-specific flags. | The DATA frame defines the following flags: | |||
| END_STREAM (0x1): Bit 1 being set indicates that this frame is the | ||||
| last that the endpoint will send for the identified stream. | ||||
| Setting this flag causes the stream to enter a "half closed" state | ||||
| (Section 5.1). | ||||
| RESERVED (0x2): Bit 2 is reserved for future use. | ||||
| 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 0x0, the recipient MUST | |||
| respond with a connection error (Section 3.5.1) of type | respond with a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| 3.8.2. HEADERS+PRIORITY | 6.2. HEADERS | |||
| The HEADERS+PRIORITY frame (type=0x1) allows the sender to set header | The HEADERS frame (type=0x1) carries name-value pairs. The HEADERS | |||
| fields and stream priority at the same time. | is used to open a stream (Section 5.1). Any number of HEADERS frames | |||
| can be sent on an existing stream at any time. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |X| Priority (31) | | |X| Priority (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| | Header Block (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| HEADERS+PRIORITY Frame Payload | HEADERS Frame Payload | |||
| The HEADERS+PRIORITY frame is identical to the HEADERS frame | The HEADERS frame defines the following flags: | |||
| (Section 3.8.8), preceded by a single reserved bit and a 31-bit | ||||
| priority; see Section 3.4.2. | ||||
| HEADERS+PRIORITY uses the same flags as the HEADERS frame, except | END_STREAM (0x1): Bit 1 being set indicates that this frame is the | |||
| that a HEADERS+PRIORITY frame with a CONTINUES bit MUST be followed | last that the endpoint will send for the identified stream. | |||
| by another HEADERS+PRIORITY frame. See HEADERS frame (Section 3.8.8) | Setting this flag causes the stream to enter a "half closed" state | |||
| for any flags. | (Section 5.1). | |||
| HEADERS+PRIORITY frames MUST be associated with a stream. If a | RESERVED (0x2): Bit 2 is reserved for future use. | |||
| HEADERS+PRIORITY frame is received whose stream identifier field is | ||||
| 0x0, the recipient MUST respond with a connection error | ||||
| (Section 3.5.1) of type PROTOCOL_ERROR. | ||||
| The HEADERS+PRIORITY frame modifies the connection state as defined | END_HEADERS (0x4): The END_HEADERS bit indicates that this frame | |||
| in Section 3.7. | ends the sequence of header block fragments necessary to provide a | |||
| complete set of headers. | ||||
| 3.8.3. RST_STREAM | The payload for a complete header block is provided by a sequence | |||
| of HEADERS frames, terminated by a HEADERS frame with the | ||||
| END_HEADERS flag set. Once the sequence terminates, the payload | ||||
| of all HEADERS frames are concatenated and interpreted as a single | ||||
| block. | ||||
| A HEADERS frame without the END_HEADERS flag set MUST be followed | ||||
| by a HEADERS frame for the same stream. A receiver MUST treat the | ||||
| receipt of any other type of frame or a frame on a different | ||||
| stream as a connection error (Section 5.4.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| PRIORITY (0x8): Bit 4 being set indicates that the first four octets | ||||
| of this frame contain a single reserved bit and a 31-bit priority; | ||||
| see Section 5.3. If this bit is not set, the four bytes do not | ||||
| appear and the frame only contains a header block fragment. | ||||
| The payload of a HEADERS frame contains a header block fragment | ||||
| (Section 4.3). | ||||
| HEADERS frames MUST be associated with a stream. If a HEADERS frame | ||||
| is received whose stream identifier field is 0x0, the recipient MUST | ||||
| respond with a connection error (Section 5.4.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| The HEADERS frame changes the connection state as defined in | ||||
| Section 4.3. | ||||
| 6.3. PRIORITY | ||||
| The PRIORITY frame (type=0x2) specifies the sender-advised priority | ||||
| of a stream. It can be sent at any time for an existing stream. | ||||
| This enables reprioritisation of existing streams. | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| |X| Priority (31) | | ||||
| +-+-------------------------------------------------------------+ | ||||
| PRIORITY Frame Payload | ||||
| The payload of a PRIORITY frame contains a single reserved bit and a | ||||
| 31-bit priority. | ||||
| The PRIORITY frame does not define any flags. | ||||
| The PRIORITY frame is associated with an existing stream. If a | ||||
| PRIORITY frame is received with a stream identifier of 0x0, the | ||||
| recipient MUST respond with a connection error (Section 5.4.1) of | ||||
| type PROTOCOL_ERROR. | ||||
| 6.4. RST_STREAM | ||||
| The RST_STREAM frame (type=0x3) allows for abnormal termination of a | The RST_STREAM frame (type=0x3) allows for abnormal termination of a | |||
| stream. When sent by the initiator of a stream, it indicates that | stream. When sent by the initiator of a stream, it indicates that | |||
| they wish to cancel the stream. When sent by the receiver of a | they wish to cancel the stream or that an error condition has | |||
| stream, it indicates that either the receiver is rejecting the | occurred. When sent by the receiver of a stream, it indicates that | |||
| stream, requesting that the stream be cancelled or that an error | either the receiver is rejecting the stream, requesting that the | |||
| condition has occurred. | stream be cancelled or that an error condition has occurred. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (32) | | | Error Code (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| RST_STREAM Frame Payload | RST_STREAM Frame Payload | |||
| The RST_STREAM frame contains a single unsigned, 32-bit integer | The RST_STREAM frame contains a single unsigned, 32-bit integer | |||
| identifying the error code (Section 3.5.3). The error code indicates | identifying the error code (Section 7). The error code indicates why | |||
| why the stream is being terminated. | the stream is being terminated. | |||
| No type-flags are defined. | The RST_STREAM frame does not define any flags. | |||
| 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 on | causes it to enter the closed state. After receiving a RST_STREAM on | |||
| a stream, the receiver MUST NOT send additional frames for that | a stream, the receiver MUST NOT send additional frames for that | |||
| stream. However, after sending the RST_STREAM, the sending endpoint | stream. However, after sending the RST_STREAM, the sending endpoint | |||
| MUST be prepared to receive and process additional frames sent on the | MUST be prepared to receive and process additional frames sent on the | |||
| stream that might have been sent by the peer prior to the arrival of | stream that might have been sent by the peer prior to the arrival of | |||
| the RST_STREAM. | 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 whose stream identifier field is 0x0 the recipient | frame is received whose stream identifier field is 0x0 the recipient | |||
| MUST respond with a connection error (Section 3.5.1) of type | MUST respond with a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| 3.8.4. SETTINGS | 6.5. SETTINGS | |||
| The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x4) conveys configuration parameters that | |||
| affect how endpoints communicate. The parameters are either | affect how endpoints communicate. The parameters are either | |||
| constraints on peer behavior or preferences. | constraints on peer behavior or preferences. | |||
| SETTINGS frames MUST be sent at the start of a connection, and MAY be | SETTINGS frames MUST be sent at the start of a connection, and MAY be | |||
| sent at any other time by either endpoint over the lifetime of the | sent at any other time by either endpoint over the lifetime of the | |||
| connection. | connection. | |||
| Implementations MUST support all of the settings defined by this | Implementations MUST support all of the settings defined by this | |||
| specification and MAY support additional settings defined by | specification and MAY support additional settings defined by | |||
| extensions. Unsupported or unrecognized settings MUST be ignored. | extensions. Unsupported or unrecognized settings MUST be ignored. | |||
| New settings MUST NOT be defined or implemented in a way that | New settings MUST NOT be defined or implemented in a way that | |||
| requires endpoints to understand then in order to communicate | requires endpoints to understand them in order to communicate | |||
| successfully. | successfully. | |||
| A SETTINGS frame is not required to include every defined setting; | A SETTINGS frame is not required to include every defined setting; | |||
| senders can include only those parameters for which it has accurate | senders can include only those parameters for which it has accurate | |||
| values and a need to convey. When multiple parameters are sent, they | values and a need to convey. When multiple parameters are sent, they | |||
| SHOULD be sent in order of numerically lowest ID to highest ID. A | SHOULD be sent in order of numerically lowest ID to highest ID. A | |||
| single SETTINGS frame MUST NOT contain multiple values for the same | single SETTINGS frame MUST NOT contain multiple values for the same | |||
| ID. If the receiver of a SETTINGS frame discovers multiple values | ID. If the receiver of a SETTINGS frame discovers multiple values | |||
| for the same ID, it MUST ignore all values for that ID except the | for the same ID, it MUST ignore all values for that ID except the | |||
| first one. | first one. | |||
| Over the lifetime of a connection, an endpoint MAY send multiple | Over the lifetime of a connection, an endpoint MAY send multiple | |||
| SETTINGS frames containing previously unspecified parameters or new | SETTINGS frames containing previously unspecified parameters or new | |||
| values for parameters whose values have already been established. | values for parameters whose values have already been established. | |||
| Only the most recent value provided setting value applies. | Only the most recent provided setting value applies. | |||
| The SETTINGS frame defines the following flag: | ||||
| CLEAR_PERSISTED (0x2): Bit 2 being set indicates a request to clear | The SETTINGS frame does not define any flags. | |||
| any previously persisted settings before processing the settings. | ||||
| Clients MUST NOT set this flag. | ||||
| 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. If an | The stream identifier for a settings frame MUST be zero. If an | |||
| endpoint receives a SETTINGS frame whose stream identifier field is | endpoint receives a SETTINGS frame whose stream identifier field is | |||
| anything other than 0x0, the endpoint MUST respond with a connection | anything other than 0x0, the endpoint MUST respond with a connection | |||
| error (Section 3.5.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| 3.8.4.1. Setting Format | The SETTINGS frame affects connection state. A badly formed or | |||
| incomplete SETTINGS frame MUST be treated as a connection error | ||||
| (Section 5.4.1). | ||||
| 6.5.1. Setting Format | ||||
| The payload of a SETTINGS frame consists of zero or more settings. | The payload of a SETTINGS frame consists of zero or more settings. | |||
| Each setting consists of an 8-bit flags field specifying per-item | Each setting consists of an 8-bit reserved field, an unsigned 24-bit | |||
| instructions, an unsigned 24-bit setting identifier, and an unsigned | setting identifier, and an unsigned 32-bit value. | |||
| 32-bit value. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |SettingFlags(8)| Setting Identifier (24) | | | Reserved (8) | Setting Identifier (24) | | |||
| +---------------+-----------------------------------------------+ | +---------------+-----------------------------------------------+ | |||
| | Value (32) | | | Value (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Setting Format | ||||
| Two flags are defined for the 8-bit flags field: | ||||
| PERSIST_VALUE (0x1): Bit 1 (the least significant bit) being set | ||||
| indicates a request from the server to the client to persist this | ||||
| setting. A client MUST NOT set this flag. | ||||
| PERSISTED (0x2): Bit 2 being set indicates that this setting is a | ||||
| persisted setting being returned by the client to the server. | ||||
| This also indicates that this setting is not a client setting, but | ||||
| a value previously set by the server. A server MUST NOT set this | ||||
| flag. | ||||
| 3.8.4.2. Setting Persistence | ||||
| [[anchor12: Note that persistence of settings is under discussion in | ||||
| the WG and might be removed in a future version of this document.]] | ||||
| A server endpoint can request that configuration parameters sent to a | ||||
| client in a SETTINGS frame are to be persisted by the client across | ||||
| HTTP/2.0 connections and returned to the server in any new SETTINGS | ||||
| frame the client sends to the server in the current connection or any | ||||
| future connections. | ||||
| Persistence is requested on a per-setting basis by setting the | ||||
| PERSIST_VALUE flag (0x1). | ||||
| Client endpoints are not permitted to make such requests. Servers | ||||
| MUST ignore any attempt by clients to request that a server persist | ||||
| configuration parameters. | ||||
| Persistence of configuration parameters is done on a per-origin basis | ||||
| (see [RFC6454]). That is, when a client establishes a connection | ||||
| with a server, and the server requests that the client maintain | ||||
| persistent settings, the client SHOULD return the persisted settings | ||||
| on all future connections to the same origin, IP address and TCP | ||||
| port. | ||||
| Whenever the client sends a SETTINGS frame in the current connection, | ||||
| or establishes a new connection with the same origin, persisted | ||||
| configuration parameters are sent with the PERSISTED flag (0x2) set | ||||
| for each persisted parameter. | ||||
| Persisted settings accumulate until the server requests that all | ||||
| previously persisted settings are to be cleared by setting the | ||||
| CLEAR_PERSISTED (0x2) flag on the SETTINGS frame. | ||||
| For example, if the server sends IDs 1, 2, and 3 with the | Setting Format | |||
| FLAG_SETTINGS_PERSIST_VALUE in a first SETTINGS frame, and then sends | ||||
| IDs 4 and 5 with the FLAG_SETTINGS_PERSIST_VALUE in a subsequent | ||||
| SETTINGS frame, the client will return values for all 5 settings (1, | ||||
| 2, 3, 4, and 5 in this example) to the server. | ||||
| 3.8.4.3. Defined Settings | 6.5.2. Defined Settings | |||
| The following settings are defined: | The following settings are defined: | |||
| SETTINGS_UPLOAD_BANDWIDTH (1): indicates the sender's estimated | ||||
| upload bandwidth for this connection. The value is an the | ||||
| integral number of kilobytes per second that the sender predicts | ||||
| as an expected maximum upload channel capacity. | ||||
| SETTINGS_DOWNLOAD_BANDWIDTH (2): indicates the sender's estimated | ||||
| download bandwidth for this connection. The value is an integral | ||||
| number of kilobytes per second that the sender predicts as an | ||||
| expected maximum download channel capacity. | ||||
| SETTINGS_ROUND_TRIP_TIME (3): indicates the sender's estimated | ||||
| round-trip-time for this connection. The round trip time is | ||||
| defined as the minimum amount of time to send a control frame from | ||||
| this client to the remote and receive a response. The value is | ||||
| represented in milliseconds. | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS (4): indicates the maximum number of | SETTINGS_MAX_CONCURRENT_STREAMS (4): indicates the maximum number of | |||
| concurrent streams that the sender will allow. This limit is | concurrent streams that the sender will allow. This limit is | |||
| directional: it applies to the number of streams that the sender | directional: it applies to the number of streams that the sender | |||
| permits the receiver to create. By default there is no limit. It | permits the receiver to create. By default there is no limit. It | |||
| is recommended that this value be no smaller than 100, so as to | is recommended that this value be no smaller than 100, so as to | |||
| not unnecessarily limit parallelism. | not unnecessarily limit parallelism. | |||
| SETTINGS_CURRENT_CWND (5): indicates the sender's current TCP CWND | ||||
| value. | ||||
| SETTINGS_DOWNLOAD_RETRANS_RATE (6): indicates the sender's | ||||
| retransmission rate (bytes retransmitted / total bytes | ||||
| transmitted). | ||||
| SETTINGS_INITIAL_WINDOW_SIZE (7): indicates the sender's initial | SETTINGS_INITIAL_WINDOW_SIZE (7): indicates the sender's initial | |||
| stream window size (in bytes) for new streams. | window size (in bytes) for stream level flow control. | |||
| This settings affects the window size of all streams, including | ||||
| existing streams, see Section 6.9.2. | ||||
| SETTINGS_FLOW_CONTROL_OPTIONS (10): indicates that streams directed | SETTINGS_FLOW_CONTROL_OPTIONS (10): indicates that streams directed | |||
| to the sender will not be subject to flow control. The least | to the sender will not be subject to flow control. The least | |||
| significant bit (0x1) is set to indicate that new streams are not | significant bit (0x1) of the value is set to indicate that new | |||
| flow controlled. All other bits are reserved. | streams are not flow controlled. All other bits are reserved. | |||
| This setting applies to all streams, including existing streams. | This setting applies to all streams, including existing streams. | |||
| These bits cannot be cleared once set, see Section 3.8.9.4. | These bits cannot be cleared once set, see Section 6.9.4. | |||
| 3.8.5. PUSH_PROMISE | 6.6. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | |||
| in advance of streams the sender intends to initiate. The | 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 minimal set of | stream the endpoint plans to create along with a minimal set of | |||
| headers that provide additional context for the stream. Section 4.3 | headers that provide additional context for the stream. Section 8.2 | |||
| contains a thorough description of the use of PUSH_PROMISE frames. | contains a thorough description of the use of PUSH_PROMISE frames. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |X| Promised-Stream-ID (31) | | |X| Promised-Stream-ID (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| | Header Block (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| PUSH_PROMISE Payload Format | PUSH_PROMISE Payload Format | |||
| The payload of a PUSH_PROMISE includes a "Promised-Stream-ID". This | The payload of a PUSH_PROMISE includes a "Promised-Stream-ID". This | |||
| unsigned 31-bit integer identifies the stream the endpoint intends to | unsigned 31-bit integer identifies the stream the endpoint intends to | |||
| start sending frames for. The promised stream identifier MUST be a | start sending frames for. The promised stream identifier MUST be a | |||
| valid choice for the next stream sent by the sender (see new stream | valid choice for the next stream sent by the sender (see new stream | |||
| identifier (Section 3.4.1)). | identifier (Section 5.1.1)). | |||
| PUSH_PROMISE frames MUST be associated with an existing stream. If | Following the "Promised-Stream-ID" is a header block fragment | |||
| the stream identifier field specifies the value 0x0, a recipient MUST | (Section 4.3). | |||
| respond with a connection error (Section 3.5.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| The state of promised streams is bound to the state of the original | PUSH_PROMISE frames MUST be associated with an existing, peer- | |||
| associated stream on which the PUSH_PROMISE frame were sent. If the | initiated stream. If the stream identifier field specifies the value | |||
| originating stream state changes to fully closed, all associated | 0x0, a recipient MUST respond with a connection error (Section 5.4.1) | |||
| promised streams fully close as well. [[anchor13: Ed. Note: We need | of type PROTOCOL_ERROR. | |||
| clarification on this point. How synchronized are the lifecycles of | ||||
| streams and associated promised streams?]] | ||||
| PUSH_PROMISE uses the same flags as the HEADERS frame, except that a | The PUSH_PROMISE frame defines the following flags: | |||
| PUSH_PROMISE frame with a CONTINUES bit MUST be followed by another | ||||
| PUSH_PROMISE frame. See HEADERS frame (Section 3.8.8) for any flags. | END_PUSH_PROMISE (0x1): The END_PUSH_PROMISE bit indicates that this | |||
| frame ends the sequence of header block fragments necessary to | ||||
| provide a complete set of headers. | ||||
| The payload for a complete header block is provided by a sequence | ||||
| of PUSH_PROMISE frames, terminated by a PUSH_PROMISE frame with | ||||
| the END_PUSH_PROMISE flag set. Once the sequence terminates, the | ||||
| payload of all PUSH_PROMISE frames are concatenated and | ||||
| interpreted as a single block. | ||||
| A PUSH_PROMISE frame without the END_PUSH_PROMISE flag set MUST be | ||||
| followed by a PUSH_PROMISE frame for the same stream. A receiver | ||||
| MUST treat the receipt of any other type of frame or a frame on a | ||||
| different stream as a connection error (Section 5.4.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| Promised streams are not required to be used in order promised. The | Promised streams are not required to be used in order promised. The | |||
| PUSH_PROMISE only reserves stream identifiers for later use. | PUSH_PROMISE only reserves stream identifiers for later use. | |||
| 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. | |||
| The PUSH_PROMISE frame modifies the connection state as defined in | The PUSH_PROMISE frame modifies the connection state as defined in | |||
| Section 3.7. | Section 4.3. | |||
| 3.8.6. PING | 6.7. PING | |||
| The PING frame (type=0x6) is a mechanism for measuring a minimal | The PING frame (type=0x6) 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 frames consist of an arbitrary, variable-length sequence of | 0 1 2 3 | |||
| octets. Receivers of a PING send a response PING frame with the PONG | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| flag set and precisely the same sequence of octets back to the sender | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| as soon as possible. | | | | |||
| | Opaque Data (64) | | ||||
| | | | ||||
| +---------------------------------------------------------------+ | ||||
| Processing of PING frames SHOULD be performed with the highest | PING Payload Format | |||
| priority if there are additional frames waiting to be processed. | ||||
| The PING frame defines one type-specific flag: | In addition to the frame header, PING frames MUST contain 8 octets of | |||
| data in the payload. A sender can include any value it chooses and | ||||
| use those bytes in any fashion. | ||||
| PONG (0x2): Bit 2 being set indicates that this PING frame is a PING | Receivers of a PING frame that does not include a PONG flag MUST send | |||
| a PING frame with the PONG flag set in response, with an identical | ||||
| payload. PING responses SHOULD given higher priority than any other | ||||
| frame. | ||||
| The PING frame defines the following flags: | ||||
| PONG (0x1): Bit 1 being set indicates that this PING frame is a PING | ||||
| response. An endpoint MUST set this flag in PING responses. An | response. An endpoint MUST set this flag in PING responses. An | |||
| endpoint MUST NOT respond to PING frames containing this flag. | endpoint MUST NOT respond to PING frames containing 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 | 0x0, the recipient MUST respond with a connection error | |||
| (Section 3.5.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| 3.8.7. GOAWAY | 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 | ||||
| PROTOCOL_ERROR. | ||||
| 6.8. GOAWAY | ||||
| The GOAWAY frame (type=0x7) informs the remote peer to stop creating | The GOAWAY frame (type=0x7) informs the remote peer to stop creating | |||
| streams on this connection. It can be sent from the client or the | streams on this connection. It can be sent from the client or the | |||
| server. Once sent, the sender will ignore frames sent on new streams | server. Once sent, the sender will ignore frames sent on new streams | |||
| for the remainder of the connection. Receivers of a GOAWAY frame | for the remainder of the connection. Receivers of a GOAWAY frame | |||
| MUST NOT open additional streams on the connection, although a new | MUST NOT open additional streams on the connection, although a new | |||
| connection can be established for new streams. The purpose of this | connection can be established for new streams. The purpose of this | |||
| frame is to allow an endpoint to gracefully stop accepting new | frame is to allow an endpoint to gracefully stop accepting new | |||
| streams (perhaps for a reboot or maintenance), while still finishing | streams (perhaps for a reboot or maintenance), while still finishing | |||
| processing of previously established streams. | processing of previously established streams. | |||
| skipping to change at page 27, line 11 ¶ | skipping to change at page 30, line 22 ¶ | |||
| 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 sending a GOAWAY frame. To deal with this | |||
| case, the GOAWAY contains the stream identifier of the last stream | case, the GOAWAY contains the stream identifier of the last stream | |||
| which was processed on the sending endpoint in this connection. If | which was processed on the sending endpoint in this connection. If | |||
| the receiver of the GOAWAY used streams that are newer than the | the receiver of the GOAWAY used streams that are newer than the | |||
| indicated stream identifier, they were not processed by the sender | indicated stream identifier, they were not processed by the sender | |||
| and the receiver may treat the streams as though they had never been | and the receiver may treat the streams as though they had never been | |||
| created at all (hence the receiver may want to re-create the streams | created at all (hence the receiver may want to re-create the streams | |||
| later on a new connection). | later on a new 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 can know whether a stream has been | connection so that the remote can know whether a stream has been | |||
| partially processed or not. (For example, if an HTTP client sends a | partially processed or not. For example, if an HTTP client sends a | |||
| POST at the same time that a server closes a connection, the client | POST at the same time that a server closes a connection, the client | |||
| cannot know if the server started to process that POST request if the | cannot know if the server started to process that POST request if the | |||
| server does not send a GOAWAY frame to indicate where it stopped | server does not send a GOAWAY frame to indicate where it stopped | |||
| working). | working. An endpoint might choose to close a connection without | |||
| sending GOAWAY for misbehaving peers. | ||||
| After sending a GOAWAY frame, the sender can ignore frames for new | ||||
| streams. | ||||
| [[anchor14: Issue: connection state that is established by those | After sending a GOAWAY frame, the sender can discard frames for new | |||
| "ignored" frames cannot be ignored without the state in the two peers | streams. However, any frames that alter connection state cannot be | |||
| becoming unsynchronized.]] | completely ignored. For instance, HEADERS and PUSH_PROMISE frames | |||
| MUST be minimally processed to ensure a consistent compression state | ||||
| (see Section 4.3). | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |X| Last-Stream-ID (31) | | |X| Last-Stream-ID (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| | Error Code (32) | | | Error Code (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Additional Debug Data (*) | | ||||
| +---------------------------------------------------------------+ | ||||
| GOAWAY Payload Format | GOAWAY Payload Format | |||
| The GOAWAY frame does not define any type-specific 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. | |||
| The stream identifier MUST be zero. | The stream identifier MUST be zero. | |||
| 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 | |||
| has received frames on and might have taken some action on. All | has received frames on and might have taken some 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 is set to 0 if no | processed in some way. The last stream identifier is set to 0 if no | |||
| streams were processed. | streams were processed. | |||
| Note: In this case, "processed" means that some data from the | Note: In this case, "processed" means that some data from the | |||
| stream was passed to some higher layer of software that might have | stream was passed to some higher layer of software that might have | |||
| taken some action as a result. | taken some action as a result. | |||
| On streams with lower or equal numbered identifiers that do not close | On streams with lower or equal numbered identifiers that were not | |||
| completely prior to the connection being closed, re-attempting | closed completely prior to the connection being closed, re-attempting | |||
| requests, transactions, or any protocol activity is not possible | requests, transactions, or any protocol activity is not possible | |||
| (with the exception of idempotent actions like HTTP GET, PUT, or | (with the exception of idempotent actions like HTTP GET, PUT, or | |||
| DELETE). Any protocol activity that uses higher numbered streams can | DELETE). Any protocol activity that uses higher numbered streams can | |||
| be safely retried using a new connection. | be safely retried using a new connection. | |||
| Activity on streams numbered lower or equal to the last stream | Activity on streams numbered lower 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 gracefully shut down a connection by sending a GOAWAY frame, | frame might gracefully shut down a connection by sending a GOAWAY | |||
| maintaining the connection in an open state until all in-progress | frame, maintaining the connection in an open state until all in- | |||
| streams complete. | progress streams complete. | |||
| The last stream ID MUST be 0 if no streams were acted upon. | The last stream ID MUST be 0 if no streams were acted upon. | |||
| The GOAWAY frame also contains a 32-bit error code (Section 3.5.3) | The GOAWAY frame also contains a 32-bit error code (Section 7) that | |||
| that contains the reason for closing the connection. | contains the reason for closing the connection. | |||
| 3.8.8. HEADERS | ||||
| The HEADERS frame (type=0x8) provides header fields for a stream. | ||||
| Any number of HEADERS frames can may be sent on an existing stream at | ||||
| any time. | ||||
| Additional type-specific flags for the HEADERS frame are: | ||||
| CONTINUES (0x2): The CONTINUES bit indicates that this frame does | ||||
| not contain the entire payload necessary to provide a complete set | ||||
| of headers. | ||||
| The payload for a complete set of headers is provided by a | ||||
| sequence of HEADERS frames, terminated by a HEADERS frame without | ||||
| the CONTINUES bit. Once the sequence terminates, the payload of | ||||
| all HEADERS frames are concatenated and interpreted as a single | ||||
| block. | ||||
| A HEADERS frame that includes a CONTINUES bit MUST be followed by | ||||
| a HEADERS frame for the same stream. A receiver MUST treat the | ||||
| receipt of any other type of frame or a frame on a different | ||||
| stream as a connection error (Section 3.5.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| The payload of a HEADERS frame contains a Headers Block | ||||
| (Section 3.7). | ||||
| The HEADERS frame is associated with an existing stream. If a | ||||
| HEADERS frame is received with a stream identifier of 0x0, the | ||||
| recipient MUST respond with a stream error (Section 3.5.2) of type | ||||
| PROTOCOL_ERROR. | ||||
| The HEADERS frame changes the connection state as defined in | Endpoints MAY append opaque data to the payload of any GOAWAY frame. | |||
| Section 3.7. | Additional debug data is intended for diagnostic purposes only and | |||
| carries no semantic value. Debug data MUST NOT be persistently | ||||
| stored, since it could contain sensitive information. | ||||
| 3.8.9. WINDOW_UPDATE | 6.9. WINDOW_UPDATE | |||
| The WINDOW_UPDATE frame (type=0x9) is used to implement flow control. | The WINDOW_UPDATE frame (type=0x9) is used to implement flow control. | |||
| 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 frame. Frames that are exempt from | document, this includes only DATA frame. Frames that are exempt from | |||
| flow control MUST be accepted and processed, unless the receiver is | flow control MUST be accepted and processed, unless the receiver is | |||
| unable to assign resources to handling the frame. A receiver MAY | unable to assign resources to handling the frame. A receiver MAY | |||
| respond with a stream error (Section 3.5.2) or connection error | respond with a stream error (Section 5.4.2) or connection error | |||
| (Section 3.5.1) of type FLOW_CONTROL_ERROR if it is unable accept a | (Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable accept a | |||
| frame. | frame. | |||
| The following additional flags are defined for the WINDOW_UPDATE | 0 1 2 3 | |||
| frame: | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| |X| Window Size Increment (31) | | ||||
| +-+-------------------------------------------------------------+ | ||||
| END_FLOW_CONTROL (0x2): Bit 2 being set indicates that flow control | WINDOW_UPDATE Payload Format | |||
| The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | ||||
| unsigned 31-bit integer indicating the number of bytes that the | ||||
| sender can transmit in addition to the existing flow control window. | ||||
| The legal range for the increment to the flow control window is 1 to | ||||
| 2^31 - 1 (0x7fffffff) bytes. | ||||
| The WINDOW_UPDATE frame defines the following flags: | ||||
| END_FLOW_CONTROL (0x1): Bit 1 being set indicates that flow control | ||||
| for the identified stream or connection has been ended; subsequent | for the identified stream or connection has been ended; subsequent | |||
| frames do not need to be flow controlled. | frames do not need to be flow controlled. | |||
| The WINDOW_UPDATE frame can be specific to a stream or to the entire | The WINDOW_UPDATE frame can be specific to a stream or to the entire | |||
| connection. In the former case, the frame's stream identifier | connection. In the former case, the frame's stream identifier | |||
| 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. | |||
| The payload of a WINDOW_UPDATE frame is a 32-bit value indicating the | 6.9.1. The Flow Control Window | |||
| additional number of bytes that the sender can transmit in addition | ||||
| to the existing flow control window. The legal range for this field | ||||
| is 1 to 2^31 - 1 (0x7fffffff) bytes; the most significant bit of this | ||||
| value is reserved. | ||||
| 3.8.9.1. The Flow Control Window | ||||
| Flow control in HTTP/2.0 is implemented using a window kept by each | Flow control in HTTP/2.0 is implemented using a window kept by each | |||
| sender on every stream. The flow control window is a simple integer | sender on every stream. The flow control window is a simple integer | |||
| value that indicates how many bytes of data the sender is permitted | value that indicates how many bytes of data the sender is permitted | |||
| to transmit; as such, its size is a measure of the buffering | to transmit; as such, its size is a measure of the buffering | |||
| capability of the receiver. | capability of the receiver. | |||
| Two flow control windows are applicable; the stream flow control | Two flow control windows are applicable; the stream flow control | |||
| window and the connection flow control window. The sender MUST NOT | window and the connection flow control window. The sender MUST NOT | |||
| send a flow controlled frame with a length that exceeds the space | send a flow controlled frame with a length that exceeds the space | |||
| available in either of the flow control windows advertised by the | available in either of the flow control windows advertised by the | |||
| receiver. Frames with zero length with the FINAL flag set (for | receiver. Frames with zero length with the END_STREAM flag set (for | |||
| example, an empty data frame) MAY be sent if there is no available | example, an empty data frame) MAY be sent if there is no available | |||
| space in either flow control window. | space in either flow control window. | |||
| For flow control calculations, the 8 byte frame header is not | For flow control calculations, the 8 byte frame header is not | |||
| counted. | counted. | |||
| After sending a flow controlled frame, the sender reduces the space | After sending a flow controlled frame, the sender reduces the space | |||
| available in both windows by the length of the transmitted frame. | available in both windows by the length of the transmitted frame. | |||
| The receiver of a frame sends a WINDOW_UPDATE frame as it consumes | The receiver of a frame sends a WINDOW_UPDATE frame as it consumes | |||
| skipping to change at page 30, line 47 ¶ | skipping to change at page 33, line 32 ¶ | |||
| control window to exceed this maximum it MUST terminate either the | control window to exceed this maximum it MUST terminate either the | |||
| stream or the connection, as appropriate. For streams, the sender | stream or the connection, as appropriate. For streams, the sender | |||
| sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | |||
| for the connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | for the connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | |||
| Flow controlled frames from the sender and WINDOW_UPDATE frames from | Flow controlled frames from the sender and WINDOW_UPDATE frames from | |||
| the receiver are completely asynchronous with respect to each other. | the receiver are completely asynchronous with respect to each other. | |||
| This property allows a receiver to aggressively update the window | This property allows a receiver to aggressively update the window | |||
| size kept by the sender to prevent streams from stalling. | size kept by the sender to prevent streams from stalling. | |||
| 3.8.9.2. Initial Flow Control Window Size | 6.9.2. Initial Flow Control Window Size | |||
| When a HTTP/2.0 connection is first established, new streams are | When a HTTP/2.0 connection is first established, new streams are | |||
| created with an initial flow control window size of 65535 bytes. The | created with an initial flow control window size of 65535 bytes. The | |||
| connection flow control window is 65536 bytes. Both endpoints can | connection flow control window is 65535 bytes. Both endpoints can | |||
| adjust the initial window size for new streams by including a value | adjust the initial window size for new streams by including a value | |||
| for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that forms | for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that forms | |||
| part of the connection header. | part of the connection header. | |||
| Prior to receiving a SETTINGS frame that sets a value for | Prior to receiving a SETTINGS frame that sets a value for | |||
| SETTINGS_INITIAL_WINDOW_SIZE, a client can only use the default | SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default | |||
| initial window size when sending flow controlled frames. Similarly, | initial window size when sending flow controlled frames. Similarly, | |||
| the connection flow control window is set to the default initial | the connection flow control window is set to the default initial | |||
| window size until a WINDOW_UPDATE frame is received. | window size until a WINDOW_UPDATE frame is received. | |||
| A SETTINGS frame can alter the initial flow control window size for | A SETTINGS frame can alter the initial flow control window size for | |||
| all current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE | all current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE | |||
| changes, a receiver MUST adjust the size of all flow control windows | changes, a receiver MUST adjust the size of all stream flow control | |||
| that it maintains by the difference between the new value and the old | windows that it maintains by the difference between the new value and | |||
| value. | the old value. A SETTINGS frame cannot alter the connection flow | |||
| control window. | ||||
| A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the available | A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the available | |||
| space in a flow control window to become negative. A sender MUST | space in a flow control window to become negative. A sender MUST | |||
| track the negative flow control window, and MUST NOT send new flow | track the negative flow control window, and MUST NOT send new flow | |||
| controlled frames until it receives WINDOW_UPDATE frames that cause | controlled frames until it receives WINDOW_UPDATE frames that cause | |||
| the flow control window to become positive. | the flow control window to become positive. | |||
| For example, if the server sets the initial window size to be 16KB, | For example, if the client sends 64KB immediately on connection | |||
| and the client sends 64KB immediately on connection establishment, | establishment, and the server sets the initial window size to be | |||
| the client will recalculate the available flow control window to be | 16KB, the client will recalculate the available flow control window | |||
| -48KB on receipt of the SETTINGS frame. The client retains a | to be -48KB on receipt of the SETTINGS frame. The client retains a | |||
| negative flow control window until WINDOW_UPDATE frames restore the | negative flow control window until WINDOW_UPDATE frames restore the | |||
| window to being positive, after which the client can resume sending. | window to being positive, after which the client can resume sending. | |||
| 3.8.9.3. Reducing the Stream Window Size | 6.9.3. Reducing the Stream Window Size | |||
| A receiver that wishes to use a smaller flow control window than the | A receiver that wishes to use a smaller flow control window than the | |||
| current size can send a new SETTINGS frame. However, the receiver | current size can send a new SETTINGS frame. However, the receiver | |||
| MUST be prepared to receive data that exceeds this window size, since | MUST be prepared to receive data that exceeds this window size, since | |||
| the sender might send data that exceeds the lower limit prior to | the sender might send data that exceeds the lower limit prior to | |||
| processing the SETTINGS frame. | processing the SETTINGS frame. | |||
| A receiver has two options for handling streams that exceed flow | A receiver has two options for handling streams that exceed flow | |||
| control limits: | control limits: | |||
| skipping to change at page 32, line 6 ¶ | skipping to change at page 34, line 41 ¶ | |||
| FLOW_CONTROL_ERROR error code for the affected streams. | FLOW_CONTROL_ERROR error code for the affected streams. | |||
| 2. The receiver can accept the streams and tolerate the resulting | 2. The receiver can accept the streams and tolerate the resulting | |||
| head of line blocking, sending WINDOW_UPDATE frames as it | head of line blocking, sending WINDOW_UPDATE frames as it | |||
| consumes data. | consumes data. | |||
| If a receiver decides to accept streams, both sides MUST recompute | If a receiver decides to accept streams, both sides MUST recompute | |||
| the available flow control window based on the initial window size | the available flow control window based on the initial window size | |||
| sent in the SETTINGS. | sent in the SETTINGS. | |||
| 3.8.9.4. Ending Flow Control | 6.9.4. Ending Flow Control | |||
| After a receiver reads in a frame that marks the end of a stream (for | After a receiver reads in a frame that marks the end of a stream (for | |||
| example, a data stream with a FINAL flag set), it MUST cease | example, a data stream with a END_STREAM flag set), it MUST cease | |||
| transmission of WINDOW_UPDATE frames for that stream. A sender is | transmission of WINDOW_UPDATE frames for that stream. A sender is | |||
| not obligated to maintain the available flow control window for | not obligated to maintain the available flow control window for | |||
| streams that it is no longer sending on. | streams that it is no longer sending on. | |||
| Flow control can be disabled for all streams or the connection using | Flow control can be disabled for all streams on the connection using | |||
| the SETTINGS_FLOW_CONTROL_OPTIONS setting. An implementation that | the SETTINGS_FLOW_CONTROL_OPTIONS setting. An implementation that | |||
| does not wish to perform flow control can use this in the initial | does not wish to perform stream flow control can use this in the | |||
| SETTINGS exchange. | initial SETTINGS exchange. | |||
| Flow control can be disabled for an individual stream or the overall | Flow control can be disabled for an individual stream or the overall | |||
| connection by sending a WINDOW_UPDATE with the END_FLOW_CONTROL flag | connection by sending a WINDOW_UPDATE with the END_FLOW_CONTROL flag | |||
| set. The payload of a WINDOW_UPDATE frame that has the | set. The payload of a WINDOW_UPDATE frame that has the | |||
| END_FLOW_CONTROL flag set is ignored. | END_FLOW_CONTROL flag set is ignored. | |||
| Flow control cannot be enabled again once disabled. Any attempt to | Flow control cannot be enabled again once disabled. Any attempt to | |||
| re-enable flow control - by sending a WINDOW_UPDATE or by clearing | re-enable flow control - by sending a WINDOW_UPDATE or by clearing | |||
| the bits on the SETTINGS_FLOW_CONTROL_OPTIONS setting - MUST be | the bits on the SETTINGS_FLOW_CONTROL_OPTIONS setting - MUST be | |||
| rejected with a FLOW_CONTROL_ERROR error code. | rejected with a FLOW_CONTROL_ERROR error code. | |||
| 4. HTTP Message Exchanges | 7. Error Codes | |||
| Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | ||||
| frames to convey the reasons for the stream or connection error. | ||||
| Error codes share a common code space. Some error codes only apply | ||||
| to specific conditions and have no defined semantics in certain frame | ||||
| types. | ||||
| The following error codes are defined: | ||||
| NO_ERROR (0): The associated condition is not as a result of an | ||||
| error. For example, a GOAWAY might include this code to indicate | ||||
| graceful shutdown of a connection. | ||||
| PROTOCOL_ERROR (1): The endpoint detected an unspecific protocol | ||||
| error. This error is for use when a more specific error code is | ||||
| not available. | ||||
| INTERNAL_ERROR (2): The endpoint encountered an unexpected internal | ||||
| error. | ||||
| FLOW_CONTROL_ERROR (3): The endpoint detected that its peer violated | ||||
| the flow control protocol. | ||||
| STREAM_CLOSED (5): The endpoint received a frame after a stream was | ||||
| half closed. | ||||
| FRAME_TOO_LARGE (6): The endpoint received a frame that was larger | ||||
| than the maximum size that it supports. | ||||
| REFUSED_STREAM (7): The endpoint refuses the stream prior to | ||||
| performing any application processing, see Section 8.1.5 for | ||||
| details. | ||||
| CANCEL (8): Used by the endpoint to indicate that the stream is no | ||||
| longer needed. | ||||
| COMPRESSION_ERROR (9): The endpoint is unable to maintain the | ||||
| compression context for the connection. | ||||
| 8. HTTP Message Exchanges | ||||
| HTTP/2.0 is intended to be as compatible as possible with current | HTTP/2.0 is intended to be as compatible as possible with current | |||
| web-based applications. This means that, from the perspective of the | web-based applications. This means that, from the perspective of the | |||
| server business logic or application API, the features of HTTP are | server business logic or application API, the features of HTTP are | |||
| unchanged. To achieve this, all of the application request and | unchanged. To achieve this, all of the application request and | |||
| response header semantics are preserved, although the syntax of | response header semantics are preserved, although the syntax of | |||
| conveying those semantics has changed. Thus, the rules from HTTP/1.1 | conveying those semantics has changed. Thus, the rules from HTTP/1.1 | |||
| ([HTTP-p1], [HTTP-p2], [HTTP-p4], [HTTP-p5], [HTTP-p6], and | ([HTTP-p1], [HTTP-p2], [HTTP-p4], [HTTP-p5], [HTTP-p6], and | |||
| [HTTP-p7]) apply with the changes in the sections below. | [HTTP-p7]) apply with the changes in the sections below. | |||
| 4.1. Connection Management | 8.1. HTTP Request/Response Exchange | |||
| Clients SHOULD NOT open more than one HTTP/2.0 connection to a given | ||||
| origin ([RFC6454]) concurrently. | ||||
| Note that it is possible for one HTTP/2.0 connection to be finishing | ||||
| (e.g. a GOAWAY frame has been sent, but not all streams have | ||||
| finished), while another HTTP/2.0 connection is starting. | ||||
| 4.2. HTTP Request/Response | ||||
| 4.2.1. HTTP Header Fields and HTTP/2.0 Headers | ||||
| At the application level, HTTP uses name-value pairs in its header | ||||
| fields. Because HTTP/2.0 merges the existing HTTP header fields with | ||||
| HTTP/2.0 headers, there is a possibility that some HTTP applications | ||||
| already use a particular header field name. To avoid any conflicts, | ||||
| all header fields introduced for layering HTTP over HTTP/2.0 are | ||||
| prefixed with ":". ":" is not a valid sequence in HTTP/1.* header | ||||
| field naming, preventing any possible conflict. | ||||
| 4.2.2. Request | A client sends an HTTP request on a new stream, using a previously | |||
| unused stream identifier (Section 5.1.1). A server sends an HTTP | ||||
| response on the same stream as the request. | ||||
| The client initiates a request by sending a HEADERS+PRIORITY frame. | An HTTP request or response each consist of: | |||
| Requests that do not contain a body MUST set the FINAL flag, | ||||
| indicating that the client intends to send no further data on this | ||||
| stream, unless the server intends to push resources (see | ||||
| Section 4.3). HEADERS+PRIORITY frame does not contain the FINAL flag | ||||
| for requests that contain a body. The body of a request follows as a | ||||
| series of DATA frames. The last DATA frame sets the FINAL flag to | ||||
| indicate the end of the body. | ||||
| The header fields included in the HEADERS+PRIORITY frame contain all | o one contiguous sequence of HEADERS frames; | |||
| of the HTTP header fields associated with an HTTP request. The | ||||
| definitions of these headers are largely unchanged relative to | ||||
| HTTP/1.1, with a few notable exceptions: | ||||
| o The HTTP/1.1 request-line has been split into two separate header | o zero or more DATA frames; and | |||
| fields named :method and :path, whose values specify the HTTP | ||||
| method for the request and the request-target, respectively. The | ||||
| HTTP-version component of the request-line is removed entirely | ||||
| from the headers. | ||||
| o The host and optional port portions of the request URI (see | o optionally, a contiguous sequence of HEADERS frames | |||
| [RFC3986], Section 3.2), is specified using the new :host header | ||||
| field. [[anchor21: Ed. Note: it needs to be clarified whether or | ||||
| not this replaces the existing HTTP/1.1 Host header.]] | ||||
| o A new :scheme header field has been added to specify the scheme | The last frame in the sequence bears an END_STREAM flag. | |||
| portion of the request-target (e.g. "https") | ||||
| o All header field names MUST be lowercased, and the definitions of | Other frames, including HEADERS, MAY be interspersed with these | |||
| all header field names defined by HTTP/1.1 are updated to be all | frames, but those frames do not carry HTTP semantics. | |||
| lowercase. | ||||
| o The Connection, Host, Keep-Alive, Proxy-Connection, and Transfer- | Trailing header fields are carried in a header block that also | |||
| Encoding header fields are no longer valid and MUST not be sent. | terminates the stream. That is, a sequence of HEADERS frames that | |||
| carries an END_STREAM flag on the last frame. Header blocks after | ||||
| the first that do not terminate the stream are not part of an HTTP | ||||
| request or response. | ||||
| All HTTP Requests MUST include the ":method", ":path", ":host", and | An HTTP request/response exchange fully consumes a single stream. A | |||
| ":scheme" header fields. | request starts with the HEADERS frame that puts the stream into an | |||
| "open" state and ends with a frame bearing END_STREAM, which causes | ||||
| the stream to become "half closed" for the client. A response starts | ||||
| with a HEADERS frame and ends with a frame bearing END_STREAM, which | ||||
| places the stream in the "closed" state. | ||||
| Header fields whose names begin with ":" (whether defined in this | 8.1.1. Examples | |||
| document or future extensions to this document) MUST appear before | ||||
| any other header fields. | ||||
| If a client sends a HEADERS+PRIORITY frame that omits a mandatory | For example, an HTTP GET request that includes request header fields | |||
| header, the server MUST reply with a HTTP 400 Bad Request reply. | and no body, is transmitted as a single contiguous sequence of | |||
| [[anchor22: Ed: why PROTOCOL_ERROR on missing ":status" in the | HEADERS frames containing the serialized block of request header | |||
| response, but HTTP 400 here?]] | fields. The last HEADERS frame in the sequence has both the | |||
| END_HEADERS and END_STREAM flag set: | ||||
| If a server receives a request where the sum of the data frame | GET /resource HTTP/1.1 HEADERS | |||
| payload lengths does not equal the size of the Content-Length header | Host: example.org ==> + END_STREAM | |||
| field, the server MUST return a 400 (Bad Request) error. | Accept: image/jpeg + END_HEADERS | |||
| :method = get | ||||
| :scheme = https | ||||
| :host = example.org | ||||
| :path = /resource | ||||
| accept = image/jpeg | ||||
| Although POSTs are inherently chunked, POST requests SHOULD also be | Similarly, a response that includes only response header fields is | |||
| accompanied by a Content-Length header field. First, it informs the | transmitted as a sequence of HEADERS frames containing the serialized | |||
| server of how much data to expect, which the server can use to track | block of response header fields. The last HEADERS frame in the | |||
| overall progress and provide appropriate user feedback. More | sequence has both the END_HEADERS and END_STREAM flag set: | |||
| importantly, some HTTP server implementations fail to correctly | ||||
| process requests that omit the Content-Length header field. Many | ||||
| existing clients send a Content-Length header field, and some server | ||||
| implementations have come to depend upon its presence. | ||||
| A client provides priority in requests as a hint to the server. A | HTTP/1.1 204 No Content HEADERS | |||
| server SHOULD attempt to provide responses to higher priority | Content-Length: 0 ===> + END_STREAM | |||
| requests before lower priority requests. A server could send lower | + END_HEADERS | |||
| priority responses during periods that higher priority responses are | :status = 204 | |||
| unavailable to ensure better utilization of a connection. | content-length: 0 | |||
| If the server receives a data frame prior to a HEADERS+PRIORITY frame | An HTTP POST request that includes request header fields and payload | |||
| the server MUST treat this as a stream error (Section 3.5.2) of type | data is transmitted as one or more HEADERS frames containing the | |||
| PROTOCOL_ERROR. | request headers followed by one or more DATA frames, with the last | |||
| HEADERS frame having the END_HEADERS flag set and the final DATA | ||||
| frame having the END_STREAM flag set: | ||||
| 4.2.3. Response | POST /resource HTTP/1.1 HEADERS | |||
| Host: example.org ==> - END_STREAM | ||||
| Content-Type: image/jpeg + END_HEADERS | ||||
| Content-Length: 123 :method = post | ||||
| :scheme = https | ||||
| {binary data} :host = example.org | ||||
| :path = /resource | ||||
| content-type = image/jpeg | ||||
| content-length = 123 | ||||
| The server responds to a client request using the same stream | DATA | |||
| identifier that was used by the request. An HTTP response begins | + END_STREAM | |||
| with a HEADERS frame. An HTTP response body consists of a series of | {binary data} | |||
| DATA frames. The last data frame contains a FINAL flag to indicate | ||||
| the end of the response. A response that contains no body (such as a | ||||
| 204 or 304 response) consists only of a HEADERS frame that contains | ||||
| the FINAL flag to indicate no further data will be sent on the | ||||
| stream. | ||||
| The response status line is unfolded into name-value pairs like | A response that includes header fields and payload data is | |||
| other HTTP header fields and must be present: | transmitted as one or more HEADERS frames followed by one or more | |||
| DATA frames, with the last DATA frame in the sequence having the | ||||
| END_STREAM flag set: | ||||
| ":status": The HTTP response status code (e.g. "200" or "200 OK") | HTTP/1.1 200 OK HEADERS | |||
| Content-Type: image/jpeg ==> - END_STREAM | ||||
| Content-Length: 123 + END_HEADERS | ||||
| :status = 200 | ||||
| {binary data} content-type = image/jpeg | ||||
| content-length = 123 | ||||
| All header field names starting with ":" (whether defined in this | DATA | |||
| document or future extensions to this document) MUST appear before | + END_STREAM | |||
| any other header fields. | {binary data} | |||
| All header field names MUST be all lowercase. | Trailing header fields are sent as a header block after both the | |||
| request or response header block and all the DATA frames have been | ||||
| sent. The sequence of HEADERS frames that bears the trailers | ||||
| includes a terminal frame that has both END_HEADERS and END_STREAM | ||||
| flags set. | ||||
| The Connection, Keep-Alive, Proxy-Connection, and Transfer- | HTTP/1.1 200 OK HEADERS | |||
| Encoding header fields are not valid and MUST not be sent. | Content-Type: image/jpeg ===> - END_STREAM | |||
| Content-Length: 123 + END_HEADERS | ||||
| TE: trailers :status = 200 | ||||
| 123 content-type = image/jpeg | ||||
| {binary data} content-length = 123 | ||||
| 0 | ||||
| Foo: bar DATA | ||||
| - END_STREAM | ||||
| {binary data} | ||||
| Responses MAY be accompanied by a Content-Length header field for | HEADERS | |||
| advisory purposes. This allows clients to learn the full size of | + END_STREAM | |||
| an entity prior to receiving all the data frames. This can help | + END_HEADERS | |||
| in, for example, reporting progress. | foo: bar | |||
| If a client receives a response where the sum of the data frame | 8.1.2. Request Header Fields | |||
| payload length does not equal the size of the Content-Length | ||||
| header field, the client MUST ignore the content length header | ||||
| field. [[anchor23: Ed: See | ||||
| <https://github.com/http2/http2-spec/issues/46>.]] | ||||
| If a client receives a response with an absent or duplicated status | The definitions of the request header fields are largely unchanged | |||
| header, the client MUST treat this as a stream error (Section 3.5.2) | relative to HTTP/1.1, with a few notable exceptions: | |||
| of type PROTOCOL_ERROR. | ||||
| If the client receives a data frame prior to a HEADERS frame the | o The HTTP/1.1 request-line has been split into two separate header | |||
| client MUST treat this as a stream error (Section 3.5.2) of type | fields named :method and :path, whose values specify the HTTP | |||
| PROTOCOL_ERROR. | method for the request and the request-target, respectively. The | |||
| HTTP-version component of the request-line is removed entirely | ||||
| from the headers. | ||||
| Clients MUST support gzip compression. Regardless of the value of | o The host and optional port portions of the request URI (see | |||
| the Accept-Encoding header field, a server MAY send responses with | [RFC3986], Section 3.2), are specified using the new :host header | |||
| gzip or deflate encoding. A compressed response MUST still bear an | field. [[anchor13: Ed. Note: it needs to be clarified whether or | |||
| appropriate Content-Encoding header field. | not this replaces the existing HTTP/1.1 Host header.]] | |||
| 4.3. Server Push Transactions | o A new :scheme header field has been added to specify the scheme | |||
| portion of the request-target (e.g. "https") | ||||
| HTTP/2.0 enables a server to send multiple replies to a client for a | o All header field names MUST be lowercased, and the definitions of | |||
| single request. The rationale for this feature is that sometimes a | all header field names defined by HTTP/1.1 are updated to be all | |||
| server knows that it will need to send multiple resources in response | lowercase. | |||
| to a single request. Without server push features, the client must | ||||
| first download the primary resource, then discover the secondary | ||||
| resource(s), and request them. | ||||
| Server push is an optional feature. The | o The Connection, Host, Keep-Alive, Proxy-Connection, and Transfer- | |||
| SETTINGS_MAX_CONCURRENT_STREAMS setting from the client limits the | Encoding header fields are no longer valid and MUST NOT be sent. | |||
| number of resources that can be concurrently pushed by a server. | [[anchor14: Ed. Note: And "TE" I presume?]] | |||
| Server push can be disabled by clients that do not wish to receive | ||||
| pushed resources by advertising a SETTINGS_MAX_CONCURRENT_STREAMS | ||||
| SETTING (Section 3.8.4) of zero. This prevents servers from creating | ||||
| the streams necessary to push resources. | ||||
| Clients receiving a pushed response MUST validate that the server is | All HTTP Requests MUST include the ":method", ":path", ":host", and | |||
| authorized to push the resource using the same-origin policy | ":scheme" header fields. | |||
| ([RFC6454], Section 3). For example, a HTTP/2.0 connection to | ||||
| "example.com" is generally [[anchor24: Ed: weaselly use of | ||||
| "generally", needs better definition]] not permitted to push a | ||||
| response for "www.example.org". | ||||
| A client that accepts pushed resources caches those resources as | Header fields whose names begin with ":" (whether defined in this | |||
| though they were responses to GET requests. | document or future extensions to this document) MUST appear before | |||
| any other header fields. [[anchor15: Ed. Note: This requirement is | ||||
| currently pending review. Consider it "on hold" for the moment.]] | ||||
| Pushing of resources avoids the round-trip delay, but also creates a | All HTTP Requests that include a body SHOULD include the "content- | |||
| potential race where a server can be pushing content which a client | length" header field. If a server receives a request where the sum | |||
| is in the process of requesting. The PUSH_PROMISE frame reduces the | of the DATA frame payload lengths does not equal the value of the | |||
| chances of this condition occurring, while retaining the performance | "content-length" header field, the server MUST return a 400 (Bad | |||
| benefit. | Request) error. | |||
| Pushed responses are associated with a request at the HTTP/2.0 | If a client omits a mandatory header field from the request, the | |||
| framing layer. The PUSH_PROMISE is sent on the stream for the | server MUST reply with a HTTP 400 Bad Request reply. | |||
| associated request, which allows a receiver to correlate the pushed | ||||
| resource with a request. The pushed stream inherits all of the | ||||
| request header fields from the associated stream with the exception | ||||
| of resource identification header fields (":host", ":scheme", and | ||||
| ":path"), which are provided as part of the PUSH_PROMISE frame. | ||||
| Pushed resources always have an associated ":method" of "GET". A | 8.1.3. Response Header Fields | |||
| cache MUST store these inherited and implied request header fields | ||||
| with the cached resource. | ||||
| 4.3.1. Server implementation | The definitions of the response header fields are largely unchanged | |||
| relative to HTTP/1.1, with a few notable exceptions: | ||||
| A server pushes resources in association with a request from the | o The response status line has been reduced to a single ":status" | |||
| client. Prior to closing the response stream, the server sends a | header field whose value specifies only the numeric response | |||
| PUSH_PROMISE for each resource that it intends to push. The | status code. The status text component of the HTTP/1.1 response | |||
| PUSH_PROMISE includes header fields that allow the client to identify | has been dropped entirely. | |||
| the resource (":scheme", ":host", and ":path"). | ||||
| A server can push multiple resources in response to a request, but | o The response MUST contain exactly one :status header field with | |||
| all pushed resources MUST be promised on the response stream for the | exactly one response status value. If the client receives an HTTP | |||
| associated request. A server cannot send a PUSH_PROMISE on a new | response that does not include the :status field, or provides | |||
| stream or a half-closed stream. | multiple response status code values, it MUST respond with a | |||
| stream error (Section 5.4.2) of type PROTOCOL_ERROR. | ||||
| The server SHOULD include any header fields in a PUSH_PROMISE that | o All header field names MUST be lowercased, and the definitions of | |||
| would allow a cache to determine if the resource is already cached | all header field names defined by HTTP/1.1 are updated to be all | |||
| (see [HTTP-p6], Section 4). | lowercase. | |||
| After sending a PUSH_PROMISE, the server commences transmission of a | o The Connection, Keep-Alive, Proxy-Connection, and Transfer- | |||
| pushed resource. A pushed resource uses a server-initiated stream. | Encoding header fields are not valid and MUST NOT be sent. | |||
| The server sends frames on this stream in the same order as an HTTP | ||||
| response (Section 4.2.3): a HEADERS frame followed by DATA frames. | ||||
| Many uses of server push are to send content that a client is likely | Header fields whose names begin with ":" (whether defined in this | |||
| to discover a need for based on the content of a response | document or future extensions to this document) MUST appear before | |||
| representation. To minimize the chances that a client will make a | any other header fields. [[anchor16: Ed. Note: This requirement is | |||
| request for resources that are being pushed - causing duplicate | currently pending review. Consider it "on hold" for the moment.]] | |||
| copies of a resource to be sent by the server - a PUSH_PROMISE frame | ||||
| SHOULD be sent prior to any content in the response representation | ||||
| that might allow a client to discover the pushed resource and request | ||||
| it. | ||||
| The server MUST only push resources that could have been returned | 8.1.4. GZip Content-Encoding | |||
| from a GET request. | ||||
| Note: A server does not need to have all response header fields | Clients MUST support gzip compression for HTTP response bodies. | |||
| available at the time it issues a PUSH_PROMISE frame. All remaining | Regardless of the value of the accept-encoding header field, a server | |||
| header fields are included in the HEADERS frame. The HEADERS frame | MAY send responses with gzip or deflate encoding. A compressed | |||
| MUST NOT duplicate header fields from the PUSH_PROMISE frames. | response MUST still bear an appropriate content-encoding header | |||
| field. | ||||
| 4.3.2. Client implementation | 8.1.5. Request Reliability Mechanisms in HTTP/2.0 | |||
| When fetching a resource the client has 3 possibilities: | In HTTP/1.1, an HTTP client is unable to retry a non-idempotent | |||
| request when an error occurs, because there is no means to determine | ||||
| the nature of the error. It is possible that some server processing | ||||
| occurred prior to the error, which could result in undesirable | ||||
| effects if the request were reattempted. | ||||
| 1. the resource is not being pushed | HTTP/2.0 provides two mechanisms for providing a guarantee to a | |||
| client that a request has not been processed: | ||||
| 2. the resource is being pushed, but the data has not yet arrived | o The GOAWAY frame indicates the highest stream number that might | |||
| have been processed. Requests on streams with higher numbers are | ||||
| therefore guaranteed to be safe to retry. | ||||
| 3. the resource is being pushed, and the data has started to arrive | o The REFUSED_STREAM error code can be included in a RST_STREAM | |||
| frame to indicate that the stream is being closed prior to any | ||||
| processing having occurred. Any request that was sent on the | ||||
| reset stream can be safely retried. | ||||
| A client SHOULD NOT issue GET requests for a resource that has been | In both cases, clients MAY automatically retry all requests, | |||
| promised. A client is instead advised to wait for the pushed | including those with non-idempotent methods. | |||
| resource to arrive. | ||||
| When a client receives a PUSH_PROMISE frame from the server without a | A server MUST NOT indicate that a stream has not been processed | |||
| the ":host", ":scheme", and ":path" header fields, it MUST treat this | unless it can guarantee that fact. If frames that are on a stream | |||
| as a stream error (Section 3.5.2) of type PROTOCOL_ERROR. | are passed to the application layer for any stream, then | |||
| REFUSED_STREAM MUST NOT be used for that stream, and a GOAWAY frame | ||||
| MUST include a stream identifier that is greater than or equal to the | ||||
| given stream identifier. | ||||
| To cancel individual server push streams, the client can issue a | In addition to these mechanisms, the PING frame provides a way for a | |||
| stream error (Section 3.5.2) of type CANCEL. After receiving a | client to easily test a connection. Connections that remain idle can | |||
| PUSH_PROMISE frame, the client is able to cancel the pushed resource | become broken as some middleboxes (for instance, network address | |||
| before receiving any frames on the promised stream. The server | translators, or load balancers) silently discard connection bindings. | |||
| ceases transmission of the pushed resource; if the server has not | The PING frame allows a client to safely test whether a connection is | |||
| commenced transmission, it does not start. | still active without sending a request. | |||
| To cancel all server push streams related to a request, the client | 8.2. Server Push | |||
| may issue a stream error (Section 3.5.2) of type CANCEL on the | ||||
| associated-stream-id. By cancelling that stream, the server MUST | ||||
| immediately stop sending frames for any streams with | ||||
| in-association-to for the original stream. [[anchor27: Ed: Triggering | ||||
| side-effects on stream reset is going to be problematic for the | ||||
| framing layer. Purely from a design perspective, it's a layering | ||||
| violation. More practically speaking, the base request stream might | ||||
| already be removed. Special handling logic would be required.]] | ||||
| A client can choose to time out pushed streams if the server does not | HTTP/2.0 enables a server to pre-emptively send (or "push") multiple | |||
| provide the resource in a timely fashion. A stream error | associated resources to a client in response to a single request. | |||
| (Section 3.5.2) of type CANCEL can be used to stop a timed out push. | This feature becomes particularly helpful when the server knows the | |||
| client will need to have those resources available in order to fully | ||||
| process the originally requested resource. | ||||
| If the server sends a HEADERS frame containing header fields that | Pushing additional resources is optional, and is negotiated only | |||
| duplicate values on a previous HEADERS or PUSH_PROMISE frames on the | between individual endpoints. For instance, an intermediary could | |||
| same stream, the client MUST treat this as a stream error | receive pushed resources from the server but is not required to | |||
| (Section 3.5.2) of type PROTOCOL_ERROR. | forward those on to the client. How to make use of the pushed | |||
| resources is up to that intermediary. Equally, the intermediary | ||||
| might choose to push additional resources to the client, without any | ||||
| action taken by the server. | ||||
| If the server sends a HEADERS frame after sending a data frame for | Server push is semantically equivalent to a server responding to a | |||
| the same stream, the client MAY ignore the HEADERS frame. Ignoring | GET request for that resource. The PUSH_PROMISE frame, or frames, | |||
| the HEADERS frame after a data frame prevents handling of HTTP's | sent by the server includes a header block that contains the request | |||
| trailing header fields (Section 4.1.1 of [HTTP-p1]). | headers that the server has assumed. | |||
| 5. Design Rationale and Notes | Pushed resources are always associated with an explicit request from | |||
| a client. The PUSH_PROMISE frames sent by the server are sent on the | ||||
| stream created for the original request. The PUSH_PROMSE frame | ||||
| includes a promised stream identifier, chosen from the stream | ||||
| identifiers available to the server (see Section 5.1.1). Any header | ||||
| fields that are not specified in the PUSH_PROMISE frames sent by the | ||||
| server are inherited from the original request sent by the client. | ||||
| Authors' notes: The notes in this section have no bearing on the | The header fields in PUSH_PROMISE MUST include the ":scheme", ":host" | |||
| HTTP/2.0 protocol as specified within this document, and none of | and ":path" header fields that identify the resource that is being | |||
| these notes should be considered authoritative about how the protocol | pushed. A PUSH_PROMISE always implies an HTTP method of GET. If a | |||
| works. However, these notes may prove useful in future debates about | client receives a PUSH_PROMISE that does not include these header | |||
| how to resolve protocol ambiguities or how to evolve the protocol | fields, or a value for the ":method" header field, it MUST respond | |||
| going forward. They may be removed before the final draft. | with a stream error (Section 5.4.2) of type PROTOCOL_ERROR. | |||
| 5.1. Separation of Framing Layer and Application Layer | After sending the PUSH_PROMISE frame, the server can begin delivering | |||
| the pushed resource on a new, server-initiated stream that uses the | ||||
| promised stream identifier. This stream is already implicitly "half | ||||
| closed" to the client (Section 5.1). The server uses this stream to | ||||
| transmit an HTTP response, using the same sequence of frames as | ||||
| defined in Section 8.1. | ||||
| Readers may note that this specification sometimes blends the framing | Once a client receives a PUSH_PROMISE frame and chooses to accept the | |||
| layer (Section 3) with requirements of a specific application - HTTP | pushed resource, the client SHOULD NOT issue any subsequent GET | |||
| (Section 4). This is reflected in the request/response nature of the | requests for the promised resource until after the promised stream | |||
| streams and the definition of the HEADERS which are very similar to | has closed. | |||
| HTTP, and other areas as well. | ||||
| This blending is intentional - the primary goal of this protocol is | The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | |||
| to create a low-latency protocol for use with HTTP. Isolating the | sending any HEADERS or DATA frames that reference the promised | |||
| two layers is convenient for description of the protocol and how it | resources. This avoids a race where clients issue requests for | |||
| relates to existing HTTP implementations. However, the ability to | resources prior to receiving any PUSH_PROMISE frames. | |||
| reuse the HTTP/2.0 framing layer is a non goal. | ||||
| 5.2. Error handling - Framing Layer | For example, if the server receives a request for a document | |||
| containing embedded links to multiple image files, and the server | ||||
| chooses to push those additional images to the client, sending push | ||||
| promises before the DATA frames that contain the image links ensure | ||||
| that the client is able to see the promises before discovering the | ||||
| resources. Likewise, if the server pushes resources referenced by | ||||
| the header block (for instance, in Link header fields), sending the | ||||
| push promises before sending the header block ensures that clients do | ||||
| not request those resources. | ||||
| Error handling at the HTTP/2.0 layer splits errors into two groups: | PUSH_PROMISE frames MUST NOT be sent by the client. PUSH_PROMISE | |||
| Those that affect an individual HTTP/2.0 stream, and those that do | frames can be sent by the server on any stream that was opened by the | |||
| not. | client. They MUST be sent on a stream that is in either the "open" | |||
| or "half closed (remote)" to the server. PUSH_PROMISE frames can be | ||||
| interspersed within the frames that comprise response, with the | ||||
| exception that they cannot be interspersed with HEADERS frames that | ||||
| comprise a single header block. | ||||
| When an error is confined to a single stream, but general framing is | A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | |||
| intact, HTTP/2.0 attempts to use the RST_STREAM as a mechanism to | the number of resources that can be concurrently pushed by a server. | |||
| invalidate the stream but move forward without aborting the | Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables | |||
| connection altogether. | server push by preventing the server from creating the necessary | |||
| streams. | ||||
| For errors occurring outside of a single stream context, HTTP/2.0 | The request header fields provided in the PUSH_PROMISE frame SHOULD | |||
| assumes the entire connection is hosed. In this case, the endpoint | include enough information for a client to determine whether a cached | |||
| detecting the error should initiate a connection close. | representation of the resource is already available. If the client | |||
| determines, for any reason, that it does not wish to receive the | ||||
| pushed resource from the server, or if the server takes too long to | ||||
| begin sending the promised resource, the client can send an | ||||
| RST_STREAM frame, using either the CANCEL or REFUSED_STREAM codes, | ||||
| and referencing the pushed stream's identifier. | ||||
| 5.3. One Connection per Domain | Clients receiving a pushed response MUST validate that the server is | |||
| authorized to push the resource using the same-origin policy | ||||
| ([RFC6454], Section 3). For example, a HTTP/2.0 connection to | ||||
| "example.com" is generally [[anchor17: Ed: weaselly use of | ||||
| "generally", needs better definition]] not permitted to push a | ||||
| response for "www.example.org". | ||||
| HTTP/2.0 attempts to use fewer connections than other protocols have | 9. Additional HTTP Requirements/Considerations | |||
| traditionally used. The rationale for this behavior is because it is | ||||
| very difficult to provide a consistent level of service (e.g. TCP | ||||
| slow-start), prioritization, or optimal compression when the client | ||||
| is connecting to the server through multiple channels. | ||||
| Through lab measurements, we have seen consistent latency benefits by | TODO: SNI, gzip and deflate Content-Encoding, etc.. | |||
| using fewer connections from the client. The overall number of | ||||
| packets sent by HTTP/2.0 can be as much as 40% less than HTTP. | ||||
| Handling large numbers of concurrent connections on the server also | ||||
| does become a scalability problem, and HTTP/2.0 reduces this load. | ||||
| The use of multiple connections is not without benefit, however. | 9.1. Frame Size Limits for HTTP | |||
| Because HTTP/2.0 multiplexes multiple, independent streams onto a | ||||
| single stream, it creates a potential for head-of-line blocking | ||||
| problems at the transport level. In tests so far, the negative | ||||
| effects of head-of-line blocking (especially in the presence of | ||||
| packet loss) is outweighed by the benefits of compression and | ||||
| prioritization. | ||||
| 5.4. Fixed vs Variable Length Fields | Frames used for HTTP messages MUST NOT exceed 2^14-1 (16383) octets | |||
| in length, not counting the 8 octet frame header. An endpoint MUST | ||||
| treat the receipt of a larger frame as a FRAME_TOO_LARGE error (see | ||||
| Section 4.2). | ||||
| HTTP/2.0 favors use of fixed length 32bit fields in cases where | 9.2. Connection Management | |||
| smaller, variable length encodings could have been used. To some, | ||||
| this seems like a tragic waste of bandwidth. HTTP/2.0 chooses the | ||||
| simple encoding for speed and simplicity. | ||||
| The goal of HTTP/2.0 is to reduce latency on the network. The | HTTP/2.0 connections are persistent. For best performance, it is | |||
| overhead of HTTP/2.0 frames is generally quite low. Each data frame | expected clients will not close connections until it is determined | |||
| is only an 8 byte overhead for a 1452 byte payload (~0.6%). At the | that no further communication with a server is necessary (for | |||
| time of this writing, bandwidth is already plentiful, and there is a | example, when a user navigates away from a particular web page), or | |||
| strong trend indicating that bandwidth will continue to increase. | until the server closes the connection. | |||
| With an average worldwide bandwidth of 1Mbps, and assuming that a | ||||
| variable length encoding could reduce the overhead by 50%, the | ||||
| latency saved by using a variable length encoding would be less than | ||||
| 100 nanoseconds. More interesting are the effects when the larger | ||||
| encodings force a packet boundary, in which case a round-trip could | ||||
| be induced. However, by addressing other aspects of HTTP/2.0 and TCP | ||||
| interactions, we believe this is completely mitigated. | ||||
| 5.5. Server Push | Clients SHOULD NOT open more than one HTTP/2.0 connection to a given | |||
| origin ([RFC6454]) concurrently. A client can create additional | ||||
| connections as replacements, either to replace connections that are | ||||
| near to exhausting the available stream identifiers (Section 5.1.1), | ||||
| or to replace connections that have encountered errors | ||||
| (Section 5.4.1). | ||||
| A subtle but important point is that server push streams must be | Servers are encouraged to maintain open connections for as long as | |||
| declared before the associated stream is closed. The reason for this | possible, but are permitted to terminate idle connections if | |||
| is so that proxies have a lifetime for which they can discard | necessary. When either endpoint chooses to close the transport-level | |||
| information about previous streams. If a pushed stream could | TCP connection, the terminating endpoint MUST first send a GOAWAY | |||
| associate itself with an already-closed stream, then endpoints would | (Section 6.8) frame so that both endpoints can reliably determine | |||
| not have a specific lifecycle for when they could disavow knowledge | whether previously sent frames have been processed and gracefully | |||
| of the streams which went before. | complete or terminate any necessary remaining tasks. | |||
| 6. Security Considerations | 10. Security Considerations | |||
| 6.1. Server Authority and Same-Origin | 10.1. Server Authority and Same-Origin | |||
| This specification uses the same-origin policy ([RFC6454], Section 3) | This specification uses the same-origin policy ([RFC6454], Section 3) | |||
| to determine whether an origin server is permitted to provide | to determine whether an origin server is permitted to provide | |||
| content. | content. | |||
| A server that is contacted using TLS is authenticated based on the | A server that is contacted using TLS is authenticated based on the | |||
| certificate that it offers in the TLS handshake (see [RFC2818], | certificate that it offers in the TLS handshake (see [RFC2818], | |||
| Section 3). A server is considered authoritative for an "https:" | Section 3). A server is considered authoritative for an "https" | |||
| resource if it has been successfully authenticated for the domain | resource if it has been successfully authenticated for the domain | |||
| part of the origin of the resource that it is providing. | part of the origin of the resource that it is providing. | |||
| A server is considered authoritative for an "http:" resource if the | A server is considered authoritative for an "http" resource if the | |||
| connection is established to a resolved IP address for the domain in | connection is established to a resolved IP address for the domain in | |||
| the origin of the resource. | the origin of the resource. | |||
| A client MUST NOT use, in any way, resources provided by a server | A client MUST NOT use, in any way, resources provided by a server | |||
| that is not authoritative for those resources. | that is not authoritative for those resources. | |||
| 6.2. Cross-Protocol Attacks | 10.2. Cross-Protocol Attacks | |||
| When using TLS, we believe that HTTP/2.0 introduces no new cross- | When using TLS, we believe that HTTP/2.0 introduces no new cross- | |||
| protocol attacks. TLS encrypts the contents of all transmission | protocol attacks. TLS encrypts the contents of all transmission | |||
| (except the handshake itself), making it difficult for attackers to | (except the handshake itself), making it difficult for attackers to | |||
| control the data which could be used in a cross-protocol attack. | control the data which could be used in a cross-protocol attack. | |||
| [[anchor23: Issue: This is no longer true]] | ||||
| [[anchor37: Issue: This is no longer true]] | 10.3. Cacheability of Pushed Resources | |||
| 6.3. Cacheability of Pushed Resources | ||||
| Pushed resources are synthesized responses without an explicit | Pushed resources are responses without an explicit request; the | |||
| request; the request for a pushed resource is synthesized from the | request for a pushed resource is synthesized from the request that | |||
| request that triggered the push, plus resource identification | triggered the push, plus resource identification information provided | |||
| information provided by the server. Request header fields are | by the server. Request header fields are necessary for HTTP cache | |||
| necessary for HTTP cache control validations (such as the Vary header | control validations (such as the Vary header field) to work. For | |||
| field) to work. For this reason, caches MUST inherit request header | this reason, caches MUST inherit request header fields from the | |||
| fields from the associated stream for the push. This includes the | associated stream for the push. This includes the Cookie header | |||
| Cookie header field. | field. | |||
| Caching resources that are pushed is possible, based on the guidance | Caching resources 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 | |||
| small portion of its URI space. | small portion of its URI space. | |||
| Where multiple tenants share space on the same server, that server | Where multiple tenants share space on the same server, that server | |||
| MUST ensure that tenants are not able to push representations of | MUST ensure that tenants are not able to push representations of | |||
| resources that they do not have authority over. Failure to enforce | resources that they do not have authority over. Failure to enforce | |||
| 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 resources for which an origin server is not authoritative are | Pushed resources for which an origin server is not authoritative are | |||
| never cached or used. | never cached or used. | |||
| 7. Privacy Considerations | 11. Privacy Considerations | |||
| 7.1. Long Lived Connections | ||||
| HTTP/2.0 aims to keep connections open longer between clients and | HTTP/2.0 aims to keep connections open longer between clients and | |||
| servers in order to reduce the latency when a user makes a request. | servers in order to reduce the latency when a user makes a request. | |||
| The maintenance of these connections over time could be used to | The maintenance of these connections over time could be used to | |||
| expose private information. For example, a user using a browser | expose private information. For example, a user using a browser | |||
| hours after the previous user stopped using that browser may be able | hours after the previous user stopped using that browser may be able | |||
| to learn about what the previous user was doing. This is a problem | to learn about what the previous user was doing. This is a problem | |||
| with HTTP in its current form as well, however the short lived | with HTTP in its current form as well, however the short lived | |||
| connections make it less of a risk. | connections make it less of a risk. | |||
| 7.2. SETTINGS frame | 12. IANA Considerations | |||
| The HTTP/2.0 SETTINGS frame allows servers to store out-of-band | ||||
| transmitted information about the communication between client and | ||||
| server on the client. Although this is intended only to be used to | ||||
| reduce latency, renegade servers could use it as a mechanism to store | ||||
| identifying information about the client in future requests. | ||||
| Clients implementing privacy modes can disable client-persisted | ||||
| SETTINGS storage. | ||||
| Clients MUST clear persisted SETTINGS information when clearing the | ||||
| cookies. | ||||
| 8. IANA Considerations | ||||
| This document establishes registries for frame types, error codes and | This document establishes registries for frame types, error codes and | |||
| settings. | settings. These new registries are entered in a new "Hypertext | |||
| Transfer Protocol (HTTP) 2.0 Parameters" section. | ||||
| 8.1. Frame Type Registry | This document also registers the "HTTP2-Settings" header field for | |||
| use in HTTP. | ||||
| 12.1. Frame Type Registry | ||||
| This document establishes a registry for HTTP/2.0 frame types. The | This document establishes a registry for HTTP/2.0 frame types. The | |||
| "HTTP/2.0 Frame Type" registry operates under the "IETF Review" | "HTTP/2.0 Frame Type" registry operates under the "IETF Review" | |||
| policy [RFC5226]. | policy [RFC5226]. | |||
| Frame types are an 8-bit value. When reviewing new frame type | Frame types are an 8-bit value. When reviewing new frame type | |||
| registrations, special attention is advised for any frame type- | registrations, special attention is advised for any frame type- | |||
| specific flags that are defined. Frame flags can interact with | specific flags that are defined. Frame flags can interact with | |||
| existing flags and could prevent the creation of globally applicable | existing flags and could prevent the creation of globally applicable | |||
| flags. | flags. | |||
| Initial values for the "HTTP/2.0 Frame Type" registry are shown in | Initial values for the "HTTP/2.0 Frame Type" registry are shown in | |||
| Table 1. | Table 1. | |||
| +------------+------------------+---------------------+ | +-----------+---------------+---------------------------------------+ | |||
| | Frame Type | Name | Flags | | | Frame | Name | Flags | | |||
| +------------+------------------+---------------------+ | | Type | | | | |||
| | 0 | DATA | - | | +-----------+---------------+---------------------------------------+ | |||
| | 1 | HEADERS+PRIORITY | - | | | 0 | DATA | END_STREAM(1) | | |||
| | 3 | RST_STREAM | - | | | 1 | HEADERS | END_STREAM(1), END_HEADERS(4), | | |||
| | 4 | SETTINGS | CLEAR_PERSISTED(2) | | | | | PRIORITY(8) | | |||
| | 5 | PUSH_PROMISE | - | | | 2 | PRIORITY | - | | |||
| | 6 | PING | PONG(2) | | | 3 | RST_STREAM | - | | |||
| | 7 | GOAWAY | - | | | 4 | SETTINGS | - | | |||
| | 8 | HEADERS | - | | | 5 | PUSH_PROMISE | END_PUSH_PROMISE(1) | | |||
| | 9 | WINDOW_UPDATE | END_FLOW_CONTROL(2) | | | 6 | PING | PONG(1) | | |||
| +------------+------------------+---------------------+ | | 7 | GOAWAY | - | | |||
| | 9 | WINDOW_UPDATE | END_FLOW_CONTROL(1) | | ||||
| +-----------+---------------+---------------------------------------+ | ||||
| Table 1 | Table 1 | |||
| 8.2. Error Code Registry | 12.2. Error Code Registry | |||
| This document establishes a registry for HTTP/2.0 error codes. The | This document establishes a registry for HTTP/2.0 error codes. The | |||
| "HTTP/2.0 Error Code" registry manages a 32-bit space. The "HTTP/2.0 | "HTTP/2.0 Error Code" registry manages a 32-bit space. The "HTTP/2.0 | |||
| Error Code" registry operates under the "Expert Review" policy | Error Code" registry operates under the "Expert Review" policy | |||
| [RFC5226]. | [RFC5226]. | |||
| Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
| of the error code. An expert reviewer is advised to examine new | of the error code. An expert reviewer is advised to examine new | |||
| registrations for possible duplication with existing error codes. | registrations for possible duplication with existing error codes. | |||
| Use of existing registrations is to be encouraged, but not mandated. | Use of existing registrations is to be encouraged, but not mandated. | |||
| skipping to change at page 43, line 30 ¶ | skipping to change at page 46, line 48 ¶ | |||
| Name: A name for the error code. Specifying an error code name is | Name: A name for the error code. Specifying an error code name is | |||
| optional. | optional. | |||
| Description: A description of the conditions where the error code is | Description: A description of the conditions where the error code is | |||
| applicable. | applicable. | |||
| Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
| defines the error code. | defines the error code. | |||
| An initial set of error code registrations can be found in | An initial set of error code registrations can be found in Section 7. | |||
| Section 3.5.3. | ||||
| 8.3. Settings Registry | 12.3. Settings Registry | |||
| This document establishes a registry for HTTP/2.0 settings. The | This document establishes a registry for HTTP/2.0 settings. The | |||
| "HTTP/2.0 Settings" registry manages a 24-bit space. The "HTTP/2.0 | "HTTP/2.0 Settings" registry manages a 24-bit space. The "HTTP/2.0 | |||
| Settings" registry operates under the "Expert Review" policy | Settings" registry operates under the "Expert Review" policy | |||
| [RFC5226]. | [RFC5226]. | |||
| Registrations for settings are required to include a description of | Registrations for settings are required to include a description of | |||
| the setting. An expert reviewer is advised to examine new | the setting. An expert reviewer is advised to examine new | |||
| registrations for possible duplication with existing settings. Use | registrations for possible duplication with existing settings. Use | |||
| of existing registrations is to be encouraged, but not mandated. | of existing registrations is to be encouraged, but not mandated. | |||
| skipping to change at page 44, line 16 ¶ | skipping to change at page 47, line 34 ¶ | |||
| and semantics. | and semantics. | |||
| Description: A description of the setting. This might include the | Description: A description of the setting. This might include the | |||
| range of values, any applicable units and how to act upon a value | range of values, any applicable units and how to act upon a value | |||
| when it is provided. | when it is provided. | |||
| Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
| defines the setting. | defines the setting. | |||
| An initial set of settings registrations can be found in | An initial set of settings registrations can be found in | |||
| Section 3.8.4.3. | Section 6.5.2. | |||
| 9. Acknowledgements | 12.4. HTTP2-Settings Header Field Registration | |||
| This section registers the "HTTP2-Settings" header field in the | ||||
| Permanent Message Header Field Registry [BCP90]. | ||||
| Header field name: HTTP2-Settings | ||||
| Applicable protocol: http | ||||
| Status: standard | ||||
| Author/Change controller: IETF | ||||
| Specification document(s): RFC XXXX (this document) | ||||
| Related information: This header field is only used by an HTTP/2.0 | ||||
| client for Upgrade-based negotiation. | ||||
| 13. Acknowledgements | ||||
| This document includes substantial input from the following | This document includes substantial input from the following | |||
| individuals: | individuals: | |||
| o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | |||
| Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | |||
| Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | |||
| Paul Amer, Fan Yang, Jonathan Leighton (SPDY contributors). | Paul Amer, Fan Yang, Jonathan Leighton (SPDY contributors). | |||
| o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism) | o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism) | |||
| o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | |||
| Jitu Padhye, Roberto Peon, Rob Trace (Flow control) | Jitu Padhye, Roberto Peon, Rob Trace (Flow control) | |||
| o Mark Nottingham, Julian Reschke, James Snell (Editorial) | o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner | |||
| (Substantial editorial contributions) | ||||
| 10. References | 14. References | |||
| 10.1. Normative References | 14.1. Normative References | |||
| [HTTP-p1] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | [COMPRESSION] Ruellan, H. and R. Peon, "HTTP Header Compression", | |||
| (HTTP/1.1): Message Syntax and Routing", | draft-ietf-httpbis-header-compression-00 (work in | |||
| draft-ietf-httpbis-p1-messaging-22 (work in progress), | progress), June 2013. | |||
| February 2013. | ||||
| [HTTP-p2] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | [HTTP-p1] Fielding, R. and J. Reschke, "Hypertext Transfer | |||
| (HTTP/1.1): Semantics and Content", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
| draft-ietf-httpbis-p2-semantics-22 (work in progress), | draft-ietf-httpbis-p1-messaging-22 (work in progress), | |||
| February 2013. | February 2013. | |||
| [HTTP-p4] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [HTTP-p2] Fielding, R. and J. Reschke, "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Conditional Requests", | Protocol (HTTP/1.1): Semantics and Content", | |||
| draft-ietf-httpbis-p4-conditional-22 (work in progress), | draft-ietf-httpbis-p2-semantics-22 (work in progress), | |||
| February 2013. | February 2013. | |||
| [HTTP-p5] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, Ed., | [HTTP-p4] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
| "Hypertext Transfer Protocol (HTTP/1.1): Range Requests", | Transfer Protocol (HTTP/1.1): Conditional Requests", | |||
| draft-ietf-httpbis-p5-range-22 (work in progress), | draft-ietf-httpbis-p4-conditional-22 (work in | |||
| February 2013. | progress), February 2013. | |||
| [HTTP-p6] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP-p5] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, | |||
| Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | Ed., "Hypertext Transfer Protocol (HTTP/1.1): Range | |||
| draft-ietf-httpbis-p6-cache-22 (work in progress), | Requests", draft-ietf-httpbis-p5-range-22 (work in | |||
| February 2013. | progress), February 2013. | |||
| [HTTP-p7] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [HTTP-p6] Fielding, R., Ed., Nottingham, M., Ed., and J. | |||
| Protocol (HTTP/1.1): Authentication", | Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): | |||
| draft-ietf-httpbis-p7-auth-22 (work in progress), | Caching", draft-ietf-httpbis-p6-cache-22 (work in | |||
| February 2013. | progress), February 2013. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [HTTP-p7] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
| RFC 793, September 1981. | Transfer Protocol (HTTP/1.1): Authentication", | |||
| draft-ietf-httpbis-p7-auth-22 (work in progress), | ||||
| February 2013. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | RFC 793, September 1981. | |||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | ||||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | ||||
| RFC 3986, January 2005. | ||||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, | |||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | "Uniform Resource Identifier (URI): Generic Syntax", | |||
| May 2008. | STD 66, RFC 3986, January 2005. | |||
| [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| (TLS) Protocol Version 1.2", RFC 5246, August 2008. | Encodings", RFC 4648, October 2006. | |||
| [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing | |||
| December 2011. | an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 5226, May 2008. | ||||
| [TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | |||
| "Transport Layer Security (TLS) Application Layer Protocol | Specifications: ABNF", STD 68, RFC 5234, January 2008. | |||
| Negotiation Extension", draft-ietf-tls-applayerprotoneg-01 | ||||
| (work in progress), April 2013. | ||||
| 10.2. Informative References | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer | |||
| Security (TLS) Protocol Version 1.2", RFC 5246, | ||||
| August 2008. | ||||
| [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP Extensions | [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | |||
| for High Performance", RFC 1323, May 1992. | December 2011. | |||
| [TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | [TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application Layer | ||||
| Protocol Negotiation Extension", | ||||
| draft-ietf-tls-applayerprotoneg-01 (work in progress), | ||||
| April 2013. | ||||
| Jackson, "Talking to Yourself for Fun and Profit", 2011, | 14.2. Informative References | |||
| <http://w2spconf.com/2011/papers/websocket.pdf>. | ||||
| [BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration | ||||
| Procedures for Message Header Fields", BCP 90, | ||||
| RFC 3864, September 2004. | ||||
| [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP | ||||
| Extensions for High Performance", RFC 1323, May 1992. | ||||
| [TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | ||||
| Jackson, "Talking to Yourself for Fun and Profit", | ||||
| 2011, <http://w2spconf.com/2011/papers/websocket.pdf>. | ||||
| Appendix A. Change Log (to be removed by RFC Editor before publication) | Appendix A. Change Log (to be removed by RFC Editor before publication) | |||
| A.1. Since draft-ietf-httpbis-http2-02 | A.1. Since draft-ietf-httpbis-http2-03 | |||
| Committed major restructuring atrocities. | ||||
| Added reference to first header compression draft. | ||||
| Added more formal description of frame lifecycle. | ||||
| Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. | ||||
| Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. | ||||
| Added PRIORITY frame. | ||||
| A.2. Since draft-ietf-httpbis-http2-02 | ||||
| Added continuations to frames carrying header blocks. | Added continuations to frames carrying header blocks. | |||
| Replaced use of "session" with "connection" to avoid confusion with | Replaced use of "session" with "connection" to avoid confusion with | |||
| other HTTP stateful concepts, like cookies. | other HTTP stateful concepts, like cookies. | |||
| Removed "message". | Removed "message". | |||
| Switched to TLS ALPN from NPN. | Switched to TLS ALPN from NPN. | |||
| Editorial changes. | Editorial changes. | |||
| A.2. Since draft-ietf-httpbis-http2-01 | A.3. Since draft-ietf-httpbis-http2-01 | |||
| Added IANA considerations section for frame types, error codes and | Added IANA considerations section for frame types, error codes and | |||
| settings. | settings. | |||
| Removed data frame compression. | Removed data frame compression. | |||
| Added PUSH_PROMISE. | Added PUSH_PROMISE. | |||
| Added globally applicable flags to framing. | Added globally applicable flags to framing. | |||
| skipping to change at page 47, line 7 ¶ | skipping to change at page 51, line 31 ¶ | |||
| Restructured frame header. Removed distinction between data and | Restructured frame header. Removed distinction between data and | |||
| control frames. | control frames. | |||
| Altered flow control properties to include session-level limits. | Altered flow control properties to include session-level limits. | |||
| Added note on cacheability of pushed resources and multiple tenant | Added note on cacheability of pushed resources and multiple tenant | |||
| servers. | servers. | |||
| Changed protocol label form based on discussions. | Changed protocol label form based on discussions. | |||
| A.3. Since draft-ietf-httpbis-http2-00 | A.4. Since draft-ietf-httpbis-http2-00 | |||
| Changed title throughout. | Changed title throughout. | |||
| Removed section on Incompatibilities with SPDY draft#2. | Removed section on Incompatibilities with SPDY draft#2. | |||
| Changed INTERNAL_ERROR on GOAWAY to have a value of 2 <https:// | Changed INTERNAL_ERROR on GOAWAY to have a value of 2 <https:// | |||
| groups.google.com/forum/?fromgroups#!topic/spdy-dev/cfUef2gL3iU>. | groups.google.com/forum/?fromgroups#!topic/spdy-dev/cfUef2gL3iU>. | |||
| Replaced abstract and introduction. | Replaced abstract and introduction. | |||
| Added section on starting HTTP/2.0, including upgrade mechanism. | Added section on starting HTTP/2.0, including upgrade mechanism. | |||
| Removed unused references. | Removed unused references. | |||
| Added flow control principles (Section 3.6.1) based on <http:// | Added flow control principles (Section 5.2.1) based on <http:// | |||
| tools.ietf.org/html/draft-montenegro-httpbis-http2-fc-principles-01>. | tools.ietf.org/html/draft-montenegro-httpbis-http2-fc-principles-01>. | |||
| A.4. Since draft-mbelshe-httpbis-spdy-00 | A.5. Since draft-mbelshe-httpbis-spdy-00 | |||
| Adopted as base for draft-ietf-httpbis-http2. | Adopted as base for draft-ietf-httpbis-http2. | |||
| Updated authors/editors list. | Updated authors/editors list. | |||
| Added status note. | Added status note. | |||
| Authors' Addresses | Authors' Addresses | |||
| Mike Belshe | Mike Belshe | |||
| End of changes. 309 change blocks. | ||||
| 1073 lines changed or deleted | 1291 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||