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.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |