| draft-ietf-httpbis-http2-02.txt | draft-ietf-httpbis-http2-03.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: October 5, 2013 Google, Inc | Expires: November 30, 2013 Google, Inc | |||
| M. Thomson, Ed. | M. Thomson, Ed. | |||
| Microsoft | Microsoft | |||
| A. Melnikov, Ed. | A. Melnikov, Ed. | |||
| Isode Ltd | Isode Ltd | |||
| April 3, 2013 | May 29, 2013 | |||
| Hypertext Transfer Protocol version 2.0 | Hypertext Transfer Protocol version 2.0 | |||
| draft-ietf-httpbis-http2-02 | draft-ietf-httpbis-http2-03 | |||
| Abstract | Abstract | |||
| This specification describes an optimised 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 transfer of representations by providing | enables more efficient use of network resources and reduced | |||
| compressed header fields, simultaneous requests, and also introduces | perception of latency by allowing header field compression and | |||
| unsolicited push of representations from server to client. | multiple concurrent messages on the same connection. It also | |||
| introduces unsolicited push of representations from servers to | ||||
| clients. | ||||
| This document is an alternative to, but does not obsolete the HTTP | This document is an alternative to, but does not obsolete the | |||
| message format. HTTP semantics remain unchanged. | HTTP/1.1 message format or protocol. HTTP's existing semantics | |||
| remain unchanged. | ||||
| 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 | |||
| skipping to change at page 2, line 10 ¶ | skipping to change at page 2, line 12 ¶ | |||
| 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 October 5, 2013. | This Internet-Draft will expire on November 30, 2013. | |||
| 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 32 ¶ | skipping to change at page 2, line 34 ¶ | |||
| 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 . . . . . . . . . . . . . . . . . . . . . . 7 | 2. Starting HTTP/2.0 . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 2.1. HTTP/2.0 Version Identification . . . . . . . . . . . . . 7 | 2.1. HTTP/2.0 Version Identification . . . . . . . . . . . . . 7 | |||
| 2.2. Starting HTTP/2.0 for "http:" URIs . . . . . . . . . . . . 8 | 2.2. Starting HTTP/2.0 for "http:" URIs . . . . . . . . . . . . 8 | |||
| 2.3. Starting HTTP/2.0 for "https:" URIs . . . . . . . . . . . 8 | 2.3. Starting HTTP/2.0 for "https:" URIs . . . . . . . . . . . 8 | |||
| 2.4. Starting HTTP/2.0 with Prior Knowledge . . . . . . . . . . 9 | 2.4. Starting HTTP/2.0 with Prior Knowledge . . . . . . . . . . 9 | |||
| 3. HTTP/2.0 Framing Layer . . . . . . . . . . . . . . . . . . . . 9 | 3. HTTP/2.0 Framing Layer . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.1. Session . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3.1. Connection . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.2. Session Header . . . . . . . . . . . . . . . . . . . . . . 9 | 3.2. Connection Header . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.3. Framing . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 3.3. Framing . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.3.1. Frame Header . . . . . . . . . . . . . . . . . . . . . 10 | 3.3.1. Frame Header . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.3.2. Frame Processing . . . . . . . . . . . . . . . . . . . 11 | 3.3.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.4. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 3.4. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.4.1. Stream Creation . . . . . . . . . . . . . . . . . . . 12 | 3.4.1. Stream Creation . . . . . . . . . . . . . . . . . . . 13 | |||
| 3.4.2. Stream priority . . . . . . . . . . . . . . . . . . . 12 | 3.4.2. Stream priority . . . . . . . . . . . . . . . . . . . 13 | |||
| 3.4.3. Stream headers . . . . . . . . . . . . . . . . . . . . 13 | 3.4.3. Stream half-close . . . . . . . . . . . . . . . . . . 14 | |||
| 3.4.4. Stream data exchange . . . . . . . . . . . . . . . . . 13 | 3.4.4. Stream close . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.4.5. Stream half-close . . . . . . . . . . . . . . . . . . 13 | 3.5. Error Handling . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 3.4.6. Stream close . . . . . . . . . . . . . . . . . . . . . 13 | 3.5.1. Connection Error Handling . . . . . . . . . . . . . . 15 | |||
| 3.5. Error Handling . . . . . . . . . . . . . . . . . . . . . . 14 | 3.5.2. Stream Error Handling . . . . . . . . . . . . . . . . 16 | |||
| 3.5.1. Session Error Handling . . . . . . . . . . . . . . . . 14 | 3.5.3. Error Codes . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 3.5.2. Stream Error Handling . . . . . . . . . . . . . . . . 15 | 3.6. Stream Flow Control . . . . . . . . . . . . . . . . . . . 17 | |||
| 3.5.3. Error Codes . . . . . . . . . . . . . . . . . . . . . 15 | 3.6.1. Flow Control Principles . . . . . . . . . . . . . . . 17 | |||
| 3.6. Stream Flow Control . . . . . . . . . . . . . . . . . . . 16 | 3.6.2. Appropriate Use of Flow Control . . . . . . . . . . . 18 | |||
| 3.6.1. Flow Control Principles . . . . . . . . . . . . . . . 16 | 3.7. Header Blocks . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 3.6.2. Appropriate Use of Flow Control . . . . . . . . . . . 17 | 3.8. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 3.7. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 18 | 3.8.1. DATA Frames . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 3.7.1. DATA Frames . . . . . . . . . . . . . . . . . . . . . 18 | 3.8.2. HEADERS+PRIORITY . . . . . . . . . . . . . . . . . . . 20 | |||
| 3.7.2. HEADERS+PRIORITY . . . . . . . . . . . . . . . . . . . 18 | 3.8.3. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 3.7.3. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . 18 | 3.8.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 3.7.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . 19 | 3.8.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 3.7.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . 22 | 3.8.6. PING . . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 3.7.6. PING . . . . . . . . . . . . . . . . . . . . . . . . . 23 | 3.8.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 3.7.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . 23 | 3.8.8. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 3.7.8. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 24 | 3.8.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . 29 | |||
| 3.7.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . 25 | 4. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 32 | |||
| 3.7.10. Header Block . . . . . . . . . . . . . . . . . . . . . 28 | 4.1. Connection Management . . . . . . . . . . . . . . . . . . 32 | |||
| 4. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 28 | 4.2. HTTP Request/Response . . . . . . . . . . . . . . . . . . 33 | |||
| 4.1. Connection Management . . . . . . . . . . . . . . . . . . 28 | 4.2.1. HTTP Header Fields and HTTP/2.0 Headers . . . . . . . 33 | |||
| 4.1.1. Use of GOAWAY . . . . . . . . . . . . . . . . . . . . 29 | 4.2.2. Request . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 4.2. HTTP Request/Response . . . . . . . . . . . . . . . . . . 29 | 4.2.3. Response . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 4.2.1. HTTP Header Fields and HTTP/2.0 Headers . . . . . . . 29 | 4.3. Server Push Transactions . . . . . . . . . . . . . . . . . 35 | |||
| 4.2.2. Request . . . . . . . . . . . . . . . . . . . . . . . 29 | 4.3.1. Server implementation . . . . . . . . . . . . . . . . 36 | |||
| 4.2.3. Response . . . . . . . . . . . . . . . . . . . . . . . 31 | 4.3.2. Client implementation . . . . . . . . . . . . . . . . 37 | |||
| 4.3. Server Push Transactions . . . . . . . . . . . . . . . . . 32 | 5. Design Rationale and Notes . . . . . . . . . . . . . . . . . . 38 | |||
| 4.3.1. Server implementation . . . . . . . . . . . . . . . . 33 | 5.1. Separation of Framing Layer and Application Layer . . . . 38 | |||
| 4.3.2. Client implementation . . . . . . . . . . . . . . . . 34 | 5.2. Error handling - Framing Layer . . . . . . . . . . . . . . 39 | |||
| 5. Design Rationale and Notes . . . . . . . . . . . . . . . . . . 35 | 5.3. One Connection per Domain . . . . . . . . . . . . . . . . 39 | |||
| 5.1. Separation of Framing Layer and Application Layer . . . . 35 | 5.4. Fixed vs Variable Length Fields . . . . . . . . . . . . . 39 | |||
| 5.2. Error handling - Framing Layer . . . . . . . . . . . . . . 35 | 5.5. Server Push . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 5.3. One Connection Per Domain . . . . . . . . . . . . . . . . 36 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 40 | |||
| 5.4. Fixed vs Variable Length Fields . . . . . . . . . . . . . 36 | 6.1. Server Authority and Same-Origin . . . . . . . . . . . . . 40 | |||
| 5.5. Server Push . . . . . . . . . . . . . . . . . . . . . . . 36 | 6.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 40 | |||
| 6. Security Considerations . . . . . . . . . . . . . . . . . . . 37 | 6.3. Cacheability of Pushed Resources . . . . . . . . . . . . . 41 | |||
| 6.1. Use of Same-origin constraints . . . . . . . . . . . . . . 37 | 7. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 37 | 7.1. Long Lived Connections . . . . . . . . . . . . . . . . . . 41 | |||
| 6.3. Cacheability of Pushed Resources . . . . . . . . . . . . . 37 | 7.2. SETTINGS frame . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 7. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 37 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 7.1. Long Lived Connections . . . . . . . . . . . . . . . . . . 38 | 8.1. Frame Type Registry . . . . . . . . . . . . . . . . . . . 42 | |||
| 7.2. SETTINGS frame . . . . . . . . . . . . . . . . . . . . . . 38 | 8.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 43 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 38 | 8.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 43 | |||
| 8.1. Frame Type Registry . . . . . . . . . . . . . . . . . . . 38 | 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 44 | |||
| 8.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 39 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 44 | |||
| 8.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 39 | 10.1. Normative References . . . . . . . . . . . . . . . . . . . 44 | |||
| 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 40 | 10.2. Informative References . . . . . . . . . . . . . . . . . . 45 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . . 41 | ||||
| 10.2. Informative References . . . . . . . . . . . . . . . . . . 42 | ||||
| Appendix A. Change Log (to be removed by RFC Editor before | Appendix A. Change Log (to be removed by RFC Editor before | |||
| publication) . . . . . . . . . . . . . . . . . . . . 42 | publication) . . . . . . . . . . . . . . . . . . . . 46 | |||
| A.1. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 42 | A.1. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 46 | |||
| A.2. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 43 | A.2. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 46 | |||
| A.3. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 43 | A.3. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 47 | |||
| A.4. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 47 | ||||
| 1. Introduction | 1. Introduction | |||
| The Hypertext Transfer Protocol (HTTP) is a wildly successful | The Hypertext Transfer Protocol (HTTP) is a wildly successful | |||
| protocol. The HTTP/1.1 message encapsulation ([HTTP-p1], Section 3) | protocol. However, the HTTP/1.1 message encapsulation ([HTTP-p1], | |||
| is optimized for implementation simplicity and accessibility, not | Section 3) is optimized for implementation simplicity and | |||
| application performance. As such it has several characteristics that | accessibility, not application performance. As such it has several | |||
| have a negative overall effect on application performance. | characteristics that have a negative overall effect on application | |||
| performance. | ||||
| The HTTP/1.1 encapsulation ensures that only one request can be | In particular, HTTP/1.0 only allows one request to be delivered at a | |||
| delivered at a time on a given connection. HTTP/1.1 pipelining, | time on a given connection. HTTP/1.1 pipelining only partially | |||
| which is not widely deployed, only partially addresses these | addressed request concurrency, and is not widely deployed. | |||
| concerns. Clients that need to make multiple requests therefore use | Therefore, clients that need to make many requests (as is common on | |||
| commonly multiple connections to a server or servers in order to | the Web) typically use multiple connections to a server in order to | |||
| reduce the overall latency of those requests. [[anchor1: Need to tune | reduce perceived latency. | |||
| the anti-pipelining comments here.]] | ||||
| Furthermore, HTTP/1.1 header fields are represented in an inefficient | Furthermore, HTTP/1.1 header fields are often repetitive and verbose, | |||
| fashion, which, in addition to generating more or larger network | which, in addition to generating more or larger network packets, can | |||
| packets, can cause the small initial TCP window to fill more quickly | cause the small initial TCP congestion window to quickly fill. This | |||
| than is ideal. This results in excessive latency where multiple | can result in excessive latency when multiple requests are made on a | |||
| requests are made on a new TCP connection. | single new TCP connection. | |||
| This document defines an optimized mapping of the HTTP semantics to a | This document addresses these issues by defining an optimized mapping | |||
| TCP connection. This optimization reduces the latency costs of HTTP | of HTTP's semantics to an underlying connection. Specifically, it | |||
| by allowing parallel requests on the same connection and by using an | allows interleaving of request and response messages on the same | |||
| efficient coding for HTTP header fields. Prioritization of requests | connection and uses an efficient coding for HTTP header fields. It | |||
| lets more important requests complete faster, further improving | also allows prioritization of requests, letting more important | |||
| application performance. | requests complete more quickly, further improving perceived | |||
| performance. | ||||
| HTTP/2.0 applications have an improved impact on network congestion | The resulting protocol is designed to have be more friendly to the | |||
| due to the use of fewer TCP connections to achieve the same effect. | network, because fewer TCP connections can be used, in comparison to | |||
| Fewer TCP connections compete more fairly with other flows. Long- | HTTP/1.x. This means less competition with other flows, and longer- | |||
| lived connections are also more able to take better advantage of the | lived connections, which in turn leads to better utilization of | |||
| available network capacity, rather than operating in the slow start | available network capacity. | |||
| phase of TCP. | ||||
| The HTTP/2.0 encapsulation also enables more efficient processing of | Finally, this encapsulation also enables more scalable processing of | |||
| messages by providing efficient message framing. Processing of | messages through use of binary message framing. | |||
| header fields in HTTP/2.0 messages is more efficient (for entities | ||||
| that process many messages). | ||||
| 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 is started; a | HTTP/2.0 (Section 2), which covers how a HTTP/2.0 connection is | |||
| framing layer (Section 3), which multiplexes a TCP connection into | initiated; a framing layer (Section 3), which multiplexes a single | |||
| independent, length-prefixed frames; and an HTTP layer (Section 4), | TCP connection into independent frames of various types; and an HTTP | |||
| which specifies the mechanism for overlaying HTTP request/response | layer (Section 4), which specifies the mechanism for expressing HTTP | |||
| pairs on top of the framing layer. While some of the framing layer | interactions using the framing layer. While some of the framing | |||
| concepts are isolated from the HTTP layer, 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]. | |||
| All numeric values are in network byte order. Values are unsigned | All numeric values are in network byte order. Values are unsigned | |||
| unless otherwise indicated. Literal values are provided in decimal | unless otherwise indicated. Literal values are provided in decimal | |||
| or hexadecimal as appropriate. Hexadecimal literals are prefixed | or hexadecimal as appropriate. Hexadecimal literals are prefixed | |||
| with "0x" to distinguish them from decimal literals. | with "0x" to distinguish them from decimal literals. | |||
| The following terms are used: | The following terms are used: | |||
| client: The endpoint initiating the HTTP/2.0 session. | client: The endpoint initiating the HTTP connection. | |||
| connection: A transport-level connection between two endpoints. | connection: A transport-level connection between two endpoints. | |||
| endpoint: Either the client or server of a connection. | endpoint: Either the client or server of the connection. | |||
| frame: The smallest unit of communication, each containing a frame | frame: The smallest unit of communication within an HTTP/2.0 | |||
| header. | connection, consisting of a header and a variable-length sequence | |||
| of bytes structured according to the frame type. | ||||
| message: A complete sequence of frames. | peer: An endpoint. When discussing a particular endpoint, "peer" | |||
| refers to the endpoint that is remote to the primary subject of | ||||
| discussion. | ||||
| receiver: An endpoint that is receiving frames. | receiver: An endpoint that is receiving frames. | |||
| sender: An endpoint that is transmitting frames. | sender: An endpoint that is transmitting frames. | |||
| server: The endpoint which did not initiate the HTTP/2.0 session. | server: The endpoint which did not initiate the HTTP connection. | |||
| session: A synonym for a connection. | ||||
| session error: An error on the HTTP/2.0 session. | connection error: An error on the HTTP/2.0 connection. | |||
| stream: A bi-directional flow of bytes across a virtual channel | stream: A bi-directional flow of frames across a virtual channel | |||
| within a HTTP/2.0 session. | within the HTTP/2.0 connection. | |||
| stream error: An error on an individual HTTP/2.0 stream. | stream error: An error on the individual HTTP/2.0 stream. | |||
| 2. Starting HTTP/2.0 | 2. Starting HTTP/2.0 | |||
| Just as HTTP/1.1 does, HTTP/2.0 uses the "http:" and "https:" URI | HTTP/2.0 uses the same "http:" and "https:" URI schemes used by | |||
| schemes. An HTTP/2.0-capable client is therefore required to | HTTP/1.1. As a result, implementations processing requests for | |||
| discover whether a server (or intermediary) supports HTTP/2.0. | 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. | ||||
| Different discovery mechanisms are defined for "http:" and "https:" | The means by which support for HTTP/2.0 is determined is different | |||
| URIs. Discovery for "http:" URIs is described in Section 2.2; | for "http" and "https" URIs. Discovery for "https:" URIs is | |||
| discovery for "https:" URIs is described in Section 2.3. | described in Section 2.3. Discovery for "http" URIs is described | |||
| here. | ||||
| 2.1. HTTP/2.0 Version Identification | 2.1. HTTP/2.0 Version Identification | |||
| HTTP/2.0 is identified using the string "HTTP/2.0". This | The protocol defined in this document is identified using the string | |||
| identification is used in the HTTP/1.1 Upgrade header field, in the | "HTTP/2.0". This identification is used in the HTTP/1.1 Upgrade | |||
| TLS-NPN [TLSNPN] [[anchor4: TBD]] field and other places where | header field, in the TLS application layer protocol negotiation | |||
| protocol identification is required. | extension [TLSALPN] field and other places where protocol | |||
| 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. | |||
| [[anchor5: Editor's Note: please remove the following text prior to | [[anchor3: 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. | |||
| Implementations of draft versions of the protocol MUST add the string | Implementations of draft versions of the protocol MUST add the string | |||
| "-draft-" and the corresponding draft number to the identifier before | "-draft-" and the corresponding draft number to the identifier before | |||
| the separator ('/'). For example, draft-ietf-httpbis-http2-03 is | the separator ('/'). For example, draft-ietf-httpbis-http2-03 is | |||
| identified using the string "HTTP-draft-03/2.0". | identified using the string "HTTP-draft-03/2.0". | |||
| 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 with 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 | 2.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. | |||
| skipping to change at page 8, line 37 ¶ | skipping to change at page 8, line 37 ¶ | |||
| A server that supports HTTP/2.0 can accept the upgrade with a 101 | A server that supports HTTP/2.0 can accept 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 session ... | [ HTTP/2.0 connection ... | |||
| Once the server returns the 101 response, both the client and the | The first HTTP/2.0 frame sent by the server is a SETTINGS frame | |||
| server send a session header (Section 3.2). | (Section 3.8.4). Upon receiving the 101 response, the client sends a | |||
| connection header (Section 3.2), which includes a SETTINGS frame. | ||||
| 2.3. Starting HTTP/2.0 for "https:" URIs | 2.3. Starting HTTP/2.0 for "https:" URIs | |||
| A client that makes a request to an "https:" URI without prior | A client that makes a request to an "https:" URI without prior | |||
| knowledge about support for HTTP/2.0 uses TLS [RFC5246] with TLS-NPN | knowledge about support for HTTP/2.0 uses TLS [RFC5246] with the | |||
| [TLSNPN] extension. [[anchor6: TBD, maybe ALPN]] | 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 session header (Section 3.2). | a connection header (Section 3.2). | |||
| 2.4. Starting HTTP/2.0 with Prior Knowledge | 2.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. This only affects the | |||
| resolution of "http:" URIs, servers supporting HTTP/2.0 are required | resolution of "http:" URIs, servers supporting HTTP/2.0 are required | |||
| to support protocol negotiation in TLS [TLSNPN]. | 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 sessions. It is possible for server | will support HTTP/2.0 for future connections. It is possible for | |||
| configurations to change or for configurations to differ between | server configurations to change or for configurations to differ | |||
| instances in clustered server. Different "transparent" | between instances in clustered server. Interception proxies (a.k.a. | |||
| intermediaries - intermediaries that are not explicitly selected by | "transparent" proxies) are another source of variability. | |||
| either client or server - are another source of variability. | ||||
| 3. HTTP/2.0 Framing Layer | 3. HTTP/2.0 Framing Layer | |||
| 3.1. Session | 3.1. Connection | |||
| The HTTP/2.0 session runs atop TCP ([RFC0793]). The client is the | The HTTP/2.0 connection is an Application Level protocol running on | |||
| TCP connection initiator. | top of a TCP connection ([RFC0793]). The client is the TCP | |||
| connection initiator. | ||||
| HTTP/2.0 connections are persistent connections. For best | HTTP/2.0 connections are persistent. That is, for best performance, | |||
| performance, it is expected that clients will not close open | it is expected a clients will not close connections until it is | |||
| connections until the user navigates away from all web pages | determined that no further communication with a server is necessary | |||
| referencing a connection, or until the server closes the connection. | (for example, when a user navigates away from a particular web page), | |||
| Servers are encouraged to leave connections open for as long as | or until the server closes the connection. | |||
| possible, but can terminate idle connections if necessary. When | ||||
| either endpoint closes the transport-level connection, it MUST first | ||||
| send a GOAWAY (Section 3.7.7) frame so that the endpoints can | ||||
| reliably determine if requests finished before the close. | ||||
| 3.2. Session Header | 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. | ||||
| After opening a TCP connection and performing either an HTTP/1.1 | 3.2. Connection Header | |||
| Upgrade or TLS handshake, the client sends the client session header. | ||||
| The server replies with a server session header. | ||||
| The session header provides a final confirmation that both peers | Upon establishment of a TCP connection and determination that | |||
| agree to use the HTTP/2.0 protocol. The SETTINGS frame ensures that | HTTP/2.0 will be used by both peers to communicate, each endpoint | |||
| client or server configuration is known as quickly as possible. | MUST send a connection header as a final confirmation and to | |||
| establish the default parameters for the HTTP/2.0 connection. | ||||
| The client session header is the 25 byte sequence | The client connection header is a sequence of 24 octets (in hex | |||
| 0x464f4f202a20485454502f322e300d0a0d0a4241520d0a0d0a (the string "FOO | notation) | |||
| * HTTP/2.0\r\n\r\nBAR\r\n\r\n") followed by a SETTINGS frame | ||||
| (Section 3.7.4). The client sends the client session header | ||||
| immediately after receiving an HTTP/1.1 Upgrade, or after receiving a | ||||
| TLS Finished message from the server. | ||||
| The client session header is selected so that a large proportion | 464f4f202a20485454502f322e300d0a0d0a42410d0a0d0a | |||
| of HTTP/1.1 or HTTP/1.0 servers and intermediaries do not attempt | (the string "FOO * HTTP/2.0\r\n\r\nBA\r\n\r\n") followed by a | |||
| to process further frames. This doesn't address the concerns | SETTINGS frame (Section 3.8.4). The client sends the client | |||
| raised in [TALKING]. | connection header immediately upon receipt of a 101 Switching | |||
| Protocols response (indicating a successful upgrade), or after | ||||
| receiving a TLS Finished message from the server. If starting an | ||||
| HTTP/2.0 connection with prior knowledge of server support for the | ||||
| protocol, the client connection header is sent upon connection | ||||
| establishment. | ||||
| The server session header is a SETTINGS frame (Section 3.7.4). The | The client connection header is selected so that a large | |||
| server sends the server session header immediately after receiving | proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do | |||
| and validating the client session header. | not attempt to process further frames. Note that this does not | |||
| address the concerns raised in [TALKING]. | ||||
| The client sends requests immediately after sending the session | The server connection header consists of just a SETTINGS frame | |||
| header, without waiting to receive a server session header. This | (Section 3.8.4) that MUST be the first frame the server sends in the | |||
| ensures that confirming session headers does not add latency. | HTTP/2.0 connection. | |||
| Both client and server MUST close the connection if it does not begin | To avoid unnecessary latency, clients are permitted to send | |||
| with a valid session header. A GOAWAY frame (Section 3.7.7) MAY be | additional frames to the server immediately after sending the client | |||
| omitted if it is clear that the peer is not using HTTP/2.0. | connection header, without waiting to receive the server connection | |||
| header. It is important to note, however, that the server connection | ||||
| header SETTINGS frame might include parameters that necessarily alter | ||||
| how a client is expected to communicate with the server. Upon | ||||
| receiving the SETTINGS frame, the client is expected to honor any | ||||
| parameters established. | ||||
| Clients and servers MUST terminate the TCP connection if either peer | ||||
| 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 | ||||
| using HTTP/2.0. | ||||
| 3.3. Framing | 3.3. Framing | |||
| Once the connection is established, clients and servers exchange | Once the HTTP/2.0 connection is established, clients and servers can | |||
| HTTP/2.0 frames. Frames are the basic unit of communication. | begin exchanging frames. | |||
| 3.3.1. Frame Header | 3.3.1. Frame Header | |||
| HTTP/2.0 frames share a common header format. Frames have an 8 byte | HTTP/2.0 frames share a common base format consisting of an 8-byte | |||
| header with between 0 and 65535 bytes of data. | header followed by 0 to 65535 bytes of data. | |||
| 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 Data (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 16-bit length of the frame payload in bytes. The length | Length: The length of the frame data expressed as an unsigned 16-bit | |||
| of the frame header is not included in this sum. | integer. The 8 bytes of the frame header are not included in 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 payload are interpreted. | the remainder of the frame header and data are interpreted. | |||
| Implementations MUST ignore frames that use types that they do not | Implementations MUST ignore unsupported and unrecognized frame | |||
| support. | types. | |||
| Flags: An 8-bit field reserved for flags. Bits that have undefined | Flags: An 8-bit field reserved for frame-type specific boolean | |||
| semantics are reserved. The following flags are defined for all | flags. | |||
| frame types: | ||||
| FINAL (0x1): Bit 1 (the least significant bit) indicates that | The least significant bit (0x1) - the FINAL bit - is defined for | |||
| this is the last frame in a stream. This places the stream | all frame types as an indication that this frame is the last the | |||
| into a half-closed state (Section 3.4.5). No further frames | endpoint will send for the identified stream. Setting this flag | |||
| follow in the direction of the carrying frame. | 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. | ||||
| Frame types can define semantics for frame-specific flags. | 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 not | R: A reserved 1-bit field. The semantics of this bit are undefined | |||
| defined. | and the bit MUST remain unset (0) when sending and MUST be ignored | |||
| when receiving. | ||||
| Stream Identifier: A 31-bit stream identifier (see Section 3.4.1). | Stream Identifier: A 31-bit stream identifier (see Section 3.4.1). | |||
| A value 0 is reserved for frames that are directed at the session | A value 0 is reserved for frames that are associated with the | |||
| as a whole instead of a single stream. | connection as a whole as opposed to an individual stream. | |||
| Frame Data: Frames contain between 0 and 65535 bytes of data. | ||||
| Reserved bits in the frame header MUST be set to zero when sending | The structure and content of the remaining frame data is dependent | |||
| and MUST be ignored when receiving frames, unless the semantics of | entirely on the frame type. | |||
| the bit are known. | ||||
| 3.3.2. Frame Processing | 3.3.2. Frame Size | |||
| A frame of the maximum size might be too large for implementations | Implementations with limited resources might not be capable of | |||
| with limited resources to process. Implementations MAY choose to | processing large frame sizes. Such implementations MAY choose to | |||
| support frames smaller than the maximum possible size. However, | place additional limits on the maximum frame size. However, all | |||
| implementations MUST be able to receive frames containing at least | implementations MUST be capable of receiving and processing frames | |||
| 8192 octets of payload. | 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 immediately close a stream if it is unable to | An implementation MUST terminate a stream immediately if it is unable | |||
| process a frame related to that stream due to it exceeding a size | to process a frame due it's size. This is done by sending an | |||
| limit. The implementation MUST send a RST_STREAM frame | RST_STREAM frame (Section 3.8.3) containing the FRAME_TOO_LARGE error | |||
| (Section 3.7.3) containing FRAME_TOO_LARGE error code if the frame | code. | |||
| size limit is exceeded. | ||||
| [[anchor9: <https://github.com/http2/http2-spec/issues/28>: Need a | [[anchor7: <https://github.com/http2/http2-spec/issues/28>: Need a | |||
| way to signal the maximum frame size; no way to RST_STREAM on non- | way to signal the maximum frame size; no way to RST_STREAM on non- | |||
| stream-related frames.]] | stream-related frames.]] | |||
| 3.4. Streams | 3.4. Streams | |||
| Streams are independent sequences of bi-directional data divided into | A "stream" is an independent, bi-directional sequence of frames | |||
| frames with several properties: | exchanged between the client and server within an HTTP/2.0 | |||
| connection. Streams have several important characteristics: | ||||
| o Streams can be created by either the client or server. | o Streams can be established and used unilaterally or shared by | |||
| either the client or server. | ||||
| o Streams optionally carry a set of name-value header pairs. | o Streams can be rejected or cancelled by either endpoint. | |||
| o Streams can concurrently send data interleaved with other streams. | o Multiple types of frames can be sent by either endpoint within a | |||
| single stream. | ||||
| o Streams can be established and used unilaterally. | o The order in which frames are sent within a stream is significant. | |||
| Recipients are required to process frames in the order they are | ||||
| received. | ||||
| o Streams can be cancelled. | o Streams optionally carry a set of name-value header pairs that are | |||
| expressed within the headers block of HEADERS+PRIORITY, HEADERS, | ||||
| or PUSH_PROMISE frames. | ||||
| 3.4.1. Stream Creation | o A single HTTP/2.0 connection can contain multiple concurrently | |||
| active streams, with either endpoint interleaving frames from | ||||
| multiple streams. | ||||
| Use of streams does not require negotiation. A stream is not | 3.4.1. Stream Creation | |||
| created, streams are used by sending a frame on the stream. | ||||
| Streams are identified by a 31-bit numeric identifier. Streams | There is no coordination or shared action between the client and | |||
| initiated by a client use odd numbered stream identifiers. Streams | server required to create a stream. Rather, new streams are | |||
| initiated by the server use odd numbered stream identifiers. A | established by sending a frame whose stream identifier field | |||
| stream identifier of zero MUST NOT be used to create a new stream. | references a previously unused stream identifier. | |||
| The stream identifier of a new stream MUST be greater than all other | All streams are identified by an unsigned 31-bit integer. Streams | |||
| streams from that endpoint, unless the stream identifier was | initiated by a client use odd numbered stream identifiers; those | |||
| previously reserved (such as the promised stream identifier in a | initiated by the server use even numbered stream identifiers. A | |||
| PUSH_PROMISE (Section 3.7.5) frame). An endpoint that receives an | stream identifier of zero MUST NOT be used to establish a new stream. | |||
| unexpected stream identifier MUST treat this as a session error | ||||
| (Section 3.5.1) of type PROTOCOL_ERROR. | ||||
| A long-lived session can result in available stream identifiers being | The identifier of a newly established stream MUST be numerically | |||
| exhausted. An endpoint that is unable to create a new stream | greater than all previously established streams from that endpoint | |||
| identifier can establish a new session for any new streams. | 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. | ||||
| An endpoint cannot prevent the creation of a new stream, but it can | A peer can limit the total number of concurrently active streams | |||
| request the early termination of an unwanted stream. Upon receipt of | using the SETTINGS_MAX_CONCURRENT_STREAMS parameters within a | |||
| a frame, the recipient can terminate the corresponding stream by | SETTINGS frame. The maximum concurrent streams setting is specific | |||
| sending a stream error (Section 3.5.2) of type REFUSED_STREAM. This | to each endpoint and applies only to the peer. That is, clients | |||
| cannot prevent the initiating endpoint from sending frames for that | specify the maximum number of concurrent streams the server can | |||
| stream prior to receiving this request. | 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. | ||||
| 3.4.2. Stream priority | 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. | ||||
| The creator of a stream assigns a priority for that stream. Priority | Either endpoint can request the early termination of an unwanted | |||
| is represented as a 31 bit integer. 0 represents the highest priority | stream by sending an RST_STREAM frame (Section 3.5.2) with an error | |||
| and 2^31-1 represents the lowest priority. | 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. | ||||
| The sender and recipient SHOULD use best-effort to process streams in | 3.4.2. Stream priority | |||
| the order of highest priority to lowest priority. [[anchor11: ED: | ||||
| toothless, useless "SHOULD": reword]] | ||||
| 3.4.3. Stream headers | The endpoint establishing a new stream can assign a priority for the | |||
| stream. Priority is represented as an unsigned 31-bit integer. 0 | ||||
| represents the highest priority and 2^31-1 represents the lowest | ||||
| priority. | ||||
| Streams carry optional sets of header fields which carry metadata | The purpose of this value is to allow the initiating endpoint to | |||
| about the stream. After the stream has been created, and as long as | request that frames for the stream be processed with higher priority | |||
| the sender is not closed (Section 3.4.6) or half-closed | relative to any other concurrently active streams. That is, if an | |||
| (Section 3.4.5), each side may send HEADERS frame(s) containing the | endpoint receives interleaved frames for multiple streams, the | |||
| header data. Header data can be sent in multiple HEADERS frames, and | endpoint ought to make a best-effort attempt at processing frames for | |||
| HEADERS frames may be interleaved with data frames. | higher priority streams before processing those for lower priority | |||
| streams. | ||||
| 3.4.4. Stream data exchange | Explicitly setting the priority for a stream does not guarantee any | |||
| particular processing order for the stream relative to any other | ||||
| 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. | ||||
| Once a stream is created, it can be used to send arbitrary amounts of | 3.4.3. Stream half-close | |||
| data. Generally this means that a series of data frames will be sent | ||||
| on the stream until a frame containing the FINAL flag (Section 3.3.1) | ||||
| is set. Once the FINAL flag has been set on any frame, the stream is | ||||
| considered to be half-closed. | ||||
| 3.4.5. Stream half-close | When an endpoint sends a frame for a stream with the FINAL flag set, | |||
| 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. | ||||
| When one side of the stream sends a frame with the FINAL flag set, | If an endpoint receives additional frames for a stream that was | |||
| the stream is half-closed from that endpoint. The sender of the | previously half-closed by the sending peer, the recipient MUST | |||
| FINAL flag MUST NOT send further frames on that stream. When both | respond with a stream error (Section 3.5.2) of type STREAM_CLOSED. | |||
| sides have half-closed, the stream is closed. | ||||
| An endpoint MUST treat the receipt of a data frame on a half-closed | An endpoint that has not yet half-closed a stream by sending the | |||
| stream as a stream error (Section 3.5.2) of type STREAM_CLOSED. | FINAL flag can continue sending frames on the stream. | |||
| Streams that have never received packets can be considered to be | It is not necessary for an endpoint to half-close a stream for which | |||
| half-closed in the direction that is silent. This allows either peer | it has not sent any frames. This allows endpoints to use fully | |||
| to create a unidirectional stream, which does not require an explicit | unidirectional streams that do not require explicit action or | |||
| close from the peer that does not transmit frames. | acknowledgement from the receiver. | |||
| 3.4.6. Stream close | 3.4.4. Stream close | |||
| Streams can be terminated in the following ways: | Streams can be terminated in the following ways: | |||
| Normal termination: Normal stream termination occurs when both | Normal termination: Normal stream termination occurs when both | |||
| sender and recipient have half-closed the stream by sending a | client and server have half-closed the stream by sending a frame | |||
| frame containing a FINAL flag (Section 3.3.1). | containing a FINAL flag (Section 3.3.1). | |||
| Half-close on unidirectional stream: A stream that only has frames | Half-close on unidirectional stream: A stream that only has frames | |||
| sent in one direction can be tentatively considered to be closed | sent in one direction can be tentatively considered to be closed | |||
| once a frame containing a FINAL flag is sent. The active sender | once a frame containing a FINAL flag is sent. The active sender | |||
| on the stream MUST be prepared to receive frames after closing the | on the stream MUST be prepared to receive frames after closing the | |||
| stream. | stream. | |||
| Abrupt termination: Either the peer can send a RST_STREAM control | Abrupt termination: Either peer can send a RST_STREAM control frame | |||
| frame at any time to terminate an active stream. RST_STREAM | at any time to terminate an active stream. RST_STREAM contains an | |||
| contains an error code to indicate the reason for termination. A | error code to indicate the reason for termination. A RST_STREAM | |||
| RST_STREAM indicates that the sender will transmit no further data | indicates that the sender will transmit no further data on the | |||
| on the stream and that the receiver is requested to cease | stream and that the receiver is advised to cease transmission on | |||
| transmission. | it. | |||
| The sender of a RST_STREAM frame MUST allow for frames that have | The sender of a RST_STREAM frame MUST allow for frames that have | |||
| already been sent by the peer prior to the RST_STREAM being | already been sent by the peer prior to the RST_STREAM being | |||
| processed. If in-transit frames alter session state, these frames | processed. If in-transit frames alter connection state, these | |||
| cannot be safely discarded. See Stream Error Handling | frames cannot be safely discarded. See Stream Error Handling | |||
| (Section 3.5.2) for more details. | (Section 3.5.2) for more details. | |||
| TCP connection teardown: If the TCP connection is torn down while | TCP connection teardown: If the TCP connection is torn down while | |||
| un-closed streams exist, then the endpoint must assume that the | un-closed streams exist, then the endpoint MUST assume that the | |||
| stream was abnormally interrupted and may be incomplete. | stream was abnormally interrupted and may be incomplete. | |||
| If an endpoint receives a data frame after the stream is closed, it | ||||
| MAY send a RST_STREAM to the sender with the status PROTOCOL_ERROR. | ||||
| 3.5. Error Handling | 3.5. Error Handling | |||
| HTTP/2.0 framing permits two classes of error: | HTTP/2.0 framing permits two classes of error: | |||
| o An error condition that renders the entire session unusable is a | o An error condition that renders the entire connection unusable is | |||
| session error. | a connection error. | |||
| o An error in an individual stream is a stream error. | o An error in an individual stream is a stream error. | |||
| 3.5.1. Session Error Handling | 3.5.1. Connection Error Handling | |||
| A session error is any error which prevents further processing of the | A connection error is any error which prevents further processing of | |||
| framing layer or which corrupts any session state. | the framing layer or which corrupts any connection state. | |||
| An endpoint that encounters a session error MUST first send a GOAWAY | An endpoint that encounters a connection error MUST first send a | |||
| (Section 3.7.7) frame with the stream identifier of the last stream | GOAWAY (Section 3.8.7) frame with the stream identifier of the last | |||
| that it successfully received from its peer. The GOAWAY frame | stream that it successfully received from its peer. The GOAWAY frame | |||
| includes an error code that indicates why the session is terminating. | includes an error code that indicates why the connection is | |||
| After sending the GOAWAY frame, the endpoint MUST close the TCP | terminating. After sending the GOAWAY frame, the endpoint MUST close | |||
| connection. | the TCP connection. | |||
| It is possible that the GOAWAY will not be reliably received by the | It is possible that the GOAWAY will not be reliably received by the | |||
| receiving endpoint. In the event of a session error, GOAWAY only | receiving endpoint. In the event of a connection error, GOAWAY only | |||
| provides a best-effort attempt to communicate with the peer about why | provides a best-effort attempt to communicate with the peer about why | |||
| the session is going down. | the connection is being terminated. | |||
| An endpoint can end a session at any time. In particular, an | An endpoint can end a connection at any time. In particular, an | |||
| endpoint MAY choose to treat a stream error as a session error if the | endpoint MAY choose to treat a stream error as a connection error if | |||
| error is recurrent. Endpoints SHOULD send a GOAWAY frame when ending | the error is recurrent. Endpoints SHOULD send a GOAWAY frame when | |||
| a session, as long as circumstances permit it. | ending a connection, as long as circumstances permit it. | |||
| 3.5.2. Stream Error Handling | 3.5.2. Stream Error Handling | |||
| A stream error is an error related to a specific stream identifier | A stream error is an error related to a specific stream identifier | |||
| that does not affect processing of other streams at the framing | that does not affect processing of other streams at the framing | |||
| layer. | layer. | |||
| An endpoint that detects a stream error sends a RST_STREAM | An endpoint that detects a stream error sends a RST_STREAM | |||
| (Section 3.7.3) frame that contains the stream identifier of the | (Section 3.8.3) frame that contains the stream identifier of the | |||
| stream where the error occurred. The RST_STREAM frame includes an | stream where the error occurred. The RST_STREAM frame includes an | |||
| error code that indicates the type of error. | error code that indicates the type of error. | |||
| A RST_STREAM is the last frame that an endpoint can send on a stream. | 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 | 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. | any frames that were sent or enqueued for sending by the remote peer. | |||
| These frames can be ignored, except where they modify session state | These frames can be ignored, except where they modify connection | |||
| (such as the header compression state). | state (such as the state maintained for header compression | |||
| (Section 3.7)). | ||||
| An endpoint SHOULD NOT send more than one RST_STREAM frame for any | Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame | |||
| stream. An endpoint MAY send additional RST_STREAM frames if it | for any stream. However, an endpoint MAY send additional RST_STREAM | |||
| receives frames on a closed stream after more than a round trip time. | frames if it receives frames on a closed stream after more than a | |||
| This behaviour is permitted to deal with misbehaving implementations | round trip time. This behavior is permitted to deal with misbehaving | |||
| where treating this as a session error is inappropriate. | implementations. | |||
| An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | |||
| frame. This could trigger infinite loops of RST_STREAM frames. | frame, to avoid looping. | |||
| 3.5.3. Error Codes | 3.5.3. Error Codes | |||
| Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | |||
| frames to convey the reasons for the stream or session error. | frames to convey the reasons for the stream or connection error. | |||
| Error codes share a common code space. Some error codes only apply | Error codes share a common code space. Some error codes only apply | |||
| to specific conditions and have no defined semantics in certain frame | to specific conditions and have no defined semantics in certain frame | |||
| types. | types. | |||
| The following error codes are defined: | The following error codes are defined: | |||
| NO_ERROR (0): The associated condition is not as a result of an | NO_ERROR (0): The associated condition is not as a result of an | |||
| error. For example, a GOAWAY might include this code to indicate | error. For example, a GOAWAY might include this code to indicate | |||
| graceful shutdown of a session. | graceful shutdown of a connection. | |||
| PROTOCOL_ERROR (1): An unspecific protocol error was detected. This | PROTOCOL_ERROR (1): The endpoint detected an unspecific protocol | |||
| error is for use when a more specific error code is not available. | error. This error is for use when a more specific error code is | |||
| not available. | ||||
| INTERNAL_ERROR (2): The implementation encountered an unexpected | INTERNAL_ERROR (2): The endpoint encountered an unexpected internal | |||
| internal error. | error. | |||
| FLOW_CONTROL_ERROR (3): The endpoint detected that its peer violated | FLOW_CONTROL_ERROR (3): The endpoint detected that its peer violated | |||
| the flow control protocol. | the flow control protocol. | |||
| INVALID_STREAM (4): A frame was received for an inactive stream. | INVALID_STREAM (4): The endpoint received a frame for an inactive | |||
| stream. | ||||
| STREAM_CLOSED (5): The endpoint received a frame after a stream was | STREAM_CLOSED (5): The endpoint received a frame after a stream was | |||
| half-closed. | half-closed. | |||
| FRAME_TOO_LARGE (6): The endpoint received a frame that was larger | FRAME_TOO_LARGE (6): The endpoint received a frame that was larger | |||
| than the maximum size that it supports. | than the maximum size that it supports. | |||
| REFUSED_STREAM (7): Indicates that the stream was refused before any | REFUSED_STREAM (7): The endpoint is refusing the stream before | |||
| processing has been done on the stream. | processing its payload. | |||
| CANCEL (8): Used by the creator of a stream to indicate that the | CANCEL (8): Used by the creator of a stream to indicate that the | |||
| stream is no longer needed. | stream is no longer needed. | |||
| COMPRESSION_ERROR (9): The endpoint is unable to maintain the | ||||
| compression context for the connection. | ||||
| 3.6. Stream Flow Control | 3.6. Stream Flow Control | |||
| Multiplexing streams introduces contention for access to the shared | Using streams for multiplexing introduces contention over use of the | |||
| TCP connection. Stream contention can result in streams being | TCP connection, resulting in blocked streams. A flow control scheme | |||
| blocked by other streams. A flow control scheme ensures that streams | ensures that streams on the same connection do not destructively | |||
| do not destructively interfere with other streams on the same TCP | interfere with each other. | |||
| connection. | ||||
| HTTP/2.0 provides for flow control through use of the WINDOW_UPDATE | ||||
| (Section 3.8.9) frame type. | ||||
| 3.6.1. Flow Control Principles | 3.6.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 messages. 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 octets they are prepared to receive on a | |||
| stream. This is a credit-based scheme. | stream. 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. | |||
| skipping to change at page 17, line 27 ¶ | skipping to change at page 18, line 35 ¶ | |||
| 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 declaring an infinite flow control limit. | |||
| 7. HTTP/2.0 standardizes only the format of the window update | 7. HTTP/2.0 standardizes only the format of the window update frame | |||
| message (Section 3.7.9). This does not stipulate how a receiver | (Section 3.8.9). This does not stipulate how a receiver decides | |||
| decides when to send this message or the value that it sends. | when to send this frame or the value that it sends. Nor does it | |||
| Nor does it specify how a sender chooses to send packets. | specify how a sender chooses to send packets. Implementations | |||
| Implementations are able to select any algorithm that suits their | are able to select any algorithm that suits their needs. | |||
| 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 | 3.6.2. Appropriate Use of Flow Control | |||
| Flow control is defined to protect deployments (client, server or | Flow control is defined to protect endpoints (client, server or | |||
| intermediary) that are operating under constraints. For example, a | intermediary) that are operating under resource constraints. For | |||
| proxy must share memory between many connections. Flow control | example, a proxy needs to share memory between many connections, and | |||
| addresses cases where the receiver is unable process data on one | also might have a slow upstream connection and a fast downstream one. | |||
| stream, yet wants to be continue to process other streams. | Flow control addresses cases where the receiver is unable process | |||
| data on one stream, yet wants to continue to process other streams in | ||||
| the same connection. | ||||
| Deployments that do not rely on 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. | |||
| This can lead to suboptimal use of available network resources if | Note, however, that this can lead to suboptimal use of available | |||
| flow control is enabled without knowledge of the bandwidth-delay | network resources if flow control is enabled without knowledge of the | |||
| product (see [RFC1323]). | bandwidth-delay product (see [RFC1323]). | |||
| Implementation of flow control in full awareness of the current | Even with full awareness of the current bandwidth-delay product, | |||
| bandwidth-delay product is difficult, but it can ensure that | implementation of flow control is difficult. However, it can ensure | |||
| constrained resources are protected without any reduction in | that constrained resources are protected without any reduction in | |||
| connection utilization. | connection utilization. | |||
| 3.7. Frame Types | 3.7. Header Blocks | |||
| 3.7.1. DATA Frames | The header block is found in the HEADERS, HEADERS+PRIORITY and | |||
| PUSH_PROMISE frames. The header block consists of a set of header | ||||
| fields, which are name-value pairs. Headers are compressed using | ||||
| black magic. | ||||
| DATA frames (type=0) are used to convey HTTP message bodies. The | Compression of header fields is a work in progress, as is the format | |||
| payload of a data frame contains either a request or response body. | of this block. | |||
| No frame-specific flags are defined for DATA frames. | The contents of header blocks MUST be processed by the compression | |||
| context, even if stream has been reset or the frame is discarded. If | ||||
| header blocks cannot be processed, the receiver MUST treat the | ||||
| connection with a connection error (Section 3.5.1) of type | ||||
| COMPRESSION_ERROR. | ||||
| 3.7.2. HEADERS+PRIORITY | 3.8. Frame Types | |||
| The HEADERS+PRIORITY frame (type=1) allows the sender to set header | This specification defines a number of frame types, each identified | |||
| fields and stream priority at the same time. This MUST be used for | by a unique 8-bit type code. Each frame type serves a distinct | |||
| each stream that is created. | purpose either in the establishment and management of the connection | |||
| as a whole, or of individual streams. | ||||
| The transmission of specific frame types can alter the state of a | ||||
| connection. If endpoints fail to maintain a synchronized view of the | ||||
| connection state, successful communication within the connection will | ||||
| no longer be possible. Therefore, it is important that endpoints | ||||
| have a shared comprehension of how the state is affected by the use | ||||
| any given frame. Accordingly, while it is expected that new frame | ||||
| types will be introduced by extensions to this protocol, only frames | ||||
| defined by this document are permitted to alter the connection state. | ||||
| 3.8.1. DATA Frames | ||||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | ||||
| octets associated with a stream. One or more DATA frames are used, | ||||
| for instance, to carry HTTP request or response payloads. | ||||
| The DATA frame does not define any type-specific flags. | ||||
| DATA frames MUST be associated with a stream. If a DATA 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. | ||||
| 3.8.2. HEADERS+PRIORITY | ||||
| The HEADERS+PRIORITY frame (type=0x1) allows the sender to set header | ||||
| fields and stream priority at the same 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 (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| HEADERS+PRIORITY Frame Payload | HEADERS+PRIORITY Frame Payload | |||
| The HEADERS+PRIORITY frame is identical to the HEADERS frame | The HEADERS+PRIORITY frame is identical to the HEADERS frame | |||
| (Section 3.7.8), with a 32-bit field containing priority included | (Section 3.8.8), preceded by a single reserved bit and a 31-bit | |||
| before the header block. | priority; see Section 3.4.2. | |||
| The most significant bit of the priority is reserved. The 31-bit | HEADERS+PRIORITY uses the same flags as the HEADERS frame, except | |||
| priority indicates the priority for the stream, as assigned by the | that a HEADERS+PRIORITY frame with a CONTINUES bit MUST be followed | |||
| sender, see Section 3.4.2. | by another HEADERS+PRIORITY frame. See HEADERS frame (Section 3.8.8) | |||
| for any flags. | ||||
| 3.7.3. RST_STREAM | HEADERS+PRIORITY frames MUST be associated with a stream. If a | |||
| 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 RST_STREAM frame (type=3) allows for abnormal termination of a | The HEADERS+PRIORITY frame modifies the connection state as defined | |||
| stream. When sent by the creator of a stream, it indicates the | in Section 3.7. | |||
| creator wishes to cancel the stream. When sent by the recipient of a | ||||
| stream, it indicates an error or that the recipient did not want to | 3.8.3. RST_STREAM | |||
| accept the stream, so the stream should be closed. | ||||
| The RST_STREAM frame (type=0x3) allows for abnormal termination of a | ||||
| 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 | ||||
| stream, it indicates that either the receiver is rejecting the | ||||
| stream, requesting that the 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 does not define any valid flags. | The RST_STREAM frame contains a single unsigned, 32-bit integer | |||
| identifying the error code (Section 3.5.3). The error code indicates | ||||
| why the stream is being terminated. | ||||
| The RST_STREAM frame contains a single 32-bit error code | No type-flags are defined. | |||
| (Section 3.5.3). The error code indicates why the stream is being | ||||
| terminated. | ||||
| After receiving a RST_STREAM on a stream, the recipient must not send | The RST_STREAM frame fully terminates the referenced stream and | |||
| additional frames for that stream, and the stream moves into the | causes it to enter the closed state. After receiving a RST_STREAM on | |||
| closed state. | a stream, the receiver MUST NOT send additional frames for that | |||
| stream. However, after sending the RST_STREAM, the sending endpoint | ||||
| MUST be prepared to receive and process additional frames sent on the | ||||
| stream that might have been sent by the peer prior to the arrival of | ||||
| the RST_STREAM. | ||||
| 3.7.4. SETTINGS | RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | |||
| 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. | ||||
| A SETTINGS frame (type=4) contains a set of id/value pairs for | 3.8.4. SETTINGS | |||
| communicating configuration data about how the two endpoints may | ||||
| communicate. SETTINGS frames MUST be sent at the start of a session, | ||||
| but they can be sent at any other time by either endpoint. Settings | ||||
| are declarative, not negotiated, each peer indicates their own | ||||
| configuration. | ||||
| [[anchor17: Note that persistence of settings is under discussion in | The SETTINGS frame (type=0x4) conveys configuration parameters that | |||
| the WG and might be removed in a future version of this document.]] | affect how endpoints communicate. The parameters are either | |||
| constraints on peer behavior or preferences. | ||||
| When the server is the sender, the sender can request that | SETTINGS frames MUST be sent at the start of a connection, and MAY be | |||
| configuration data be persisted by the client across HTTP/2.0 | sent at any other time by either endpoint over the lifetime of the | |||
| sessions and returned to the server in future communications. | connection. | |||
| Clients persist settings on a per origin basis (see [RFC6454] for a | Implementations MUST support all of the settings defined by this | |||
| definition of web origins). That is, when a client connects to a | specification and MAY support additional settings defined by | |||
| server, and the server persists settings within the client, the | extensions. Unsupported or unrecognized settings MUST be ignored. | |||
| client SHOULD return the persisted settings on future connections to | New settings MUST NOT be defined or implemented in a way that | |||
| the same origin AND IP address and TCP port. Clients MUST NOT | requires endpoints to understand then in order to communicate | |||
| request servers to use the persistence features of the SETTINGS | successfully. | |||
| frames, and servers MUST ignore persistence related flags sent by a | ||||
| client. | ||||
| Valid frame-specific flags for the SETTINGS frame are: | A SETTINGS frame is not required to include every defined setting; | |||
| senders can include only those parameters for which it has accurate | ||||
| 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 | ||||
| single SETTINGS frame MUST NOT contain multiple values for the same | ||||
| 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 | ||||
| first one. | ||||
| Over the lifetime of a connection, an endpoint MAY send multiple | ||||
| SETTINGS frames containing previously unspecified parameters or new | ||||
| values for parameters whose values have already been established. | ||||
| Only the most recent value provided setting value applies. | ||||
| The SETTINGS frame defines the following flag: | ||||
| CLEAR_PERSISTED (0x2): Bit 2 being set indicates a request to clear | CLEAR_PERSISTED (0x2): Bit 2 being set indicates a request to clear | |||
| any previously persisted settings before processing the settings. | any previously persisted settings before processing the settings. | |||
| Clients MUST NOT set this flag. | Clients MUST NOT set this flag. | |||
| SETTINGS frames always apply to a session, 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. | The stream identifier for a settings frame MUST be zero. If an | |||
| endpoint receives a SETTINGS frame whose stream identifier field is | ||||
| anything other than 0x0, the endpoint MUST respond with a connection | ||||
| error (Section 3.5.1) of type PROTOCOL_ERROR. | ||||
| 3.8.4.1. Setting Format | ||||
| The payload of a SETTINGS frame consists of zero or more settings. | ||||
| Each setting consists of an 8-bit flags field specifying per-item | ||||
| instructions, an unsigned 24-bit setting identifier, and an unsigned | ||||
| 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) | | |SettingFlags(8)| Setting Identifier (24) | | |||
| +---------------+-----------------------------------------------+ | +---------------+-----------------------------------------------+ | |||
| | Value (32) | | | Value (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Setting Format | ||||
| SETTINGS ID/Value Pair | Two flags are defined for the 8-bit flags field: | |||
| The payload of a SETTINGS frame contains zero or more settings. Each | PERSIST_VALUE (0x1): Bit 1 (the least significant bit) being set | |||
| setting is comprised of the following | indicates a request from the server to the client to persist this | |||
| setting. A client MUST NOT set this flag. | ||||
| Settings Flags: An 8-bit flags field containing per-setting | PERSISTED (0x2): Bit 2 being set indicates that this setting is a | |||
| instructions. The following flags are valid: | 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. | ||||
| PERSIST_VALUE (0x1): Bit 1 (the least significant bit) being set | 3.8.4.2. Setting Persistence | |||
| 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 | [[anchor12: Note that persistence of settings is under discussion in | |||
| persisted setting being returned by the client to the server. | the WG and might be removed in a future version of this document.]] | |||
| 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. | ||||
| All other settings flags are reserved. | 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. | ||||
| Setting Identifier: A 24-bit field that identifies the setting. | Persistence is requested on a per-setting basis by setting the | |||
| PERSIST_VALUE flag (0x1). | ||||
| Value: A 32-bit value for the setting. | Client endpoints are not permitted to make such requests. Servers | |||
| MUST ignore any attempt by clients to request that a server persist | ||||
| configuration parameters. | ||||
| The following settings are defined: | 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. | ||||
| SETTINGS_UPLOAD_BANDWIDTH (1): allows the sender to send its | Whenever the client sends a SETTINGS frame in the current connection, | |||
| expected upload bandwidth on this channel. This number is an | or establishes a new connection with the same origin, persisted | |||
| estimate. The value should be the integral number of kilobytes | configuration parameters are sent with the PERSISTED flag (0x2) set | |||
| per second that the sender predicts as an expected maximum upload | for each persisted parameter. | |||
| channel capacity. | ||||
| SETTINGS_DOWNLOAD_BANDWIDTH (2): allows the sender to send its | Persisted settings accumulate until the server requests that all | |||
| expected download bandwidth on this channel. This number is an | previously persisted settings are to be cleared by setting the | |||
| estimate. The value should be the integral number of kilobytes | CLEAR_PERSISTED (0x2) flag on the SETTINGS frame. | |||
| per second that the sender predicts as an expected maximum | ||||
| download channel capacity. | ||||
| SETTINGS_ROUND_TRIP_TIME (3): allows the sender to send its expected | For example, if the server sends IDs 1, 2, and 3 with the | |||
| round-trip-time on this channel. The round trip time is defined | FLAG_SETTINGS_PERSIST_VALUE in a first SETTINGS frame, and then sends | |||
| as the minimum amount of time to send a control frame from this | IDs 4 and 5 with the FLAG_SETTINGS_PERSIST_VALUE in a subsequent | |||
| client to the remote and receive a response. The value is | SETTINGS frame, the client will return values for all 5 settings (1, | |||
| represented in milliseconds. | 2, 3, 4, and 5 in this example) to the server. | |||
| SETTINGS_MAX_CONCURRENT_STREAMS (4): allows the sender to inform the | 3.8.4.3. Defined Settings | |||
| remote endpoint the maximum number of concurrent streams which it | ||||
| will allow. This limit is directional: it applies to the number | ||||
| of streams that the sender permits the receiver to create. By | ||||
| default there is no limit. For implementers it is recommended | ||||
| that this value be no smaller than 100, so as to not unnecessarily | ||||
| limit parallelism. | ||||
| SETTINGS_CURRENT_CWND (5): allows the sender to inform the remote | The following settings are defined: | |||
| endpoint of the current TCP CWND value. | ||||
| SETTINGS_DOWNLOAD_RETRANS_RATE (6): allows the sender to inform the | SETTINGS_UPLOAD_BANDWIDTH (1): indicates the sender's estimated | |||
| remote endpoint the retransmission rate (bytes retransmitted / | upload bandwidth for this connection. The value is an the | |||
| total bytes transmitted). | integral number of kilobytes per second that the sender predicts | |||
| as an expected maximum upload channel capacity. | ||||
| SETTINGS_INITIAL_WINDOW_SIZE (7): allows the sender to inform the | SETTINGS_DOWNLOAD_BANDWIDTH (2): indicates the sender's estimated | |||
| remote endpoint the initial window size (in bytes) for new | download bandwidth for this connection. The value is an integral | |||
| streams. | number of kilobytes per second that the sender predicts as an | |||
| expected maximum download channel capacity. | ||||
| SETTINGS_FLOW_CONTROL_OPTIONS (10): This setting allows an endpoint | SETTINGS_ROUND_TRIP_TIME (3): indicates the sender's estimated | |||
| to indicate that streams directed to them will not be subject to | round-trip-time for this connection. The round trip time is | |||
| flow control. The least significant bit (0x1) is set to indicate | defined as the minimum amount of time to send a control frame from | |||
| that new streams are not flow controlled. Bit 2 (0x2) is set to | this client to the remote and receive a response. The value is | |||
| indicate that the session is not flow controlled. All other bits | represented in milliseconds. | |||
| are reserved. | ||||
| This setting applies to all streams, including existing streams. | SETTINGS_MAX_CONCURRENT_STREAMS (4): indicates the maximum number of | |||
| concurrent streams that the sender will allow. This limit is | ||||
| directional: it applies to the number of streams that the sender | ||||
| permits the receiver to create. By default there is no limit. It | ||||
| is recommended that this value be no smaller than 100, so as to | ||||
| not unnecessarily limit parallelism. | ||||
| These bits cannot be cleared once set, see Section 3.7.9.4. | SETTINGS_CURRENT_CWND (5): indicates the sender's current TCP CWND | |||
| value. | ||||
| The message is intentionally extensible for future information which | SETTINGS_DOWNLOAD_RETRANS_RATE (6): indicates the sender's | |||
| may improve client-server communications. The sender does not need | retransmission rate (bytes retransmitted / total bytes | |||
| to send every type of ID/value. It must only send those for which it | transmitted). | |||
| has accurate values to convey. When multiple ID/value pairs are | ||||
| sent, they should be sent in order of lowest id to highest id. A | ||||
| single SETTINGS frame MUST not contain multiple values for the same | ||||
| ID. If the recipient of a SETTINGS frame discovers multiple values | ||||
| for the same ID, it MUST ignore all values except the first one. | ||||
| A server may send multiple SETTINGS frames containing different ID/ | SETTINGS_INITIAL_WINDOW_SIZE (7): indicates the sender's initial | |||
| Value pairs. When the same ID/Value is sent twice, the most recent | stream window size (in bytes) for new streams. | |||
| value overrides any previously sent values. If the server sends IDs | ||||
| 1, 2, and 3 with the FLAG_SETTINGS_PERSIST_VALUE in a first SETTINGS | ||||
| frame, and then sends IDs 4 and 5 with the | ||||
| FLAG_SETTINGS_PERSIST_VALUE, when the client returns the persisted | ||||
| state on its next SETTINGS frame, it SHOULD send all 5 settings (1, | ||||
| 2, 3, 4, and 5 in this example) to the server. | ||||
| 3.7.5. PUSH_PROMISE | SETTINGS_FLOW_CONTROL_OPTIONS (10): indicates that streams directed | |||
| to the sender will not be subject to flow control. The least | ||||
| significant bit (0x1) is set to indicate that new streams are not | ||||
| flow controlled. All other bits are reserved. | ||||
| The PUSH_PROMISE frame (type=5) allows the sender to signal a promise | This setting applies to all streams, including existing streams. | |||
| to create a stream and serve the referenced resource. Minimal data | ||||
| allowing the receiver to understand which resource(s) are to be | ||||
| pushed are to be included. | ||||
| PUSH_PROMISE frames are sent on an existing stream. They declare the | These bits cannot be cleared once set, see Section 3.8.9.4. | |||
| intent to use another stream for the pushing of a resource. The | ||||
| PUSH_PROMISE allows the client an opportunity to reject pushed | 3.8.5. PUSH_PROMISE | |||
| resources. | ||||
| The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | ||||
| in advance of streams the sender intends to initiate. The | ||||
| PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | ||||
| stream the endpoint plans to create along with a minimal set of | ||||
| headers that provide additional context for the stream. Section 4.3 | ||||
| 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 (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| PUSH_PROMISE Payload Format | PUSH_PROMISE Payload Format | |||
| There are no frame-specific flags for the PUSH_PROMISE frame. | The payload of a PUSH_PROMISE includes a "Promised-Stream-ID". This | |||
| unsigned 31-bit integer identifies the stream the endpoint intends to | ||||
| start sending frames for. The promised stream identifier MUST be a | ||||
| valid choice for the next stream sent by the sender (see new stream | ||||
| identifier (Section 3.4.1)). | ||||
| The body of a PUSH_PROMISE includes a "Promised-Stream-ID". This 31- | PUSH_PROMISE frames MUST be associated with an existing stream. If | |||
| bit identifier indicates the stream on which the resource will be | the stream identifier field specifies the value 0x0, a recipient MUST | |||
| pushed. The promised stream identifier MUST be a valid choice for | respond with a connection error (Section 3.5.1) of type | |||
| the next stream sent by the sender (see new stream identifier | PROTOCOL_ERROR. | |||
| (Section 3.4.1)). | ||||
| There is no requirement that the streams referred to by this frame | The state of promised streams is bound to the state of the original | |||
| are created in the order referenced. The PUSH_PROMISE reserves | associated stream on which the PUSH_PROMISE frame were sent. If the | |||
| stream identifiers for later use; these reserved identifiers can be | originating stream state changes to fully closed, all associated | |||
| used as prioritization needs dictate. | promised streams fully close as well. [[anchor13: Ed. Note: We need | |||
| clarification on this point. How synchronized are the lifecycles of | ||||
| streams and associated promised streams?]] | ||||
| The PUSH_PROMISE also includes a header block (Section 3.7.10), which | PUSH_PROMISE uses the same flags as the HEADERS frame, except that a | |||
| describes the resource that will be pushed. | 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. | ||||
| 3.7.6. PING | Promised streams are not required to be used in order promised. The | |||
| PUSH_PROMISE only reserves stream identifiers for later use. | ||||
| The PING frame (type=6) is a mechanism for measuring a minimal round- | Recipients of PUSH_PROMISE frames can choose to reject promised | |||
| trip time from the sender. PING frames can be sent from the client | streams by returning a RST_STREAM referencing the promised stream | |||
| or the server. | identifier back to the sender of the PUSH_PROMISE. | |||
| Recipients of a PING frame send an identical frame to the sender as | The PUSH_PROMISE frame modifies the connection state as defined in | |||
| soon as possible. PING should take highest priority if there is | Section 3.7. | |||
| other data waiting to be sent. | ||||
| The PING frame defines a frame-specific flag: | 3.8.6. PING | |||
| PONG (0x2): Bit 2 being set indicates that this ping frame is a ping | The PING frame (type=0x6) is a mechanism for measuring a minimal | |||
| response. An endpoint MUST set this flag in ping responses. An | round-trip time from the sender, as well as determining whether an | |||
| endpoint MUST NOT respond to ping frames containing this flag. | idle connection is still functional. PING frames can be sent from | |||
| any endpoint. | ||||
| The payload of a PING frame contains any value. A PING response MUST | PING frames consist of an arbitrary, variable-length sequence of | |||
| contain the contents of the PING request. | octets. Receivers of a PING send a response PING frame with the PONG | |||
| flag set and precisely the same sequence of octets back to the sender | ||||
| as soon as possible. | ||||
| 3.7.7. GOAWAY | Processing of PING frames SHOULD be performed with the highest | |||
| priority if there are additional frames waiting to be processed. | ||||
| The GOAWAY frame (type=7) informs the remote side of the connection | The PING frame defines one type-specific flag: | |||
| to stop creating streams on this session. It can be sent from the | ||||
| client or the server. Once sent, the sender will ignore frames sent | PONG (0x2): Bit 2 being set indicates that this PING frame is a PING | |||
| on new streams for the remainder of the session. Recipients of a | response. An endpoint MUST set this flag in PING responses. An | |||
| GOAWAY frame MUST NOT open additional streams on the session, | endpoint MUST NOT respond to PING frames containing this flag. | |||
| although a new session can be established for new streams. The | ||||
| purpose of this message is to allow an endpoint to gracefully stop | PING frames are not associated with any individual stream. If a PING | |||
| accepting new streams (perhaps for a reboot or maintenance), while | frame is received with a stream identifier field value other than | |||
| still finishing processing of previously established streams. | 0x0, the recipient MUST respond with a connection error | |||
| (Section 3.5.1) of type PROTOCOL_ERROR. | ||||
| 3.8.7. GOAWAY | ||||
| 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 | ||||
| server. Once sent, the sender will ignore frames sent on new streams | ||||
| for the remainder of the connection. Receivers of a GOAWAY frame | ||||
| MUST NOT open additional streams on the connection, although a new | ||||
| connection can be established for new streams. The purpose of this | ||||
| frame is to allow an endpoint to gracefully stop accepting new | ||||
| streams (perhaps for a reboot or maintenance), while still finishing | ||||
| processing of previously established streams. | ||||
| 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 message. 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 session. If the | which was processed on the sending endpoint in this connection. If | |||
| receiver of the GOAWAY used streams that are newer than the indicated | the receiver of the GOAWAY used streams that are newer than the | |||
| stream identifier, they were not processed by the sender and the | indicated stream identifier, they were not processed by the sender | |||
| receiver may treat the streams as though they had never been created | and the receiver may treat the streams as though they had never been | |||
| at all (hence the receiver may want to re-create the streams later on | created at all (hence the receiver may want to re-create the streams | |||
| a new session). | later on a new connection). | |||
| Endpoints should always send a GOAWAY message 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). | |||
| After sending a GOAWAY message, the sender can ignore frames for new | After sending a GOAWAY frame, the sender can ignore frames for new | |||
| streams. | streams. | |||
| [[anchor18: Issue: session state that is established by those | [[anchor14: Issue: connection state that is established by those | |||
| "ignored" messages cannot be ignored without the state in the two | "ignored" frames cannot be ignored without the state in the two peers | |||
| peers becoming unsynchronized.]] | becoming unsynchronized.]] | |||
| 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) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| GOAWAY Payload Format | GOAWAY Payload Format | |||
| The GOAWAY frame does not define any valid flags. | The GOAWAY frame does not define any type-specific flags. | |||
| The GOAWAY frame applies to the session, not a specific stream. The | The GOAWAY frame applies to the connection, not a specific stream. | |||
| stream identifier MUST be zero. | The stream identifier MUST be zero. | |||
| The GOAWAY frame contains an identifier of the last stream that the | The last stream identifier in the GOAWAY frame contains the highest | |||
| sender of the GOAWAY is prepared to act upon, which can include | numbered stream identifier for which the sender of the GOAWAY frame | |||
| processing and replies. This allows an endpoint to discover what | has received frames on and might have taken some action on. All | |||
| streams might have had some effect or what might be safe to | streams up to and including the identified stream might have been | |||
| automatically retry. If no streams were acted upon, the last stream | processed in some way. The last stream identifier is set to 0 if no | |||
| ID MUST be 0. | streams were processed. | |||
| The GOAWAY frame contains a 32-bit error code (Section 3.5.3) that | Note: In this case, "processed" means that some data from the | |||
| contains the reason for closing the session. | stream was passed to some higher layer of software that might have | |||
| taken some action as a result. | ||||
| 3.7.8. HEADERS | On streams with lower or equal numbered identifiers that do not close | |||
| completely prior to the connection being closed, re-attempting | ||||
| requests, transactions, or any protocol activity is not possible | ||||
| (with the exception of idempotent actions like HTTP GET, PUT, or | ||||
| DELETE). Any protocol activity that uses higher numbered streams can | ||||
| be safely retried using a new connection. | ||||
| The HEADERS frame (type=8) provides header fields for a stream. It | Activity on streams numbered lower or equal to the last stream | |||
| may be optionally sent on an existing stream at any time. Specific | identifier might still complete successfully. The sender of a GOAWAY | |||
| application of the headers in this frame is application-dependent. | frame gracefully shut down a connection by sending a GOAWAY frame, | |||
| maintaining the connection in an open state until all in-progress | ||||
| streams complete. | ||||
| No frame-specific flags are defined for the HEADERS frame. | The last stream ID MUST be 0 if no streams were acted upon. | |||
| The body of a HEADERS frame contains a Headers Block | The GOAWAY frame also contains a 32-bit error code (Section 3.5.3) | |||
| (Section 3.7.10). | that contains the reason for closing the connection. | |||
| 3.7.9. WINDOW_UPDATE | 3.8.8. HEADERS | |||
| The WINDOW_UPDATE frame (type=9) is used to implement flow control in | The HEADERS frame (type=0x8) provides header fields for a stream. | |||
| HTTP/2.0. | Any number of HEADERS frames can may be sent on an existing stream at | |||
| any time. | ||||
| Flow control in HTTP/2.0 operates at two levels: on each individual | Additional type-specific flags for the HEADERS frame are: | |||
| stream and on the entire session. | ||||
| Flow control in HTTP/2.0 is hop by hop, that is, only between the two | CONTINUES (0x2): The CONTINUES bit indicates that this frame does | |||
| endpoints of a HTTP/2.0 connection. Intermediaries do not forward | not contain the entire payload necessary to provide a complete set | |||
| WINDOW_UPDATE messages between dependent sessions. However, | of headers. | |||
| throttling of data transfer by any recipient can indirectly cause the | ||||
| propagation of flow control information toward the original sender. | 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 | ||||
| Section 3.7. | ||||
| 3.8.9. WINDOW_UPDATE | ||||
| The WINDOW_UPDATE frame (type=0x9) is used to implement flow control. | ||||
| Flow control operates at two levels: on each individual stream and on | ||||
| the entire connection. | ||||
| Both types of flow control are hop by hop; that is, only between the | ||||
| two endpoints. Intermediaries do not forward WINDOW_UPDATE frames | ||||
| between dependent connections. However, throttling of data transfer | ||||
| by any receiver can indirectly cause the propagation of flow control | ||||
| information toward the original sender. | ||||
| Flow control only applies to frames that are identified as being | Flow control only applies to frames that are identified as being | |||
| subject to flow control. Of the frames defined in this document, | subject to flow control. Of the frame types defined in this | |||
| only data frames are subject to flow control. Receivers MUST either | document, this includes only DATA frame. Frames that are exempt from | |||
| buffer or process all other frames, terminate the corresponding | flow control MUST be accepted and processed, unless the receiver is | |||
| stream, or terminate the session. The stream or session is | unable to assign resources to handling the frame. A receiver MAY | |||
| terminated with a FLOW_CONTROL_ERROR code. | respond with a stream error (Section 3.5.2) or connection error | |||
| (Section 3.5.1) of type FLOW_CONTROL_ERROR if it is unable accept a | ||||
| frame. | ||||
| Valid flags for the WINDOW_UPDATE frame are: | The following additional flags are defined for the WINDOW_UPDATE | |||
| frame: | ||||
| END_FLOW_CONTROL (0x2): Bit 2 being set indicates that flow control | END_FLOW_CONTROL (0x2): Bit 2 being set indicates that flow control | |||
| for the identified stream or session is ended and 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 stream related or session related. | The WINDOW_UPDATE frame can be specific to a stream or to the entire | |||
| The stream identifier in the WINDOW_UPDATE frame header identifies | connection. In the former case, the frame's stream identifier | |||
| the affected stream, or includes a value of 0 to indicate that the | indicates the affected stream; in the latter, the value "0" indicates | |||
| session flow control window is updated. | that the entire connection is the subject of the frame. | |||
| The payload of a WINDOW_UPDATE frame contains a 32-bit value. This | The payload of a WINDOW_UPDATE frame is a 32-bit value indicating the | |||
| value is the additional number of bytes that the sender can transmit | additional number of bytes that the sender can transmit in addition | |||
| in addition to the existing flow control window. The legal range for | to the existing flow control window. The legal range for this field | |||
| this field is 1 to 2^31 - 1 (0x7fffffff) bytes; the most significant | is 1 to 2^31 - 1 (0x7fffffff) bytes; the most significant bit of this | |||
| bit of this value is reserved. | value is reserved. | |||
| 3.7.9.1. The Flow Control Window | 3.8.9.1. The Flow Control Window | |||
| Flow control in HTTP/2.0 is implemented by a flow control window kept | Flow control in HTTP/2.0 is implemented using a window kept by each | |||
| by the sender of each stream. The flow control window is a simple | sender on every stream. The flow control window is a simple integer | |||
| integer value that indicates how many bytes of data the sender is | value that indicates how many bytes of data the sender is permitted | |||
| permitted to transmit. The flow control window size is a measure of | to transmit; as such, its size is a measure of the buffering | |||
| the buffering capability of the recipient. | capability of the receiver. | |||
| Two flow control windows apply to the sending of every message: the | Two flow control windows are applicable; the stream flow control | |||
| stream flow control window and the session flow control window. The | window and the connection flow control window. The sender MUST NOT | |||
| sender MUST NOT send a flow controlled frame with a length that | send a flow controlled frame with a length that exceeds the space | |||
| exceeds the space available in either of the flow control windows | available in either of the flow control windows advertised by the | |||
| advertised by the receiver. Frames with zero length with the FINAL | receiver. Frames with zero length with the FINAL flag set (for | |||
| flag set (for example, an empty data frame) MAY be sent if there is | example, an empty data frame) MAY be sent if there is no available | |||
| 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 message sends a WINDOW_UPDATE frame as it consumes | The receiver of a frame sends a WINDOW_UPDATE frame as it consumes | |||
| data and frees up space in flow control windows. Separate | data and frees up space in flow control windows. Separate | |||
| WINDOW_UPDATE messages are sent for the stream and session level flow | WINDOW_UPDATE frames are sent for the stream and connection level | |||
| control windows. | flow control windows. | |||
| A sender that receives a WINDOW_UPDATE frame updates the | A sender that receives a WINDOW_UPDATE frame updates the | |||
| corresponding window by the amount specified in the frame. | corresponding window by the amount specified in the frame. | |||
| A sender MUST NOT allow a flow control window to exceed 2^31 - 1 | A sender MUST NOT allow a flow control window to exceed 2^31 - 1 | |||
| bytes. If a sender receives a WINDOW_UPDATE that causes a flow | bytes. If a sender receives a WINDOW_UPDATE that causes a flow | |||
| 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 session, as appropriate. For streams, the sender sends | stream or the connection, as appropriate. For streams, the sender | |||
| a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; for the | sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | |||
| session, a GOAWAY message 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.7.9.2. Initial Flow Control Window Size | 3.8.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 | |||
| session flow control window is 65536 bytes. Both endpoints can | connection flow control window is 65536 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 session 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, a client can only use the default | |||
| initial window size when sending flow controlled frames. Similarly, | initial window size when sending flow controlled frames. Similarly, | |||
| the session flow control window is set to the default initial window | the connection flow control window is set to the default initial | |||
| size until a WINDOW_UPDATE message 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 flow control windows | |||
| that it maintains by the difference between the new value and the old | that it maintains by the difference between the new value and the old | |||
| value. | value. | |||
| 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 not send new flow | track the negative flow control window, and MUST NOT send new flow | |||
| controlled frames until it receives WINDOW_UPDATE messages 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 server sets the initial window size to be 16KB, | |||
| and the client sends 64KB immediately on connection establishment, | and the client sends 64KB immediately on connection establishment, | |||
| the client will recalculate the available flow control window to be | the client will recalculate the available flow control window to be | |||
| -48KB on receipt of the SETTINGS frame. The client retains a | -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.7.9.3. Reducing the Stream Window Size | 3.8.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 sends a new SETTINGS frame. However, the receiver MUST | current size can send a new SETTINGS frame. However, the receiver | |||
| be prepared to receive data that exceeds this window size, since the | MUST be prepared to receive data that exceeds this window size, since | |||
| 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: | |||
| 1. The receiver can immediately send RST_STREAM with | 1. The receiver can immediately send RST_STREAM with | |||
| 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 messages 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.7.9.4. Ending Flow Control | 3.8.9.4. Ending Flow Control | |||
| After a recipient reads in a frame that marks the end of a stream | After a receiver reads in a frame that marks the end of a stream (for | |||
| (for example, a data stream with a FINAL flag set), it ceases | example, a data stream with a FINAL flag set), it MUST cease | |||
| transmission of WINDOW_UPDATE frames. A sender is not required to | transmission of WINDOW_UPDATE frames for that stream. A sender is | |||
| maintain the available flow control window for streams that it is no | not obligated to maintain the available flow control window for | |||
| longer sending on. | streams that it is no longer sending on. | |||
| Flow control can be disabled for all streams or the session using the | Flow control can be disabled for all streams or the connection using | |||
| SETTINGS_FLOW_CONTROL_OPTIONS setting. An implementation that does | the SETTINGS_FLOW_CONTROL_OPTIONS setting. An implementation that | |||
| not wish to perform flow control can use this in the initial SETTINGS | does not wish to perform flow control can use this in the initial | |||
| exchange. | 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 | |||
| session 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. | |||
| 3.7.10. Header Block | ||||
| The header block is found in the HEADERS, HEADERS+PRIORITY and | ||||
| PUSH_PROMISE frames. The header block consists of a set of header | ||||
| fields, which are name-value pairs. Headers are compressed using | ||||
| black magic. | ||||
| Compression of header fields is a work in progress, as is the format | ||||
| of this block. | ||||
| 4. HTTP Message Exchanges | 4. 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 | 4.1. Connection Management | |||
| Clients SHOULD NOT open more than one HTTP/2.0 session to a given | Clients SHOULD NOT open more than one HTTP/2.0 connection to a given | |||
| origin ([RFC6454]) concurrently. | origin ([RFC6454]) concurrently. | |||
| Note that it is possible for one HTTP/2.0 session to be finishing | Note that it is possible for one HTTP/2.0 connection to be finishing | |||
| (e.g. a GOAWAY message has been sent, but not all streams have | (e.g. a GOAWAY frame has been sent, but not all streams have | |||
| finished), while another HTTP/2.0 session is starting. | finished), while another HTTP/2.0 connection is starting. | |||
| 4.1.1. Use of GOAWAY | ||||
| HTTP/2.0 provides a GOAWAY message which can be used when closing a | ||||
| connection from either the client or server. Without a server GOAWAY | ||||
| message, HTTP has a race condition where the client sends a request | ||||
| just as the server is closing the connection, and the client cannot | ||||
| know if the server received the stream or not. By using the last- | ||||
| stream-id in the GOAWAY, servers can indicate to the client if a | ||||
| request was processed or not. | ||||
| Note that some servers will choose to send the GOAWAY and immediately | ||||
| terminate the connection without waiting for active streams to | ||||
| finish. The client will be able to determine this because HTTP/2.0 | ||||
| streams are deterministically closed. This abrupt termination will | ||||
| force the client to heuristically decide whether to retry the pending | ||||
| requests. Clients always need to be capable of dealing with this | ||||
| case because they must deal with accidental connection termination | ||||
| cases, which are the same as the server never having sent a GOAWAY. | ||||
| More sophisticated servers will use GOAWAY to implement a graceful | ||||
| teardown. They will send the GOAWAY and provide some time for the | ||||
| active streams to finish before terminating the connection. | ||||
| If a HTTP/2.0 client closes the connection, it should also send a | ||||
| GOAWAY message. This allows the server to know if any server-push | ||||
| streams were received by the client. | ||||
| If the endpoint closing the connection has not received frames on any | ||||
| stream, the GOAWAY will contain a last-stream-id of 0. | ||||
| 4.2. HTTP Request/Response | 4.2. HTTP Request/Response | |||
| 4.2.1. HTTP Header Fields and HTTP/2.0 Headers | 4.2.1. HTTP Header Fields and HTTP/2.0 Headers | |||
| At the application level, HTTP uses name-value pairs in its header | At the application level, HTTP uses name-value pairs in its header | |||
| fields. Because HTTP/2.0 merges the existing HTTP header fields with | fields. Because HTTP/2.0 merges the existing HTTP header fields with | |||
| HTTP/2.0 headers, there is a possibility that some HTTP applications | HTTP/2.0 headers, there is a possibility that some HTTP applications | |||
| already use a particular header field name. To avoid any conflicts, | already use a particular header field name. To avoid any conflicts, | |||
| all header fields introduced for layering HTTP over HTTP/2.0 are | all header fields introduced for layering HTTP over HTTP/2.0 are | |||
| skipping to change at page 30, line 10 ¶ | skipping to change at page 33, line 29 ¶ | |||
| The client initiates a request by sending a HEADERS+PRIORITY frame. | The client initiates a request by sending a HEADERS+PRIORITY frame. | |||
| Requests that do not contain a body MUST set the FINAL flag, | Requests that do not contain a body MUST set the FINAL flag, | |||
| indicating that the client intends to send no further data on this | indicating that the client intends to send no further data on this | |||
| stream, unless the server intends to push resources (see | stream, unless the server intends to push resources (see | |||
| Section 4.3). HEADERS+PRIORITY frame does not contain the FINAL flag | 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 | 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 | series of DATA frames. The last DATA frame sets the FINAL flag to | |||
| indicate the end of the body. | indicate the end of the body. | |||
| The header fields included in the HEADERS+PRIORITY frame contain all | The header fields included in the HEADERS+PRIORITY frame contain all | |||
| of the HTTP header fields that are associated with an HTTP request. | of the HTTP header fields associated with an HTTP request. The | |||
| The header block in HTTP/2.0 is mostly unchanged from today's HTTP | definitions of these headers are largely unchanged relative to | |||
| header block, with the following differences: | HTTP/1.1, with a few notable exceptions: | |||
| The following fields that are carried in the request line in | ||||
| HTTP/1.1 ([HTTP-p1], Section 3.1.1) are defined as special-valued | ||||
| name-value pairs: | ||||
| ":method": the HTTP method for this request (e.g. "GET", "POST", | ||||
| "HEAD", etc) ([HTTP-p2], Section 4) | ||||
| ":path": ":path" - the request-target for this URI with "/" | ||||
| prefixed (see [HTTP-p1], Section 3.1.1). For example, for | ||||
| "http://www.google.com/search?q=dogs" the path would be | ||||
| "/search?q=dogs". [[anchor26: what forms of the HTTPbis | ||||
| request-target are allowed here?]] | ||||
| These header fields MUST be present in HTTP requests. | ||||
| In addition, the following two name-value pairs MUST be present in | ||||
| every request: | ||||
| ":host": the host and optional port portions (see [RFC3986], | ||||
| Section 3.2) of the URI for this request (e.g. "www.google.com: | ||||
| 1234"). This header field is the same as the HTTP 'Host' | ||||
| header field ([HTTP-p1], Section 5.4). | ||||
| ":scheme": the scheme portion of the URI for this request (e.g. | ||||
| "https") | ||||
| All header field names starting with ":" (whether defined in this | o The HTTP/1.1 request-line has been split into two separate header | |||
| document or future extensions to this document) MUST appear before | fields named :method and :path, whose values specify the HTTP | |||
| any other header fields. | method for the request and the request-target, respectively. The | |||
| HTTP-version component of the request-line is removed entirely | ||||
| from the headers. | ||||
| Header field names MUST be all lowercase. | o The host and optional port portions of the request URI (see | |||
| [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.]] | ||||
| The Connection, Host, Keep-Alive, Proxy-Connection, and Transfer- | o A new :scheme header field has been added to specify the scheme | |||
| Encoding header fields are not valid and MUST not be sent. | portion of the request-target (e.g. "https") | |||
| User-agents MUST support gzip compression. Regardless of the | o All header field names MUST be lowercased, and the definitions of | |||
| Accept-Encoding sent by the user-agent, the server may always send | all header field names defined by HTTP/1.1 are updated to be all | |||
| content encoded with gzip or deflate encoding. [[anchor27: Still | lowercase. | |||
| valid?]] | ||||
| If a server receives a request where the sum of the data frame | o The Connection, Host, Keep-Alive, Proxy-Connection, and Transfer- | |||
| payload lengths does not equal the size of the Content-Length | Encoding header fields are no longer valid and MUST not be sent. | |||
| header field, the server MUST return a 400 (Bad Request) error. | ||||
| Although POSTs are inherently chunked, POST requests SHOULD also | All HTTP Requests MUST include the ":method", ":path", ":host", and | |||
| be accompanied by a Content-Length header field. First, it | ":scheme" header fields. | |||
| informs the server of how much data to expect, which the server | ||||
| can used to track overall progress and provide appropriate user | ||||
| feedback. More 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, | ||||
| which caused server implementations have come to depend upon its | ||||
| presence. | ||||
| The user-agent is free to prioritize requests as it sees fit. If the | Header fields whose names begin with ":" (whether defined in this | |||
| user-agent cannot make progress without receiving a resource, it | document or future extensions to this document) MUST appear before | |||
| should attempt to raise the priority of that resource. Resources | any other header fields. | |||
| such as images, SHOULD generally use the lowest priority. | ||||
| If a client sends a HEADERS+PRIORITY frame that omits a mandatory | If a client sends a HEADERS+PRIORITY frame that omits a mandatory | |||
| header, the server MUST reply with a HTTP 400 Bad Request reply. | header, the server MUST reply with a HTTP 400 Bad Request reply. | |||
| [[anchor28: Ed: why PROTOCOL_ERROR on missing ":status" in the | [[anchor22: Ed: why PROTOCOL_ERROR on missing ":status" in the | |||
| response, but HTTP 400 here?]] | response, but HTTP 400 here?]] | |||
| If the server receives a data frame prior to a HEADERS or HEADERS+ | If a server receives a request where the sum of the data frame | |||
| PRIORITY frame the server MUST treat this as a stream error | payload lengths does not equal the size of the Content-Length header | |||
| (Section 3.5.2) of type PROTOCOL_ERROR. | field, the server MUST return a 400 (Bad Request) error. | |||
| Although POSTs are inherently chunked, POST requests SHOULD also be | ||||
| accompanied by a Content-Length header field. First, it informs the | ||||
| server of how much data to expect, which the server can use to track | ||||
| overall progress and provide appropriate user feedback. More | ||||
| 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 | ||||
| server SHOULD attempt to provide responses to higher priority | ||||
| requests before lower priority requests. A server could send lower | ||||
| priority responses during periods that higher priority responses are | ||||
| unavailable to ensure better utilization of a connection. | ||||
| If the server receives a data frame prior to a HEADERS+PRIORITY frame | ||||
| the server MUST treat this as a stream error (Section 3.5.2) of type | ||||
| PROTOCOL_ERROR. | ||||
| 4.2.3. Response | 4.2.3. Response | |||
| The server responds to a client request with a HEADERS frame. | The server responds to a client request using the same stream | |||
| Symmetric to the client's upload stream, server will send any | identifier that was used by the request. An HTTP response begins | |||
| response body in a series of DATA frames. The last data frame will | with a HEADERS frame. An HTTP response body consists of a series of | |||
| contain the FINAL flag to indicate the end of the stream and the end | DATA frames. The last data frame contains a FINAL flag to indicate | |||
| of the response. A response that contains no body (such as a 204 or | the end of the response. A response that contains no body (such as a | |||
| 304 response) consists only of a HEADERS frame that contains the | 204 or 304 response) consists only of a HEADERS frame that contains | |||
| FINAL flag to indicate no further data will be sent on the stream. | 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 | The response status line is unfolded into name-value pairs like | |||
| other HTTP header fields and must be present: | other HTTP header fields and must be present: | |||
| ":status": The HTTP response status code (e.g. "200" or "200 OK") | ":status": The HTTP response status code (e.g. "200" or "200 OK") | |||
| All header field names starting with ":" (whether defined in this | All header field names starting with ":" (whether defined in this | |||
| document or future extensions to this document) MUST appear before | document or future extensions to this document) MUST appear before | |||
| any other header fields. | any other header fields. | |||
| skipping to change at page 32, line 18 ¶ | skipping to change at page 35, line 27 ¶ | |||
| Encoding header fields are not valid and MUST not be sent. | Encoding header fields are not valid and MUST not be sent. | |||
| Responses MAY be accompanied by a Content-Length header field for | Responses MAY be accompanied by a Content-Length header field for | |||
| advisory purposes. This allows clients to learn the full size of | advisory purposes. This allows clients to learn the full size of | |||
| an entity prior to receiving all the data frames. This can help | an entity prior to receiving all the data frames. This can help | |||
| in, for example, reporting progress. | in, for example, reporting progress. | |||
| If a client receives a response where the sum of the data frame | If a client receives a response where the sum of the data frame | |||
| payload length does not equal the size of the Content-Length | payload length does not equal the size of the Content-Length | |||
| header field, the client MUST ignore the content length header | header field, the client MUST ignore the content length header | |||
| field. [[anchor29: Ed: See | field. [[anchor23: Ed: See | |||
| <https://github.com/http2/http2-spec/issues/46>.]] | <https://github.com/http2/http2-spec/issues/46>.]] | |||
| If a client receives a response with an absent or duplicated status | If a client receives a response with an absent or duplicated status | |||
| header, the client MUST treat this as a stream error (Section 3.5.2) | header, the client MUST treat this as a stream error (Section 3.5.2) | |||
| of type PROTOCOL_ERROR. | of type PROTOCOL_ERROR. | |||
| If the client receives a data frame prior to a HEADERS or HEADERS+ | If the client receives a data frame prior to a HEADERS frame the | |||
| PRIORITY frame the client MUST treat this as a stream error | client MUST treat this as a stream error (Section 3.5.2) of type | |||
| (Section 3.5.2) of type PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| Clients MUST support gzip compression. Regardless of the value of | ||||
| the Accept-Encoding header field, a server MAY send responses with | ||||
| gzip or deflate encoding. A compressed response MUST still bear an | ||||
| appropriate Content-Encoding header field. | ||||
| 4.3. Server Push Transactions | 4.3. Server Push Transactions | |||
| HTTP/2.0 enables a server to send multiple replies to a client for a | HTTP/2.0 enables a server to send multiple replies to a client for a | |||
| single request. The rationale for this feature is that sometimes a | single request. The rationale for this feature is that sometimes a | |||
| server knows that it will need to send multiple resources in response | server knows that it will need to send multiple resources in response | |||
| to a single request. Without server push features, the client must | to a single request. Without server push features, the client must | |||
| first download the primary resource, then discover the secondary | first download the primary resource, then discover the secondary | |||
| resource(s), and request them. Pushing of resources avoids the | resource(s), and request them. | |||
| round-trip delay, but also creates a potential race where a server | ||||
| can be pushing content which a user-agent is in the process of | ||||
| requesting. The following mechanics attempt to prevent the race | ||||
| condition while enabling the performance benefit. | ||||
| Server push is an optional feature. Server push can be disabled by | Server push is an optional feature. The | |||
| clients that do not wish to receive pushed resources by advertising a | SETTINGS_MAX_CONCURRENT_STREAMS setting from the client limits the | |||
| SETTINGS_MAX_CONCURRENT_STREAMS SETTING (Section 3.7.4) of zero. | number of resources that can be concurrently pushed by a server. | |||
| This prevents servers from creating the streams necessary to push | Server push can be disabled by clients that do not wish to receive | |||
| resources. | 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. | ||||
| Browsers receiving a pushed response MUST validate that the server is | Clients receiving a pushed response MUST validate that the server is | |||
| authorized to push the resource using the same-origin policy | authorized to push the resource using the same-origin policy | |||
| ([RFC6454], Section 3). For example, a HTTP/2.0 connection to | ([RFC6454], Section 3). For example, a HTTP/2.0 connection to | |||
| "example.com" is generally [[anchor30: Ed: weaselly use of | "example.com" is generally [[anchor24: Ed: weaselly use of | |||
| "generally", needs better definition]] not permitted to push a | "generally", needs better definition]] not permitted to push a | |||
| response for "www.example.org". | response for "www.example.org". | |||
| A client that accepts pushed resources caches those resources as | A client that accepts pushed resources caches those resources as | |||
| though they were responses to GET requests. | though they were responses to GET requests. | |||
| Pushing of resources avoids the round-trip delay, but also creates a | ||||
| potential race where a server can be pushing content which a client | ||||
| is in the process of requesting. The PUSH_PROMISE frame reduces the | ||||
| chances of this condition occurring, while retaining the performance | ||||
| benefit. | ||||
| Pushed responses are associated with a request at the HTTP/2.0 | Pushed responses are associated with a request at the HTTP/2.0 | |||
| framing layer. The PUSH_PROMISE includes a stream identifier for an | framing layer. The PUSH_PROMISE is sent on the stream for the | |||
| associated request/response exchange that supplies request header | associated request, which allows a receiver to correlate the pushed | |||
| fields. The pushed stream inherits all of the request header fields | resource with a request. The pushed stream inherits all of the | |||
| from the associated stream with the exception of resource | request header fields from the associated stream with the exception | |||
| identification header fields (":host", ":scheme", and ":path"), which | of resource identification header fields (":host", ":scheme", and | |||
| are provided as part of the PUSH_PROMISE frame. Pushed resources | ":path"), which are provided as part of the PUSH_PROMISE frame. | |||
| always have an associated ":method" of "GET". A cache MUST store | ||||
| these inherited and implied request header fields with the cached | ||||
| resource. | ||||
| Implementation note: With server push, it is theoretically possible | Pushed resources always have an associated ":method" of "GET". A | |||
| for servers to push unreasonable amounts of content or resources to | cache MUST store these inherited and implied request header fields | |||
| the user-agent. Browsers MUST implement throttles to protect against | with the cached resource. | |||
| unreasonable push attacks. [[anchor31: Ed: insufficiently specified | ||||
| to implement; would like to remove]] | ||||
| 4.3.1. Server implementation | 4.3.1. Server implementation | |||
| A server pushes resources in association with a request from the | A server pushes resources in association with a request from the | |||
| client. Prior to closing the response stream, the server sends a | client. Prior to closing the response stream, the server sends a | |||
| PUSH_PROMISE for each resource that it intends to push. The | PUSH_PROMISE for each resource that it intends to push. The | |||
| PUSH_PROMISE includes header fields that allow the client to identify | PUSH_PROMISE includes header fields that allow the client to identify | |||
| the resource (":scheme", ":host", and ":port"). | the resource (":scheme", ":host", and ":path"). | |||
| A server can push multiple resources in response to a request, but | A server can push multiple resources in response to a request, but | |||
| these can only be sent while the response stream remains open. A | all pushed resources MUST be promised on the response stream for the | |||
| server MUST NOT send a PUSH_PROMISE on a half-closed stream. | associated request. A server cannot send a PUSH_PROMISE on a new | |||
| stream or a half-closed stream. | ||||
| The server SHOULD include any header fields in a PUSH_PROMISE that | The server SHOULD include any header fields in a PUSH_PROMISE that | |||
| would allow a cache to determine if the resource is already cached | would allow a cache to determine if the resource is already cached | |||
| (see [HTTP-p6], Section 4). | (see [HTTP-p6], Section 4). | |||
| After sending a PUSH_PROMISE, the server commences transmission of a | After sending a PUSH_PROMISE, the server commences transmission of a | |||
| pushed resource. A pushed resource uses a server-initiated stream. | pushed resource. A pushed resource uses a server-initiated stream. | |||
| The server sends frames on this stream in the same order as an HTTP | 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. | response (Section 4.2.3): a HEADERS frame followed by DATA frames. | |||
| skipping to change at page 34, line 26 ¶ | skipping to change at page 37, line 41 ¶ | |||
| 4.3.2. Client implementation | 4.3.2. Client implementation | |||
| When fetching a resource the client has 3 possibilities: | When fetching a resource the client has 3 possibilities: | |||
| 1. the resource is not being pushed | 1. the resource is not being pushed | |||
| 2. the resource is being pushed, but the data has not yet arrived | 2. the resource is being pushed, but the data has not yet arrived | |||
| 3. the resource is being pushed, and the data has started to arrive | 3. the resource is being pushed, and the data has started to arrive | |||
| When a HEADERS+PRIORITY frame that contains an | A client SHOULD NOT issue GET requests for a resource that has been | |||
| Associated-To-Stream-ID is received, the client MUST NOT[[anchor34: | promised. A client is instead advised to wait for the pushed | |||
| SHOULD NOT?]] issue GET requests for the resource in the pushed | resource to arrive. | |||
| stream, and instead wait for the pushed stream to arrive. | ||||
| A server MUST NOT push a resource with an Associated-To-Stream-ID of | ||||
| 0. Clients MUST treat this as a session error (Section 3.5.1) of | ||||
| type PROTOCOL_ERROR. | ||||
| When a client receives a PUSH_PROMISE frame from the server without a | When a client receives a PUSH_PROMISE frame from the server without a | |||
| the ":host", ":scheme", and ":path" header fields, it MUST treat this | the ":host", ":scheme", and ":path" header fields, it MUST treat this | |||
| as a stream error (Section 3.5.2) of type PROTOCOL_ERROR. | as a stream error (Section 3.5.2) of type PROTOCOL_ERROR. | |||
| To cancel individual server push streams, the client can issue a | To cancel individual server push streams, the client can issue a | |||
| stream error (Section 3.5.2) of type CANCEL. Upon receipt, the | stream error (Section 3.5.2) of type CANCEL. After receiving a | |||
| server ceases transmission of the pushed data. | PUSH_PROMISE frame, the client is able to cancel the pushed resource | |||
| before receiving any frames on the promised stream. The server | ||||
| ceases transmission of the pushed resource; if the server has not | ||||
| commenced transmission, it does not start. | ||||
| To cancel all server push streams related to a request, the client | To cancel all server push streams related to a request, the client | |||
| may issue a stream error (Section 3.5.2) of type CANCEL on the | may issue a stream error (Section 3.5.2) of type CANCEL on the | |||
| associated-stream-id. By cancelling that stream, the server MUST | associated-stream-id. By cancelling that stream, the server MUST | |||
| immediately stop sending frames for any streams with | immediately stop sending frames for any streams with | |||
| in-association-to for the original stream. [[anchor35: Ed: Triggering | in-association-to for the original stream. [[anchor27: Ed: Triggering | |||
| side-effects on stream reset is going to be problematic for the | side-effects on stream reset is going to be problematic for the | |||
| framing layer. Purely from a design perspective, it's a layering | framing layer. Purely from a design perspective, it's a layering | |||
| violation. More practically speaking, the base request stream might | violation. More practically speaking, the base request stream might | |||
| already be removed. Special handling logic would be required.]] | already be removed. Special handling logic would be required.]] | |||
| A client can choose to time out pushed streams if the server does not | ||||
| provide the resource in a timely fashion. A stream error | ||||
| (Section 3.5.2) of type CANCEL can be used to stop a timed out push. | ||||
| If the server sends a HEADERS frame containing header fields that | If the server sends a HEADERS frame containing header fields that | |||
| duplicate values on a previous HEADERS or PUSH_PROMISE frames on the | duplicate values on a previous HEADERS or PUSH_PROMISE frames on the | |||
| same stream, the client MUST treat this as a stream error | same stream, the client MUST treat this as a stream error | |||
| (Section 3.5.2) of type PROTOCOL_ERROR. | (Section 3.5.2) of type PROTOCOL_ERROR. | |||
| If the server sends a HEADERS frame after sending a data frame for | If the server sends a HEADERS frame after sending a data frame for | |||
| the same stream, the client MAY ignore the HEADERS frame. Ignoring | the same stream, the client MAY ignore the HEADERS frame. Ignoring | |||
| the HEADERS frame after a data frame prevents handling of HTTP's | the HEADERS frame after a data frame prevents handling of HTTP's | |||
| trailing header fields (Section 4.1.1 of [HTTP-p1]). | trailing header fields (Section 4.1.1 of [HTTP-p1]). | |||
| skipping to change at page 35, line 44 ¶ | skipping to change at page 39, line 13 ¶ | |||
| relates to existing HTTP implementations. However, the ability to | relates to existing HTTP implementations. However, the ability to | |||
| reuse the HTTP/2.0 framing layer is a non goal. | reuse the HTTP/2.0 framing layer is a non goal. | |||
| 5.2. Error handling - Framing Layer | 5.2. Error handling - Framing Layer | |||
| Error handling at the HTTP/2.0 layer splits errors into two groups: | Error handling at the HTTP/2.0 layer splits errors into two groups: | |||
| Those that affect an individual HTTP/2.0 stream, and those that do | Those that affect an individual HTTP/2.0 stream, and those that do | |||
| not. | not. | |||
| When an error is confined to a single stream, but general framing is | When an error is confined to a single stream, but general framing is | |||
| in tact, HTTP/2.0 attempts to use the RST_STREAM as a mechanism to | intact, HTTP/2.0 attempts to use the RST_STREAM as a mechanism to | |||
| invalidate the stream but move forward without aborting the | invalidate the stream but move forward without aborting the | |||
| connection altogether. | connection altogether. | |||
| For errors occurring outside of a single stream context, HTTP/2.0 | For errors occurring outside of a single stream context, HTTP/2.0 | |||
| assumes the entire session is hosed. In this case, the endpoint | assumes the entire connection is hosed. In this case, the endpoint | |||
| detecting the error should initiate a connection close. | detecting the error should initiate a connection close. | |||
| 5.3. One Connection Per Domain | 5.3. One Connection per Domain | |||
| HTTP/2.0 attempts to use fewer connections than other protocols have | HTTP/2.0 attempts to use fewer connections than other protocols have | |||
| traditionally used. The rationale for this behavior is because it is | traditionally used. The rationale for this behavior is because it is | |||
| very difficult to provide a consistent level of service (e.g. TCP | very difficult to provide a consistent level of service (e.g. TCP | |||
| slow-start), prioritization, or optimal compression when the client | slow-start), prioritization, or optimal compression when the client | |||
| is connecting to the server through multiple channels. | is connecting to the server through multiple channels. | |||
| Through lab measurements, we have seen consistent latency benefits by | Through lab measurements, we have seen consistent latency benefits by | |||
| using fewer connections from the client. The overall number of | 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. | packets sent by HTTP/2.0 can be as much as 40% less than HTTP. | |||
| skipping to change at page 37, line 10 ¶ | skipping to change at page 40, line 27 ¶ | |||
| A subtle but important point is that server push streams must be | A subtle but important point is that server push streams must be | |||
| declared before the associated stream is closed. The reason for this | declared before the associated stream is closed. The reason for this | |||
| is so that proxies have a lifetime for which they can discard | is so that proxies have a lifetime for which they can discard | |||
| information about previous streams. If a pushed stream could | information about previous streams. If a pushed stream could | |||
| associate itself with an already-closed stream, then endpoints would | associate itself with an already-closed stream, then endpoints would | |||
| not have a specific lifecycle for when they could disavow knowledge | not have a specific lifecycle for when they could disavow knowledge | |||
| of the streams which went before. | of the streams which went before. | |||
| 6. Security Considerations | 6. Security Considerations | |||
| 6.1. Use of Same-origin constraints | 6.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) | |||
| in all cases where verification of content is required. | to determine whether an origin server is permitted to provide | |||
| content. | ||||
| A server that is contacted using TLS is authenticated based on the | ||||
| certificate that it offers in the TLS handshake (see [RFC2818], | ||||
| Section 3). A server is considered authoritative for an "https:" | ||||
| resource if it has been successfully authenticated for the domain | ||||
| part of the origin of the resource that it is providing. | ||||
| A server is considered authoritative for an "http:" resource if the | ||||
| connection is established to a resolved IP address for the domain in | ||||
| the origin of the resource. | ||||
| A client MUST NOT use, in any way, resources provided by a server | ||||
| that is not authoritative for those resources. | ||||
| 6.2. Cross-Protocol Attacks | 6.2. Cross-Protocol Attacks | |||
| By utilizing 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. | |||
| [[anchor45: Issue: This is no longer true]] | ||||
| [[anchor37: Issue: This is no longer true]] | ||||
| 6.3. Cacheability of Pushed Resources | 6.3. Cacheability of Pushed Resources | |||
| Pushed resources do not have an associated request. In order for | Pushed resources are synthesized responses without an explicit | |||
| existing HTTP cache control validations (such as the Vary header | request; the request for a pushed resource is synthesized from the | |||
| field) to work, all cached resources must have a set of request | request that triggered the push, plus resource identification | |||
| header fields. For this reason, caches MUST be careful to inherit | information provided by the server. Request header fields are | |||
| request header fields from the associated stream for the push. This | necessary for HTTP cache control validations (such as the Vary header | |||
| includes the Cookie header field. | field) to work. For this reason, caches MUST inherit request header | |||
| fields from the associated stream for the push. This includes the | ||||
| Cookie header 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 | |||
| skipping to change at page 40, line 29 ¶ | skipping to change at page 44, line 16 ¶ | |||
| 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.7.4. | Section 3.8.4.3. | |||
| 9. Acknowledgements | 9. 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 and Julian Reschke | o Mark Nottingham, Julian Reschke, James Snell (Editorial) | |||
| 10. References | 10. References | |||
| 10.1. Normative References | 10.1. Normative References | |||
| [HTTP-p1] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | [HTTP-p1] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | |||
| (HTTP/1.1): Message Syntax and Routing", | (HTTP/1.1): Message Syntax and Routing", | |||
| draft-ietf-httpbis-p1-messaging-22 (work in progress), | draft-ietf-httpbis-p1-messaging-22 (work in progress), | |||
| February 2013. | February 2013. | |||
| [HTTP-p2] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | [HTTP-p2] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | |||
| (HTTP/1.1): Semantics and Content", | (HTTP/1.1): Semantics and Content", | |||
| draft-ietf-httpbis-p2-semantics-22 (work in progress), | draft-ietf-httpbis-p2-semantics-22 (work in progress), | |||
| skipping to change at page 41, line 42 ¶ | skipping to change at page 45, line 26 ¶ | |||
| Protocol (HTTP/1.1): Authentication", | Protocol (HTTP/1.1): Authentication", | |||
| draft-ietf-httpbis-p7-auth-22 (work in progress), | draft-ietf-httpbis-p7-auth-22 (work in progress), | |||
| February 2013. | February 2013. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, September 1981. | RFC 793, September 1981. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | ||||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| RFC 3986, January 2005. | RFC 3986, January 2005. | |||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | |||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | IANA Considerations Section in RFCs", BCP 26, RFC 5226, | |||
| May 2008. | May 2008. | |||
| [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
| (TLS) Protocol Version 1.2", RFC 5246, August 2008. | (TLS) Protocol Version 1.2", RFC 5246, August 2008. | |||
| [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | |||
| December 2011. | December 2011. | |||
| [TLSNPN] Langley, A., "Transport Layer Security (TLS) Next Protocol | [TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| Negotiation Extension", draft-agl-tls-nextprotoneg-04 | "Transport Layer Security (TLS) Application Layer Protocol | |||
| (work in progress), May 2012. | Negotiation Extension", draft-ietf-tls-applayerprotoneg-01 | |||
| (work in progress), April 2013. | ||||
| 10.2. Informative References | 10.2. Informative References | |||
| [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP Extensions | [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP Extensions | |||
| for High Performance", RFC 1323, May 1992. | for High Performance", RFC 1323, May 1992. | |||
| [TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | [TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | |||
| Jackson, "Talking to Yourself for Fun and Profit", 2011, | Jackson, "Talking to Yourself for Fun and Profit", 2011, | |||
| <http://w2spconf.com/2011/papers/websocket.pdf>. | <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-01 | A.1. Since draft-ietf-httpbis-http2-02 | |||
| Added continuations to frames carrying header blocks. | ||||
| Replaced use of "session" with "connection" to avoid confusion with | ||||
| other HTTP stateful concepts, like cookies. | ||||
| Removed "message". | ||||
| Switched to TLS ALPN from NPN. | ||||
| Editorial changes. | ||||
| A.2. 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 43, line 7 ¶ | skipping to change at page 47, line 7 ¶ | |||
| 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.2. Since draft-ietf-httpbis-http2-00 | A.3. 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 3.6.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.3. Since draft-mbelshe-httpbis-spdy-00 | A.4. 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 | |||
| skipping to change at page 44, line 7 ¶ | skipping to change at page 48, line 7 ¶ | |||
| EMail: mbelshe@chromium.org | EMail: mbelshe@chromium.org | |||
| Roberto Peon | Roberto Peon | |||
| Google, Inc | Google, Inc | |||
| EMail: fenix@google.com | EMail: fenix@google.com | |||
| Martin Thomson (editor) | Martin Thomson (editor) | |||
| Microsoft | Microsoft | |||
| 3210 Porter Drive | 3210 Porter Drive | |||
| Palo Alto 94043 | Palo Alto 94304 | |||
| US | US | |||
| EMail: martin.thomson@skype.net | EMail: martin.thomson@skype.net | |||
| Alexey Melnikov (editor) | Alexey Melnikov (editor) | |||
| Isode Ltd | Isode Ltd | |||
| 5 Castle Business Village | 5 Castle Business Village | |||
| 36 Station Road | 36 Station Road | |||
| Hampton, Middlesex TW12 2BX | Hampton, Middlesex TW12 2BX | |||
| UK | UK | |||
| End of changes. 263 change blocks. | ||||
| 799 lines changed or deleted | 988 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/ | ||||