| draft-ietf-httpbis-http2-04.txt | draft-ietf-httpbis-http2-05.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: January 9, 2014 Google, Inc | Expires: February 14, 2014 Google, Inc | |||
| M. Thomson, Ed. | M. Thomson, Ed. | |||
| Microsoft | Microsoft | |||
| A. Melnikov, Ed. | A. Melnikov, Ed. | |||
| Isode Ltd | Isode Ltd | |||
| July 8, 2013 | August 13, 2013 | |||
| Hypertext Transfer Protocol version 2.0 | Hypertext Transfer Protocol version 2.0 | |||
| draft-ietf-httpbis-http2-04 | draft-ietf-httpbis-http2-05 | |||
| Abstract | Abstract | |||
| This specification describes an optimized expression of the syntax of | This specification describes an optimized expression of the syntax of | |||
| the Hypertext Transfer Protocol (HTTP). The HTTP/2.0 encapsulation | the Hypertext Transfer Protocol (HTTP). The HTTP/2.0 encapsulation | |||
| enables more efficient use of network resources and reduced | enables more efficient use of network resources and reduced | |||
| perception of latency by allowing header field compression and | perception of latency by allowing header field compression and | |||
| multiple concurrent messages on the same connection. It also | multiple concurrent messages on the same connection. It also | |||
| introduces unsolicited push of representations from servers to | introduces unsolicited push of representations from servers to | |||
| clients. | clients. | |||
| This document is an alternative to, but does not obsolete the | This document is an alternative to, but does not obsolete the | |||
| HTTP/1.1 message format or protocol. HTTP's existing semantics | HTTP/1.1 message format or protocol. HTTP's existing semantics | |||
| remain unchanged. | remain unchanged. | |||
| This version of the draft has been marked for implementation. | ||||
| Interoperability testing will occur in the HTTP/2.0 interim in | ||||
| Hamburg, DE, starting 2013-08-05. | ||||
| Editorial Note (To be removed by RFC Editor) | Editorial Note (To be removed by RFC Editor) | |||
| Discussion of this draft takes place on the HTTPBIS working group | Discussion of this draft takes place on the HTTPBIS working group | |||
| mailing list (ietf-http-wg@w3.org), which is archived at | mailing list (ietf-http-wg@w3.org), which is archived at | |||
| <http://lists.w3.org/Archives/Public/ietf-http-wg/>. | <http://lists.w3.org/Archives/Public/ietf-http-wg/>. | |||
| Working Group information and related documents can be found at | Working Group information and related documents can be found at | |||
| <http://tools.ietf.org/wg/httpbis/> (Wiki) and | <http://tools.ietf.org/wg/httpbis/> (Wiki) and | |||
| <https://github.com/http2/http2-spec> (source code and issues | <https://github.com/http2/http2-spec> (source code and issues | |||
| tracker). | tracker). | |||
| skipping to change at page 2, line 16 ¶ | 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 January 9, 2014. | This Internet-Draft will expire on February 14, 2014. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2013 IETF Trust and the persons identified as the | Copyright (c) 2013 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 50 ¶ | skipping to change at page 2, line 46 ¶ | |||
| 2.2. HTTP Multiplexing . . . . . . . . . . . . . . . . . . . . 7 | 2.2. HTTP Multiplexing . . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.3. HTTP Semantics . . . . . . . . . . . . . . . . . . . . . . 7 | 2.3. HTTP Semantics . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3. Starting HTTP/2.0 . . . . . . . . . . . . . . . . . . . . . . 7 | 3. Starting HTTP/2.0 . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. HTTP/2.0 Version Identification . . . . . . . . . . . . . 8 | 3.1. HTTP/2.0 Version Identification . . . . . . . . . . . . . 8 | |||
| 3.2. Starting HTTP/2.0 for "http" URIs . . . . . . . . . . . . 8 | 3.2. Starting HTTP/2.0 for "http" URIs . . . . . . . . . . . . 8 | |||
| 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | |||
| 3.3. Starting HTTP/2.0 for "https" URIs . . . . . . . . . . . . 10 | 3.3. Starting HTTP/2.0 for "https" URIs . . . . . . . . . . . . 10 | |||
| 3.4. Starting HTTP/2.0 with Prior Knowledge . . . . . . . . . . 10 | 3.4. Starting HTTP/2.0 with Prior Knowledge . . . . . . . . . . 10 | |||
| 3.5. Connection Header . . . . . . . . . . . . . . . . . . . . 11 | 3.5. Connection Header . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.1. Frame Header . . . . . . . . . . . . . . . . . . . . . . . 12 | 4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . . 13 | 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.3. Header Compression and Decompression . . . . . . . . . . . 13 | 4.3. Header Compression and Decompression . . . . . . . . . . . 13 | |||
| 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . . 14 | 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 14 | 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 18 | 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 18 | |||
| 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 18 | 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 19 | |||
| 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 18 | 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 19 | 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 19 | |||
| 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 20 | 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 21 | |||
| 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 20 | 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 21 | 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 21 | 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 22 | |||
| 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 22 | 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 22 | |||
| 5.4.3. Connection Termination . . . . . . . . . . . . . . . . 22 | 5.4.3. Connection Termination . . . . . . . . . . . . . . . . 23 | |||
| 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 22 | 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 | 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 23 | 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 24 | 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 25 | 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6.5.1. Setting Format . . . . . . . . . . . . . . . . . . . . 26 | 6.5.1. Setting Format . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6.5.2. Defined Settings . . . . . . . . . . . . . . . . . . . 27 | 6.5.2. Defined Settings . . . . . . . . . . . . . . . . . . . 28 | |||
| 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 27 | 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 31 | 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 32 | 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 34 | |||
| 6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 33 | 6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 35 | |||
| 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 34 | 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 36 | |||
| 6.9.4. Ending Flow Control . . . . . . . . . . . . . . . . . 34 | 6.9.4. Ending Flow Control . . . . . . . . . . . . . . . . . 36 | |||
| 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 35 | 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 36 | 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 36 | 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 38 | |||
| 8.1.1. Examples . . . . . . . . . . . . . . . . . . . . . . . 37 | 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 39 | |||
| 8.1.2. Request Header Fields . . . . . . . . . . . . . . . . 38 | 8.1.1. Examples . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 8.1.3. Response Header Fields . . . . . . . . . . . . . . . . 39 | 8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . . 41 | |||
| 8.1.4. GZip Content-Encoding . . . . . . . . . . . . . . . . 40 | 8.1.3. Request Reliability Mechanisms in HTTP/2.0 . . . . . . 43 | |||
| 8.1.5. Request Reliability Mechanisms in HTTP/2.0 . . . . . . 40 | 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
| 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 41 | 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 44 | |||
| 9. Additional HTTP Requirements/Considerations . . . . . . . . . 43 | 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . . 45 | |||
| 9.1. Frame Size Limits for HTTP . . . . . . . . . . . . . . . . 43 | 9. Additional HTTP Requirements/Considerations . . . . . . . . . 46 | |||
| 9.2. Connection Management . . . . . . . . . . . . . . . . . . 43 | 9.1. Connection Management . . . . . . . . . . . . . . . . . . 46 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 43 | 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.1. Server Authority and Same-Origin . . . . . . . . . . . . . 43 | 9.3. Frame Size Limits for HTTP . . . . . . . . . . . . . . . . 47 | |||
| 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 44 | 9.4. GZip Content-Encoding . . . . . . . . . . . . . . . . . . 47 | |||
| 10.3. Cacheability of Pushed Resources . . . . . . . . . . . . . 44 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 47 | |||
| 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 45 | 10.1. Server Authority and Same-Origin . . . . . . . . . . . . . 47 | |||
| 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 45 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 47 | |||
| 12.1. Frame Type Registry . . . . . . . . . . . . . . . . . . . 45 | 10.3. Cacheability of Pushed Resources . . . . . . . . . . . . . 48 | |||
| 12.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 46 | 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 48 | |||
| 12.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 47 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 12.4. HTTP2-Settings Header Field Registration . . . . . . . . . 47 | 12.1. Frame Type Registry . . . . . . . . . . . . . . . . . . . 49 | |||
| 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 48 | 12.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 49 | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 48 | 12.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 50 | |||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . . 48 | 12.4. HTTP2-Settings Header Field Registration . . . . . . . . . 51 | |||
| 14.2. Informative References . . . . . . . . . . . . . . . . . . 50 | 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 51 | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . . 51 | ||||
| 14.2. Informative References . . . . . . . . . . . . . . . . . . 53 | ||||
| Appendix A. Change Log (to be removed by RFC Editor before | Appendix A. Change Log (to be removed by RFC Editor before | |||
| publication) . . . . . . . . . . . . . . . . . . . . 50 | publication) . . . . . . . . . . . . . . . . . . . . 53 | |||
| A.1. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 50 | A.1. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 53 | |||
| A.2. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 50 | A.2. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 54 | |||
| A.3. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 50 | A.3. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 54 | |||
| A.4. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 51 | A.4. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 54 | |||
| A.5. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 51 | A.5. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 55 | |||
| A.6. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 55 | ||||
| 1. Introduction | 1. Introduction | |||
| The Hypertext Transfer Protocol (HTTP) is a wildly successful | The Hypertext Transfer Protocol (HTTP) is a wildly successful | |||
| protocol. However, the HTTP/1.1 message format ([HTTP-p1], Section | protocol. However, the HTTP/1.1 message format ([HTTP-p1], Section | |||
| 3) is optimized for implementation simplicity and accessibility, not | 3) is optimized for implementation simplicity and accessibility, not | |||
| application performance. As such it has several characteristics that | application performance. As such it has several characteristics that | |||
| have a negative overall effect on application performance. | have a negative overall effect on application performance. | |||
| In particular, HTTP/1.0 only allows one request to be delivered at a | In particular, HTTP/1.0 only allows one request to be delivered at a | |||
| skipping to change at page 5, line 34 ¶ | skipping to change at page 5, line 34 ¶ | |||
| single new TCP connection. | single new TCP connection. | |||
| This document addresses these issues by defining an optimized mapping | This document addresses these issues by defining an optimized mapping | |||
| of HTTP's semantics to an underlying connection. Specifically, it | of HTTP's semantics to an underlying connection. Specifically, it | |||
| allows interleaving of request and response messages on the same | allows interleaving of request and response messages on the same | |||
| connection and uses an efficient coding for HTTP header fields. It | connection and uses an efficient coding for HTTP header fields. It | |||
| also allows prioritization of requests, letting more important | also allows prioritization of requests, letting more important | |||
| requests complete more quickly, further improving perceived | requests complete more quickly, further improving perceived | |||
| performance. | performance. | |||
| The resulting protocol is designed to have be more friendly to the | The resulting protocol is designed to be more friendly to the | |||
| network, because fewer TCP connections can be used, in comparison to | network, because fewer TCP connections can be used, in comparison to | |||
| HTTP/1.x. This means less competition with other flows, and longer- | HTTP/1.x. This means less competition with other flows, and longer- | |||
| lived connections, which in turn leads to better utilization of | lived connections, which in turn leads to better utilization of | |||
| available network capacity. | available network capacity. | |||
| Finally, this encapsulation also enables more scalable processing of | Finally, this encapsulation also enables more scalable processing of | |||
| messages through use of binary message framing. | messages through use of binary message framing. | |||
| 1.1. Document Organization | 1.1. Document Organization | |||
| skipping to change at page 7, line 32 ¶ | skipping to change at page 7, line 32 ¶ | |||
| HTTP/2.0 provides the ability to multiplex multiple HTTP requests and | HTTP/2.0 provides the ability to multiplex multiple HTTP requests and | |||
| responses onto a single connection. Multiple requests or responses | responses onto a single connection. Multiple requests or responses | |||
| can be sent concurrently on a connection using streams (Section 5). | can be sent concurrently on a connection using streams (Section 5). | |||
| In order to maintain independent streams, flow control and | In order to maintain independent streams, flow control and | |||
| prioritization are necessary. | prioritization are necessary. | |||
| 2.3. HTTP Semantics | 2.3. HTTP Semantics | |||
| HTTP/2.0 defines how HTTP requests and responses are mapped to | HTTP/2.0 defines how HTTP requests and responses are mapped to | |||
| streams (see Section 8) and introduces a new interaction model, | streams (see Section 8.1) and introduces a new interaction model, | |||
| server push (Section 8.2). | server push (Section 8.2). | |||
| 3. Starting HTTP/2.0 | 3. Starting HTTP/2.0 | |||
| HTTP/2.0 uses the same "http" and "https" URI schemes used by | HTTP/2.0 uses the same "http" and "https" URI schemes used by | |||
| HTTP/1.1. HTTP/2.0 shares the same default port numbers: 80 for | HTTP/1.1. HTTP/2.0 shares the same default port numbers: 80 for | |||
| "http" URIs and 443 for "https" URIs. As a result, implementations | "http" URIs and 443 for "https" URIs. As a result, implementations | |||
| processing requests for target resource URIs like | processing requests for target resource URIs like | |||
| "http://example.org/foo" or "https://example.com/bar" are required to | "http://example.org/foo" or "https://example.com/bar" are required to | |||
| first discover whether the upstream server (the immediate peer to | first discover whether the upstream server (the immediate peer to | |||
| skipping to change at page 8, line 16 ¶ | skipping to change at page 8, line 16 ¶ | |||
| The protocol defined in this document is identified using the string | The protocol defined in this document is identified using the string | |||
| "HTTP/2.0". This identification is used in the HTTP/1.1 Upgrade | "HTTP/2.0". This identification is used in the HTTP/1.1 Upgrade | |||
| header field, in the TLS application layer protocol negotiation | header field, in the TLS application layer protocol negotiation | |||
| extension [TLSALPN] field, and other places where protocol | extension [TLSALPN] field, and other places where protocol | |||
| identification is required. | identification is required. | |||
| Negotiating "HTTP/2.0" implies the use of the transport, security, | Negotiating "HTTP/2.0" implies the use of the transport, security, | |||
| framing and message semantics described in this document. | framing and message semantics described in this document. | |||
| [[anchor6: Editor's Note: please remove the following text prior to | [[anchor6: Editor's Note: please remove the remainder of this section | |||
| the publication of a final version of this document.]] | prior to 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. The exception to this | |||
| rule is the string included in the connection header sent by clients | ||||
| immediately after establishing an HTTP/2.0 connection (see | ||||
| Section 3.5); this fixed length sequence of octets does not change. | ||||
| 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 | |||
| skipping to change at page 8, line 47 ¶ | skipping to change at page 8, line 50 ¶ | |||
| "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. | |||
| 3.2. Starting HTTP/2.0 for "http" URIs | 3.2. Starting HTTP/2.0 for "http" URIs | |||
| A client that makes a request to an "http" URI without prior | A client that makes a request to an "http" URI without prior | |||
| knowledge about support for HTTP/2.0 uses the HTTP Upgrade mechanism | knowledge about support for HTTP/2.0 uses the HTTP Upgrade mechanism | |||
| (Section 6.7 of [HTTP-p1]). The client makes an HTTP/1.1 request | (Section 6.7 of [HTTP-p1]). The client makes an HTTP/1.1 request | |||
| that includes an Upgrade header field identifying HTTP/2.0. The | that includes an Upgrade header field identifying HTTP/2.0. The | |||
| HTTP/1.1 request MUST include an HTTP2-Settings (Section 3.2.1) | HTTP/1.1 request MUST include exactly one HTTP2-Settings | |||
| header field. | (Section 3.2.1) header field. | |||
| For example: | For example: | |||
| GET /default.htm HTTP/1.1 | GET /default.htm HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Connection: Upgrade, HTTP2-Settings | Connection: Upgrade, HTTP2-Settings | |||
| Upgrade: HTTP/2.0 | Upgrade: HTTP/2.0 | |||
| HTTP2-Settings: <base64url encoding of HTTP/2.0 SETTINGS payload> | HTTP2-Settings: <base64url encoding of HTTP/2.0 SETTINGS payload> | |||
| Requests that contain a request entity body MUST be sent in their | Requests that contain a request entity body MUST be sent in their | |||
| skipping to change at page 10, line 7 ¶ | skipping to change at page 10, line 7 ¶ | |||
| connection header (Section 3.5), which includes a SETTINGS frame. | connection header (Section 3.5), which includes a SETTINGS frame. | |||
| The HTTP/1.1 request that is sent prior to upgrade is associated with | The HTTP/1.1 request that is sent prior to upgrade is associated with | |||
| stream 1 and is assigned the highest possible priority. Stream 1 is | stream 1 and is assigned the highest possible priority. Stream 1 is | |||
| implicitly half closed from the client toward the server, since the | implicitly half closed from the client toward the server, since the | |||
| request is completed as an HTTP/1.1 request. After commencing the | request is completed as an HTTP/1.1 request. After commencing the | |||
| HTTP/2.0 connection, stream 1 is used for the response. | HTTP/2.0 connection, stream 1 is used for the response. | |||
| 3.2.1. HTTP2-Settings Header Field | 3.2.1. HTTP2-Settings Header Field | |||
| A client that upgrades from HTTP/1.1 to HTTP/2.0 MUST include an | A client that upgrades from HTTP/1.1 to HTTP/2.0 MUST include exactly | |||
| "HTTP2-Settings" header field. The "HTTP2-Settings" header field is | one "HTTP2-Settings" header field. The "HTTP2-Settings" header field | |||
| a hop-by-hop header field that includes settings that govern the | is a hop-by-hop header field that includes settings that govern the | |||
| HTTP/2.0 connection, provided in anticipation of the server accepting | HTTP/2.0 connection, provided in anticipation of the server accepting | |||
| the request to upgrade. A server MUST reject an attempt to upgrade | the request to upgrade. A server MUST reject an attempt to upgrade | |||
| if this header is not present. | if this header is not present. | |||
| HTTP2-Settings = token68 | HTTP2-Settings = token68 | |||
| The content of the "HTTP2-Settings" header field is the payload of a | The content of the "HTTP2-Settings" header field is the payload of a | |||
| SETTINGS frame (Section 6.5), encoded as a base64url string (that is, | SETTINGS frame (Section 6.5), encoded as a base64url string (that is, | |||
| the URL- and filename-safe Base64 encoding described in Section 5 of | the URL- and filename-safe Base64 encoding described in Section 5 of | |||
| [RFC4648], with any trailing '=' characters omitted). The ABNF | [RFC4648], with any trailing '=' characters omitted). The ABNF | |||
| skipping to change at page 10, line 43 ¶ | skipping to change at page 10, line 43 ¶ | |||
| A server decodes and interprets these values as it would any other | A server decodes and interprets these values as it would any other | |||
| SETTINGS frame. Providing these values in the Upgrade request | SETTINGS frame. Providing these values in the Upgrade request | |||
| ensures that the protocol does not require default values for the | ensures that the protocol does not require default values for the | |||
| above settings, and gives a client an opportunity to provide other | above settings, and gives a client an opportunity to provide other | |||
| settings prior to receiving any frames from the server. | settings prior to receiving any frames from the server. | |||
| 3.3. Starting HTTP/2.0 for "https" URIs | 3.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 the | knowledge about support for HTTP/2.0 uses TLS [TLS12] with the | |||
| application layer protocol negotiation extension [TLSALPN]. | application layer protocol negotiation extension [TLSALPN]. | |||
| Once TLS negotiation is complete, both the client and the server send | Once TLS negotiation is complete, both the client and the server send | |||
| a connection header (Section 3.5). | a connection header (Section 3.5). | |||
| 3.4. Starting HTTP/2.0 with Prior Knowledge | 3.4. Starting HTTP/2.0 with Prior Knowledge | |||
| A client can learn that a particular server supports HTTP/2.0 by | A client can learn that a particular server supports HTTP/2.0 by | |||
| other means. A client MAY immediately send HTTP/2.0 frames to a | other means. A client MAY immediately send HTTP/2.0 frames to a | |||
| server that is known to support HTTP/2.0, after the connection header | server that is known to support HTTP/2.0, after the connection header | |||
| skipping to change at page 11, line 30 ¶ | skipping to change at page 11, line 30 ¶ | |||
| initial settings for the HTTP/2.0 connection. | initial settings for the HTTP/2.0 connection. | |||
| The client connection header is a sequence of 24 octets, which in hex | The client connection header is a sequence of 24 octets, which in hex | |||
| notation are: | notation are: | |||
| 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | |||
| (the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n") followed by a | (the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n") followed by a | |||
| SETTINGS frame (Section 6.5). The client sends the client connection | SETTINGS frame (Section 6.5). The client sends the client connection | |||
| header immediately upon receipt of a 101 Switching Protocols response | header immediately upon receipt of a 101 Switching Protocols response | |||
| (indicating a successful upgrade), or after receiving a TLS Finished | (indicating a successful upgrade), or as the first application data | |||
| message from the server. If starting an HTTP/2.0 connection with | octets of a TLS connection. If starting an HTTP/2.0 connection with | |||
| prior knowledge of server support for the protocol, the client | prior knowledge of server support for the protocol, the client | |||
| connection header is sent upon connection establishment. | connection header is sent upon connection establishment. | |||
| The client connection header is selected so that a large | The client connection header is selected so that a large | |||
| proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do | proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do | |||
| not attempt to process further frames. Note that this does not | not attempt to process further frames. Note that this does not | |||
| address the concerns raised in [TALKING]. | address the concerns raised in [TALKING]. | |||
| The server connection header consists of just a SETTINGS frame | The server connection header consists of just a SETTINGS frame | |||
| (Section 6.5) that MUST be the first frame the server sends in the | (Section 6.5) that MUST be the first frame the server sends in the | |||
| skipping to change at page 12, line 15 ¶ | skipping to change at page 12, line 15 ¶ | |||
| Clients and servers MUST terminate the TCP connection if either peer | Clients and servers MUST terminate the TCP connection if either peer | |||
| does not begin with a valid connection header. A GOAWAY frame | does not begin with a valid connection header. A GOAWAY frame | |||
| (Section 6.8) MAY be omitted if it is clear that the peer is not | (Section 6.8) MAY be omitted if it is clear that the peer is not | |||
| using HTTP/2.0. | using HTTP/2.0. | |||
| 4. HTTP Frames | 4. HTTP Frames | |||
| Once the HTTP/2.0 connection is established, endpoints can begin | Once the HTTP/2.0 connection is established, endpoints can begin | |||
| exchanging frames. | exchanging frames. | |||
| 4.1. Frame Header | 4.1. Frame Format | |||
| All frames begin with an 8-octet header followed by a payload of | All frames begin with an 8-octet header followed by a payload of | |||
| between 0 and 65,535 octets. | between 0 and 65,535 octets. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (16) | Type (8) | Flags (8) | | | Length (16) | Type (8) | Flags (8) | | |||
| +-+-------------+---------------+-------------------------------+ | +-+-------------+---------------+-------------------------------+ | |||
| |R| Stream Identifier (31) | | |R| Stream Identifier (31) | | |||
| skipping to change at page 12, line 40 ¶ | skipping to change at page 12, line 40 ¶ | |||
| Frame Header | Frame Header | |||
| The fields of the frame header are defined as: | The fields of the frame header are defined as: | |||
| Length: The length of the frame payload expressed as an unsigned 16- | Length: The length of the frame payload expressed as an unsigned 16- | |||
| bit integer. The 8 octets of the frame header are not included in | bit integer. The 8 octets of the frame header are not included in | |||
| this value. | this value. | |||
| Type: The 8-bit type of the frame. The frame type determines how | Type: The 8-bit type of the frame. The frame type determines how | |||
| the remainder of the frame header and payload are interpreted. | the remainder of the frame header and payload are interpreted. | |||
| Implementations MUST ignore unsupported and unrecognized frame | Implementations MUST ignore frames of unsupported or unrecognized | |||
| types. | types. | |||
| Flags: An 8-bit field reserved for frame-type specific boolean | Flags: An 8-bit field reserved for frame-type specific boolean | |||
| flags. | flags. | |||
| Flags are assigned semantics specific to the indicated frame type. | Flags are assigned semantics specific to the indicated frame type. | |||
| Flags that have no defined semantics for a particular frame type | Flags that have no defined semantics for a particular frame type | |||
| MUST be ignored, and MUST be left unset (0) when sending. | MUST be ignored, and MUST be left unset (0) when sending. | |||
| R: A reserved 1-bit field. The semantics of this bit are undefined | R: A reserved 1-bit field. The semantics of this bit are undefined | |||
| skipping to change at page 13, line 45 ¶ | skipping to change at page 13, line 45 ¶ | |||
| A header in HTTP/2.0 is a name-value pair with one or more associated | A header in HTTP/2.0 is a name-value pair with one or more associated | |||
| values. They are used within HTTP request and response messages as | values. They are used within HTTP request and response messages as | |||
| well as server push operations (see Section 8.2). | well as server push operations (see Section 8.2). | |||
| Header sets are logical collections of zero or more header fields | Header sets are logical collections of zero or more header fields | |||
| arranged at the application layer. When transmitted over a | arranged at the application layer. When transmitted over a | |||
| connection, the header set is serialized into a header block using | connection, the header set is serialized into a header block using | |||
| HTTP Header Compression [COMPRESSION]. The serialized header block | HTTP Header Compression [COMPRESSION]. The serialized header block | |||
| is then divided into one or more octet sequences, called header block | is then divided into one or more octet sequences, called header block | |||
| fragments, and transmitted within the payload of HEADERS | fragments, and transmitted within the payload of HEADERS | |||
| (Section 6.2) or PUSH_PROMISE (Section 6.6) frames. The receiving | (Section 6.2), PUSH_PROMISE (Section 6.6) or CONTINUATION | |||
| endpoint reassembles the header block by concatenating the individual | (Section 6.10) frames. The receiving endpoint reassembles the header | |||
| fragments, then decompresses the block to reconstruct the header set. | block by concatenating the individual fragments, then decompresses | |||
| the block to reconstruct the header set. | ||||
| Header block fragments can only be sent as the payload of HEADERS or | Header block fragments can only be sent as the payload of HEADERS, | |||
| PUSH_PROMISE frames. | PUSH_PROMISE or CONTINUATION frames. | |||
| A compressed and encoded header block is transmitted in one or more | A compressed and encoded header block is transmitted in a HEADERS or | |||
| HEADERS or PUSH_PROMISE frames. If the number of octets in the block | PUSH_PROMISE frame, followed by zero or more CONTINUATION frames. If | |||
| is greater than the space remaining in the frame, the block is | the number of octets in the block is greater than the space remaining | |||
| divided into multiple fragments, which are then transmitted in | in the frame, the block is divided into multiple fragments, which are | |||
| multiple frames. | then transmitted in multiple frames. | |||
| Header blocks MUST be transmitted as a contiguous sequence of frames, | Header blocks MUST be transmitted as a contiguous sequence of frames, | |||
| with no interleaved frames of any other type, or from any other | with no interleaved frames of any other type, or from any other | |||
| stream. The last frame in a sequence of HEADERS frames MUST have the | stream. The last frame in a sequence of HEADERS/CONTINUATION frames | |||
| END_HEADERS flag set. The last frame in a sequence of PUSH_PROMISE | MUST have the END_HEADERS flag set. The last frame in a sequence of | |||
| frames MUST have the END_PUSH_PROMISE flag set. | PUSH_PROMISE/CONTINUATION frames MUST have the END_PUSH_PROMISE/ | |||
| END_HEADERS flag set (respectively). | ||||
| HEADERS and PUSH_PROMISE frames carry data that can modify the | HEADERS, PUSH_PROMISE and CONTINUATION frames carry data that can | |||
| compression context maintained by a receiver. An endpoint receiving | modify the compression context maintained by a receiver. An endpoint | |||
| HEADERS or PUSH_PROMISE frames MUST reassemble header blocks and | receiving HEADERS, PUSH_PROMISE or CONTINUATION frames MUST | |||
| perform decompression even if the frames are to be discarded, which | reassemble header blocks and perform decompression even if the frames | |||
| is likely to occur after a stream is reset. A receiver MUST | are to be discarded, which is likely to occur after a stream is | |||
| terminate the connection with a connection error (Section 5.4.1) of | reset. A receiver MUST terminate the connection with a connection | |||
| type COMPRESSION_ERROR, if it does not decompress a header block. | error (Section 5.4.1) of type COMPRESSION_ERROR, if it does not | |||
| decompress a header block. | ||||
| 5. Streams and Multiplexing | 5. Streams and Multiplexing | |||
| A "stream" is an independent, bi-directional sequence of HEADER and | A "stream" is an independent, bi-directional sequence of HEADERS and | |||
| DATA frames exchanged between the client and server within an | DATA frames exchanged between the client and server within an | |||
| HTTP/2.0 connection. Streams have several important characteristics: | HTTP/2.0 connection. Streams have several important characteristics: | |||
| o A single HTTP/2.0 connection can contain multiple concurrently | o A single HTTP/2.0 connection can contain multiple concurrently | |||
| active streams, with either endpoint interleaving frames from | active streams, with either endpoint interleaving frames from | |||
| multiple streams. | multiple streams. | |||
| o Streams can be established and used unilaterally or shared by | o Streams can be established and used unilaterally or shared by | |||
| either the client or server. | either the client or server. | |||
| skipping to change at page 16, line 25 ¶ | skipping to change at page 16, line 25 ¶ | |||
| promised by sending a PUSH_PROMISE frame. A PUSH_PROMISE frame | promised by sending a PUSH_PROMISE frame. A PUSH_PROMISE frame | |||
| reserves an idle stream by associating the stream with an open | reserves an idle stream by associating the stream with an open | |||
| stream that was initiated by the remote peer (see Section 8.2). | stream that was initiated by the remote peer (see Section 8.2). | |||
| In this state, only the following transitions are possible: | In this state, only the following transitions are possible: | |||
| * The endpoint can send a HEADERS frame. This causes the stream | * The endpoint can send a HEADERS frame. This causes the stream | |||
| to open in a "half closed (remote)" state. | to open in a "half closed (remote)" state. | |||
| * Either endpoint can send a RST_STREAM frame to cause the stream | * Either endpoint can send a RST_STREAM frame to cause the stream | |||
| to become "closed". This releases the stream reservation. | to become "closed". This also releases the stream reservation. | |||
| An endpoint MUST NOT send any other type of frame in this state. | An endpoint MUST NOT send any other type of frame in this state. | |||
| Receiving any frame other than RST_STREAM or PRIORITY MUST be | ||||
| treated as a connection error (Section 5.4.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| reserved (remote): | reserved (remote): | |||
| A stream in the "reserved (remote)" state has been reserved by a | A stream in the "reserved (remote)" state has been reserved by a | |||
| remote peer. | remote peer. | |||
| In this state, only the following transitions are possible: | In this state, only the following transitions are possible: | |||
| * Receiving a HEADERS frame causes the stream to transition to | * Receiving a HEADERS frame causes the stream to transition to | |||
| "half closed (local)". | "half closed (local)". | |||
| * Either endpoint can send a RST_STREAM frame to cause the stream | * Either endpoint can send a RST_STREAM frame to cause the stream | |||
| to become "closed". This releases the stream reservation. | to become "closed". This also releases the stream reservation. | |||
| Receiving any other type of frame MUST be treated as a stream | Receiving any other type of frame MUST be treated as a stream | |||
| error (Section 5.4.2) of type PROTOCOL_ERROR. | error (Section 5.4.2) of type PROTOCOL_ERROR. An endpoint MAY | |||
| send RST_STREAM or PRIORITY frames in this state to cancel or | ||||
| reprioritize the reserved stream. | ||||
| open: | open: | |||
| The "open" state is where both peers can send frames. In this | The "open" state is where both peers can send frames of any type. | |||
| state, sending peers observe advertised stream level flow control | In this state, sending peers observe advertised stream level flow | |||
| limits (Section 5.2). | control limits (Section 5.2). | |||
| From this state either endpoint can send a frame with a END_STREAM | From this state either endpoint can send a frame with a END_STREAM | |||
| flag set, which causes the stream to transition into one of the | flag set, which causes the stream to transition into one of the | |||
| "half closed" states: an endpoint sending a END_STREAM flag causes | "half closed" states: an endpoint sending a END_STREAM flag causes | |||
| the stream state to become "half closed (local)"; an endpoint | the stream state to become "half closed (local)"; an endpoint | |||
| receiving a END_STREAM flag causes the stream state to become | receiving a END_STREAM flag causes the stream state to become | |||
| "half closed (remote)". | "half closed (remote)". | |||
| Either endpoint can send a RST_STREAM frame from this state, | Either endpoint can send a RST_STREAM frame from this state, | |||
| causing it to transition immediately to "closed". | causing it to transition immediately to "closed". | |||
| half closed (local): | half closed (local): | |||
| A stream that is "half closed (local)" cannot be used for sending | A stream that is "half closed (local)" cannot be used for sending | |||
| frames. | frames. | |||
| A stream transitions from this state to "closed" when a frame that | A stream transitions from this state to "closed" when a frame that | |||
| contains a END_STREAM flag is received, or when either peer sends | contains a END_STREAM flag is received, or when either peer sends | |||
| a RST_STREAM frame. | a RST_STREAM frame. | |||
| A receiver can ignore WINDOW_UPDATE or PRIORITY frames in this | ||||
| state. These frame types might arrive for a short period after a | ||||
| frame bearing the END_STREAM flag is sent. | ||||
| half closed (remote): | half closed (remote): | |||
| A stream that is "half closed (remote)" is no longer being used by | A stream that is "half closed (remote)" is no longer being used by | |||
| the peer to send frames. In this state, an endpoint is no longer | the peer to send frames. In this state, an endpoint is no longer | |||
| obligated to maintain a receiver flow control window if it | obligated to maintain a receiver flow control window if it | |||
| performs flow control. | performs flow control. | |||
| If an endpoint receives additional frames for a stream that is in | If an endpoint receives additional frames for a stream that is in | |||
| this state it MUST respond with a stream error (Section 5.4.2) of | this state it MUST respond with a stream error (Section 5.4.2) of | |||
| type STREAM_CLOSED. | type STREAM_CLOSED. | |||
| skipping to change at page 17, line 40 ¶ | skipping to change at page 17, line 49 ¶ | |||
| RST_STREAM frame. | RST_STREAM frame. | |||
| closed: | closed: | |||
| The "closed" state is the terminal state. | The "closed" state is the terminal state. | |||
| An endpoint MUST NOT send frames on a closed stream. An endpoint | An endpoint MUST NOT send frames on a closed stream. An endpoint | |||
| that receives a frame after receiving a RST_STREAM or a frame | that receives a frame after receiving a RST_STREAM or a frame | |||
| containing a END_STREAM flag on that stream MUST treat that as a | containing a END_STREAM flag on that stream MUST treat that as a | |||
| stream error (Section 5.4.2) of type STREAM_CLOSED. | stream error (Section 5.4.2) of type STREAM_CLOSED. | |||
| WINDOW_UPDATE or PRIORITY frames can be received in this state for | ||||
| a short period after a a frame containing an END_STREAM flag is | ||||
| sent. Until the remote peer receives and processes the frame | ||||
| bearing the END_STREAM flag, it might send either frame type. | ||||
| Endpoints MUST ignore WINDOW_UPDATE frames received in this state, | ||||
| though endpoints MAY choose to treat WINDOW_UPDATE frames that | ||||
| arrive a significant time after sending END_STREAM as a connection | ||||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| If this state is reached as a result of sending a RST_STREAM | If this state is reached as a result of sending a RST_STREAM | |||
| frame, the peer that receives the RST_STREAM might have already | frame, the peer that receives the RST_STREAM might have already | |||
| sent - or enqueued for sending - frames on the stream that cannot | sent - or enqueued for sending - frames on the stream that cannot | |||
| be withdrawn. An endpoint that sends a RST_STREAM frame MUST | be withdrawn. An endpoint MUST ignore frames that it receives on | |||
| ignore frames that it receives on closed streams after it has sent | closed streams after it has sent a RST_STREAM frame. An endpoint | |||
| a RST_STREAM frame. An endpoint MAY choose to limit the period | MAY choose to limit the period over which it ignores frames and | |||
| over which it ignores frames and treat frames that arrive after | treat frames that arrive after this time as being in error. | |||
| this time as being in error. | ||||
| An endpoint might receive a PUSH_PROMISE frame after it sends | Flow controlled frames (i.e., DATA) received after sending | |||
| RST_STREAM. PUSH_PROMISE causes a stream to become "reserved". | RST_STREAM are counted toward the connection flow control window. | |||
| If promised streams are not desired, a RST_STREAM can be used to | Even though these frames might be ignored, because they are sent | |||
| close any of those streams. | before the sender receives the RST_STREAM, the sender will | |||
| consider the frames to count against the flow control window. | ||||
| An endpoint might receive a PUSH_PROMISE or a CONTINUATION frame | ||||
| after it sends RST_STREAM. PUSH_PROMISE causes a stream to become | ||||
| "reserved". If promised streams are not desired, a RST_STREAM can | ||||
| be used to close any of those streams. | ||||
| In the absence of more specific guidance elsewhere in this document, | ||||
| implementations SHOULD treat the receipt of a message that is not | ||||
| expressly permitted in the description of a state as a connection | ||||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 5.1.1. Stream Identifiers | 5.1.1. Stream Identifiers | |||
| Streams are identified with an unsigned 31-bit integer. Streams | Streams are identified with an unsigned 31-bit integer. Streams | |||
| initiated by a client MUST use odd-numbered stream identifiers; those | initiated by a client MUST use odd-numbered stream identifiers; those | |||
| initiated by the server MUST use even-numbered stream identifiers. A | initiated by the server MUST use even-numbered stream identifiers. A | |||
| stream identifier of zero (0x0) is used for connection control | stream identifier of zero (0x0) is used for connection control | |||
| message; the stream identifier zero MUST NOT be used to establish a | message; the stream identifier zero MUST NOT be used to establish a | |||
| new stream. | new stream. A stream identifier of one (0x1) is used to respond to | |||
| the HTTP/1.1 request which was specified during Upgrade (see | ||||
| Section 3.2); the stream identifier one MUST NOT be used to establish | ||||
| a new stream. | ||||
| The identifier of a newly established stream MUST be numerically | The identifier of a newly established stream MUST be numerically | |||
| greater than all streams that the initiating endpoint has opened or | greater than all streams that the initiating endpoint has opened or | |||
| reserved. This governs streams that are opened using a HEADERS frame | reserved. This governs streams that are opened using a HEADERS frame | |||
| and streams that are reserved using PUSH_PROMISE. An endpoint that | and streams that are reserved using PUSH_PROMISE. An endpoint that | |||
| receives an unexpected stream identifier MUST respond with a | receives an unexpected stream identifier MUST respond with a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The first use of a new stream identifier implicitly closes all idle | ||||
| streams that might have been initiated by that peer with a lower- | ||||
| valued stream identifier. | ||||
| Stream identifiers cannot be reused. Long-lived connections can | Stream identifiers cannot be reused. Long-lived connections can | |||
| result in endpoint exhausting the available range of stream | result in endpoint exhausting the available range of stream | |||
| identifiers. A client that is unable to establish a new stream | identifiers. A client that is unable to establish a new stream | |||
| identifier can establish a new connection for new streams. | identifier can establish a new connection for new streams. | |||
| 5.1.2. Stream Concurrency | 5.1.2. Stream Concurrency | |||
| A peer can limit the number of concurrently active streams using the | A peer can limit the number of concurrently active streams using the | |||
| SETTINGS_MAX_CONCURRENT_STREAMS parameters within a SETTINGS frame. | SETTINGS_MAX_CONCURRENT_STREAMS parameters within a SETTINGS frame. | |||
| The maximum concurrent streams setting is specific to each endpoint | The maximum concurrent streams setting is specific to each endpoint | |||
| skipping to change at page 19, line 9 ¶ | skipping to change at page 19, line 44 ¶ | |||
| 5.2. Flow Control | 5.2. Flow Control | |||
| Using streams for multiplexing introduces contention over use of the | Using streams for multiplexing introduces contention over use of the | |||
| TCP connection, resulting in blocked streams. A flow control scheme | TCP connection, resulting in blocked streams. A flow control scheme | |||
| ensures that streams on the same connection do not destructively | ensures that streams on the same connection do not destructively | |||
| interfere with each other. Flow control is used for both individual | interfere with each other. Flow control is used for both individual | |||
| streams and for the connection as a whole. | streams and for the connection as a whole. | |||
| HTTP/2.0 provides for flow control through use of the WINDOW_UPDATE | HTTP/2.0 provides for flow control through use of the WINDOW_UPDATE | |||
| (Section 6.9) frame type. | frame type. | |||
| 5.2.1. Flow Control Principles | 5.2.1. Flow Control Principles | |||
| Experience with TCP congestion control has shown that algorithms can | Experience with TCP congestion control has shown that algorithms can | |||
| evolve over time to become more sophisticated without requiring | evolve over time to become more sophisticated without requiring | |||
| protocol changes. TCP congestion control and its evolution is | protocol changes. TCP congestion control and its evolution is | |||
| clearly different from HTTP/2.0 flow control, though the evolution of | clearly different from HTTP/2.0 flow control, though the evolution of | |||
| TCP congestion control algorithms shows that a similar approach could | TCP congestion control algorithms shows that a similar approach could | |||
| be feasible for HTTP/2.0 flow control. | be feasible for HTTP/2.0 flow control. | |||
| skipping to change at page 19, line 38 ¶ | skipping to change at page 20, line 24 ¶ | |||
| and for the entire connection. This is a credit-based scheme. | and for the entire connection. This is a credit-based scheme. | |||
| 3. Flow control is directional with overall control provided by the | 3. Flow control is directional with overall control provided by the | |||
| receiver. A receiver MAY choose to set any window size that it | receiver. A receiver MAY choose to set any window size that it | |||
| desires for each stream and for the entire connection. A sender | desires for each stream and for the entire connection. A sender | |||
| MUST respect flow control limits imposed by a receiver. Clients, | MUST respect flow control limits imposed by a receiver. Clients, | |||
| servers and intermediaries all independently advertise their flow | servers and intermediaries all independently advertise their flow | |||
| control preferences as a receiver and abide by the flow control | control preferences as a receiver and abide by the flow control | |||
| limits set by their peer when sending. | limits set by their peer when sending. | |||
| 4. The initial value for the flow control window is 65536 bytes for | 4. The initial value for the flow control window is 65535 bytes for | |||
| both new streams and the overall connection. | both new streams and the overall connection. | |||
| 5. The frame type determines whether flow control applies to a | 5. The frame type determines whether flow control applies to a | |||
| frame. Of the frames specified in this document, only DATA | frame. Of the frames specified in this document, only DATA | |||
| frames are subject to flow control; all other frame types do not | frames are subject to flow control; all other frame types do not | |||
| consume space in the advertised flow control window. This | consume space in the advertised flow control window. This | |||
| ensures that important control frames are not blocked by flow | ensures that important control frames are not blocked by flow | |||
| control. | control. | |||
| 6. Flow control can be disabled by a receiver. A receiver can | 6. Flow control can be disabled by a receiver. A receiver can | |||
| choose to either disable flow control for a stream or connection | choose to disable both forms of flow control by sending the | |||
| by sending a window update frame with a specific flag. See | SETTINGS_FLOW_CONTROL_OPTIONS setting. See Ending Flow Control | |||
| Ending Flow Control (Section 6.9.4) for more details. | (Section 6.9.4) for more details. | |||
| 7. HTTP/2.0 standardizes only the format of the WINDOW_UPDATE frame | 7. HTTP/2.0 standardizes only the format of the WINDOW_UPDATE frame | |||
| (Section 6.9). This does not stipulate how a receiver decides | (Section 6.9). This does not stipulate how a receiver decides | |||
| when to send this frame or the value that it sends. Nor does it | when to send this frame or the value that it sends. Nor does it | |||
| specify how a sender chooses to send packets. Implementations | specify how a sender chooses to send packets. Implementations | |||
| are able to select any algorithm that suits their needs. | are able to select any algorithm that suits their needs. | |||
| Implementations are also responsible for managing how requests and | Implementations are also responsible for managing how requests and | |||
| responses are sent based on priority; choosing how to avoid head of | responses are sent based on priority; choosing how to avoid head of | |||
| line blocking for requests; and managing the creation of new streams. | line blocking for requests; and managing the creation of new streams. | |||
| skipping to change at page 20, line 38 ¶ | skipping to change at page 21, line 26 ¶ | |||
| cannot be disabled for sending. Sending data is always subject to | cannot be disabled for sending. Sending data is always subject to | |||
| the flow control window advertised by the receiver. | the flow control window advertised by the receiver. | |||
| Deployments with constrained resources (for example, memory) MAY | Deployments with constrained resources (for example, memory) MAY | |||
| employ flow control to limit the amount of memory a peer can consume. | employ flow control to limit the amount of memory a peer can consume. | |||
| Note, however, that this can lead to suboptimal use of available | Note, however, that this can lead to suboptimal use of available | |||
| network resources if flow control is enabled without knowledge of the | network resources if flow control is enabled without knowledge of the | |||
| bandwidth-delay product (see [RFC1323]). | bandwidth-delay product (see [RFC1323]). | |||
| Even with full awareness of the current bandwidth-delay product, | Even with full awareness of the current bandwidth-delay product, | |||
| implementation of flow control is difficult. However, it can ensure | implementation of flow control can be difficult. When using flow | |||
| that constrained resources are protected without any reduction in | control, the receive MUST read from the TCP receive buffer in a | |||
| connection utilization. | timely fashion. Failure to do so could lead to a deadlock when | |||
| critical frames, such as WINDOW_UPDATE, are not available to | ||||
| HTTP/2.0. However, flow control can ensure that constrained | ||||
| resources are protected without any reduction in connection | ||||
| utilization. | ||||
| 5.3. Stream priority | 5.3. Stream priority | |||
| The endpoint establishing a new stream can assign a priority for the | The endpoint establishing a new stream can assign a priority for the | |||
| stream. Priority is represented as an unsigned 31-bit integer. 0 | stream. Priority is represented as an unsigned 31-bit integer. 0 | |||
| represents the highest priority and 2^31-1 represents the lowest | represents the highest priority and 2^31-1 represents the lowest | |||
| priority. | priority. | |||
| The purpose of this value is to allow the initiating endpoint to | The purpose of this value is to allow an endpoint to express the | |||
| request that frames for the stream be processed with a specified | relative priority of a stream. An endpoint can use this information | |||
| priority relative to other concurrently active streams. That is, if | to preferentially allocate resources to a stream. Within HTTP/2.0, | |||
| an endpoint receives interleaved frames for multiple streams, the | priority can be used to select streams for transmitting frames when | |||
| endpoint ought to make a best-effort attempt at processing frames for | there is limited capacity for sending. For instance, an endpoint | |||
| higher priority streams before processing those for lower priority | might enqueue frames for all concurrently active streams. As | |||
| streams. | transmission capacity becomes available, frames from higher priority | |||
| streams might be sent before lower priority streams. | ||||
| Explicitly setting the priority for a stream does not guarantee any | Explicitly setting the priority for a stream does not guarantee any | |||
| particular processing order for the stream relative to any other | particular processing or transmision order for the stream relative to | |||
| stream. Nor is there any mechanism provided by which the initiator | any other stream. Nor is there any mechanism provided by which the | |||
| of a stream can force or require a receiving endpoint to process | initiator of a stream can force or require a receiving endpoint to | |||
| frames from one stream before processing frames from another. | process concurrent streams in a particular order. | |||
| Unless explicitly specified in the HEADERS frame (Section 6.2) during | Unless explicitly specified in the HEADERS frame (Section 6.2) during | |||
| stream creation, the default stream priority is 2^30. Pushed streams | stream creation, the default stream priority is 2^30. | |||
| (Section 8.2) are assumed to inherit the priority of the associated | ||||
| stream plus one (or 2^31-1 if the the associated stream priority is | Pushed streams (Section 8.2) have a lower priority than their | |||
| 2^31-1), i.e. they have priority one lower than the associated | associated stream. The promised stream inherits the priority value | |||
| stream. | of the associated stream plus one, up to a maximum of 2^31-1. | |||
| 5.4. Error Handling | 5.4. 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 connection unusable is | o An error condition that renders the entire connection unusable is | |||
| a connection error. | a connection error. | |||
| o An error in an individual stream is a stream error. | o An error in an individual stream is a stream error. | |||
| A list of error codes is included in Section 7. | A list of error codes is included in Section 7. | |||
| 5.4.1. Connection Error Handling | 5.4.1. Connection Error Handling | |||
| A connection error is any error which prevents further processing of | A connection error is any error which prevents further processing of | |||
| the framing layer or which corrupts any connection state. | the framing layer or which corrupts any connection state. | |||
| An endpoint that encounters a connection error SHOULD first send a | An endpoint that encounters a connection error SHOULD first send a | |||
| GOAWAY (Section 6.8) frame with the stream identifier of the last | GOAWAY frame (Section 6.8) with the stream identifier of the last | |||
| stream 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 connection is | includes an error code that indicates why the connection is | |||
| terminating. After sending the GOAWAY frame, the endpoint MUST close | terminating. After sending the GOAWAY frame, the endpoint MUST close | |||
| the TCP 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 connection 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 connection is being terminated. | the connection is being terminated. | |||
| An endpoint can end a connection 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 connection error if | endpoint MAY choose to treat a stream error as a connection error. | |||
| the error is recurrent. Endpoints SHOULD send a GOAWAY frame when | Endpoints SHOULD send a GOAWAY frame when ending a connection, as | |||
| ending a connection, as long as circumstances permit it. | long as circumstances permit it. | |||
| 5.4.2. Stream Error Handling | 5.4.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. | that does not affect processing of other streams. | |||
| An endpoint that detects a stream error sends a RST_STREAM | An endpoint that detects a stream error sends a RST_STREAM frame | |||
| (Section 6.4) frame that contains the stream identifier of the stream | (Section 6.4) that contains the stream identifier of the stream where | |||
| where the error occurred. The RST_STREAM frame includes an error | the error occurred. The RST_STREAM frame includes an error code that | |||
| code that indicates the type of error. | 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 connection | These frames can be ignored, except where they modify connection | |||
| state (such as the state maintained for header compression | state (such as the state maintained for header compression | |||
| (Section 4.3)). | (Section 4.3)). | |||
| Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame | Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame | |||
| for any stream. However, an endpoint MAY send additional RST_STREAM | for any stream. However, an endpoint MAY send additional RST_STREAM | |||
| skipping to change at page 23, line 16 ¶ | skipping to change at page 24, line 9 ¶ | |||
| 6.1. DATA | 6.1. DATA | |||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
| octets associated with a stream. One or more DATA frames are used, | octets associated with a stream. One or more DATA frames are used, | |||
| for instance, to carry HTTP request or response payloads. | for instance, to carry HTTP request or response payloads. | |||
| The DATA frame defines the following flags: | The DATA frame defines the following flags: | |||
| END_STREAM (0x1): Bit 1 being set indicates that this frame is the | END_STREAM (0x1): Bit 1 being set indicates that this frame is the | |||
| last that the endpoint will send for the identified stream. | last that the endpoint will send for the identified stream. | |||
| Setting this flag causes the stream to enter a "half closed" state | Setting this flag causes the stream to enter a "half closed" or | |||
| (Section 5.1). | "closed" state (Section 5.1). | |||
| RESERVED (0x2): Bit 2 is reserved for future use. | RESERVED (0x2): Bit 2 is reserved for future use. | |||
| DATA frames MUST be associated with a stream. If a DATA frame is | DATA frames MUST be associated with a stream. If a DATA frame is | |||
| received whose stream identifier field is 0x0, the recipient MUST | received whose stream identifier field is 0x0, the recipient MUST | |||
| respond with a connection error (Section 5.4.1) of type | respond with a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| DATA frames are subject to flow control and can only be sent when a | ||||
| stream is in the "open" or "half closed (remote)" states. | ||||
| 6.2. HEADERS | 6.2. HEADERS | |||
| The HEADERS frame (type=0x1) carries name-value pairs. The HEADERS | The HEADERS frame (type=0x1) carries name-value pairs. It is used to | |||
| is used to open a stream (Section 5.1). Any number of HEADERS frames | open a stream (Section 5.1). HEADERS frames can be sent on a stream | |||
| can be sent on an existing stream at any time. | in the "open" or "half closed (remote)" states. | |||
| 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 Fragment (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| HEADERS Frame Payload | HEADERS Frame Payload | |||
| skipping to change at page 24, line 12 ¶ | skipping to change at page 24, line 52 ¶ | |||
| Setting this flag causes the stream to enter a "half closed" state | Setting this flag causes the stream to enter a "half closed" state | |||
| (Section 5.1). | (Section 5.1). | |||
| RESERVED (0x2): Bit 2 is reserved for future use. | RESERVED (0x2): Bit 2 is reserved for future use. | |||
| END_HEADERS (0x4): The END_HEADERS bit indicates that this frame | END_HEADERS (0x4): The END_HEADERS bit indicates that this frame | |||
| ends the sequence of header block fragments necessary to provide a | ends the sequence of header block fragments necessary to provide a | |||
| complete set of headers. | complete set of headers. | |||
| The payload for a complete header block is provided by a sequence | The payload for a complete header block is provided by a sequence | |||
| of HEADERS frames, terminated by a HEADERS frame with the | of that starts with a HEADERS frame, followed by zero or more | |||
| END_HEADERS flag set. Once the sequence terminates, the payload | CONTINUATION frames. The sequence is terminated by a frame with | |||
| of all HEADERS frames are concatenated and interpreted as a single | the END_HEADERS flag set. Once the sequence terminates, the | |||
| block. | payload of all HEADERS and CONTINUATION frames are concatenated | |||
| and interpreted as a single block. | ||||
| A HEADERS frame without the END_HEADERS flag set MUST be followed | A HEADERS frame without the END_HEADERS flag set MUST be followed | |||
| by a HEADERS frame for the same stream. A receiver MUST treat the | by a CONTINUATION frame for the same stream. A receiver MUST | |||
| receipt of any other type of frame or a frame on a different | treat the receipt of any other type of frame or a frame on a | |||
| stream as a connection error (Section 5.4.1) of type | different stream as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| PRIORITY (0x8): Bit 4 being set indicates that the first four octets | PRIORITY (0x8): Bit 4 being set indicates that the first four octets | |||
| of this frame contain a single reserved bit and a 31-bit priority; | of this frame contain a single reserved bit and a 31-bit priority; | |||
| see Section 5.3. If this bit is not set, the four bytes do not | see Section 5.3. If this bit is not set, the four bytes do not | |||
| appear and the frame only contains a header block fragment. | appear and the frame only contains a header block fragment. | |||
| The payload of a HEADERS frame contains a header block fragment | The payload of a HEADERS frame contains a header block fragment | |||
| (Section 4.3). | (Section 4.3). A header block that does not fit within a HEADERS | |||
| frame is continued in a CONTINUATION frame (Section 6.10). | ||||
| HEADERS frames MUST be associated with a stream. If a HEADERS frame | HEADERS frames MUST be associated with a stream. If a HEADERS frame | |||
| is received whose stream identifier field is 0x0, the recipient MUST | is received whose stream identifier field is 0x0, the recipient MUST | |||
| respond with a connection error (Section 5.4.1) of type | respond with a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| The HEADERS frame changes the connection state as defined in | The HEADERS frame changes the connection state as described in | |||
| Section 4.3. | Section 4.3. | |||
| 6.3. PRIORITY | 6.3. PRIORITY | |||
| The PRIORITY frame (type=0x2) specifies the sender-advised priority | The PRIORITY frame (type=0x2) specifies the sender-advised priority | |||
| of a stream. It can be sent at any time for an existing stream. | of a stream. It can be sent at any time for an existing stream. | |||
| This enables reprioritisation of existing streams. | This enables reprioritisation of existing streams. | |||
| 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 | |||
| skipping to change at page 25, line 15 ¶ | skipping to change at page 26, line 8 ¶ | |||
| The payload of a PRIORITY frame contains a single reserved bit and a | The payload of a PRIORITY frame contains a single reserved bit and a | |||
| 31-bit priority. | 31-bit priority. | |||
| The PRIORITY frame does not define any flags. | The PRIORITY frame does not define any flags. | |||
| The PRIORITY frame is associated with an existing stream. If a | The PRIORITY frame is associated with an existing stream. If a | |||
| PRIORITY frame is received with a stream identifier of 0x0, the | PRIORITY frame is received with a stream identifier of 0x0, the | |||
| recipient MUST respond with a connection error (Section 5.4.1) of | recipient MUST respond with a connection error (Section 5.4.1) of | |||
| type PROTOCOL_ERROR. | type PROTOCOL_ERROR. | |||
| The PRIORITY frame can be sent on a stream in any of the "reserved | ||||
| (remote)", "open", "half-closed (local)", or "half closed (remote)" | ||||
| states, though it cannot be sent between consecutive frames that | ||||
| comprise a single header block (Section 4.3). Note that this frame | ||||
| could arrive after processing or frame sending has completed, which | ||||
| would cause it to have no effect. For a stream that is in the "half | ||||
| closed (remote)" state, this frame can only affect processing of the | ||||
| stream and not frame transmission. | ||||
| 6.4. RST_STREAM | 6.4. RST_STREAM | |||
| The RST_STREAM frame (type=0x3) allows for abnormal termination of a | The RST_STREAM frame (type=0x3) allows for abnormal termination of a | |||
| stream. When sent by the initiator of a stream, it indicates that | stream. When sent by the initiator of a stream, it indicates that | |||
| they wish to cancel the stream or that an error condition has | they wish to cancel the stream or that an error condition has | |||
| occurred. When sent by the receiver of a stream, it indicates that | occurred. When sent by the receiver of a stream, it indicates that | |||
| either the receiver is rejecting the stream, requesting that the | either the receiver is rejecting the stream, requesting that the | |||
| stream be cancelled or that an error condition has occurred. | stream be cancelled or that an error condition has occurred. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| skipping to change at page 25, line 47 ¶ | skipping to change at page 26, line 49 ¶ | |||
| The RST_STREAM frame fully terminates the referenced stream and | The RST_STREAM frame fully terminates the referenced stream and | |||
| causes it to enter the closed state. After receiving a RST_STREAM on | causes it to enter the closed state. After receiving a RST_STREAM on | |||
| a stream, the receiver MUST NOT send additional frames for that | a stream, the receiver MUST NOT send additional frames for that | |||
| stream. However, after sending the RST_STREAM, the sending endpoint | stream. However, after sending the RST_STREAM, the sending endpoint | |||
| MUST be prepared to receive and process additional frames sent on the | MUST be prepared to receive and process additional frames sent on the | |||
| stream that might have been sent by the peer prior to the arrival of | stream that might have been sent by the peer prior to the arrival of | |||
| the RST_STREAM. | the RST_STREAM. | |||
| RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | |||
| frame is received whose stream identifier field is 0x0 the recipient | frame is received with a stream identifier of 0x0, the recipient MUST | |||
| MUST respond with a connection error (Section 5.4.1) of type | treat this as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. | ||||
| If a RST_STREAM frame identifying an idle stream is received, the | ||||
| recipient MUST treat this as a connection error (Section 5.4.1) of | ||||
| type PROTOCOL_ERROR. | ||||
| 6.5. SETTINGS | 6.5. SETTINGS | |||
| The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x4) conveys configuration parameters that | |||
| affect how endpoints communicate. The parameters are either | affect how endpoints communicate. The parameters are either | |||
| constraints on peer behavior or preferences. | constraints on peer behavior or preferences. | |||
| SETTINGS frames MUST be sent at the start of a connection, and MAY be | SETTINGS frames MUST be sent at the start of a connection, and MAY be | |||
| sent at any other time by either endpoint over the lifetime of the | sent at any other time by either endpoint over the lifetime of the | |||
| connection. | connection. | |||
| Implementations MUST support all of the settings defined by this | Implementations MUST support all of the settings defined by this | |||
| specification and MAY support additional settings defined by | specification and MAY support additional settings defined by | |||
| extensions. Unsupported or unrecognized settings MUST be ignored. | extensions. Unsupported or unrecognized settings MUST be ignored. | |||
| New settings MUST NOT be defined or implemented in a way that | New settings MUST NOT be defined or implemented in a way that | |||
| requires endpoints to understand them in order to communicate | requires endpoints to understand them in order to communicate | |||
| successfully. | successfully. | |||
| A SETTINGS frame is not required to include every defined setting; | Each setting in a SETTINGS frame replaces the existing value for that | |||
| senders can include only those parameters for which it has accurate | setting. Settings are processed in the order in which they appear, | |||
| values and a need to convey. When multiple parameters are sent, they | and a receiver of a SETTINGS frame does not need to maintain any | |||
| SHOULD be sent in order of numerically lowest ID to highest ID. A | state other than the current value of settings. Therefore, the value | |||
| single SETTINGS frame MUST NOT contain multiple values for the same | of a setting is the last value that is seen by a receiver. This | |||
| ID. If the receiver of a SETTINGS frame discovers multiple values | permits the inclusion of the same settings multiple times in the same | |||
| for the same ID, it MUST ignore all values for that ID except the | SETTINGS frame, though doing so does nothing other than waste | |||
| first one. | connection capacity. | |||
| 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 provided setting value applies. | ||||
| The SETTINGS frame does not define any flags. | The SETTINGS frame does not define any flags. | |||
| SETTINGS frames always apply to a connection, never a single stream. | SETTINGS frames always apply to a connection, never a single stream. | |||
| The stream identifier for a settings frame MUST be zero. If an | The stream identifier for a settings frame MUST be zero. If an | |||
| endpoint receives a SETTINGS frame whose stream identifier field is | endpoint receives a SETTINGS frame whose stream identifier field is | |||
| anything other than 0x0, the endpoint MUST respond with a connection | anything other than 0x0, the endpoint MUST respond with a connection | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The SETTINGS frame affects connection state. A badly formed or | The SETTINGS frame affects connection state. A badly formed or | |||
| incomplete SETTINGS frame MUST be treated as a connection error | incomplete SETTINGS frame MUST be treated as a connection error | |||
| (Section 5.4.1). | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| 6.5.1. Setting Format | 6.5.1. Setting Format | |||
| The payload of a SETTINGS frame consists of zero or more settings. | The payload of a SETTINGS frame consists of zero or more settings. | |||
| Each setting consists of an 8-bit reserved field, an unsigned 24-bit | Each setting consists of an 8-bit reserved field, an unsigned 24-bit | |||
| setting identifier, and an unsigned 32-bit value. | 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 27, line 32 ¶ | skipping to change at page 28, line 32 ¶ | |||
| permits the receiver to create. By default there is no limit. It | permits the receiver to create. By default there is no limit. It | |||
| is recommended that this value be no smaller than 100, so as to | is recommended that this value be no smaller than 100, so as to | |||
| not unnecessarily limit parallelism. | not unnecessarily limit parallelism. | |||
| SETTINGS_INITIAL_WINDOW_SIZE (7): indicates the sender's initial | SETTINGS_INITIAL_WINDOW_SIZE (7): indicates the sender's initial | |||
| window size (in bytes) for stream level flow control. | window size (in bytes) for stream level flow control. | |||
| This settings affects the window size of all streams, including | This settings affects the window size of all streams, including | |||
| existing streams, see Section 6.9.2. | existing streams, see Section 6.9.2. | |||
| SETTINGS_FLOW_CONTROL_OPTIONS (10): indicates that streams directed | SETTINGS_FLOW_CONTROL_OPTIONS (10): indicates flow control options. | |||
| to the sender will not be subject to flow control. The least | The least significant bit (0x1) of the value is set to indicate | |||
| significant bit (0x1) of the value is set to indicate that new | that the sender has disabled all flow control. This bit cannot be | |||
| streams are not flow controlled. All other bits are reserved. | cleared once set, see Section 6.9.4. | |||
| This setting applies to all streams, including existing streams. | ||||
| These bits cannot be cleared once set, see Section 6.9.4. | All bits other than the least significant are reserved. | |||
| 6.6. PUSH_PROMISE | 6.6. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | |||
| in advance of streams the sender intends to initiate. The | in advance of streams the sender intends to initiate. The | |||
| PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | |||
| stream the endpoint plans to create along with a minimal set of | stream the endpoint plans to create along with a minimal set of | |||
| headers that provide additional context for the stream. Section 8.2 | headers that provide additional context for the stream. Section 8.2 | |||
| contains a thorough description of the use of PUSH_PROMISE frames. | contains a thorough description of the use of PUSH_PROMISE frames. | |||
| skipping to change at page 29, line 8 ¶ | skipping to change at page 30, line 8 ¶ | |||
| Promised streams are not required to be used in order promised. The | Promised streams are not required to be used in order promised. The | |||
| PUSH_PROMISE only reserves stream identifiers for later use. | PUSH_PROMISE only reserves stream identifiers for later use. | |||
| Recipients of PUSH_PROMISE frames can choose to reject promised | Recipients of PUSH_PROMISE frames can choose to reject promised | |||
| streams by returning a RST_STREAM referencing the promised stream | streams by returning a RST_STREAM referencing the promised stream | |||
| identifier back to the sender of the PUSH_PROMISE. | identifier back to the sender of the PUSH_PROMISE. | |||
| The PUSH_PROMISE frame modifies the connection state as defined in | The PUSH_PROMISE frame modifies the connection state as defined in | |||
| Section 4.3. | Section 4.3. | |||
| A PUSH_PROMISE frame modifies the connection state in two ways. The | ||||
| inclusion of a header block (Section 4.3) potentially modifies the | ||||
| compression state. PUSH_PROMISE also reserves a stream for later | ||||
| use, causing the promised stream to enter the "reserved" state. A | ||||
| sender MUST NOT send a PUSH_PROMISE on a stream unless that stream is | ||||
| either "open" or "half closed (remote)"; the sender MUST ensure that | ||||
| the promised stream is a valid choice for a new stream identifier | ||||
| (Section 5.1.1) (that is, the promised stream MUST be in the "idle" | ||||
| state). | ||||
| Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame | ||||
| causes the stream state to become indeterminate. A receiver MUST | ||||
| treat the receipt of a PUSH_PROMISE on a stream that is neither | ||||
| "open" nor "half-closed (local)" as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. Similarly, a receiver MUST | ||||
| treat the receipt of a PUSH_PROMISE that promises an illegal stream | ||||
| identifier (Section 5.1.1) (that is, an identifier for a stream that | ||||
| is not currently in the "idle" state) as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 6.7. PING | 6.7. PING | |||
| The PING frame (type=0x6) is a mechanism for measuring a minimal | The PING frame (type=0x6) is a mechanism for measuring a minimal | |||
| round-trip time from the sender, as well as determining whether an | round-trip time from the sender, as well as determining whether an | |||
| idle connection is still functional. PING frames can be sent from | idle connection is still functional. PING frames can be sent from | |||
| any endpoint. | any endpoint. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 30, line 33 ¶ | skipping to change at page 32, line 4 ¶ | |||
| 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. An endpoint might choose to close a connection without | working. An endpoint might choose to close a connection without | |||
| sending GOAWAY for misbehaving peers. | sending GOAWAY for misbehaving peers. | |||
| After sending a GOAWAY frame, the sender can discard frames for new | After sending a GOAWAY frame, the sender can discard frames for new | |||
| streams. However, any frames that alter connection state cannot be | streams. However, any frames that alter connection state cannot be | |||
| completely ignored. For instance, HEADERS and PUSH_PROMISE frames | completely ignored. For instance, HEADERS, PUSH_PROMISE and | |||
| MUST be minimally processed to ensure a consistent compression state | CONTINUATION frames MUST be minimally processed to ensure a | |||
| (see Section 4.3). | consistent compression state (see Section 4.3); similarly DATA frames | |||
| MUST be counted toward the connection flow control window. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |X| Last-Stream-ID (31) | | |X| Last-Stream-ID (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| | Error Code (32) | | | Error Code (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Additional Debug Data (*) | | | Additional Debug Data (*) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| skipping to change at page 31, line 4 ¶ | skipping to change at page 32, line 24 ¶ | |||
| | Error Code (32) | | | Error Code (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Additional Debug Data (*) | | | Additional Debug Data (*) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| GOAWAY Payload Format | GOAWAY Payload Format | |||
| The GOAWAY frame does not define any flags. | The GOAWAY frame does not define any flags. | |||
| The GOAWAY frame applies to the connection, not a specific stream. | The GOAWAY frame applies to the connection, not a specific stream. | |||
| The stream identifier MUST be zero. | The stream identifier MUST be zero. | |||
| The last stream identifier in the GOAWAY frame contains the highest | The last stream identifier in the GOAWAY frame contains the highest | |||
| numbered stream identifier for which the sender of the GOAWAY frame | numbered stream identifier for which the sender of the GOAWAY frame | |||
| has received frames on and might have taken some action on. All | has received frames on and might have taken some action on. All | |||
| streams up to and including the identified stream might have been | streams up to and including the identified stream might have been | |||
| processed in some way. The last stream identifier is set to 0 if no | processed in some way. The last stream identifier is set to 0 if no | |||
| streams were processed. | streams were processed. | |||
| Note: In this case, "processed" means that some data from the | Note: In this case, "processed" means that some data from the | |||
| stream was passed to some higher layer of software that might have | stream was passed to some higher layer of software that might have | |||
| taken some action as a result. | taken some action as a result. | |||
| If a connection terminates without a GOAWAY frame, this value is | ||||
| effectively the highest stream identifier. | ||||
| On streams with lower or equal numbered identifiers that were not | On streams with lower or equal numbered identifiers that were not | |||
| closed completely prior to the connection being closed, re-attempting | closed completely prior to the connection being closed, re-attempting | |||
| requests, transactions, or any protocol activity is not possible | requests, transactions, or any protocol activity is not possible | |||
| (with the exception of idempotent actions like HTTP GET, PUT, or | (with the exception of idempotent actions like HTTP GET, PUT, or | |||
| DELETE). Any protocol activity that uses higher numbered streams can | DELETE). Any protocol activity that uses higher numbered streams can | |||
| be safely retried using a new connection. | be safely retried using a new connection. | |||
| Activity on streams numbered lower or equal to the last stream | Activity on streams numbered lower or equal to the last stream | |||
| identifier might still complete successfully. The sender of a GOAWAY | identifier might still complete successfully. The sender of a GOAWAY | |||
| frame might gracefully shut down a connection by sending a GOAWAY | frame might gracefully shut down a connection by sending a GOAWAY | |||
| skipping to change at page 32, line 28 ¶ | skipping to change at page 33, line 51 ¶ | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| WINDOW_UPDATE Payload Format | WINDOW_UPDATE Payload Format | |||
| The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | |||
| unsigned 31-bit integer indicating the number of bytes that the | unsigned 31-bit integer indicating the number of bytes that the | |||
| sender can transmit in addition to the existing flow control window. | sender can transmit in addition to the existing flow control window. | |||
| The legal range for the increment to the flow control window is 1 to | The legal range for the increment to the flow control window is 1 to | |||
| 2^31 - 1 (0x7fffffff) bytes. | 2^31 - 1 (0x7fffffff) bytes. | |||
| The WINDOW_UPDATE frame defines the following flags: | The WINDOW_UPDATE frame does not define any flags. | |||
| END_FLOW_CONTROL (0x1): Bit 1 being set indicates that flow control | ||||
| for the identified stream or connection has been ended; subsequent | ||||
| frames do not need to be flow controlled. | ||||
| The WINDOW_UPDATE frame can be specific to a stream or to the entire | The WINDOW_UPDATE frame can be specific to a stream or to the entire | |||
| connection. In the former case, the frame's stream identifier | connection. In the former case, the frame's stream identifier | |||
| indicates the affected stream; in the latter, the value "0" indicates | indicates the affected stream; in the latter, the value "0" indicates | |||
| that the entire connection is the subject of the frame. | that the entire connection is the subject of the frame. | |||
| WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the | ||||
| END_STREAM flag. This means that a receiver could receive a | ||||
| WINDOW_UPDATE frame on a "half closed (remote)" or "closed" stream. | ||||
| A receiver MUST NOT treat this as an error, see Section 5.1. | ||||
| A receiver that receives a flow controlled frame MUST always account | ||||
| for its contribution against the connection flow control window, | ||||
| unless the receiver treats this as a connection error | ||||
| (Section 5.4.1). This is necessary even if the frame is in error. | ||||
| Since the sender counts the frame toward the flow control window, if | ||||
| the receiver does not, the flow control window at sender and receiver | ||||
| can become different. | ||||
| 6.9.1. The Flow Control Window | 6.9.1. The Flow Control Window | |||
| Flow control in HTTP/2.0 is implemented using a window kept by each | Flow control in HTTP/2.0 is implemented using a window kept by each | |||
| sender on every stream. The flow control window is a simple integer | sender on every stream. The flow control window is a simple integer | |||
| value that indicates how many bytes of data the sender is permitted | value that indicates how many bytes of data the sender is permitted | |||
| to transmit; as such, its size is a measure of the buffering | to transmit; as such, its size is a measure of the buffering | |||
| capability of the receiver. | capability of the receiver. | |||
| Two flow control windows are applicable; the stream flow control | Two flow control windows are applicable: the stream flow control | |||
| window and the connection flow control window. The sender MUST NOT | window and the connection flow control window. The sender MUST NOT | |||
| send a flow controlled frame with a length that exceeds the space | send a flow controlled frame with a length that exceeds the space | |||
| available in either of the flow control windows advertised by the | available in either of the flow control windows advertised by the | |||
| receiver. Frames with zero length with the END_STREAM flag set (for | receiver. Frames with zero length with the END_STREAM flag set (for | |||
| example, an empty data frame) MAY be sent if there is no available | example, an empty data frame) MAY be sent if there is no available | |||
| space in either flow control window. | space in either flow control window. | |||
| For flow control calculations, the 8 byte frame header is not | For flow control calculations, the 8 byte frame header is not | |||
| counted. | counted. | |||
| skipping to change at page 34, line 12 ¶ | skipping to change at page 35, line 45 ¶ | |||
| windows that it maintains by the difference between the new value and | windows that it maintains by the difference between the new value and | |||
| the old value. A SETTINGS frame cannot alter the connection flow | the old value. A SETTINGS frame cannot alter the connection flow | |||
| control window. | control window. | |||
| A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the available | A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the available | |||
| space in a flow control window to become negative. A sender MUST | space in a flow control window to become negative. A sender MUST | |||
| track the negative flow control window, and MUST NOT send new flow | track the negative flow control window, and MUST NOT send new flow | |||
| controlled frames until it receives WINDOW_UPDATE frames that cause | controlled frames until it receives WINDOW_UPDATE frames that cause | |||
| the flow control window to become positive. | the flow control window to become positive. | |||
| For example, if the client sends 64KB immediately on connection | For example, if the client sends 60KB immediately on connection | |||
| establishment, and the server sets the initial window size to be | establishment, and the server sets the initial window size to be | |||
| 16KB, the client will recalculate the available flow control window | 16KB, the client will recalculate the available flow control window | |||
| to be -48KB on receipt of the SETTINGS frame. The client retains a | to be -44KB 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. | |||
| 6.9.3. Reducing the Stream Window Size | 6.9.3. Reducing the Stream Window Size | |||
| A receiver that wishes to use a smaller flow control window than the | A receiver that wishes to use a smaller flow control window than the | |||
| current size can send a new SETTINGS frame. However, the receiver | current size can send a new SETTINGS frame. However, the receiver | |||
| MUST be prepared to receive data that exceeds this window size, since | MUST be prepared to receive data that exceeds this window size, since | |||
| the sender might send data that exceeds the lower limit prior to | the sender might send data that exceeds the lower limit prior to | |||
| processing the SETTINGS frame. | processing the SETTINGS frame. | |||
| skipping to change at page 34, line 49 ¶ | skipping to change at page 36, line 35 ¶ | |||
| sent in the SETTINGS. | sent in the SETTINGS. | |||
| 6.9.4. Ending Flow Control | 6.9.4. Ending Flow Control | |||
| After a receiver reads in a frame that marks the end of a stream (for | After a receiver reads in a frame that marks the end of a stream (for | |||
| example, a data stream with a END_STREAM flag set), it MUST cease | example, a data stream with a END_STREAM flag set), it MUST cease | |||
| transmission of WINDOW_UPDATE frames for that stream. A sender is | transmission of WINDOW_UPDATE frames for that stream. A sender is | |||
| not obligated to maintain the available flow control window for | not obligated to maintain the available flow control window for | |||
| streams that it is no longer sending on. | streams that it is no longer sending on. | |||
| Flow control can be disabled for all streams on the connection using | Flow control can be disabled the entire connection using the | |||
| the SETTINGS_FLOW_CONTROL_OPTIONS setting. An implementation that | SETTINGS_FLOW_CONTROL_OPTIONS setting. This setting ends all forms | |||
| does not wish to perform stream flow control can use this in the | of flow control. An implementation that does not wish to perform | |||
| initial SETTINGS exchange. | flow control can use this in the initial SETTINGS exchange. | |||
| Flow control can be disabled for an individual stream or the overall | ||||
| connection by sending a WINDOW_UPDATE with the END_FLOW_CONTROL flag | ||||
| set. The payload of a WINDOW_UPDATE frame that has the | ||||
| 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. | |||
| 6.10. CONTINUATION | ||||
| The CONTINUATION frame (type=0xA) is used to continue a sequence of | ||||
| header block fragments (Section 4.3). Any number of CONTINUATION | ||||
| frames can be sent on an existing stream, as long as the preceding | ||||
| frame on the same stream is one of HEADERS, PUSH_PROMISE or | ||||
| CONTINUATION. | ||||
| 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Header Block Fragment (*) ... | ||||
| +---------------------------------------------------------------+ | ||||
| CONTINUATION Frame Payload | ||||
| The CONTINUATION frame defines the following flags: | ||||
| END_STREAM (0x1): Bit 1 being set indicates that this frame is the | ||||
| last that the endpoint will send for the identified stream. | ||||
| Setting this flag causes the stream to enter a "half closed" or | ||||
| "closed" state (Section 5.1). | ||||
| END_HEADERS (0x2): The END_HEADERS bit indicates that this frame | ||||
| ends the sequence of header block fragments necessary to provide a | ||||
| complete set of headers. | ||||
| The payload for a complete header block is provided by a sequence | ||||
| that starts with a HEADERS or PUSH_PROMISE frame and zero or more | ||||
| CONTINUATION frames, terminated by a HEADERS, PUSH_PROMISE, or | ||||
| CONTINUATION frame with the END_HEADERS flag set. Once the | ||||
| sequence terminates, the payload of all frames in the sequence are | ||||
| concatenated and interpreted as a single block. | ||||
| A HEADERS, PUSH_PROMISE, or CONTINUATION frame without the | ||||
| END_HEADERS flag set MUST be followed by a CONTINUATION frame for | ||||
| the same stream. A receiver MUST treat the receipt of any other | ||||
| type of frame or a frame on a different stream as a connection | ||||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| The payload of a CONTINUATION frame contains a header block fragment | ||||
| (Section 4.3). | ||||
| The CONTINUATION frame changes the connection state as defined in | ||||
| Section 4.3. | ||||
| CONTINUATION frames MUST be associated with a stream. If a | ||||
| CONTINUATION frame is received whose stream identifier field is 0x0, | ||||
| the recipient MUST respond with a connection error (Section 5.4.1) of | ||||
| type PROTOCOL_ERROR. | ||||
| header block fragments (Section 4.3). A CONTINUATION frame MUST be | ||||
| preceded by one of HEADERS, PUSH_PROMISE or CONTINUATION frame. A | ||||
| recipient that observes violation of this rule MUST respond with a | ||||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 7. Error Codes | 7. Error Codes | |||
| Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | |||
| frames to convey the reasons for the stream or connection error. | frames to convey the reasons for the stream or connection error. | |||
| Error codes share a common code space. Some error codes 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: | |||
| skipping to change at page 35, line 48 ¶ | skipping to change at page 38, line 37 ¶ | |||
| 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. | |||
| 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): The endpoint refuses the stream prior to | REFUSED_STREAM (7): The endpoint refuses the stream prior to | |||
| performing any application processing, see Section 8.1.5 for | performing any application processing, see Section 8.1.3 for | |||
| details. | details. | |||
| CANCEL (8): Used by the endpoint to indicate that the stream is no | CANCEL (8): Used by the endpoint to indicate that the stream is no | |||
| longer needed. | longer needed. | |||
| COMPRESSION_ERROR (9): The endpoint is unable to maintain the | COMPRESSION_ERROR (9): The endpoint is unable to maintain the | |||
| compression context for the connection. | compression context for the connection. | |||
| 8. HTTP Message Exchanges | 8. HTTP Message Exchanges | |||
| skipping to change at page 36, line 30 ¶ | skipping to change at page 39, line 16 ¶ | |||
| [HTTP-p7]) apply with the changes in the sections below. | [HTTP-p7]) apply with the changes in the sections below. | |||
| 8.1. HTTP Request/Response Exchange | 8.1. HTTP Request/Response Exchange | |||
| A client sends an HTTP request on a new stream, using a previously | A client sends an HTTP request on a new stream, using a previously | |||
| unused stream identifier (Section 5.1.1). A server sends an HTTP | unused stream identifier (Section 5.1.1). A server sends an HTTP | |||
| response on the same stream as the request. | response on the same stream as the request. | |||
| An HTTP request or response each consist of: | An HTTP request or response each consist of: | |||
| o one contiguous sequence of HEADERS frames; | 1. a HEADERS frame; | |||
| o zero or more DATA frames; and | 2. one contiguous sequence of zero or more CONTINUATION frames; | |||
| o optionally, a contiguous sequence of HEADERS frames | 3. zero or more DATA frames; and | |||
| 4. optionally, a contiguous sequence that starts with a HEADERS | ||||
| frame, followed by zero or more CONTINUATION frames. | ||||
| The last frame in the sequence bears an END_STREAM flag. | The last frame in the sequence bears an END_STREAM flag. | |||
| Other frames, including HEADERS, MAY be interspersed with these | Other frames MAY be interspersed with these frames, but those frames | |||
| frames, but those frames do not carry HTTP semantics. | do not carry HTTP semantics. In particular, HEADERS frames (and any | |||
| CONTINUATION frames that follow) other than the first and optional | ||||
| last frames in this sequence do not carry HTTP semantics. | ||||
| Trailing header fields are carried in a header block that also | Trailing header fields are carried in a header block that also | |||
| terminates the stream. That is, a sequence of HEADERS frames that | terminates the stream. That is, a sequence starting with a HEADERS | |||
| carries an END_STREAM flag on the last frame. Header blocks after | frame, followed by zero or more CONTINUATION frames, that carries an | |||
| the first that do not terminate the stream are not part of an HTTP | END_STREAM flag on the last frame. Header blocks after the first | |||
| request or response. | that do not terminate the stream are not part of an HTTP request or | |||
| response. | ||||
| An HTTP request/response exchange fully consumes a single stream. A | An HTTP request/response exchange fully consumes a single stream. A | |||
| request starts with the HEADERS frame that puts the stream into an | request starts with the HEADERS frame that puts the stream into an | |||
| "open" state and ends with a frame bearing END_STREAM, which causes | "open" state and ends with a frame bearing END_STREAM, which causes | |||
| the stream to become "half closed" for the client. A response starts | the stream to become "half closed" for the client. A response starts | |||
| with a HEADERS frame and ends with a frame bearing END_STREAM, which | with a HEADERS frame and ends with a frame bearing END_STREAM, which | |||
| places the stream in the "closed" state. | places the stream in the "closed" state. | |||
| 8.1.1. Examples | 8.1.1. Examples | |||
| For example, an HTTP GET request that includes request header fields | For example, an HTTP GET request that includes request header fields | |||
| and no body, is transmitted as a single contiguous sequence of | and no body, is transmitted as a single contiguous sequence of | |||
| HEADERS frames containing the serialized block of request header | HEADERS frames containing the serialized block of request header | |||
| fields. The last HEADERS frame in the sequence has both the | fields. The last HEADERS frame in the sequence has both the | |||
| END_HEADERS and END_STREAM flag set: | END_HEADERS and END_STREAM flag set: | |||
| GET /resource HTTP/1.1 HEADERS | GET /resource HTTP/1.1 HEADERS | |||
| Host: example.org ==> + END_STREAM | Host: example.org ==> + END_STREAM | |||
| Accept: image/jpeg + END_HEADERS | Accept: image/jpeg + END_HEADERS | |||
| :method = get | :method = GET | |||
| :scheme = https | :scheme = https | |||
| :host = example.org | :host = example.org | |||
| :path = /resource | :path = /resource | |||
| accept = image/jpeg | accept = image/jpeg | |||
| Similarly, a response that includes only response header fields is | Similarly, a response that includes only response header fields is | |||
| transmitted as a sequence of HEADERS frames containing the serialized | transmitted as a sequence of HEADERS frames containing the serialized | |||
| block of response header fields. The last HEADERS frame in the | block of response header fields. The last HEADERS frame in the | |||
| sequence has both the END_HEADERS and END_STREAM flag set: | sequence has both the END_HEADERS and END_STREAM flag set: | |||
| HTTP/1.1 204 No Content HEADERS | HTTP/1.1 204 No Content HEADERS | |||
| Content-Length: 0 ===> + END_STREAM | Content-Length: 0 ===> + END_STREAM | |||
| + END_HEADERS | + END_HEADERS | |||
| :status = 204 | :status = 204 | |||
| content-length: 0 | content-length: 0 | |||
| An HTTP POST request that includes request header fields and payload | An HTTP POST request that includes request header fields and payload | |||
| data is transmitted as one or more HEADERS frames containing the | data is transmitted as one HEADERS frame, followed by zero or more | |||
| request headers followed by one or more DATA frames, with the last | CONTINUATION frames, containing the request headers followed by one | |||
| HEADERS frame having the END_HEADERS flag set and the final DATA | or more DATA frames, with the last CONTINUATION (or HEADERS) frame | |||
| frame having the END_STREAM flag set: | having the END_HEADERS flag set and the final DATA frame having the | |||
| END_STREAM flag set: | ||||
| POST /resource HTTP/1.1 HEADERS | POST /resource HTTP/1.1 HEADERS | |||
| Host: example.org ==> - END_STREAM | Host: example.org ==> - END_STREAM | |||
| Content-Type: image/jpeg + END_HEADERS | Content-Type: image/jpeg + END_HEADERS | |||
| Content-Length: 123 :method = post | Content-Length: 123 :method = POST | |||
| :scheme = https | :scheme = https | |||
| {binary data} :host = example.org | {binary data} :host = example.org | |||
| :path = /resource | :path = /resource | |||
| content-type = image/jpeg | content-type = image/jpeg | |||
| content-length = 123 | content-length = 123 | |||
| DATA | DATA | |||
| + END_STREAM | + END_STREAM | |||
| {binary data} | {binary data} | |||
| A response that includes header fields and payload data is | A response that includes header fields and payload data is | |||
| transmitted as one or more HEADERS frames followed by one or more | transmitted as a HEADERS frame, followed by zero or more CONTINUATION | |||
| DATA frames, with the last DATA frame in the sequence having the | frames, followed by one or more DATA frames, with the last DATA frame | |||
| END_STREAM flag set: | in the sequence having the END_STREAM flag set: | |||
| HTTP/1.1 200 OK HEADERS | HTTP/1.1 200 OK HEADERS | |||
| Content-Type: image/jpeg ==> - END_STREAM | Content-Type: image/jpeg ==> - END_STREAM | |||
| Content-Length: 123 + END_HEADERS | Content-Length: 123 + END_HEADERS | |||
| :status = 200 | :status = 200 | |||
| {binary data} content-type = image/jpeg | {binary data} content-type = image/jpeg | |||
| content-length = 123 | content-length = 123 | |||
| DATA | DATA | |||
| + END_STREAM | + END_STREAM | |||
| {binary data} | {binary data} | |||
| Trailing header fields are sent as a header block after both the | Trailing header fields are sent as a header block after both the | |||
| request or response header block and all the DATA frames have been | request or response header block and all the DATA frames have been | |||
| sent. The sequence of HEADERS frames that bears the trailers | sent. The sequence of HEADERS/CONTINUATION frames that bears the | |||
| includes a terminal frame that has both END_HEADERS and END_STREAM | trailers includes a terminal frame that has both END_HEADERS and | |||
| flags set. | END_STREAM flags set. | |||
| HTTP/1.1 200 OK HEADERS | HTTP/1.1 200 OK HEADERS | |||
| Content-Type: image/jpeg ===> - END_STREAM | Content-Type: image/jpeg ===> - END_STREAM | |||
| Content-Length: 123 + END_HEADERS | Content-Length: 123 + END_HEADERS | |||
| TE: trailers :status = 200 | TE: trailers :status = 200 | |||
| 123 content-type = image/jpeg | 123 content-type = image/jpeg | |||
| {binary data} content-length = 123 | {binary data} content-length = 123 | |||
| 0 | 0 | |||
| Foo: bar DATA | Foo: bar DATA | |||
| - END_STREAM | - END_STREAM | |||
| {binary data} | {binary data} | |||
| HEADERS | HEADERS | |||
| + END_STREAM | + END_STREAM | |||
| + END_HEADERS | + END_HEADERS | |||
| foo: bar | foo: bar | |||
| 8.1.2. Request Header Fields | 8.1.2. HTTP Header Fields | |||
| The definitions of the request header fields are largely unchanged | ||||
| relative to HTTP/1.1, with a few notable exceptions: | ||||
| o The HTTP/1.1 request-line has been split into two separate header | ||||
| fields named :method and :path, whose values specify the HTTP | ||||
| method for the request and the request-target, respectively. The | ||||
| HTTP-version component of the request-line is removed entirely | ||||
| from the headers. | ||||
| o The host and optional port portions of the request URI (see | ||||
| [RFC3986], Section 3.2), are specified using the new :host header | ||||
| field. [[anchor13: Ed. Note: it needs to be clarified whether or | ||||
| not this replaces the existing HTTP/1.1 Host header.]] | ||||
| o A new :scheme header field has been added to specify the scheme | ||||
| portion of the request-target (e.g. "https") | ||||
| o All header field names MUST be lowercased, and the definitions of | HTTP/2.0 request and response header fields carry information as a | |||
| all header field names defined by HTTP/1.1 are updated to be all | series of key-value pairs. This includes the target URI for the | |||
| lowercase. | request, the status code for the response, as well as HTTP header | |||
| fields. | ||||
| o The Connection, Host, Keep-Alive, Proxy-Connection, and Transfer- | HTTP header field names are strings of ASCII characters that are | |||
| Encoding header fields are no longer valid and MUST NOT be sent. | compared in a case-insensitive fashion. Note that header compression | |||
| [[anchor14: Ed. Note: And "TE" I presume?]] | could cause case information to be lost. | |||
| All HTTP Requests MUST include the ":method", ":path", ":host", and | The semantics of HTTP header fields are not altered by this | |||
| ":scheme" header fields. | specification, though header fields relating to connection management | |||
| or request framing are no longer necessary. An HTTP/2.0 request MUST | ||||
| NOT include any of the following header fields: Connection, Host, | ||||
| Keep-Alive, Proxy-Connection, TE, Transfer-Encoding, and Upgrade. A | ||||
| server MUST treat the presence of any of these header fields as a | ||||
| stream error (Section 5.4.2) of type PROTOCOL_ERROR. | ||||
| Header fields whose names begin with ":" (whether defined in this | 8.1.2.1. Request Header Fields | |||
| document or future extensions to this document) MUST appear before | ||||
| any other header fields. [[anchor15: Ed. Note: This requirement is | ||||
| currently pending review. Consider it "on hold" for the moment.]] | ||||
| All HTTP Requests that include a body SHOULD include the "content- | HTTP/2.0 defines a number of headers starting with a ':' character | |||
| length" header field. If a server receives a request where the sum | that carry information about the request target: | |||
| of the DATA frame payload lengths does not equal the value of the | ||||
| "content-length" header field, the server MUST return a 400 (Bad | ||||
| Request) error. | ||||
| If a client omits a mandatory header field from the request, the | o The ":method" header field includes the HTTP method ([HTTP-p2], | |||
| server MUST reply with a HTTP 400 Bad Request reply. | Section 4). | |||
| 8.1.3. Response Header Fields | o The ":scheme" header field includes the scheme portion of the | |||
| target URI ([RFC3986], Section 3.1). | ||||
| The definitions of the response header fields are largely unchanged | o The ":host" header field includes the authority portion of the | |||
| relative to HTTP/1.1, with a few notable exceptions: | target URI ([RFC3986], Section 3.2). | |||
| o The response status line has been reduced to a single ":status" | o The ":path" header field includes the path and query parts of the | |||
| header field whose value specifies only the numeric response | target URI (the "path-absolute" production from [RFC3986] and | |||
| status code. The status text component of the HTTP/1.1 response | optionally a '?' character followed by the "query" production, see | |||
| has been dropped entirely. | [RFC3986], Section 3.3 and [RFC3986], Section 3.4). This field | |||
| MUST NOT be empty; URIs that do not contain a path component MUST | ||||
| include a value of '/', unless the request is an OPTIONS request | ||||
| for '*', in which case the ":path" header field MUST include '*'. | ||||
| o The response MUST contain exactly one :status header field with | All HTTP/2.0 requests MUST include exactly one valid value for all of | |||
| exactly one response status value. If the client receives an HTTP | these header fields. An intermediary MUST ensure that requests that | |||
| response that does not include the :status field, or provides | it forwards are correct. A server MUST treat the absence of any of | |||
| multiple response status code values, it MUST respond with a | these header fields, presence of multiple values, or an invalid value | |||
| stream error (Section 5.4.2) of type PROTOCOL_ERROR. | as a stream error (Section 5.4.2) of type PROTOCOL_ERROR. | |||
| o All header field names MUST be lowercased, and the definitions of | HTTP/2.0 does not define a way to carry the version identifier that | |||
| all header field names defined by HTTP/1.1 are updated to be all | is included in the HTTP/1.1 request line. | |||
| lowercase. | ||||
| o The Connection, Keep-Alive, Proxy-Connection, and Transfer- | All HTTP Requests that include a body can include a "content-length" | |||
| Encoding header fields are not valid and MUST NOT be sent. | header field. If a server receives a request where the sum of the | |||
| DATA frame payload lengths does not equal the value of the | ||||
| "content-length" header field, the server MUST return a 400 (Bad | ||||
| Request) error. | ||||
| Header fields whose names begin with ":" (whether defined in this | 8.1.2.2. Response Header Fields | |||
| document or future extensions to this document) MUST appear before | ||||
| any other header fields. [[anchor16: Ed. Note: This requirement is | ||||
| currently pending review. Consider it "on hold" for the moment.]] | ||||
| 8.1.4. GZip Content-Encoding | A single ":status" header field is defined that carries the HTTP | |||
| status code field (see [HTTP-p2], Section 6). This header field MUST | ||||
| be included in all responses. An intermediary MUST ensure that it | ||||
| does not forward responses with absent or invalid values. A client | ||||
| MUST treat the absence of the ":status"" header field, the presence | ||||
| of multiple values, or an invalid value as a stream error | ||||
| (Section 5.4.2) of type PROTOCOL_ERROR. | ||||
| Clients MUST support gzip compression for HTTP response bodies. | HTTP/2.0 does not define a way to carry the version or reason phrase | |||
| Regardless of the value of the accept-encoding header field, a server | that is included in an HTTP/1.1 status line. | |||
| MAY send responses with gzip or deflate encoding. A compressed | ||||
| response MUST still bear an appropriate content-encoding header | ||||
| field. | ||||
| 8.1.5. Request Reliability Mechanisms in HTTP/2.0 | 8.1.3. Request Reliability Mechanisms in HTTP/2.0 | |||
| In HTTP/1.1, an HTTP client is unable to retry a non-idempotent | In HTTP/1.1, an HTTP client is unable to retry a non-idempotent | |||
| request when an error occurs, because there is no means to determine | request when an error occurs, because there is no means to determine | |||
| the nature of the error. It is possible that some server processing | the nature of the error. It is possible that some server processing | |||
| occurred prior to the error, which could result in undesirable | occurred prior to the error, which could result in undesirable | |||
| effects if the request were reattempted. | effects if the request were reattempted. | |||
| HTTP/2.0 provides two mechanisms for providing a guarantee to a | HTTP/2.0 provides two mechanisms for providing a guarantee to a | |||
| client that a request has not been processed: | client that a request has not been processed: | |||
| skipping to change at page 41, line 29 ¶ | skipping to change at page 44, line 15 ¶ | |||
| process the originally requested resource. | process the originally requested resource. | |||
| Pushing additional resources is optional, and is negotiated only | Pushing additional resources is optional, and is negotiated only | |||
| between individual endpoints. For instance, an intermediary could | between individual endpoints. For instance, an intermediary could | |||
| receive pushed resources from the server but is not required to | receive pushed resources from the server but is not required to | |||
| forward those on to the client. How to make use of the pushed | forward those on to the client. How to make use of the pushed | |||
| resources is up to that intermediary. Equally, the intermediary | resources is up to that intermediary. Equally, the intermediary | |||
| might choose to push additional resources to the client, without any | might choose to push additional resources to the client, without any | |||
| action taken by the server. | action taken by the server. | |||
| 8.2.1. Push Requests | ||||
| Server push is semantically equivalent to a server responding to a | Server push is semantically equivalent to a server responding to a | |||
| GET request for that resource. The PUSH_PROMISE frame, or frames, | request. The PUSH_PROMISE frame, or frames, sent by the server | |||
| sent by the server includes a header block that contains the request | includes a header block that contains a complete set of request | |||
| headers that the server has assumed. | headers that the server attributes to the request. It is not | |||
| possible to push a response to a request that includes a request | ||||
| body. | ||||
| Pushed resources are always associated with an explicit request from | Pushed resources are always associated with an explicit request from | |||
| a client. The PUSH_PROMISE frames sent by the server are sent on the | a client. The PUSH_PROMISE frames sent by the server are sent on the | |||
| stream created for the original request. The PUSH_PROMSE frame | stream created for the original request. The PUSH_PROMISE frame | |||
| includes a promised stream identifier, chosen from the stream | includes a promised stream identifier, chosen from the stream | |||
| identifiers available to the server (see Section 5.1.1). Any header | identifiers available to the server (see Section 5.1.1). | |||
| fields that are not specified in the PUSH_PROMISE frames sent by the | ||||
| server are inherited from the original request sent by the client. | ||||
| The header fields in PUSH_PROMISE MUST include the ":scheme", ":host" | ||||
| and ":path" header fields that identify the resource that is being | ||||
| pushed. A PUSH_PROMISE always implies an HTTP method of GET. If a | ||||
| client receives a PUSH_PROMISE that does not include these header | ||||
| fields, or a value for the ":method" header field, it MUST respond | ||||
| with a stream error (Section 5.4.2) of type PROTOCOL_ERROR. | ||||
| After sending the PUSH_PROMISE frame, the server can begin delivering | ||||
| the pushed resource on a new, server-initiated stream that uses the | ||||
| promised stream identifier. This stream is already implicitly "half | ||||
| closed" to the client (Section 5.1). The server uses this stream to | ||||
| transmit an HTTP response, using the same sequence of frames as | ||||
| defined in Section 8.1. | ||||
| Once a client receives a PUSH_PROMISE frame and chooses to accept the | The header fields in PUSH_PROMISE and any subsequent CONTINUATION | |||
| pushed resource, the client SHOULD NOT issue any subsequent GET | frames MUST be a valid and complete set of request headers | |||
| requests for the promised resource until after the promised stream | (Section 8.1.2.1). The server MUST include a method in the ":method" | |||
| has closed. | header field that is safe (see [HTTP-p2], Section 4.2.1). If a | |||
| client receives a PUSH_PROMISE that does not include a complete and | ||||
| valid set of header fields, or the ":method" header field identifies | ||||
| a method that is not safe, it MUST respond with a stream error | ||||
| (Section 5.4.2) of type PROTOCOL_ERROR. | ||||
| The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | |||
| sending any HEADERS or DATA frames that reference the promised | sending any frames that reference the promised resources. This | |||
| resources. This avoids a race where clients issue requests for | avoids a race where clients issue requests for resources prior to | |||
| resources prior to receiving any PUSH_PROMISE frames. | receiving any PUSH_PROMISE frames. | |||
| For example, if the server receives a request for a document | For example, if the server receives a request for a document | |||
| containing embedded links to multiple image files, and the server | containing embedded links to multiple image files, and the server | |||
| chooses to push those additional images to the client, sending push | chooses to push those additional images to the client, sending push | |||
| promises before the DATA frames that contain the image links ensure | promises before the DATA frames that contain the image links ensure | |||
| that the client is able to see the promises before discovering the | that the client is able to see the promises before discovering the | |||
| resources. Likewise, if the server pushes resources referenced by | resources. Similarly, if the server pushes resources referenced by | |||
| the header block (for instance, in Link header fields), sending the | the header block (for instance, in Link header fields), sending the | |||
| push promises before sending the header block ensures that clients do | push promises before sending the header block ensures that clients do | |||
| not request those resources. | not request those resources. | |||
| PUSH_PROMISE frames MUST NOT be sent by the client. PUSH_PROMISE | PUSH_PROMISE frames MUST NOT be sent by the client. PUSH_PROMISE | |||
| frames can be sent by the server on any stream that was opened by the | frames can be sent by the server on any stream that was opened by the | |||
| client. They MUST be sent on a stream that is in either the "open" | client. They MUST be sent on a stream that is in either the "open" | |||
| or "half closed (remote)" to the server. PUSH_PROMISE frames can be | or "half closed (remote)" to the server. PUSH_PROMISE frames are | |||
| interspersed within the frames that comprise response, with the | interspersed with the frames that comprise a response, though they | |||
| exception that they cannot be interspersed with HEADERS frames that | cannot be interspersed with HEADERS and CONTINUATION frames that | |||
| comprise a single header block. | comprise a single header block. | |||
| 8.2.2. Push Responses | ||||
| After sending the PUSH_PROMISE frame, the server can begin delivering | ||||
| the pushed resource as a response (Section 8.1.2.2) on a server- | ||||
| initiated stream that uses the promised stream identifier. The | ||||
| server uses this stream to transmit an HTTP response, using the same | ||||
| sequence of frames as defined in Section 8.1. This stream becomes | ||||
| "half closed" to the client (Section 5.1) after the initial HEADERS | ||||
| frame is sent. | ||||
| Once a client receives a PUSH_PROMISE frame and chooses to accept the | ||||
| pushed resource, the client SHOULD NOT issue any requests for the | ||||
| promised resource until after the promised stream has closed. | ||||
| If the client determines, for any reason, that it does not wish to | ||||
| receive the pushed resource from the server, or if the server takes | ||||
| too long to begin sending the promised resource, the client can send | ||||
| an RST_STREAM frame, using either the CANCEL or REFUSED_STREAM codes, | ||||
| and referencing the pushed stream's identifier. | ||||
| A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | |||
| the number of resources that can be concurrently pushed by a server. | the number of resources that can be concurrently pushed by a server. | |||
| Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables | Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables | |||
| server push by preventing the server from creating the necessary | server push by preventing the server from creating the necessary | |||
| streams. | streams. This does not prohibit a server from sending PUSH_PROMISE | |||
| frames; clients need to reset any promised streams that are not | ||||
| The request header fields provided in the PUSH_PROMISE frame SHOULD | wanted. | |||
| include enough information for a client to determine whether a cached | ||||
| representation of the resource is already available. If the client | ||||
| determines, for any reason, that it does not wish to receive the | ||||
| pushed resource from the server, or if the server takes too long to | ||||
| begin sending the promised resource, the client can send an | ||||
| RST_STREAM frame, using either the CANCEL or REFUSED_STREAM codes, | ||||
| and referencing the pushed stream's identifier. | ||||
| Clients 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 [[anchor17: Ed: weaselly use of | "example.com" is generally [[anchor15: 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". | |||
| 9. Additional HTTP Requirements/Considerations | 9. Additional HTTP Requirements/Considerations | |||
| TODO: SNI, gzip and deflate Content-Encoding, etc.. | This section outlines attributes of the HTTP protocol that improve | |||
| interoperability, reduce exposure to known security vulnerabilities, | ||||
| 9.1. Frame Size Limits for HTTP | or reduce the potential for implementation variation. | |||
| Frames used for HTTP messages MUST NOT exceed 2^14-1 (16383) octets | ||||
| in length, not counting the 8 octet frame header. An endpoint MUST | ||||
| treat the receipt of a larger frame as a FRAME_TOO_LARGE error (see | ||||
| Section 4.2). | ||||
| 9.2. Connection Management | 9.1. Connection Management | |||
| HTTP/2.0 connections are persistent. For best performance, it is | HTTP/2.0 connections are persistent. For best performance, it is | |||
| expected clients will not close connections until it is determined | expected clients will not close connections until it is determined | |||
| that no further communication with a server is necessary (for | that no further communication with a server is necessary (for | |||
| example, when a user navigates away from a particular web page), or | example, when a user navigates away from a particular web page), or | |||
| until the server closes the connection. | until the server closes the connection. | |||
| Clients SHOULD NOT open more than one HTTP/2.0 connection to a given | Clients SHOULD NOT open more than one HTTP/2.0 connection to a given | |||
| origin ([RFC6454]) concurrently. A client can create additional | origin ([RFC6454]) concurrently. A client can create additional | |||
| connections as replacements, either to replace connections that are | connections as replacements, either to replace connections that are | |||
| skipping to change at page 43, line 44 ¶ | skipping to change at page 46, line 34 ¶ | |||
| (Section 5.4.1). | (Section 5.4.1). | |||
| Servers are encouraged to maintain open connections for as long as | Servers are encouraged to maintain open connections for as long as | |||
| possible, but are permitted to terminate idle connections if | possible, but are permitted to terminate idle connections if | |||
| necessary. When either endpoint chooses to close the transport-level | necessary. When either endpoint chooses to close the transport-level | |||
| TCP connection, the terminating endpoint MUST first send a GOAWAY | TCP connection, the terminating endpoint MUST first send a GOAWAY | |||
| (Section 6.8) frame so that both endpoints can reliably determine | (Section 6.8) frame so that both endpoints can reliably determine | |||
| whether previously sent frames have been processed and gracefully | whether previously sent frames have been processed and gracefully | |||
| complete or terminate any necessary remaining tasks. | complete or terminate any necessary remaining tasks. | |||
| 9.2. Use of TLS Features | ||||
| Implementations of HTTP/2.0 MUST support TLS 1.1 [TLS11]. [[anchor18: | ||||
| The working group intends to require at least the use of TLS 1.2 | ||||
| [TLS12] prior to publication of this document; negotiating TLS 1.1 is | ||||
| permitted to enable the creation of interoperable implementations of | ||||
| early drafts.]] | ||||
| The TLS implementation MUST support the Server Name Indication (SNI) | ||||
| [TLS-EXT] extension to TLS. HTTP/2.0 clients MUST indicate the | ||||
| target domain name when negotiating TLS. | ||||
| A server that receives a TLS handshake that does not include either | ||||
| TLS 1.1 or SNI, MUST NOT negotiate HTTP/2.0. Removing HTTP/2.0 | ||||
| protocols from consideration could result in the removal of all | ||||
| protocols from the set of protocols offered by the client. This | ||||
| causes protocol negotiation failure, as described in Section 3.2 of | ||||
| [TLSALPN]. | ||||
| Implementations are encouraged not to negotiate TLS cipher suites | ||||
| with known vulnerabilities, such as [RC4]. | ||||
| 9.3. Frame Size Limits for HTTP | ||||
| Frames used for HTTP messages MUST NOT exceed 2^14-1 (16383) octets | ||||
| in length, not counting the 8 octet frame header. An endpoint MUST | ||||
| treat the receipt of a larger frame as a FRAME_TOO_LARGE error (see | ||||
| Section 4.2). | ||||
| 9.4. GZip Content-Encoding | ||||
| Clients MUST support gzip compression for HTTP response bodies. | ||||
| 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. | ||||
| 10. Security Considerations | 10. Security Considerations | |||
| 10.1. Server Authority and Same-Origin | 10.1. Server Authority and Same-Origin | |||
| This specification uses the same-origin policy ([RFC6454], Section 3) | This specification uses the same-origin policy ([RFC6454], Section 3) | |||
| to determine whether an origin server is permitted to provide | to determine whether an origin server is permitted to provide | |||
| content. | content. | |||
| A server that is contacted using TLS is authenticated based on the | A server that is contacted using TLS is authenticated based on the | |||
| certificate that it offers in the TLS handshake (see [RFC2818], | certificate that it offers in the TLS handshake (see [RFC2818], | |||
| skipping to change at page 46, line 5 ¶ | skipping to change at page 49, line 20 ¶ | |||
| Frame types are an 8-bit value. When reviewing new frame type | Frame types are an 8-bit value. When reviewing new frame type | |||
| registrations, special attention is advised for any frame type- | registrations, special attention is advised for any frame type- | |||
| specific flags that are defined. Frame flags can interact with | specific flags that are defined. Frame flags can interact with | |||
| existing flags and could prevent the creation of globally applicable | existing flags and could prevent the creation of globally applicable | |||
| flags. | flags. | |||
| Initial values for the "HTTP/2.0 Frame Type" registry are shown in | Initial values for the "HTTP/2.0 Frame Type" registry are shown in | |||
| Table 1. | Table 1. | |||
| +-----------+---------------+---------------------------------------+ | +--------+---------------+---------------------------+--------------+ | |||
| | Frame | Name | Flags | | | Frame | Name | Flags | Section | | |||
| | Type | | | | | Type | | | | | |||
| +-----------+---------------+---------------------------------------+ | +--------+---------------+---------------------------+--------------+ | |||
| | 0 | DATA | END_STREAM(1) | | | 0 | DATA | END_STREAM(1) | Section 6.1 | | |||
| | 1 | HEADERS | END_STREAM(1), END_HEADERS(4), | | | 1 | HEADERS | END_STREAM(1), | Section 6.2 | | |||
| | | | PRIORITY(8) | | | | | END_HEADERS(4), | | | |||
| | 2 | PRIORITY | - | | | | | PRIORITY(8) | | | |||
| | 3 | RST_STREAM | - | | | 2 | PRIORITY | - | Section 6.3 | | |||
| | 4 | SETTINGS | - | | | 3 | RST_STREAM | - | Section 6.4 | | |||
| | 5 | PUSH_PROMISE | END_PUSH_PROMISE(1) | | | 4 | SETTINGS | - | Section 6.5 | | |||
| | 6 | PING | PONG(1) | | | 5 | PUSH_PROMISE | END_PUSH_PROMISE(1) | Section 6.6 | | |||
| | 7 | GOAWAY | - | | | 6 | PING | PONG(1) | Section 6.7 | | |||
| | 9 | WINDOW_UPDATE | END_FLOW_CONTROL(1) | | | 7 | GOAWAY | - | Section 6.8 | | |||
| +-----------+---------------+---------------------------------------+ | | 9 | WINDOW_UPDATE | - | Section 6.9 | | |||
| | 10 | CONTINUATION | END_STREAM(1), | Section 6.10 | | ||||
| | | | END_HEADERS(4) | | | ||||
| +--------+---------------+---------------------------+--------------+ | ||||
| Table 1 | Table 1 | |||
| 12.2. Error Code Registry | 12.2. Error Code Registry | |||
| This document establishes a registry for HTTP/2.0 error codes. The | This document establishes a registry for HTTP/2.0 error codes. The | |||
| "HTTP/2.0 Error Code" registry manages a 32-bit space. The "HTTP/2.0 | "HTTP/2.0 Error Code" registry manages a 32-bit space. The "HTTP/2.0 | |||
| Error Code" registry operates under the "Expert Review" policy | Error Code" registry operates under the "Expert Review" policy | |||
| [RFC5226]. | [RFC5226]. | |||
| skipping to change at page 47, line 49 ¶ | skipping to change at page 51, line 18 ¶ | |||
| Permanent Message Header Field Registry [BCP90]. | Permanent Message Header Field Registry [BCP90]. | |||
| Header field name: HTTP2-Settings | Header field name: HTTP2-Settings | |||
| Applicable protocol: http | Applicable protocol: http | |||
| Status: standard | Status: standard | |||
| Author/Change controller: IETF | Author/Change controller: IETF | |||
| Specification document(s): RFC XXXX (this document) | Specification document(s): Section 3.2.1 of this document | |||
| Related information: This header field is only used by an HTTP/2.0 | Related information: This header field is only used by an HTTP/2.0 | |||
| client for Upgrade-based negotiation. | client for Upgrade-based negotiation. | |||
| 13. Acknowledgements | 13. Acknowledgements | |||
| This document includes substantial input from the following | This document includes substantial input from the following | |||
| individuals: | individuals: | |||
| o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | |||
| Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | |||
| skipping to change at page 48, line 35 ¶ | skipping to change at page 51, line 51 ¶ | |||
| 14. References | 14. References | |||
| 14.1. Normative References | 14.1. Normative References | |||
| [COMPRESSION] Ruellan, H. and R. Peon, "HTTP Header Compression", | [COMPRESSION] Ruellan, H. and R. Peon, "HTTP Header Compression", | |||
| draft-ietf-httpbis-header-compression-00 (work in | draft-ietf-httpbis-header-compression-00 (work in | |||
| progress), June 2013. | progress), June 2013. | |||
| [HTTP-p1] Fielding, R. and J. Reschke, "Hypertext Transfer | [HTTP-p1] Fielding, R. and J. Reschke, "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
| draft-ietf-httpbis-p1-messaging-22 (work in progress), | draft-ietf-httpbis-p1-messaging-23 (work in progress), | |||
| February 2013. | July 2013. | |||
| [HTTP-p2] Fielding, R. and J. Reschke, "Hypertext Transfer | [HTTP-p2] Fielding, R. and J. Reschke, "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Semantics and Content", | Protocol (HTTP/1.1): Semantics and Content", | |||
| draft-ietf-httpbis-p2-semantics-22 (work in progress), | draft-ietf-httpbis-p2-semantics-23 (work in progress), | |||
| February 2013. | July 2013. | |||
| [HTTP-p4] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [HTTP-p4] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
| Transfer Protocol (HTTP/1.1): Conditional Requests", | Transfer Protocol (HTTP/1.1): Conditional Requests", | |||
| draft-ietf-httpbis-p4-conditional-22 (work in | draft-ietf-httpbis-p4-conditional-23 (work in | |||
| progress), February 2013. | progress), July 2013. | |||
| [HTTP-p5] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, | [HTTP-p5] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, | |||
| Ed., "Hypertext Transfer Protocol (HTTP/1.1): Range | Ed., "Hypertext Transfer Protocol (HTTP/1.1): Range | |||
| Requests", draft-ietf-httpbis-p5-range-22 (work in | Requests", draft-ietf-httpbis-p5-range-23 (work in | |||
| progress), February 2013. | progress), July 2013. | |||
| [HTTP-p6] Fielding, R., Ed., Nottingham, M., Ed., and J. | [HTTP-p6] Fielding, R., Ed., Nottingham, M., Ed., and J. | |||
| Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): | Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): | |||
| Caching", draft-ietf-httpbis-p6-cache-22 (work in | Caching", draft-ietf-httpbis-p6-cache-23 (work in | |||
| progress), February 2013. | progress), July 2013. | |||
| [HTTP-p7] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [HTTP-p7] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
| Transfer Protocol (HTTP/1.1): Authentication", | Transfer Protocol (HTTP/1.1): Authentication", | |||
| draft-ietf-httpbis-p7-auth-22 (work in progress), | draft-ietf-httpbis-p7-auth-23 (work in progress), | |||
| February 2013. | July 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. | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, | |||
| skipping to change at page 49, line 37 ¶ | skipping to change at page 52, line 52 ¶ | |||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| Encodings", RFC 4648, October 2006. | Encodings", RFC 4648, October 2006. | |||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing | [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing | |||
| an IANA Considerations Section in RFCs", BCP 26, | an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 5226, May 2008. | RFC 5226, May 2008. | |||
| [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, January 2008. | Specifications: ABNF", STD 68, RFC 5234, January 2008. | |||
| [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer | ||||
| Security (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. | |||
| [TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) | ||||
| Extensions: Extension Definitions", RFC 6066, | ||||
| January 2011. | ||||
| [TLS11] Dierks, T. and E. Rescorla, "The Transport Layer | ||||
| Security (TLS) Protocol Version 1.1", RFC 4346, | ||||
| April 2006. | ||||
| [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer | ||||
| Security (TLS) Protocol Version 1.2", RFC 5246, | ||||
| August 2008. | ||||
| [TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application Layer | "Transport Layer Security (TLS) Application Layer | |||
| Protocol Negotiation Extension", | Protocol Negotiation Extension", | |||
| draft-ietf-tls-applayerprotoneg-01 (work in progress), | draft-ietf-tls-applayerprotoneg-01 (work in progress), | |||
| April 2013. | April 2013. | |||
| 14.2. Informative References | 14.2. Informative References | |||
| [BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
| Procedures for Message Header Fields", BCP 90, | Procedures for Message Header Fields", BCP 90, | |||
| RFC 3864, September 2004. | RFC 3864, September 2004. | |||
| [RC4] Rivest, R., "The RC4 encryption algorithm", RSA Data | ||||
| Security, Inc. , March 1992. | ||||
| [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP | [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP | |||
| Extensions for High Performance", RFC 1323, May 1992. | Extensions 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", | Jackson, "Talking to Yourself for Fun and Profit", | |||
| 2011, <http://w2spconf.com/2011/papers/websocket.pdf>. | 2011, <http://w2spconf.com/2011/papers/websocket.pdf>. | |||
| Appendix A. Change Log (to be removed by RFC Editor before publication) | Appendix A. Change Log (to be removed by RFC Editor before publication) | |||
| A.1. Since draft-ietf-httpbis-http2-03 | A.1. Since draft-ietf-httpbis-http2-04 | |||
| Added CONTINUATION frame for HEADERS and PUSH_PROMISE. | ||||
| PUSH_PROMISE is no longer implicitly prohibited if | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS is zero. | ||||
| Push expanded to allow all safe methods without a request body. | ||||
| Clarified the use of HTTP header fields in requests and responses. | ||||
| Prohibited HTTP/1.1 hop-by-hop header fields. | ||||
| Requiring that intermediaries not forward requests with missing or | ||||
| illegal routing :-headers. | ||||
| Clarified requirements around handling different frames after stream | ||||
| close, stream reset and GOAWAY. | ||||
| Added more specific prohibitions for sending of different frame types | ||||
| in various stream states. | ||||
| Making the last received setting value the effective value. | ||||
| Clarified requirements on TLS version, extension and ciphers. | ||||
| A.2. Since draft-ietf-httpbis-http2-03 | ||||
| Committed major restructuring atrocities. | Committed major restructuring atrocities. | |||
| Added reference to first header compression draft. | Added reference to first header compression draft. | |||
| Added more formal description of frame lifecycle. | Added more formal description of frame lifecycle. | |||
| Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. | Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. | |||
| Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. | Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. | |||
| Added PRIORITY frame. | Added PRIORITY frame. | |||
| A.2. Since draft-ietf-httpbis-http2-02 | A.3. Since draft-ietf-httpbis-http2-02 | |||
| Added continuations to frames carrying header blocks. | Added continuations to frames carrying header blocks. | |||
| Replaced use of "session" with "connection" to avoid confusion with | Replaced use of "session" with "connection" to avoid confusion with | |||
| other HTTP stateful concepts, like cookies. | other HTTP stateful concepts, like cookies. | |||
| Removed "message". | Removed "message". | |||
| Switched to TLS ALPN from NPN. | Switched to TLS ALPN from NPN. | |||
| Editorial changes. | Editorial changes. | |||
| A.3. Since draft-ietf-httpbis-http2-01 | A.4. 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 51, line 31 ¶ | skipping to change at page 55, line 31 ¶ | |||
| Restructured frame header. Removed distinction between data and | Restructured frame header. Removed distinction between data and | |||
| control frames. | control frames. | |||
| Altered flow control properties to include session-level limits. | Altered flow control properties to include session-level limits. | |||
| Added note on cacheability of pushed resources and multiple tenant | Added note on cacheability of pushed resources and multiple tenant | |||
| servers. | servers. | |||
| Changed protocol label form based on discussions. | Changed protocol label form based on discussions. | |||
| A.4. Since draft-ietf-httpbis-http2-00 | A.5. 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 5.2.1) based on <http:// | Added flow control principles (Section 5.2.1) based on <http:// | |||
| tools.ietf.org/html/draft-montenegro-httpbis-http2-fc-principles-01>. | tools.ietf.org/html/draft-montenegro-httpbis-http2-fc-principles-01>. | |||
| A.5. Since draft-mbelshe-httpbis-spdy-00 | A.6. Since draft-mbelshe-httpbis-spdy-00 | |||
| Adopted as base for draft-ietf-httpbis-http2. | Adopted as base for draft-ietf-httpbis-http2. | |||
| Updated authors/editors list. | Updated authors/editors list. | |||
| Added status note. | Added status note. | |||
| Authors' Addresses | Authors' Addresses | |||
| Mike Belshe | Mike Belshe | |||
| End of changes. 131 change blocks. | ||||
| 381 lines changed or deleted | 597 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||