| draft-ietf-httpbis-http2-09.txt | draft-ietf-httpbis-http2-10.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: June 7, 2014 Google, Inc | Expires: August 17, 2014 Google, Inc | |||
| M. Thomson, Ed. | M. Thomson, Ed. | |||
| Microsoft | Mozilla | |||
| A. Melnikov, Ed. | February 13, 2014 | |||
| Isode Ltd | ||||
| December 4, 2013 | ||||
| Hypertext Transfer Protocol version 2.0 | Hypertext Transfer Protocol version 2 | |||
| draft-ietf-httpbis-http2-09 | draft-ietf-httpbis-http2-10 | |||
| 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). HTTP/2.0 enables a more | the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more | |||
| efficient use of network resources and a reduced perception of | efficient use of network resources and a reduced perception of | |||
| latency by introducing header field compression and allowing multiple | latency by introducing header field compression and allowing multiple | |||
| concurrent messages on the same connection. It also introduces | concurrent messages on the same connection. It also introduces | |||
| unsolicited push of representations from servers to clients. | unsolicited push of representations from servers to 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 syntax. HTTP's existing semantics remain unchanged. | HTTP/1.1 message syntax. HTTP's existing semantics remain unchanged. | |||
| This version of the draft has been marked for implementation. | ||||
| Interoperability testing will occur in the HTTP/2.0 interim in | ||||
| Zurich, CH, starting 2014-01-22. This replaces -08, which was | ||||
| originally identified as an implementation draft. | ||||
| 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 15 ¶ | skipping to change at page 2, line 8 ¶ | |||
| 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 June 7, 2014. | This Internet-Draft will expire on August 17, 2014. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2013 IETF Trust and the persons identified as the | Copyright (c) 2014 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 | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.1. Document Organization . . . . . . . . . . . . . . . . . . 5 | 1.1. Document Organization . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 1.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | |||
| 2. HTTP/2.0 Protocol Overview . . . . . . . . . . . . . . . . . . 6 | 2. HTTP/2 Protocol Overview . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.1. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . 7 | 2.1. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 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 . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. HTTP/2.0 Version Identification . . . . . . . . . . . . . 7 | 3.1. HTTP/2 Version Identification . . . . . . . . . . . . . . 8 | |||
| 3.2. Starting HTTP/2.0 for "http" URIs . . . . . . . . . . . . 8 | 3.2. Starting HTTP/2 for "http" URIs . . . . . . . . . . . . . 9 | |||
| 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 for "https" URIs . . . . . . . . . . . . . 11 | |||
| 3.4. Starting HTTP/2.0 with Prior Knowledge . . . . . . . . . . 10 | 3.4. Starting HTTP/2 with Prior Knowledge . . . . . . . . . . . 11 | |||
| 3.5. HTTP/2.0 Connection Header . . . . . . . . . . . . . . . . 11 | 3.5. HTTP/2 Connection Header . . . . . . . . . . . . . . . . . 11 | |||
| 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . 14 | |||
| 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . . 14 | 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 15 | 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 19 | 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 20 | |||
| 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 19 | 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 20 | |||
| 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 20 | 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 20 | 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 21 | |||
| 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 21 | 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 22 | |||
| 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 22 | 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 22 | 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 23 | 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 23 | |||
| 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 23 | 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 24 | |||
| 5.4.3. Connection Termination . . . . . . . . . . . . . . . . 24 | 5.4.3. Connection Termination . . . . . . . . . . . . . . . . 24 | |||
| 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 24 | 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 26 | 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 27 | 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 6.5.1. Setting Format . . . . . . . . . . . . . . . . . . . . 28 | 6.5.1. Setting Format . . . . . . . . . . . . . . . . . . . . 31 | |||
| 6.5.2. Defined Settings . . . . . . . . . . . . . . . . . . . 29 | 6.5.2. Defined Settings . . . . . . . . . . . . . . . . . . . 32 | |||
| 6.5.3. Settings Synchronization . . . . . . . . . . . . . . . 30 | 6.5.3. Settings Synchronization . . . . . . . . . . . . . . . 33 | |||
| 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 30 | 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 34 | 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 36 | 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 39 | |||
| 6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 36 | 6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 40 | |||
| 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 37 | 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 40 | |||
| 6.9.4. Ending Flow Control . . . . . . . . . . . . . . . . . 38 | 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 38 | 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 39 | 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 44 | |||
| 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 40 | 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 44 | |||
| 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 40 | 8.1.1. Informational Responses . . . . . . . . . . . . . . . 45 | |||
| 8.1.1. Informational Responses . . . . . . . . . . . . . . . 41 | 8.1.2. Examples . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 8.1.2. Examples . . . . . . . . . . . . . . . . . . . . . . . 42 | 8.1.3. HTTP Header Fields . . . . . . . . . . . . . . . . . . 48 | |||
| 8.1.3. HTTP Header Fields . . . . . . . . . . . . . . . . . . 44 | 8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . . 51 | |||
| 8.1.4. Request Reliability Mechanisms in HTTP/2.0 . . . . . . 47 | 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 48 | 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 53 | |||
| 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 48 | 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . . 54 | |||
| 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . . 49 | 8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . . 54 | |||
| 8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . . 50 | 9. Additional HTTP Requirements/Considerations . . . . . . . . . 56 | |||
| 9. Additional HTTP Requirements/Considerations . . . . . . . . . 51 | 9.1. Connection Management . . . . . . . . . . . . . . . . . . 56 | |||
| 9.1. Connection Management . . . . . . . . . . . . . . . . . . 51 | 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 56 | |||
| 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 52 | 9.3. GZip Content-Encoding . . . . . . . . . . . . . . . . . . 57 | |||
| 9.3. GZip Content-Encoding . . . . . . . . . . . . . . . . . . 52 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 57 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 52 | 10.1. Server Authority and Same-Origin . . . . . . . . . . . . . 57 | |||
| 10.1. Server Authority and Same-Origin . . . . . . . . . . . . . 53 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 58 | |||
| 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 53 | 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . . 58 | |||
| 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . . 53 | 10.4. Cacheability of Pushed Resources . . . . . . . . . . . . . 58 | |||
| 10.4. Cacheability of Pushed Resources . . . . . . . . . . . . . 54 | 10.5. Denial of Service Considerations . . . . . . . . . . . . . 59 | |||
| 10.5. Denial of Service Considerations . . . . . . . . . . . . . 54 | 10.6. Use of Padding . . . . . . . . . . . . . . . . . . . . . . 60 | |||
| 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 55 | 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 60 | |||
| 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 55 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 60 | |||
| 12.1. Registration of HTTP/2.0 Identification String . . . . . . 55 | 12.1. Registration of HTTP/2 Identification String . . . . . . . 61 | |||
| 12.2. Frame Type Registry . . . . . . . . . . . . . . . . . . . 56 | 12.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 61 | |||
| 12.3. Error Code Registry . . . . . . . . . . . . . . . . . . . 56 | 12.3. HTTP2-Settings Header Field Registration . . . . . . . . . 62 | |||
| 12.4. Settings Registry . . . . . . . . . . . . . . . . . . . . 57 | 12.4. PRI Method Registration . . . . . . . . . . . . . . . . . 62 | |||
| 12.5. HTTP2-Settings Header Field Registration . . . . . . . . . 58 | 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
| 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 58 | 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 58 | 14.1. Normative References . . . . . . . . . . . . . . . . . . . 63 | |||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . . 58 | 14.2. Informative References . . . . . . . . . . . . . . . . . . 65 | |||
| 14.2. Informative References . . . . . . . . . . . . . . . . . . 60 | ||||
| Appendix A. Change Log (to be removed by RFC Editor before | Appendix A. Change Log (to be removed by RFC Editor before | |||
| publication) . . . . . . . . . . . . . . . . . . . . 61 | publication) . . . . . . . . . . . . . . . . . . . . 65 | |||
| A.1. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 61 | A.1. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 65 | |||
| A.2. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 61 | A.2. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 66 | |||
| A.3. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 61 | A.3. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 66 | |||
| A.4. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 61 | A.4. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 66 | |||
| A.5. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 61 | A.5. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 66 | |||
| A.6. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 62 | A.6. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 67 | |||
| A.7. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 62 | A.7. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 67 | |||
| A.8. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 62 | A.8. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 67 | |||
| A.9. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 63 | A.9. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 68 | |||
| A.10. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 63 | A.10. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 68 | |||
| A.11. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 69 | ||||
| 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 outstanding at | In particular, HTTP/1.0 only allows one request to be outstanding at | |||
| skipping to change at page 5, line 43 ¶ | skipping to change at page 5, line 43 ¶ | |||
| 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 | |||
| The HTTP/2.0 Specification is split into three parts: starting | The HTTP/2 specification is split into four parts: | |||
| HTTP/2.0 (Section 3), which covers how a HTTP/2.0 connection is | ||||
| initiated; a framing layer (Section 4), which multiplexes a single | o Starting HTTP/2 (Section 3) covers how a HTTP/2 connection is | |||
| TCP connection into independent frames of various types; and an HTTP | initiated. | |||
| layer (Section 8), which specifies the mechanism for expressing HTTP | ||||
| interactions using the framing layer. While some of the framing | o The framing (Section 4) and streams (Section 5) layers describe | |||
| layer concepts are isolated from HTTP, building a generic framing | the way HTTP/2 frames are structured and formed into multiplexed | |||
| layer has not been a goal. The framing layer is tailored to the | streams. | |||
| needs of the HTTP protocol and server push. | ||||
| o Frame (Section 6) and error (Section 7) definitions include | ||||
| details of the frame and error types used in HTTP/2. | ||||
| o HTTP mappings (Section 8) and additional requirements (Section 9) | ||||
| describe how HTTP semantics are expressed using the mechanisms | ||||
| defined. | ||||
| While some of the frame and stream layer concepts are isolated from | ||||
| HTTP, the intent is not to define a completely generic framing layer. | ||||
| The framing and streams layers are tailored to the needs of the HTTP | ||||
| protocol and server push. | ||||
| 1.2. Conventions and Terminology | 1.2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
| All numeric values are in network byte order. Values are unsigned | All numeric values are in network byte order. Values are unsigned | |||
| unless otherwise indicated. Literal values are provided in decimal | unless otherwise indicated. Literal values are provided in decimal | |||
| or hexadecimal as appropriate. Hexadecimal literals are prefixed | or hexadecimal as appropriate. Hexadecimal literals are prefixed | |||
| with "0x" to distinguish them from decimal literals. | with "0x" to distinguish them from decimal literals. | |||
| The following terms are used: | The following terms are used: | |||
| client: The endpoint initiating the HTTP connection. | client: The endpoint initiating the HTTP/2 connection. | |||
| connection: A transport-level connection between two endpoints. | connection: A transport-level connection between two endpoints. | |||
| connection error: An error on the HTTP/2.0 connection. | connection error: An error that affects the entire HTTP/2 | |||
| connection. | ||||
| endpoint: Either the client or server of the connection. | endpoint: Either the client or server of the connection. | |||
| frame: The smallest unit of communication within an HTTP/2.0 | frame: The smallest unit of communication within an HTTP/2 | |||
| connection, consisting of a header and a variable-length sequence | connection, consisting of a header and a variable-length sequence | |||
| of bytes structured according to the frame type. | of bytes structured according to the frame type. | |||
| peer: An endpoint. When discussing a particular endpoint, "peer" | peer: An endpoint. When discussing a particular endpoint, "peer" | |||
| refers to the endpoint that is remote to the primary subject of | refers to the endpoint that is remote to the primary subject of | |||
| discussion. | discussion. | |||
| receiver: An endpoint that is receiving frames. | receiver: An endpoint that is receiving frames. | |||
| sender: An endpoint that is transmitting frames. | sender: An endpoint that is transmitting frames. | |||
| server: The endpoint which did not initiate the HTTP connection. | server: The endpoint which did not initiate the HTTP/2 connection. | |||
| stream: A bi-directional flow of frames across a virtual channel | stream: A bi-directional flow of frames across a virtual channel | |||
| within the HTTP/2.0 connection. | within the HTTP/2 connection. | |||
| stream error: An error on the individual HTTP/2.0 stream. | stream error: An error on the individual HTTP/2 stream. | |||
| 2. HTTP/2.0 Protocol Overview | 2. HTTP/2 Protocol Overview | |||
| HTTP/2.0 provides an optimized transport for HTTP semantics. | HTTP/2 provides an optimized transport for HTTP semantics. | |||
| An HTTP/2.0 connection is an application level protocol running on | An HTTP/2 connection is an application level protocol running on top | |||
| top of a TCP connection ([TCP]). The client is the TCP connection | of a TCP connection ([TCP]). The client is the TCP connection | |||
| initiator. | initiator. | |||
| This document describes the HTTP/2.0 protocol using a logical | This document describes the HTTP/2 protocol using a logical structure | |||
| structure that is formed of three parts: framing, streams, and | that is formed of three parts: framing, streams, and application | |||
| application mapping. This structure is provided primarily as an aid | mapping. This structure is provided primarily as an aid to | |||
| to specification, implementations are free to diverge from this | specification, implementations are free to diverge from this | |||
| structure as necessary. | structure as necessary. | |||
| 2.1. HTTP Frames | 2.1. HTTP Frames | |||
| HTTP/2.0 provides an efficient serialization of HTTP semantics. HTTP | HTTP/2 provides an efficient serialization of HTTP semantics. HTTP | |||
| requests and responses are encoded into length-prefixed frames (see | requests and responses are encoded into length-prefixed frames (see | |||
| Section 4.1). | Section 4.1). | |||
| HTTP header fields are compressed into a series of frames that | HTTP header fields are compressed into a series of frames that | |||
| contain header block fragments (see Section 4.3). | contain header block fragments (see Section 4.3). | |||
| 2.2. HTTP Multiplexing | 2.2. HTTP Multiplexing | |||
| HTTP/2.0 provides the ability to multiplex HTTP requests and | HTTP/2 provides the ability to multiplex HTTP requests and responses | |||
| responses over a single connection. Multiple requests or responses | over a single connection. Multiple requests or responses can be sent | |||
| can be sent concurrently on a connection using streams (Section 5). | concurrently on a connection using streams (Section 5). In order to | |||
| In order to maintain independent streams, flow control and | maintain independent streams, flow control and prioritization are | |||
| prioritization are necessary. | necessary. | |||
| 2.3. HTTP Semantics | 2.3. HTTP Semantics | |||
| HTTP/2.0 defines how HTTP requests and responses are mapped to | HTTP/2 defines how HTTP requests and responses are mapped to streams | |||
| streams (see Section 8.1) and introduces a new interaction model, | (see Section 8.1) and introduces a new interaction model, server push | |||
| server push (Section 8.2). | (Section 8.2). | |||
| 3. Starting HTTP/2.0 | 3. Starting HTTP/2 | |||
| HTTP/2.0 uses the same "http" and "https" URI schemes used by | HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. | |||
| HTTP/1.1. HTTP/2.0 shares the same default port numbers: 80 for | HTTP/2 shares the same default port numbers: 80 for "http" URIs and | |||
| "http" URIs and 443 for "https" URIs. As a result, implementations | 443 for "https" URIs. As a result, implementations processing | |||
| processing requests for target resource URIs like | requests for target resource URIs like "http://example.org/foo" or | |||
| "http://example.org/foo" or "https://example.com/bar" are required to | "https://example.com/bar" are required to first discover whether the | |||
| first discover whether the upstream server (the immediate peer to | upstream server (the immediate peer to which the client wishes to | |||
| which the client wishes to establish a connection) supports HTTP/2.0. | establish a connection) supports HTTP/2. | |||
| The means by which support for HTTP/2.0 is determined is different | The means by which support for HTTP/2 is determined is different for | |||
| for "http" and "https" URIs. Discovery for "http" URIs is described | "http" and "https" URIs. Discovery for "http" URIs is described in | |||
| in Section 3.2. Discovery for "https" URIs is described in | Section 3.2. Discovery for "https" URIs is described in Section 3.3. | |||
| Section 3.3. | ||||
| 3.1. HTTP/2.0 Version Identification | 3.1. HTTP/2 Version Identification | |||
| The protocol defined in this document is identified using the string | The protocol defined in this document is identified using the string | |||
| "HTTP/2.0". This identification is used in the HTTP/1.1 Upgrade | "h2". This identification is used in the HTTP/1.1 Upgrade header | |||
| header field, in the TLS application layer protocol negotiation | field, in the TLS application layer protocol negotiation extension | |||
| extension [TLSALPN] field, and other places where protocol | [TLSALPN] field, and other places where protocol identification is | |||
| identification is required. | required. | |||
| Negotiating "HTTP/2.0" implies the use of the transport, security, | Negotiating "h2" implies the use of the transport, security, framing | |||
| framing and message semantics described in this document. | and message semantics described in this document. | |||
| [[anchor6: Editor's Note: please remove the remainder of this section | [[anchor6: Editor's Note: please remove the remainder of this section | |||
| prior to 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 "h2". Until such an RFC exists, implementations MUST | |||
| MUST NOT identify themselves using "HTTP/2.0". | NOT identify themselves using "h2". | |||
| Examples and text throughout the rest of this document use "HTTP/2.0" | Examples and text throughout the rest of this document use "h2" as a | |||
| as a matter of editorial convenience only. Implementations of draft | matter of editorial convenience only. Implementations of draft | |||
| versions MUST NOT identify using this string. The exception to this | versions MUST NOT identify using this string. | |||
| 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 | "-" and the corresponding draft number to the identifier. For | |||
| the separator ('/'). For example, draft-ietf-httpbis-http2-03 is | example, draft-ietf-httpbis-http2-09 is identified using the string | |||
| identified using the string "HTTP-draft-03/2.0". | "h2-09". | |||
| 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 append the string "-" and a experiment name to the 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-09 might identify itself | |||
| as "HTTP-emo-07/2.0". Note that any label MUST conform to the | as "h2-09-emo". Note that any label MUST conform to the "token" | |||
| "token" syntax defined in Section 3.2.6 of [HTTP-p1]. Experimenters | syntax defined in Section 3.2.6 of [HTTP-p1]. Experimenters are | |||
| are encouraged to coordinate their experiments on the | encouraged to coordinate their experiments on the ietf-http-wg@w3.org | |||
| ietf-http-wg@w3.org mailing list. | mailing list. | |||
| 3.2. Starting HTTP/2.0 for "http" URIs | 3.2. Starting HTTP/2 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 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 with the h2 | |||
| HTTP/1.1 request MUST include exactly one HTTP2-Settings | token. The HTTP/1.1 request MUST include exactly one HTTP2-Settings | |||
| (Section 3.2.1) 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: h2 | |||
| HTTP2-Settings: <base64url encoding of HTTP/2.0 SETTINGS payload> | HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload> | |||
| Requests that contain an entity body MUST be sent in their entirety | Requests that contain an entity body MUST be sent in their entirety | |||
| before the client can send HTTP/2.0 frames. This means that a large | before the client can send HTTP/2 frames. This means that a large | |||
| request entity can block the use of the connection until it is | request entity can block the use of the connection until it is | |||
| completely sent. | completely sent. | |||
| If concurrency of an initial request with subsequent requests is | If concurrency of an initial request with subsequent requests is | |||
| important, a small request can be used to perform the upgrade to | important, a small request can be used to perform the upgrade to | |||
| HTTP/2.0, at the cost of an additional round-trip. | HTTP/2, at the cost of an additional round-trip. | |||
| A server that does not support HTTP/2.0 can respond to the request as | A server that does not support HTTP/2 can respond to the request as | |||
| though the Upgrade header field were absent: | though the Upgrade header field were absent: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Length: 243 | Content-Length: 243 | |||
| Content-Type: text/html | Content-Type: text/html | |||
| ... | ... | |||
| A server that supports HTTP/2.0 can accept the upgrade with a 101 | A server that supports HTTP/2 can accept the upgrade with a 101 | |||
| (Switching Protocols) response. After the empty line that terminates | (Switching Protocols) response. After the empty line that terminates | |||
| the 101 response, the server can begin sending HTTP/2.0 frames. | the 101 response, the server can begin sending HTTP/2 frames. These | |||
| These frames MUST include a response to the request that initiated | frames MUST include a response to the request that initiated the | |||
| the Upgrade. | Upgrade. | |||
| HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Upgrade: HTTP/2.0 | Upgrade: h2 | |||
| [ HTTP/2.0 connection ... | [ HTTP/2 connection ... | |||
| The first HTTP/2.0 frame sent by the server is a SETTINGS frame | The first HTTP/2 frame sent by the server is a SETTINGS frame | |||
| (Section 6.5). Upon receiving the 101 response, the client sends a | (Section 6.5). Upon receiving the 101 response, the client sends a | |||
| connection header (Section 3.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 assigned stream | The HTTP/1.1 request that is sent prior to upgrade is assigned stream | |||
| identifier 1 and is assigned the highest possible priority. Stream 1 | identifier 1 and is assigned the highest possible priority. Stream 1 | |||
| is implicitly half closed from the client toward the server, since | is 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. | the HTTP/2 connection, stream 1 is used for the response. | |||
| 3.2.1. HTTP2-Settings Header Field | 3.2.1. HTTP2-Settings Header Field | |||
| A request that upgrades from HTTP/1.1 to HTTP/2.0 MUST include | A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly | |||
| exactly one "HTTP2-Settings" header field. The "HTTP2-Settings" | one "HTTP2-Settings" header field. The "HTTP2-Settings" header field | |||
| header field is a hop-by-hop header field that includes settings that | is a hop-by-hop header field that includes settings that govern the | |||
| govern the HTTP/2.0 connection, provided in anticipation of the | HTTP/2 connection, provided in anticipation of the server accepting | |||
| server accepting the request to upgrade. A server MUST reject an | the request to upgrade. A server MUST reject an attempt to upgrade | |||
| attempt to upgrade if this header field is not present. | if this header field 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 | |||
| [RFC5234] production for "token68" is defined in Section 2.1 of | [RFC5234] production for "token68" is defined in Section 2.1 of | |||
| [HTTP-p7]. | [HTTP-p7]. | |||
| The client MUST include values for the following settings | The client MUST include values for the following settings | |||
| (Section 6.5.1): | (Section 6.5.1): | |||
| o SETTINGS_MAX_CONCURRENT_STREAMS | o SETTINGS_MAX_CONCURRENT_STREAMS | |||
| o SETTINGS_INITIAL_WINDOW_SIZE | o SETTINGS_INITIAL_WINDOW_SIZE | |||
| As a hop-by-hop header field, the "Connection" header field MUST | As a hop-by-hop header field, the "Connection" header field MUST | |||
| include a value of "HTTP2-Settings" in addition to "Upgrade" when | include a value of "HTTP2-Settings" in addition to "Upgrade" when | |||
| upgrading to HTTP/2.0. | upgrading to HTTP/2. | |||
| 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. Acknowledgement of the settings (Section 6.5.3) is | |||
| not necessary, since a 101 response serves as implicit | ||||
| acknowledgment. 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 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 [TLS12] with the | knowledge about support for HTTP/2 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 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 by other | |||
| other means. A client MAY immediately send HTTP/2.0 frames to a | means. For example, [AltSvc] describes a mechanism for advertising | |||
| server that is known to support HTTP/2.0, after the connection header | this capability in an HTTP header field. A client MAY immediately | |||
| (Section 3.5). This only affects the resolution of "http" URIs; | send HTTP/2 frames to a server that is known to support HTTP/2, after | |||
| servers supporting HTTP/2.0 are required to support protocol | the connection header (Section 3.5). A server can identify such a | |||
| negotiation in TLS [TLSALPN] for "https" URIs. | connection by the use of the "PRI" method in the connection header. | |||
| This only affects the resolution of "http" URIs; servers supporting | ||||
| HTTP/2 are required to support protocol negotiation in TLS [TLSALPN] | ||||
| for "https" URIs. | ||||
| Prior support for HTTP/2.0 is not a strong signal that a given server | Prior support for HTTP/2 is not a strong signal that a given server | |||
| will support HTTP/2.0 for future connections. It is possible for | will support HTTP/2 for future connections. It is possible for | |||
| server configurations to change or for configurations to differ | server configurations to change or for configurations to differ | |||
| between instances in clustered server. Interception proxies (a.k.a. | between instances in clustered server. Interception proxies (a.k.a. | |||
| "transparent" proxies) are another source of variability. | "transparent" proxies) are another source of variability. | |||
| 3.5. HTTP/2.0 Connection Header | 3.5. HTTP/2 Connection Header | |||
| Upon establishment of a TCP connection and determination that | Upon establishment of a TCP connection and determination that HTTP/2 | |||
| HTTP/2.0 will be used by both peers, each endpoint MUST send a | will be used by both peers, each endpoint MUST send a connection | |||
| connection header as a final confirmation and to establish the | header as a final confirmation and to establish the initial settings | |||
| initial settings for the HTTP/2.0 connection. | for the HTTP/2 connection. | |||
| The client connection header starts with a sequence of 24 octets, | The client connection header starts with a sequence of 24 octets, | |||
| which in hex notation are: | which in hex notation are: | |||
| 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | |||
| (the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence is | (the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence is | |||
| followed by a SETTINGS frame (Section 6.5). The client sends the | followed by a SETTINGS frame (Section 6.5). The client sends the | |||
| client connection header immediately upon receipt of a 101 Switching | client connection header immediately upon receipt of a 101 Switching | |||
| Protocols response (indicating a successful upgrade), or as the first | Protocols response (indicating a successful upgrade), or as the first | |||
| application data octets of a TLS connection. If starting an HTTP/2.0 | application data octets of a TLS connection. If starting an HTTP/2 | |||
| connection with prior knowledge of server support for the protocol, | connection with prior knowledge of server support for the protocol, | |||
| the client connection header is sent upon connection establishment. | the client 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 | |||
| HTTP/2.0 connection. | HTTP/2 connection. | |||
| To avoid unnecessary latency, clients are permitted to send | To avoid unnecessary latency, clients are permitted to send | |||
| additional frames to the server immediately after sending the client | additional frames to the server immediately after sending the client | |||
| connection header, without waiting to receive the server connection | connection header, without waiting to receive the server connection | |||
| header. It is important to note, however, that the server connection | header. It is important to note, however, that the server connection | |||
| header SETTINGS frame might include parameters that necessarily alter | header SETTINGS frame might include parameters that necessarily alter | |||
| how a client is expected to communicate with the server. Upon | how a client is expected to communicate with the server. Upon | |||
| receiving the SETTINGS frame, the client is expected to honor any | receiving the SETTINGS frame, the client is expected to honor any | |||
| parameters established. | parameters established. | |||
| Clients and servers MUST terminate the TCP connection if either peer | Clients and servers MUST terminate the TCP connection if either peer | |||
| does not begin with a valid connection header. A GOAWAY frame | does not begin with a valid connection header. A GOAWAY frame | |||
| (Section 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. | |||
| 4. HTTP Frames | 4. HTTP Frames | |||
| Once the HTTP/2.0 connection is established, endpoints can begin | Once the HTTP/2 connection is established, endpoints can begin | |||
| exchanging frames. | exchanging frames. | |||
| 4.1. Frame Format | 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 16,383 octets. | between 0 and 16,383 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 12, line 35 ¶ | skipping to change at page 13, line 6 ¶ | |||
| |R| Stream Identifier (31) | | |R| Stream Identifier (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| | Frame Payload (0...) ... | | Frame Payload (0...) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Frame Header | Frame Header | |||
| The fields of the frame header are defined as: | The fields of the frame header are defined as: | |||
| R: A reserved 2-bit field. The semantics of these bits are undefined | R: A reserved 2-bit field. The semantics of these bits are undefined | |||
| and the bit MUST remain unset (0) when sending and MUST be ignored | and the bits MUST remain unset (0) when sending and MUST be | |||
| when receiving. | ignored when receiving. | |||
| Length: The length of the frame payload expressed as an unsigned 14- | Length: The length of the frame payload expressed as an unsigned 14- | |||
| 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 frames of unsupported or unrecognized | Implementations MUST treat the receipt of an unknown frame type | |||
| types. | (any frame type not defined in this document) as a connection | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 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 | |||
| and the bit MUST remain unset (0) when sending and MUST be ignored | and the bit MUST remain unset (0) when sending and MUST be ignored | |||
| skipping to change at page 13, line 30 ¶ | skipping to change at page 13, line 51 ¶ | |||
| implementations SHOULD be capable of receiving and minimally | implementations SHOULD be capable of receiving and minimally | |||
| processing frames up to this maximum size. | processing frames up to this maximum size. | |||
| Certain frame types, such as PING (see Section 6.7), impose | Certain frame types, such as PING (see Section 6.7), impose | |||
| additional limits on the amount of payload data allowed. Likewise, | additional limits on the amount of payload data allowed. Likewise, | |||
| additional size limits can be set by specific application uses (see | additional size limits can be set by specific application uses (see | |||
| Section 9). | Section 9). | |||
| If a frame size exceeds any defined limit, or is too small to contain | If a frame size exceeds any defined limit, or is too small to contain | |||
| mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | |||
| error. Frame size errors in frames that affect connection-level | error. A frame size error in a frame that affects connection-level | |||
| state MUST be treated as a connection error (Section 5.4.1). | state MUST be treated as a connection error (Section 5.4.1). | |||
| 4.3. Header Compression and Decompression | 4.3. Header Compression and Decompression | |||
| A header field in HTTP/2.0 is a name-value pair with one or more | A header field in HTTP/2 is a name-value pair with one or more | |||
| associated values. They are used within HTTP request and response | associated values. They are used within HTTP request and response | |||
| messages as well as server push operations (see Section 8.2). | messages as well as server push operations (see Section 8.2). | |||
| Header sets are collections of zero or more header fields arranged at | Header sets are collections of zero or more header fields. When | |||
| the application layer. When transmitted over a connection, a header | transmitted over a connection, a header set is serialized into a | |||
| set is serialized into a header block using HTTP Header Compression | header block using HTTP Header Compression [COMPRESSION]. The | |||
| [COMPRESSION]. The serialized header block is then divided into one | serialized header block is then divided into one or more octet | |||
| or more octet sequences, called header block fragments, and | sequences, called header block fragments, and transmitted within the | |||
| transmitted within the payload of HEADERS (Section 6.2), PUSH_PROMISE | payload of HEADERS (Section 6.2), PUSH_PROMISE (Section 6.6) or | |||
| (Section 6.6) or CONTINUATION (Section 6.10) frames. | CONTINUATION (Section 6.10) frames. | |||
| HTTP Header Compression does not preserve the relative ordering of | HTTP Header Compression does not preserve the relative ordering of | |||
| header fields. Header fields with multiple values are encoded into a | header fields. Header fields with multiple values are encoded into a | |||
| single header field using a special delimiter, see Section 8.1.3.3. | single header field using a special delimiter, see Section 8.1.3.3. | |||
| The Cookie header field [COOKIE] is treated specially by the HTTP | The Cookie header field [COOKIE] is treated specially by the HTTP | |||
| mapping, see Section 8.1.3.4. | mapping, see Section 8.1.3.4. | |||
| A receiving endpoint reassembles the header block by concatenating | A receiving endpoint reassembles the header block by concatenating | |||
| the individual fragments, then decompresses the block to reconstruct | the individual fragments, then decompresses the block to reconstruct | |||
| the header set. | the header set. | |||
| A complete header block consists of either: | A complete header block consists of either: | |||
| o a single HEADERS or PUSH_PROMISE frame each respectively with the | o a single HEADERS or PUSH_PROMISE frame each respectively with the | |||
| END_HEADERS or END_PUSH_PROMISE flag set, or | END_HEADERS or END_PUSH_PROMISE flag set, or | |||
| o a HEADERS or PUSH_PROMISE frame with the END_HEADERS or | o a HEADERS or PUSH_PROMISE frame with the END_HEADERS or | |||
| END_PUSH_PROMISE flag cleared and one or more CONTINUATION frames, | END_PUSH_PROMISE flag cleared and one or more CONTINUATION frames, | |||
| where the last CONTINUATION frame has the END_HEADER flag set. | where the last CONTINUATION frame has the END_HEADERS flag set. | |||
| 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 or CONTINUATION | stream. The last frame in a sequence of HEADERS or CONTINUATION | |||
| frames MUST have the END_HEADERS flag set. The last frame in a | frames MUST have the END_HEADERS flag set. The last frame in a | |||
| sequence of PUSH_PROMISE or CONTINUATION frames MUST have the | sequence of PUSH_PROMISE or CONTINUATION frames MUST have the | |||
| END_PUSH_PROMISE or END_HEADERS flag set (respectively). | END_PUSH_PROMISE or END_HEADERS flag set (respectively). | |||
| Header block fragments can only be sent as the payload of HEADERS, | Header block fragments can only be sent as the payload of HEADERS, | |||
| PUSH_PROMISE or CONTINUATION frames. HEADERS, PUSH_PROMISE and | PUSH_PROMISE or CONTINUATION frames. HEADERS, PUSH_PROMISE and | |||
| skipping to change at page 14, line 38 ¶ | skipping to change at page 15, line 10 ¶ | |||
| context maintained by a receiver. An endpoint receiving HEADERS, | context maintained by a receiver. An endpoint receiving HEADERS, | |||
| PUSH_PROMISE or CONTINUATION frames MUST reassemble header blocks and | PUSH_PROMISE or CONTINUATION frames MUST reassemble header blocks and | |||
| perform decompression even if the frames are to be discarded. A | perform decompression even if the frames are to be discarded. A | |||
| receiver MUST terminate the connection with a connection error | receiver MUST terminate the connection with a connection error | |||
| (Section 5.4.1) of type COMPRESSION_ERROR, if it does not decompress | (Section 5.4.1) of type COMPRESSION_ERROR, if it does not decompress | |||
| a header block. | a header block. | |||
| 5. Streams and Multiplexing | 5. Streams and Multiplexing | |||
| A "stream" is an independent, bi-directional sequence of HEADERS 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 | |||
| HTTP/2.0 connection. Streams have several important characteristics: | connection. Streams have several important characteristics: | |||
| o A single HTTP/2.0 connection can contain multiple concurrently | o A single HTTP/2 connection can contain multiple concurrently open | |||
| open streams, with either endpoint interleaving frames from | streams, with either endpoint interleaving frames from multiple | |||
| multiple streams. | 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. | |||
| o Streams can be closed by either endpoint. | o Streams can be closed by either endpoint. | |||
| o The order in which frames are sent within a stream is significant. | o The order in which frames are sent within a stream is significant. | |||
| Recipients process frames in the order they are received. | Recipients process frames in the order they are received. | |||
| o Streams are identified by an integer. Stream identifiers are | o Streams are identified by an integer. Stream identifiers are | |||
| skipping to change at page 18, line 51 ¶ | skipping to change at page 19, line 42 ¶ | |||
| MAY choose to limit the period over which it ignores frames and | MAY choose to limit the period over which it ignores frames and | |||
| treat frames that arrive after this time as being in error. | treat frames that arrive after this time as being in error. | |||
| Flow controlled frames (i.e., DATA) received after sending | Flow controlled frames (i.e., DATA) received after sending | |||
| RST_STREAM are counted toward the connection flow control window. | RST_STREAM are counted toward the connection flow control window. | |||
| Even though these frames might be ignored, because they are sent | Even though these frames might be ignored, because they are sent | |||
| before the sender receives the RST_STREAM, the sender will | before the sender receives the RST_STREAM, the sender will | |||
| consider the frames to count against the flow control window. | consider the frames to count against the flow control window. | |||
| An endpoint might receive a PUSH_PROMISE frame after it sends | An endpoint might receive a PUSH_PROMISE frame after it sends | |||
| RST_STREAM. PUSH_PROMISE causes a stream to become "reserved". | RST_STREAM. PUSH_PROMISE causes a stream to become "reserved" | |||
| even if the associated stream has been reset. Therefore, a | ||||
| The RST_STREAM does not cancel any promised stream. Therefore, if | RST_STREAM is needed to close an unwanted promised streams. | |||
| 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, | In the absence of more specific guidance elsewhere in this document, | |||
| implementations SHOULD treat the receipt of a message that is not | implementations SHOULD treat the receipt of a message that is not | |||
| expressly permitted in the description of a state as a connection | expressly permitted in the description of a state as a connection | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | 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 | messages; 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 | 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). After | request which was specified during Upgrade (see Section 3.2). After | |||
| the upgrade completes, stream 0x1 is "half closed (local)" to the | the upgrade completes, stream 0x1 is "half closed (local)" to the | |||
| client. Therefore, stream 0x1 cannot be selected as a new stream | client. Therefore, stream 0x1 cannot be selected as a new stream | |||
| identifier by a client that upgrades from HTTP/1.1. | identifier by a client that upgrades from HTTP/1.1. | |||
| 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 | |||
| skipping to change at page 20, line 28 ¶ | skipping to change at page 21, line 19 ¶ | |||
| promised stream can be successfully used. | promised stream can be successfully used. | |||
| 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 provides for flow control through use of the WINDOW_UPDATE | |||
| frame type. | frame type. | |||
| 5.2.1. Flow Control Principles | 5.2.1. Flow Control Principles | |||
| HTTP/2.0 stream flow control aims to allow for future improvements to | HTTP/2 stream flow control aims to allow for future improvements to | |||
| flow control algorithms without requiring protocol changes. Flow | flow control algorithms without requiring protocol changes. Flow | |||
| control in HTTP/2.0 has the following characteristics: | control in HTTP/2 has the following characteristics: | |||
| 1. Flow control is hop-by-hop, not end-to-end. | 1. Flow control is hop-by-hop, not end-to-end. | |||
| 2. Flow control is based on window update frames. Receivers | 2. Flow control is based on window update frames. Receivers | |||
| advertise how many bytes they are prepared to receive on a stream | advertise how many bytes they are prepared to receive on a stream | |||
| 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 window as a receiver and abide by the flow control limits | |||
| limits set by their peer when sending. | set by their peer when sending. | |||
| 4. The initial value for the flow control window is 65,535 bytes for | 4. The initial value for the flow control window is 65,535 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 cannot be disabled. | |||
| choose to disable both forms of flow control by sending the | ||||
| SETTINGS_FLOW_CONTROL_OPTIONS setting. See Ending Flow Control | ||||
| (Section 6.9.4) for more details. | ||||
| 7. HTTP/2.0 standardizes only the format of the WINDOW_UPDATE frame | 7. HTTP/2 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. | |||
| Algorithm choices for these could interact with any flow control | Algorithm choices for these could interact with any flow control | |||
| algorithm. | algorithm. | |||
| 5.2.2. Appropriate Use of Flow Control | 5.2.2. Appropriate Use of Flow Control | |||
| Flow control is defined to protect endpoints that are operating under | Flow control is defined to protect endpoints that are operating under | |||
| resource constraints. For example, a proxy needs to share memory | resource constraints. For example, a proxy needs to share memory | |||
| between many connections, and also might have a slow upstream | between many connections, and also might have a slow upstream | |||
| connection and a fast downstream one. Flow control addresses cases | connection and a fast downstream one. Flow control addresses cases | |||
| where the receiver is unable process data on one stream, yet wants to | where the receiver is unable process data on one stream, yet wants to | |||
| continue to process other streams in the same connection. | continue to process other streams in the same connection. | |||
| Deployments that do not require this capability SHOULD disable flow | Deployments that do not require this capability can advertise a flow | |||
| control for data that is being received. Note that flow control | control of the maximum size, incrementing the available space when | |||
| cannot be disabled for sending. Sending data is always subject to | new data is received. Sending data is always subject to the flow | |||
| the flow control window advertised by the receiver. | 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 can be difficult. When using flow | implementation of flow control can be difficult. When using flow | |||
| control, the receive MUST read from the TCP receive buffer in a | control, the receiver MUST read from the TCP receive buffer in a | |||
| timely fashion. Failure to do so could lead to a deadlock when | timely fashion. Failure to do so could lead to a deadlock when | |||
| critical frames, such as WINDOW_UPDATE, are not available to | critical frames, such as WINDOW_UPDATE, are not available to HTTP/2. | |||
| HTTP/2.0. However, flow control can ensure that constrained | However, flow control can ensure that constrained resources are | |||
| resources are protected without any reduction in connection | protected without any reduction in connection utilization. | |||
| 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 an endpoint to express the | The purpose of this value is to allow an endpoint to express the | |||
| relative priority of a stream. An endpoint can use this information | relative priority of a stream. An endpoint can use this information | |||
| to preferentially allocate resources to a stream. Within HTTP/2.0, | to preferentially allocate resources to a stream. Within HTTP/2, | |||
| priority can be used to select streams for transmitting frames when | priority can be used to select streams for transmitting frames when | |||
| there is limited capacity for sending. For instance, an endpoint | there is limited capacity for sending. For instance, an endpoint | |||
| might enqueue frames for all concurrently active streams. As | might enqueue frames for all concurrently active streams. As | |||
| transmission capacity becomes available, frames from higher priority | transmission capacity becomes available, frames from higher priority | |||
| streams might be sent before lower priority streams. | 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 or transmission order for the stream relative | particular processing or transmission order for the stream relative | |||
| to any other stream. Nor is there any mechanism provided by which | to any other stream. Nor is there any mechanism provided by which | |||
| the initiator of a stream can force or require a receiving endpoint | the initiator of a stream can force or require a receiving endpoint | |||
| skipping to change at page 22, line 43 ¶ | skipping to change at page 23, line 29 ¶ | |||
| 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. | stream creation, the default stream priority is 2^30. | |||
| Pushed streams (Section 8.2) have a lower priority than their | Pushed streams (Section 8.2) have a lower priority than their | |||
| associated stream. The promised stream inherits the priority value | associated stream. The promised stream inherits the priority value | |||
| of the associated stream plus one, up to a maximum of 2^31-1. | 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 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 | |||
| skipping to change at page 24, line 33 ¶ | skipping to change at page 25, line 17 ¶ | |||
| any given frame. Accordingly, while it is expected that new frame | any given frame. Accordingly, while it is expected that new frame | |||
| types will be introduced by extensions to this protocol, only frames | types will be introduced by extensions to this protocol, only frames | |||
| defined by this document are permitted to alter the connection state. | defined by this document are permitted to alter the connection state. | |||
| 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. | |||
| DATA frames MAY also contain arbitrary padding. Padding can be added | ||||
| to DATA frames to hide the size of messages. | ||||
| 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [Pad High(8)] | [Pad Low (8)] | Data (*) . | ||||
| +---------------+---------------+-------------------------------+ | ||||
| . Data (*) ... | ||||
| +---------------------------------------------------------------+ | ||||
| | Padding (*) ... | ||||
| +---------------------------------------------------------------+ | ||||
| DATA Frame Payload | ||||
| The DATA frame contains the following fields: | ||||
| Pad High: An 8-bit field containing an amount of padding in units of | ||||
| 256 octets. This field is optional and is only present if the | ||||
| PAD_HIGH flag is set. This field, in combination with Pad Low, | ||||
| determines how much padding there is on a frame. | ||||
| Pad Low: An 8-bit field containing an amount of padding in units of | ||||
| single octets. This field is optional and is only present if the | ||||
| PAD_LOW flag is set. This field, in combination with Pad High, | ||||
| determines how much padding there is on a frame. | ||||
| Data: Application data. The amount of data is the remainder of the | ||||
| frame payload after subtracting the length of the other fields | ||||
| that are present. | ||||
| Padding: Padding octets that contain no application semantic value. | ||||
| Padding octets MUST be set to zero when sending and ignored when | ||||
| receiving. | ||||
| 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 one of "half closed" | Setting this flag causes the stream to enter one of the "half | |||
| states or "closed" state (Section 5.1). | closed" states or the "closed" state (Section 5.1). | |||
| RESERVED (0x2): Bit 2 is reserved for future use. | END_SEGMENT (0x2): Bit 2 being set indicates that this frame is the | |||
| last for the current segment. Intermediaries MUST NOT coalesce | ||||
| frames across a segment boundary and MUST preserve segment | ||||
| boundaries when forwarding frames. | ||||
| PAD_LOW (0x10): Bit 5 being set indicates that the Pad Low field is | ||||
| present. | ||||
| PAD_HIGH (0x20): Bit 6 being set indicates that the Pad High field | ||||
| is present. This bit MUST NOT be set unless the PAD_LOW flag is | ||||
| also set. Endpoints that receive a frame with PAD_HIGH set and | ||||
| PAD_LOW cleared MUST treat this as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 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 | DATA frames are subject to flow control and can only be sent when a | |||
| stream is in the "open" or "half closed (remote)" states. If a DATA | stream is in the "open" or "half closed (remote)" states. Padding is | |||
| frame is received whose stream is not in "open" or "half closed | not excluded from flow control. If a DATA frame is received whose | |||
| (local)" state, the recipient MUST respond with a stream error | stream is not in "open" or "half closed (local)" state, the recipient | |||
| (Section 5.4.2) of type STREAM_CLOSED. | MUST respond with a stream error (Section 5.4.2) of type | |||
| STREAM_CLOSED. | ||||
| The total number of padding octets is determined by multiplying the | ||||
| value of the Pad High field by 256 and adding the value of the Pad | ||||
| Low field. Both Pad High and Pad Low fields assume a value of zero | ||||
| if absent. If the length of the padding is greater than the length | ||||
| of the remainder of the frame payload, the recipient MUST treat this | ||||
| as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| Note: A frame can be increased in size by one octet by including a | ||||
| Pad Low field with a value of zero. | ||||
| Use of padding is a security feature; as such, its use demands some | ||||
| care, see Section 10.6. | ||||
| 6.2. HEADERS | 6.2. HEADERS | |||
| The HEADERS frame (type=0x1) carries name-value pairs. It is used to | The HEADERS frame (type=0x1) carries name-value pairs. It is used to | |||
| open a stream (Section 5.1). HEADERS frames can be sent on a stream | open a stream (Section 5.1). HEADERS frames can be sent on a stream | |||
| in the "open" or "half closed (remote)" states. | 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) | | | [Pad High(8)] | [Pad Low (8)] |X| [Priority (31)] ... | |||
| +-+-------------------------------------------------------------+ | +---------------+---------------+-+-----------------------------+ | |||
| ...[Priority] | Header Block Fragment (*) ... | ||||
| +-------------------------------+-------------------------------+ | ||||
| | Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Padding (*) ... | ||||
| +---------------------------------------------------------------+ | ||||
| HEADERS Frame Payload | HEADERS Frame Payload | |||
| The HEADERS frame payload has the following fields: | ||||
| Pad High: Padding size high bits. This field is only present if the | ||||
| PAD_HIGH flag is set. | ||||
| Pad Low: Padding size low bits. This field is only present if the | ||||
| PAD_LOW flag is set. | ||||
| X: A single reserved bit. This field is optional and is only present | ||||
| if the PRIORITY flag is set. | ||||
| Priority: Prioritization information for the stream, see | ||||
| Section 5.3. This field is optional and is only present if the | ||||
| PRIORITY flag is set. | ||||
| Header Block Fragment: A header block fragment (Section 4.3). | ||||
| Padding: Padding octets. | ||||
| The HEADERS frame defines the following flags: | The HEADERS frame defines the following flags: | |||
| END_STREAM (0x1): Bit 1 being set indicates that the header block | END_STREAM (0x1): Bit 1 being set indicates that the header block | |||
| (Section 4.3) is the last that the endpoint will send for the | (Section 4.3) is the last that the endpoint will send for the | |||
| identified stream. Setting this flag causes the stream to enter | identified stream. Setting this flag causes the stream to enter | |||
| one of "half closed" states (Section 5.1). | one of "half closed" states (Section 5.1). | |||
| A HEADERS frame that is followed by CONTINUATION frames carries | A HEADERS frame that is followed by CONTINUATION frames carries | |||
| the END_STREAM flag that signals the end of a stream. A | the END_STREAM flag that signals the end of a stream. A | |||
| CONTINUATION frame cannot be used to terminate a stream. | CONTINUATION frame cannot be used to terminate a stream. | |||
| RESERVED (0x2): Bit 2 is reserved for future use. | END_SEGMENT (0x2): Bit 2 being set indicates that this frame is the | |||
| last for the current segment. Intermediaries MUST NOT coalesce | ||||
| frames across a segment boundary and MUST preserve segment | ||||
| boundaries when forwarding frames. | ||||
| END_HEADERS (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): Bit 3 being set indicates that this frame | |||
| contains an entire header block (Section 4.3) and is not followed | contains an entire header block (Section 4.3) and is not followed | |||
| by any CONTINUATION frames. | by any CONTINUATION frames. | |||
| A HEADERS frame without the END_HEADERS flag set MUST be followed | A HEADERS frame without the END_HEADERS flag set MUST be followed | |||
| by a CONTINUATION frame for the same stream. A receiver MUST | by a CONTINUATION frame for the same stream. A receiver MUST | |||
| treat the receipt of any other type of frame or a frame on a | treat the receipt of any other type of frame or a frame on a | |||
| different stream as a connection error (Section 5.4.1) of type | different stream as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| 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. | |||
| PAD_LOW (0x10): Bit 5 being set indicates that the Pad Low field is | ||||
| present. | ||||
| PAD_HIGH (0x20): Bit 6 being set indicates that the Pad High field | ||||
| is present. This bit MUST NOT be set unless the PAD_LOW flag is | ||||
| also set. Endpoints that receive a frame with PAD_HIGH set and | ||||
| PAD_LOW cleared MUST treat this as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 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). A header block that does not fit within a HEADERS | (Section 4.3). A header block that does not fit within a HEADERS | |||
| frame is continued in a CONTINUATION frame (Section 6.10). | frame is continued in a CONTINUATION frame (Section 6.10). | |||
| HEADERS frames MUST be associated with a stream. If a HEADERS frame | HEADERS frames MUST be associated with a stream. If a HEADERS frame | |||
| is received whose stream identifier field is 0x0, the recipient MUST | is received whose stream identifier field is 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 described in | The HEADERS frame changes the connection state as described in | |||
| Section 4.3. | Section 4.3. | |||
| The HEADERS frame includes optional padding. Padding fields and | ||||
| flags are identical to those defined for DATA frames (Section 6.1). | ||||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |X| Priority (31) | | |X| Priority (31) | | |||
| skipping to change at page 28, line 8 ¶ | skipping to change at page 30, line 48 ¶ | |||
| values for the same setting can be advertised by each peer. For | values for the same setting can be advertised by each peer. For | |||
| example, a client might set a high initial flow control window, | example, a client might set a high initial flow control window, | |||
| whereas a server might set a lower value to conserve resources. | whereas a server might set a lower value to conserve resources. | |||
| 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 to this protocol. Unsupported or unrecognized settings | |||
| New settings MUST NOT be defined or implemented in a way that | MUST be ignored. New settings MUST NOT be defined or implemented in | |||
| requires endpoints to understand them in order to communicate | a way that requires endpoints to understand them in order to | |||
| successfully. | communicate successfully. | |||
| Each setting in a SETTINGS frame replaces the existing value for that | Each setting in a SETTINGS frame replaces the existing value for that | |||
| setting. Settings are processed in the order in which they appear, | setting. Settings are processed in the order in which they appear, | |||
| and a receiver of a SETTINGS frame does not need to maintain any | and a receiver of a SETTINGS frame does not need to maintain any | |||
| state other than the current value of settings. Therefore, the value | state other than the current value of settings. Therefore, the value | |||
| of a setting is the last value that is seen by a receiver. This | of a setting is the last value that is seen by a receiver. This | |||
| permits the inclusion of the same settings multiple times in the same | permits the inclusion of the same settings multiple times in the same | |||
| SETTINGS frame, though doing so does nothing other than waste | SETTINGS frame, though doing so does nothing other than waste | |||
| connection capacity. | connection capacity. | |||
| skipping to change at page 28, line 45 ¶ | skipping to change at page 31, line 37 ¶ | |||
| 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) of type PROTOCOL_ERROR. | (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 unsigned 8-bit setting identifier, and an | |||
| setting identifier, and an unsigned 32-bit value. | 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reserved (8) | Setting Identifier (24) | | |Identifier (8) | Value (32) ... | |||
| +---------------+-----------------------------------------------+ | +---------------+-----------------------------------------------+ | |||
| | Value (32) | | ...Value | | |||
| +---------------------------------------------------------------+ | +---------------+ | |||
| Setting Format | Setting Format | |||
| 6.5.2. Defined Settings | 6.5.2. Defined Settings | |||
| The following settings are defined: | The following settings are defined: | |||
| SETTINGS_HEADER_TABLE_SIZE (1): Allows the sender to inform the | SETTINGS_HEADER_TABLE_SIZE (1): Allows the sender to inform the | |||
| remote endpoint of the size of the header compression table used | remote endpoint of the size of the header compression table used | |||
| to decode header blocks. The space available for encoding cannot | to decode header blocks. The encoder can reduce this size by | |||
| be changed; it is determined by the setting sent by the peer that | using signalling specific to the header compression format inside | |||
| receives the header blocks. The initial value is 4,096 bytes. | a header block. The initial value is 4,096 bytes. | |||
| SETTINGS_ENABLE_PUSH (2): This setting can be use to disable server | SETTINGS_ENABLE_PUSH (2): This setting can be use to disable server | |||
| push (Section 8.2). An endpoint MUST NOT send a PUSH_PROMISE | push (Section 8.2). An endpoint MUST NOT send a PUSH_PROMISE | |||
| frame if it receives this setting set to a value of 0. The | frame if it receives this setting set to a value of 0. An | |||
| initial value is 1, which indicates that push is permitted. | endpoint that has set this setting to 0 and had it acknowledged | |||
| MUST treat the receipt of a PUSH_PROMISE frame as a connection | ||||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS (4): Indicates the maximum number of | The initial value is 1, which indicates that push is permitted. | |||
| Any value other than 0 or 1 MUST be treated as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS (3): Indicates the maximum number of | ||||
| concurrent streams that the sender will allow. This limit is | concurrent streams that the sender will allow. This limit is | |||
| directional: it applies to the number of streams that the sender | directional: it applies to the number of streams that the sender | |||
| permits the receiver to create. Initially there is no limit to | permits the receiver to create. Initially there is no limit to | |||
| this value. It is recommended that this value be no smaller than | this value. It is recommended that this value be no smaller than | |||
| 100, so as to not unnecessarily limit parallelism. | 100, so as to not unnecessarily limit parallelism. | |||
| SETTINGS_INITIAL_WINDOW_SIZE (7): Indicates the sender's initial | A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be | |||
| treated as special by endpoints. A zero value does prevent the | ||||
| creation of new streams, however this can also happen for any | ||||
| limit that is exhausted with active streams. Servers SHOULD only | ||||
| set a zero value for short durations; if a server does not wish to | ||||
| accept requests, closing the connection could be preferable. | ||||
| SETTINGS_INITIAL_WINDOW_SIZE (4): 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 flow control options. | Values above the maximum flow control window size of 2^31 - 1 MUST | |||
| The least significant bit (0x1) of the value is set to indicate | be treated as a connection error (Section 5.4.1) of type | |||
| that the sender has disabled all flow control. This bit cannot be | FLOW_CONTROL_ERROR. | |||
| cleared once set, see Section 6.9.4. | ||||
| All bits other than the least significant are reserved. | An endpoint that receives a SETTINGS frame with any other setting | |||
| identifier MUST treat this as a connection error (Section 5.4.1) of | ||||
| type PROTOCOL_ERROR. | ||||
| 6.5.3. Settings Synchronization | 6.5.3. Settings Synchronization | |||
| Most values in SETTINGS benefit from or require an understanding of | Most values in SETTINGS benefit from or require an understanding of | |||
| when the peer has received and applied the changed setting values. | when the peer has received and applied the changed setting values. | |||
| In order to provide such synchronization timepoints, the recipient of | In order to provide such synchronization timepoints, the recipient of | |||
| a SETTINGS frame in which the ACK flag is not set MUST apply the | a SETTINGS frame in which the ACK flag is not set MUST apply the | |||
| updated settings as soon as possible upon receipt. | updated settings as soon as possible upon receipt. | |||
| The values in the SETTINGS frame MUST be applied in the order they | The values in the SETTINGS frame MUST be applied in the order they | |||
| skipping to change at page 31, line 51 ¶ | skipping to change at page 34, line 51 ¶ | |||
| state). | state). | |||
| Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame | Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame | |||
| causes the stream state to become indeterminate. A receiver MUST | causes the stream state to become indeterminate. A receiver MUST | |||
| treat the receipt of a PUSH_PROMISE on a stream that is neither | treat the receipt of a PUSH_PROMISE on a stream that is neither | |||
| "open" nor "half-closed (local)" as a connection error | "open" nor "half-closed (local)" as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. Similarly, a receiver MUST | (Section 5.4.1) of type PROTOCOL_ERROR. Similarly, a receiver MUST | |||
| treat the receipt of a PUSH_PROMISE that promises an illegal stream | 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 | identifier (Section 5.1.1) (that is, an identifier for a stream that | |||
| is not currently in the "idle" state) as a connection error | is not currently in the "idle" state) as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR, unless the receiver recently | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| sent a RST_STREAM frame to cancel the associated stream (see | ||||
| Section 5.1). | ||||
| 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 32, line 30 ¶ | skipping to change at page 35, line 28 ¶ | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| PING Payload Format | PING Payload Format | |||
| In addition to the frame header, PING frames MUST contain 8 octets of | In addition to the frame header, PING frames MUST contain 8 octets of | |||
| data in the payload. A sender can include any value it chooses and | data in the payload. A sender can include any value it chooses and | |||
| use those bytes in any fashion. | use those bytes in any fashion. | |||
| Receivers of a PING frame that does not include a ACK flag MUST send | Receivers of a PING frame that does not include a ACK flag MUST send | |||
| a PING frame with the ACK flag set in response, with an identical | a PING frame with the ACK flag set in response, with an identical | |||
| payload. PING responses SHOULD given higher priority than any other | payload. PING responses SHOULD be given higher priority than any | |||
| frame. | other frame. | |||
| The PING frame defines the following flags: | The PING frame defines the following flags: | |||
| ACK (0x1): Bit 1 being set indicates that this PING frame is a PING | ACK (0x1): Bit 1 being set indicates that this PING frame is a PING | |||
| response. An endpoint MUST set this flag in PING responses. An | response. An endpoint MUST set this flag in PING responses. An | |||
| endpoint MUST NOT respond to PING frames containing this flag. | endpoint MUST NOT respond to PING frames containing this flag. | |||
| PING frames are not associated with any individual stream. If a PING | PING frames are not associated with any individual stream. If a PING | |||
| frame is received with a stream identifier field value other than | frame is received with a stream identifier field value other than | |||
| 0x0, the recipient MUST respond with a connection error | 0x0, the recipient MUST respond with a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| Receipt of a PING frame with a length field value other than 8 MUST | Receipt of a PING frame with a length field value other than 8 MUST | |||
| be treated as a connection error (Section 5.4.1) of type | be treated as a connection error (Section 5.4.1) of type | |||
| FRAME_SIZE_ERROR. | FRAME_SIZE_ERROR. | |||
| 6.8. GOAWAY | 6.8. GOAWAY | |||
| The GOAWAY frame (type=0x7) informs the remote peer to stop creating | The GOAWAY frame (type=0x7) informs the remote peer to stop creating | |||
| streams on this connection. It can be sent from the client or the | streams on this connection. GOAWAY can be sent by either the client | |||
| server. Once sent, the sender will ignore frames sent on new streams | or the server. Once sent, the sender will ignore frames sent on new | |||
| for the remainder of the connection. Receivers of a GOAWAY frame | streams for the remainder of the connection. Receivers of a GOAWAY | |||
| MUST NOT open additional streams on the connection, although a new | frame MUST NOT open additional streams on the connection, although a | |||
| connection can be established for new streams. The purpose of this | new connection can be established for new streams. The purpose of | |||
| frame is to allow an endpoint to gracefully stop accepting new | this frame is to allow an endpoint to gracefully stop accepting new | |||
| streams (perhaps for a reboot or maintenance), while still finishing | streams (perhaps for a reboot or maintenance), while still finishing | |||
| processing of previously established streams. | processing of previously established streams. | |||
| There is an inherent race condition between an endpoint starting new | There is an inherent race condition between an endpoint starting new | |||
| streams and the remote sending a GOAWAY frame. To deal with this | streams and the remote sending a GOAWAY frame. To deal with this | |||
| case, the GOAWAY contains the stream identifier of the last stream | case, the GOAWAY contains the stream identifier of the last stream | |||
| which was processed on the sending endpoint in this connection. If | which was processed on the sending endpoint in this connection. If | |||
| the receiver of the GOAWAY used streams that are newer than the | the receiver of the GOAWAY used streams that are newer than the | |||
| indicated stream identifier, they were not processed by the sender | indicated stream identifier, they were not processed by the sender | |||
| and the receiver may treat the streams as though they had never been | and the receiver may treat the streams as though they had never been | |||
| skipping to change at page 34, line 6 ¶ | skipping to change at page 36, line 50 ¶ | |||
| | 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. | An endpoint MUST treat a GOAWAY frame with a stream identifier other | |||
| than 0x0 as a connection error (Section 5.4.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| The last stream identifier in the GOAWAY frame contains the highest | The last stream identifier in the GOAWAY frame contains the highest | |||
| numbered stream identifier for which the sender of the GOAWAY frame | numbered stream identifier for which the sender of the GOAWAY frame | |||
| 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 | |||
| skipping to change at page 34, line 37 ¶ | skipping to change at page 37, line 35 ¶ | |||
| 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 | |||
| frame, maintaining the connection in an open state until all in- | frame, maintaining the connection in an open state until all in- | |||
| progress streams complete. | progress streams complete. | |||
| The last stream ID MUST be 0 if no streams were acted upon. | The last stream ID MUST be 0 if no streams were acted upon. | |||
| If an endpoint maintains the connection and continues to exchange | ||||
| frames, ignored frames MUST be counted toward flow control limits | ||||
| (Section 5.2) or update header compression state (Section 4.3). | ||||
| Otherwise, flow control or header compression state can become | ||||
| unsynchronized. | ||||
| The GOAWAY frame also contains a 32-bit error code (Section 7) that | The GOAWAY frame also contains a 32-bit error code (Section 7) that | |||
| contains the reason for closing the connection. | contains the reason for closing the connection. | |||
| Endpoints MAY append opaque data to the payload of any GOAWAY frame. | Endpoints MAY append opaque data to the payload of any GOAWAY frame. | |||
| Additional debug data is intended for diagnostic purposes only and | Additional debug data is intended for diagnostic purposes only and | |||
| carries no semantic value. Debug data MUST NOT be persistently | carries no semantic value. Debug information could contain security- | |||
| stored, since it could contain sensitive information. | or privacy-sensitive data. Logged or otherwise persistently stored | |||
| debug data MUST have adequate safeguards to prevent unauthorized | ||||
| access. | ||||
| 6.9. WINDOW_UPDATE | 6.9. WINDOW_UPDATE | |||
| The WINDOW_UPDATE frame (type=0x9) is used to implement flow control. | The WINDOW_UPDATE frame (type=0x8) is used to implement flow control. | |||
| Flow control operates at two levels: on each individual stream and on | Flow control operates at two levels: on each individual stream and on | |||
| the entire connection. | the entire connection. | |||
| Both types of flow control are hop by hop; that is, only between the | Both types of flow control are hop by hop; that is, only between the | |||
| two endpoints. Intermediaries do not forward WINDOW_UPDATE frames | two endpoints. Intermediaries do not forward WINDOW_UPDATE frames | |||
| between dependent connections. However, throttling of data transfer | between dependent connections. However, throttling of data transfer | |||
| by any receiver can indirectly cause the propagation of flow control | by any receiver can indirectly cause the propagation of flow control | |||
| information toward the original sender. | information toward the original sender. | |||
| skipping to change at page 36, line 7 ¶ | skipping to change at page 39, line 15 ¶ | |||
| A receiver that receives a flow controlled frame MUST always account | A receiver that receives a flow controlled frame MUST always account | |||
| for its contribution against the connection flow control window, | for its contribution against the connection flow control window, | |||
| unless the receiver treats this as a connection error | unless the receiver treats this as a connection error | |||
| (Section 5.4.1). This is necessary even if the frame is in error. | (Section 5.4.1). This is necessary even if the frame is in error. | |||
| Since the sender counts the frame toward the flow control window, if | Since the sender counts the frame toward the flow control window, if | |||
| the receiver does not, the flow control window at sender and receiver | the receiver does not, the flow control window at sender and receiver | |||
| can become different. | 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 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 | |||
| skipping to change at page 36, line 49 ¶ | skipping to change at page 40, line 8 ¶ | |||
| sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | |||
| for the connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | for the connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | |||
| Flow controlled frames from the sender and WINDOW_UPDATE frames from | Flow controlled frames from the sender and WINDOW_UPDATE frames from | |||
| the receiver are completely asynchronous with respect to each other. | the receiver are completely asynchronous with respect to each other. | |||
| This property allows a receiver to aggressively update the window | This property allows a receiver to aggressively update the window | |||
| size kept by the sender to prevent streams from stalling. | size kept by the sender to prevent streams from stalling. | |||
| 6.9.2. Initial Flow Control Window Size | 6.9.2. Initial Flow Control Window Size | |||
| When a HTTP/2.0 connection is first established, new streams are | When a HTTP/2 connection is first established, new streams are | |||
| created with an initial flow control window size of 65,535 bytes. | created with an initial flow control window size of 65,535 bytes. | |||
| The connection flow control window is 65,535 bytes. Both endpoints | The connection flow control window is 65,535 bytes. Both endpoints | |||
| can adjust the initial window size for new streams by including a | can adjust the initial window size for new streams by including a | |||
| value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that | value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that | |||
| forms part of the connection header. | forms part of the connection header. | |||
| Prior to receiving a SETTINGS frame that sets a value for | Prior to receiving a SETTINGS frame that sets a value for | |||
| SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default | SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default | |||
| initial window size when sending flow controlled frames. Similarly, | initial window size when sending flow controlled frames. Similarly, | |||
| the connection flow control window is set to the default initial | the connection flow control window is set to the default initial | |||
| window size until a WINDOW_UPDATE frame is received. | window size until a WINDOW_UPDATE frame is received. | |||
| A SETTINGS frame can alter the initial flow control window size for | A SETTINGS frame can alter the initial flow control window size for | |||
| all current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE | all current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE | |||
| changes, a receiver MUST adjust the size of all stream flow control | changes, a receiver MUST adjust the size of all stream flow control | |||
| 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 | An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that | |||
| causes any flow control window to exceed the maximum size as a | ||||
| connection error (Section 5.4.1) of type FLOW_CONTROL_ERROR. | ||||
| A change to SETTINGS_INITIAL_WINDOW_SIZE can 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 60KB 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 -44KB 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 | |||
| skipping to change at page 38, line 7 ¶ | skipping to change at page 41, line 19 ¶ | |||
| FLOW_CONTROL_ERROR error code for the affected streams. | FLOW_CONTROL_ERROR error code for the affected streams. | |||
| 2. The receiver can accept the streams and tolerate the resulting | 2. The receiver can accept the streams and tolerate the resulting | |||
| head of line blocking, sending WINDOW_UPDATE frames as it | head of line blocking, sending WINDOW_UPDATE frames as it | |||
| consumes data. | consumes data. | |||
| If a receiver decides to accept streams, both sides MUST recompute | If a receiver decides to accept streams, both sides MUST recompute | |||
| the available flow control window based on the initial window size | the available flow control window based on the initial window size | |||
| sent in the SETTINGS. | sent in the SETTINGS. | |||
| 6.9.4. Ending Flow Control | ||||
| 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 | ||||
| transmission of WINDOW_UPDATE frames for that stream. A sender is | ||||
| not obligated to maintain the available flow control window for | ||||
| streams that it is no longer sending on. | ||||
| Flow control can be disabled for the entire connection using the | ||||
| SETTINGS_FLOW_CONTROL_OPTIONS setting. This setting ends all forms | ||||
| of flow control. An implementation that does not wish to perform | ||||
| flow control can use this in the initial SETTINGS exchange. | ||||
| Flow control cannot be enabled again once disabled. Any attempt to | ||||
| re-enable flow control - by sending a WINDOW_UPDATE or by clearing | ||||
| the bits on the SETTINGS_FLOW_CONTROL_OPTIONS setting - MUST be | ||||
| rejected with a FLOW_CONTROL_ERROR error code. | ||||
| 6.10. CONTINUATION | 6.10. CONTINUATION | |||
| The CONTINUATION frame (type=0xA) is used to continue a sequence of | The CONTINUATION frame (type=0x9) is used to continue a sequence of | |||
| header block fragments (Section 4.3). Any number of CONTINUATION | header block fragments (Section 4.3). Any number of CONTINUATION | |||
| frames can be sent on an existing stream, as long as the preceding | 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 | frame on the same stream is one of HEADERS, PUSH_PROMISE or | |||
| CONTINUATION without the END_HEADERS or END_PUSH_PROMISE flag set. | CONTINUATION without the END_HEADERS or END_PUSH_PROMISE flag set. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Pad High(8)] | [Pad Low (8)] | Header Block Fragment (*) . | ||||
| +---------------+---------------+-------------------------------+ | ||||
| | Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Padding (*) ... | ||||
| +---------------------------------------------------------------+ | ||||
| CONTINUATION Frame Payload | CONTINUATION Frame Payload | |||
| The CONTINUATION frame payload has the following fields: | ||||
| Pad High: Padding size high bits. This field is only present if the | ||||
| PAD_HIGH flag is set. | ||||
| Pad Low: Padding size low bits. This field is only present if the | ||||
| PAD_LOW flag is set. | ||||
| Header Block Fragment: A header block fragment (Section 4.3). | ||||
| Padding: Padding octets. | ||||
| The CONTINUATION frame defines the following flags: | The CONTINUATION frame defines the following flags: | |||
| END_HEADERS (0x4): Bit 3 being set indicates that this frame ends a | END_HEADERS (0x4): Bit 3 being set indicates that this frame ends a | |||
| header block (Section 4.3). | header block (Section 4.3). | |||
| If the END_HEADERS bit is not set, this frame MUST be followed by | If the END_HEADERS bit is not set, this frame MUST be followed by | |||
| another CONTINUATION frame. A receiver MUST treat the receipt of | another CONTINUATION frame. A receiver MUST treat the receipt of | |||
| any other type of frame or a frame on a different stream as a | any other type of frame or a frame on a different stream as a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| PAD_LOW (0x10): Bit 5 being set indicates that the Pad Low field is | ||||
| present. | ||||
| PAD_HIGH (0x20): Bit 6 being set indicates that the Pad High field | ||||
| is present. This bit MUST NOT be set unless the PAD_LOW flag is | ||||
| also set. Endpoints that receive a frame with PAD_HIGH set and | ||||
| PAD_LOW cleared MUST treat this as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| The payload of a CONTINUATION frame contains a header block fragment | The payload of a CONTINUATION frame contains a header block fragment | |||
| (Section 4.3). | (Section 4.3). | |||
| The CONTINUATION frame changes the connection state as defined in | The CONTINUATION frame changes the connection state as defined in | |||
| Section 4.3. | Section 4.3. | |||
| CONTINUATION frames MUST be associated with a stream. If a | CONTINUATION frames MUST be associated with a stream. If a | |||
| CONTINUATION frame is received whose stream identifier field is 0x0, | CONTINUATION frame is received whose stream identifier field is 0x0, | |||
| the recipient MUST respond with a connection error (Section 5.4.1) of | the recipient MUST respond with a connection error (Section 5.4.1) of | |||
| type PROTOCOL_ERROR. | type PROTOCOL_ERROR. | |||
| A CONTINUATION frame MUST be preceded by a HEADERS, PUSH_PROMISE or | A CONTINUATION frame MUST be preceded by a HEADERS, PUSH_PROMISE or | |||
| CONTINUATION frame without the END_HEADERS flag set. A recipient | CONTINUATION frame without the END_HEADERS flag set. A recipient | |||
| that observes violation of this rule MUST respond with a connection | that observes violation of this rule MUST respond with a connection | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The CONTINUATION frame includes optional padding. Padding fields and | ||||
| flags are identical to those defined for DATA frames (Section 6.1). | ||||
| 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 40, line 21 ¶ | skipping to change at page 43, line 42 ¶ | |||
| 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. | |||
| CONNECT_ERROR (10): The connection established in response to a | CONNECT_ERROR (10): The connection established in response to a | |||
| CONNECT request (Section 8.3) was reset or abnormally closed. | CONNECT request (Section 8.3) was reset or abnormally closed. | |||
| ENHANCE_YOUR_CALM (420): The endpoint detected that its peer is | ENHANCE_YOUR_CALM (11): The endpoint detected that its peer is | |||
| exhibiting a behavior over a given amount of time that has caused | exhibiting a behavior over a given amount of time that has caused | |||
| it to refuse to process further frames. | it to refuse to process further frames. | |||
| INADEQUATE_SECURITY (12): The underlying transport has properties | ||||
| that do not meet the minimum requirements imposed by this document | ||||
| (see Section 9.2) or the endpoint. | ||||
| 8. HTTP Message Exchanges | 8. HTTP Message Exchanges | |||
| HTTP/2.0 is intended to be as compatible as possible with current | HTTP/2 is intended to be as compatible as possible with current web- | |||
| web-based applications. This means that, from the perspective of the | based applications. This means that, from the perspective of the | |||
| server business logic or application API, the features of HTTP are | server business logic or application API, the features of HTTP are | |||
| unchanged. To achieve this, all of the application request and | unchanged. To achieve this, all of the application request and | |||
| response header semantics are preserved, although the syntax of | response header semantics are preserved, although the syntax of | |||
| conveying those semantics has changed. Thus, the rules from HTTP/1.1 | conveying those semantics has changed. Thus, the rules from HTTP/1.1 | |||
| ([HTTP-p1], [HTTP-p2], [HTTP-p4], [HTTP-p5], [HTTP-p6], and | ([HTTP-p1], [HTTP-p2], [HTTP-p4], [HTTP-p5], [HTTP-p6], and | |||
| [HTTP-p7]) apply with the changes in the sections below. | [HTTP-p7]) apply with the changes in the sections below. | |||
| 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 | |||
| skipping to change at page 41, line 26 ¶ | skipping to change at page 45, line 5 ¶ | |||
| terminates the stream. That is, a sequence starting with a HEADERS | terminates the stream. That is, a sequence starting with a HEADERS | |||
| frame, followed by zero or more CONTINUATION frames, where the | frame, followed by zero or more CONTINUATION frames, where the | |||
| HEADERS frame bears an END_STREAM flag. Header blocks after the | HEADERS frame bears an END_STREAM flag. Header blocks after the | |||
| first that do not terminate the stream are not part of an HTTP | first that do not terminate the stream are not part of an HTTP | |||
| request or response. | 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, | |||
| places the stream in the "closed" state. | optionally followed by CONTINUATION frames, which places the stream | |||
| in the "closed" state. | ||||
| 8.1.1. Informational Responses | 8.1.1. Informational Responses | |||
| The 1xx series of HTTP response status codes ([HTTP-p2], Section 6.2) | The 1xx series of HTTP response status codes ([HTTP-p2], Section 6.2) | |||
| are not supported in HTTP/2.0. | are not supported in HTTP/2. | |||
| The most common use case for 1xx is using a Expect header field with | The most common use case for 1xx is using a Expect header field with | |||
| a "100-continue" token (colloquially, "Expect/continue") to indicate | a "100-continue" token (colloquially, "Expect/continue") to indicate | |||
| that the client expects a 100 (Continue) non-final response status | that the client expects a 100 (Continue) non-final response status | |||
| code, receipt of which indicates that the client should continue | code, receipt of which indicates that the client should continue | |||
| sending the request body if it has not already done so. | sending the request body if it has not already done so. | |||
| Typically, Expect/continue is used by clients wishing to avoid | Typically, Expect/continue is used by clients wishing to avoid | |||
| sending a large amount of data in a request body, only to have the | sending a large amount of data in a request body, only to have the | |||
| request rejected by the origin server. | request rejected by the origin server. | |||
| HTTP/2.0 does not enable the Expect/continue mechanism; if the server | HTTP/2 does not enable the Expect/continue mechanism; if the server | |||
| sends a final status code to reject the request, it can do so without | sends a final status code to reject the request, it can do so without | |||
| making the underlying connection unusable. | making the underlying connection unusable. | |||
| Note that this means HTTP/2.0 clients sending requests with bodies | Note that this means HTTP/2 clients sending requests with bodies may | |||
| may waste at least one round trip of sent data when the request is | waste at least one round trip of sent data when the request is | |||
| rejected. This can be mitigated by restricting the amount of data | rejected. This can be mitigated by restricting the amount of data | |||
| sent for the first round trip by bandwidth-constrained clients, in | sent for the first round trip by bandwidth-constrained clients, in | |||
| anticipation of a final status code. | anticipation of a final status code. | |||
| Other defined 1xx status codes are not applicable to HTTP/2.0; the | Other defined 1xx status codes are not applicable to HTTP/2; the | |||
| semantics of 101 (Switching Protocols) is better expressed using a | semantics of 101 (Switching Protocols) is better expressed using a | |||
| distinct frame type, since they apply to the entire connection, not | distinct frame type, since they apply to the entire connection, not | |||
| just one stream. Likewise, 102 (Processing) is no longer necessary, | just one stream. Likewise, 102 (Processing) is no longer necessary, | |||
| because HTTP/2.0 has a separate means of keeping the connection | because HTTP/2 has a separate means of keeping the connection alive. | |||
| alive. | ||||
| This difference between protocol versions necessitates special | This difference between protocol versions necessitates special | |||
| handling by intermediaries that translate between them: | handling by intermediaries that translate between them: | |||
| o An intermediary that gateways HTTP/1.1 to HTTP/2.0 MUST generate a | o An intermediary that gateways HTTP/1.1 to HTTP/2 MUST generate a | |||
| 100 (Continue) response if a received request includes and Expect | 100 (Continue) response if a received request includes and Expect | |||
| header field with a "100-continue" token ([HTTP-p2], Section | header field with a "100-continue" token ([HTTP-p2], Section | |||
| 5.1.1), unless it can immediately generate a final status code. | 5.1.1), unless it can immediately generate a final status code. | |||
| It MUST NOT forward the "100-continue" expectation in the request | It MUST NOT forward the "100-continue" expectation in the request | |||
| header fields. | header fields. | |||
| o An intermediary that gateways HTTP/2.0 to HTTP/1.1 MAY add an | o An intermediary that gateways HTTP/2 to HTTP/1.1 MAY add an Expect | |||
| Expect header field with a "100-continue" expectation when | header field with a "100-continue" expectation when forwarding a | |||
| forwarding a request that has a body; see [HTTP-p2], Section 5.1.1 | request that has a body; see [HTTP-p2], Section 5.1.1 for specific | |||
| for specific requirements. | requirements. | |||
| o An intermediary that gateways HTTP/2.0 to HTTP/1.1 MUST discard | o An intermediary that gateways HTTP/2 to HTTP/1.1 MUST discard all | |||
| all other 1xx informational responses. | other 1xx informational responses. | |||
| 8.1.2. Examples | 8.1.2. Examples | |||
| This section shows HTTP/1.1 requests and responses, with | This section shows HTTP/1.1 requests and responses, with | |||
| illustrations of equivalent HTTP/2.0 requests and responses. | illustrations of equivalent HTTP/2 requests and responses. | |||
| An HTTP GET request includes request header fields and no body and is | An HTTP GET request includes request header fields and no body and is | |||
| therefore transmitted as a single contiguous sequence of HEADERS | therefore transmitted as a single contiguous sequence of HEADERS and | |||
| frames containing the serialized block of request header fields. The | CONTINUATION frames containing the serialized block of request header | |||
| last HEADERS frame in the sequence has both the END_HEADERS and | fields. The last HEADERS frame in the sequence has both the | |||
| END_STREAM flag set: | END_HEADERS and END_STREAM flags 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 | |||
| :authority = example.org | :authority = 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 304 Not Modified HEADERS | |||
| Content-Length: 0 ===> + END_STREAM | ETag: "xyzzy" ===> + END_STREAM | |||
| + END_HEADERS | Expires: Thu, 23 Jan ... + END_HEADERS | |||
| :status = 204 | :status = 304 | |||
| content-length: 0 | etag: "xyzzy" | |||
| expires: Thu, 23 Jan ... | ||||
| 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 HEADERS frame, followed by zero or more | data is transmitted as one HEADERS frame, followed by zero or more | |||
| CONTINUATION frames, containing the request header fields followed by | CONTINUATION frames containing the request header fields, followed by | |||
| one or more DATA frames, with the last CONTINUATION (or HEADERS) | one or more DATA frames, with the last CONTINUATION (or HEADERS) | |||
| frame having the END_HEADERS flag set and the final DATA frame having | frame having the END_HEADERS flag set and the final DATA frame having | |||
| the END_STREAM flag set: | 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} :authority = example.org | {binary data} :authority = example.org | |||
| skipping to change at page 44, line 9 ¶ | skipping to change at page 48, line 7 ¶ | |||
| {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/CONTINUATION frames that bears the | sent. The sequence of HEADERS/CONTINUATION frames that bears the | |||
| trailers includes a terminal frame that has both END_HEADERS and | trailers includes a terminal frame that has both END_HEADERS and | |||
| END_STREAM 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 | Transfer-Encoding: chunked + END_HEADERS | |||
| Transfer-Encoding: chunked :status = 200 | TE: trailers :status = 200 | |||
| TE: trailers content-length = 123 | content-length = 123 | |||
| 123 content-type = image/jpeg | 123 content-type = image/jpeg | |||
| {binary data} | {binary data} | |||
| 0 DATA | 0 DATA | |||
| Foo: bar - END_STREAM | Foo: bar - END_STREAM | |||
| {binary data} | {binary data} | |||
| HEADERS | HEADERS | |||
| + END_STREAM | + END_STREAM | |||
| + END_HEADERS | + END_HEADERS | |||
| foo: bar | foo: bar | |||
| 8.1.3. HTTP Header Fields | 8.1.3. HTTP Header Fields | |||
| HTTP/2.0 request and response header fields carry information as a | HTTP/2 request and response header fields carry information as a | |||
| series of key-value pairs. This includes the target URI for the | series of key-value pairs. This includes the target URI for the | |||
| request, the status code for the response, as well as HTTP header | request, the status code for the response, as well as HTTP header | |||
| fields. | fields. | |||
| HTTP header field names are strings of ASCII characters that are | HTTP header field names are strings of ASCII characters that are | |||
| compared in a case-insensitive fashion. Header field names MUST be | compared in a case-insensitive fashion. Header field names MUST be | |||
| converted to lowercase prior to their encoding in HTTP/2.0. A | converted to lowercase prior to their encoding in HTTP/2. A request | |||
| request or response containing uppercase header field names MUST be | or response containing uppercase header field names MUST be treated | |||
| treated as malformed (Section 8.1.3.5). | as malformed (Section 8.1.3.5). | |||
| The semantics of HTTP header fields are not altered by this | HTTP/2 does not use the Connection header field to indicate "hop-by- | |||
| specification, though header fields relating to connection management | hop" header fields; in this protocol, connection-specific metadata is | |||
| or request framing are no longer necessary. An HTTP/2.0 request or | conveyed by other means. As such, a HTTP/2 message containing | |||
| response MUST NOT include any of the following header fields: | Connection MUST be treated as malformed (Section 8.1.3.5). | |||
| Connection, Keep-Alive, Proxy-Connection, TE, Transfer-Encoding, and | ||||
| Upgrade. A request or response containing these header fields MUST | ||||
| be treated as malformed (Section 8.1.3.5). | ||||
| Note: HTTP/2.0 purposefully does not support upgrade from HTTP/2.0 | This means that an intermediary transforming a HTTP/1.x message to | |||
| to another protocol. The handshake methods described in Section 3 | HTTP/2 will need to remove any header fields nominated by the | |||
| are sufficient to negotiate the use of alternative protocols. | Connection header field, along with the Connection header field | |||
| itself. Such intermediaries SHOULD also remove other connection- | ||||
| specific header fields, such as Keep-Alive, Proxy-Connection, | ||||
| Transfer-Encoding and Upgrade, even if they are not nominated by | ||||
| Connection. | ||||
| One exception to this is the TE header field, which MAY be present in | ||||
| a HTTP/2 request, but when it is MUST NOT contain any value other | ||||
| than "trailers". | ||||
| Note: HTTP/2 purposefully does not support upgrade to another | ||||
| protocol. The handshake methods described in Section 3 are | ||||
| believed sufficient to negotiate the use of alternative protocols. | ||||
| 8.1.3.1. Request Header Fields | 8.1.3.1. Request Header Fields | |||
| HTTP/2.0 defines a number of header fields starting with a colon ':' | HTTP/2 defines a number of header fields starting with a colon ':' | |||
| character that carry information about the request target: | character that carry information about the request target: | |||
| o The ":method" header field includes the HTTP method ([HTTP-p2], | o The ":method" header field includes the HTTP method ([HTTP-p2], | |||
| Section 4). | Section 4). | |||
| o The ":scheme" header field includes the scheme portion of the | o The ":scheme" header field includes the scheme portion of the | |||
| target URI ([RFC3986], Section 3.1). | target URI ([RFC3986], Section 3.1). | |||
| o The ":authority" header field includes the authority portion of | o The ":authority" header field includes the authority portion of | |||
| the target URI ([RFC3986], Section 3.2). | the target URI ([RFC3986], Section 3.2). The authority MUST NOT | |||
| include the deprecated "userinfo" subcomponent for "http:" or | ||||
| "https:" URIs. | ||||
| To ensure that the HTTP/1.1 request line can be reproduced | To ensure that the HTTP/1.1 request line can be reproduced | |||
| accurately, this header field MUST be omitted when translating | accurately, this header field MUST be omitted when translating | |||
| from an HTTP/1.1 request that has a request target in origin or | from an HTTP/1.1 request that has a request target in origin or | |||
| asterisk form (see [HTTP-p1], Section 5.3). Clients that generate | asterisk form (see [HTTP-p1], Section 5.3). Clients that generate | |||
| HTTP/2.0 requests directly SHOULD instead omit the "Host" header | HTTP/2 requests directly SHOULD instead omit the "Host" header | |||
| field. An intermediary that converts a request to HTTP/1.1 MUST | field. An intermediary that converts a request to HTTP/1.1 MUST | |||
| create a "Host" header field if one is not present in a request by | create a "Host" header field if one is not present in a request by | |||
| copying the value of the ":authority" header field. | copying the value of the ":authority" header field. | |||
| o The ":path" header field includes the path and query parts of the | o The ":path" header field includes the path and query parts of the | |||
| target URI (the "path-absolute" production from [RFC3986] and | target URI (the "path-absolute" production from [RFC3986] and | |||
| optionally a '?' character followed by the "query" production, see | optionally a '?' character followed by the "query" production, see | |||
| [RFC3986], Section 3.3 and [RFC3986], Section 3.4). This field | [RFC3986], Section 3.3 and [RFC3986], Section 3.4). This field | |||
| MUST NOT be empty; URIs that do not contain a path component MUST | MUST NOT be empty; URIs that do not contain a path component MUST | |||
| include a value of '/', unless the request is an OPTIONS in | include a value of '/', unless the request is an OPTIONS request | |||
| asterisk form, in which case the ":path" header field MUST include | in asterisk form, in which case the ":path" header field MUST | |||
| '*'. | include '*'. | |||
| All HTTP/2.0 requests MUST include exactly one valid value for all of | All HTTP/2 requests MUST include exactly one valid value for the | |||
| these header fields, unless this is a CONNECT request (Section 8.3). | ":method", ":scheme", and ":path" header fields, unless this is a | |||
| An HTTP request that omits mandatory header fields is malformed | CONNECT request (Section 8.3). An HTTP request that omits mandatory | |||
| (Section 8.1.3.5). | header fields is malformed (Section 8.1.3.5). | |||
| Header field names that contain a colon are only valid in the | Header field names that start with a colon are only valid in the | |||
| HTTP/2.0 context. These are not HTTP header fields. Implementations | HTTP/2 context. These are not HTTP header fields. Implementations | |||
| MUST NOT generate header fields that start with a colon, but they | MUST NOT generate header fields that start with a colon, but they | |||
| MUST ignore any header field that starts with a colon. In | MUST ignore any header field that starts with a colon. In | |||
| particular, header fields with names starting with a colon MUST NOT | particular, header fields with names starting with a colon MUST NOT | |||
| be exposed as HTTP header fields. | be exposed as HTTP header fields. | |||
| HTTP/2.0 does not define a way to carry the version identifier that | HTTP/2 does not define a way to carry the version identifier that is | |||
| is included in the HTTP/1.1 request line. | included in the HTTP/1.1 request line. | |||
| 8.1.3.2. Response Header Fields | 8.1.3.2. Response Header Fields | |||
| A single ":status" header field is defined that carries the HTTP | A single ":status" header field is defined that carries the HTTP | |||
| status code field (see [HTTP-p2], Section 6). This header field MUST | status code field (see [HTTP-p2], Section 6). This header field MUST | |||
| be included in all responses, otherwise the response is malformed | be included in all responses, otherwise the response is malformed | |||
| (Section 8.1.3.5). | (Section 8.1.3.5). | |||
| HTTP/2.0 does not define a way to carry the version or reason phrase | HTTP/2 does not define a way to carry the version or reason phrase | |||
| that is included in an HTTP/1.1 status line. | that is included in an HTTP/1.1 status line. | |||
| 8.1.3.3. Header Field Ordering | 8.1.3.3. Header Field Ordering | |||
| HTTP Header Compression [COMPRESSION] does not preserve the order of | HTTP Header Compression [COMPRESSION] does not preserve the order of | |||
| header fields. The relative order of header fields with different | header fields. The relative order of header fields with different | |||
| names is not important. However, the same header field can be | names is not important. However, the same header field can be | |||
| repeated to form a comma-separated list (see [HTTP-p1], Section | repeated to form a comma-separated list (see [HTTP-p1], Section | |||
| 3.2.2), where the relative order of header field values is | 3.2.2), where the relative order of header field values is | |||
| significant. This repetition can occur either as a single header | significant. This repetition can occur either as a single header | |||
| skipping to change at page 47, line 13 ¶ | skipping to change at page 51, line 18 ¶ | |||
| prevents cookie-pairs from being separated into different name-value | prevents cookie-pairs from being separated into different name-value | |||
| pairs. This can significantly reduce compression efficiency as | pairs. This can significantly reduce compression efficiency as | |||
| individual cookie-pairs are updated. | individual cookie-pairs are updated. | |||
| To allow for better compression efficiency, the Cookie header field | To allow for better compression efficiency, the Cookie header field | |||
| MAY be split into separate header fields, each with one or more | MAY be split into separate header fields, each with one or more | |||
| cookie-pairs. If there are multiple Cookie header fields after | cookie-pairs. If there are multiple Cookie header fields after | |||
| decompression, these MUST be concatenated into a single octet string | decompression, these MUST be concatenated into a single octet string | |||
| using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; "). | using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; "). | |||
| The Cookie header field MAY be split using a zero octet (0x0), as | ||||
| defined in Section 8.1.3.3. When decoding, zero octets MUST be | ||||
| replaced with the cookie delimiter ("; "). | ||||
| 8.1.3.5. Malformed Requests and Responses | 8.1.3.5. Malformed Requests and Responses | |||
| A malformed request or response is one that uses a valid sequence of | A malformed request or response is one that uses a valid sequence of | |||
| HTTP/2.0 frames, but is otherwise invalid due to the presence of | HTTP/2 frames, but is otherwise invalid due to the presence of | |||
| prohibited header fields, the absence of mandatory header fields, or | prohibited header fields, the absence of mandatory header fields, or | |||
| the inclusion of uppercase header field names. | the inclusion of uppercase header field names. | |||
| A request or response that includes an entity body can include a | A request or response that includes an entity body can include a | |||
| "content-length" header field. A request or response is also | "content-length" header field. A request or response is also | |||
| malformed if the value of a "content-length" header field does not | malformed if the value of a "content-length" header field does not | |||
| equal the sum of the DATA frame payload lengths that form the body. | equal the sum of the DATA frame payload lengths that form the body. | |||
| Intermediaries that process HTTP requests or responses (i.e., all | Intermediaries that process HTTP requests or responses (i.e., all | |||
| intermediaries other than those acting as tunnels) MUST NOT forward a | intermediaries other than those acting as tunnels) MUST NOT forward a | |||
| malformed request or response. | malformed request or response. | |||
| Implementations that detect malformed requests or responses need to | Implementations that detect malformed requests or responses need to | |||
| ensure that the stream ends. For malformed requests, a server MAY | ensure that the stream ends. For malformed requests, a server MAY | |||
| send an HTTP response to prior to closing or resetting the stream. | send an HTTP response prior to closing or resetting the stream. | |||
| Clients MUST NOT accept a malformed response. | Clients MUST NOT accept a malformed response. | |||
| 8.1.4. Request Reliability Mechanisms in HTTP/2.0 | 8.1.4. Request Reliability Mechanisms in HTTP/2 | |||
| 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 provides two mechanisms for providing a guarantee to a client | |||
| client that a request has not been processed: | that a request has not been processed: | |||
| o The GOAWAY frame indicates the highest stream number that might | o The GOAWAY frame indicates the highest stream number that might | |||
| have been processed. Requests on streams with higher numbers are | have been processed. Requests on streams with higher numbers are | |||
| therefore guaranteed to be safe to retry. | therefore guaranteed to be safe to retry. | |||
| o The REFUSED_STREAM error code can be included in a RST_STREAM | o The REFUSED_STREAM error code can be included in a RST_STREAM | |||
| frame to indicate that the stream is being closed prior to any | frame to indicate that the stream is being closed prior to any | |||
| processing having occurred. Any request that was sent on the | processing having occurred. Any request that was sent on the | |||
| reset stream can be safely retried. | reset stream can be safely retried. | |||
| skipping to change at page 48, line 26 ¶ | skipping to change at page 52, line 34 ¶ | |||
| In addition to these mechanisms, the PING frame provides a way for a | In addition to these mechanisms, the PING frame provides a way for a | |||
| client to easily test a connection. Connections that remain idle can | client to easily test a connection. Connections that remain idle can | |||
| become broken as some middleboxes (for instance, network address | become broken as some middleboxes (for instance, network address | |||
| translators, or load balancers) silently discard connection bindings. | translators, or load balancers) silently discard connection bindings. | |||
| The PING frame allows a client to safely test whether a connection is | The PING frame allows a client to safely test whether a connection is | |||
| still active without sending a request. | still active without sending a request. | |||
| 8.2. Server Push | 8.2. Server Push | |||
| HTTP/2.0 enables a server to pre-emptively send (or "push") multiple | HTTP/2 enables a server to pre-emptively send (or "push") multiple | |||
| associated resources to a client in response to a single request. | associated resources to a client in response to a single request. | |||
| This feature becomes particularly helpful when the server knows the | This feature becomes particularly helpful when the server knows the | |||
| client will need to have those resources available in order to fully | client will need to have those resources available in order to fully | |||
| 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. The SETTINGS_ENABLE_PUSH setting can | between individual endpoints. The SETTINGS_ENABLE_PUSH setting can | |||
| be set to 0 to indicate that server push is disabled. Even if | be set to 0 to indicate that server push is disabled. Even if | |||
| enabled, an intermediary could receive pushed resources from the | enabled, an intermediary could receive pushed resources from the | |||
| server but could choose not to forward those on to the client. How | server but could choose not to forward those on to the client. How | |||
| to make use of the pushed resources is up to that intermediary. | to make use of the pushed resources is up to that intermediary. | |||
| Equally, the intermediary might choose to push additional resources | Equally, the intermediary might choose to push additional resources | |||
| to the client, without any action taken by the server. | to the client, without any action taken by the server. | |||
| A client cannot push resources. Clients and servers MUST operate as | ||||
| though the server has disabled PUSH_PROMISE by setting the | ||||
| SETTINGS_ENABLE_PUSH to 0. As a consequence, servers MUST treat the | ||||
| receipt of a PUSH_PROMISE frame as a connection error | ||||
| (Section 5.4.1). Clients MUST reject any attempt to change this | ||||
| setting by treating the message as a connection error (Section 5.4.1) | ||||
| of type PROTOCOL_ERROR. | ||||
| A server can only push requests that are safe (see [HTTP-p2], Section | A server can only push requests that are safe (see [HTTP-p2], Section | |||
| 4.2.1), cacheable (see [HTTP-p6], Section 3) and do not include a | 4.2.1), cacheable (see [HTTP-p6], Section 3) and do not include a | |||
| request body. | request body. | |||
| 8.2.1. Push Requests | 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 | |||
| request. The PUSH_PROMISE frame, or frames, sent by the server | request. The PUSH_PROMISE frame, or frames, sent by the server | |||
| includes a header block that contains a complete set of request | includes a header block that contains a complete set of request | |||
| header fields that the server attributes to the request. It is not | header fields that the server attributes to the request. It is not | |||
| skipping to change at page 49, line 29 ¶ | skipping to change at page 53, line 44 ¶ | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | |||
| sending any frames that reference the promised resources. This | sending any frames that reference the promised resources. This | |||
| avoids a race where clients issue requests for resources prior to | avoids a race where clients issue requests for 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 ensures | |||
| 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. Similarly, 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)" state to the server. PUSH_PROMISE frames | or "half closed (remote)" state to the server. PUSH_PROMISE frames | |||
| skipping to change at page 50, line 26 ¶ | skipping to change at page 54, line 41 ¶ | |||
| 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. This does not prohibit a server from sending PUSH_PROMISE | streams. This does not prohibit a server from sending PUSH_PROMISE | |||
| frames; clients need to reset any promised streams that are not | frames; clients need to reset any promised streams that are not | |||
| wanted. | wanted. | |||
| 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 connection to | |||
| "example.com" is generally [[anchor15: 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". | |||
| 8.3. The CONNECT Method | 8.3. The CONNECT Method | |||
| The HTTP pseudo-method CONNECT ([HTTP-p2], Section 4.3.6) is used to | The HTTP pseudo-method CONNECT ([HTTP-p2], Section 4.3.6) is used to | |||
| convert an HTTP/1.1 connection into a tunnel to a remote host. | convert an HTTP/1.1 connection into a tunnel to a remote host. | |||
| CONNECT is primarily used with HTTP proxies to established a TLS | CONNECT is primarily used with HTTP proxies to establish a TLS | |||
| session with a server for the purposes of interacting with "https" | session with a server for the purposes of interacting with "https" | |||
| resources. | resources. | |||
| In HTTP/2.0, the CONNECT method is used to establish a tunnel over a | In HTTP/2, the CONNECT method is used to establish a tunnel over a | |||
| single HTTP/2.0 stream to a remote host. The HTTP header field | single HTTP/2 stream to a remote host. The HTTP header field mapping | |||
| mapping works as mostly as defined in Request Header Fields | works as mostly as defined in Request Header Fields | |||
| (Section 8.1.3.1), with a few differences. Specifically: | (Section 8.1.3.1), with a few differences. Specifically: | |||
| o The ":method" header field is set to "CONNECT". | o The ":method" header field is set to "CONNECT". | |||
| o The ":scheme" and ":path" header fields MUST be omitted. | o The ":scheme" and ":path" header fields MUST be omitted. | |||
| o The ":authority" header field contains the host and port to | o The ":authority" header field contains the host and port to | |||
| connect to (equivalent to the authority-form of the request-target | connect to (equivalent to the authority-form of the request-target | |||
| of CONNECT requests, see [HTTP-p1], Section 5.3). | of CONNECT requests, see [HTTP-p1], Section 5.3). | |||
| skipping to change at page 51, line 35 ¶ | skipping to change at page 55, line 49 ¶ | |||
| data with the FIN bit set on the last TCP segment. A proxy that | data with the FIN bit set on the last TCP segment. A proxy that | |||
| receives a TCP segment with the FIN bit set sends a DATA frame with | receives a TCP segment with the FIN bit set sends a DATA frame with | |||
| the END_STREAM flag set. Note that the final TCP segment or DATA | the END_STREAM flag set. Note that the final TCP segment or DATA | |||
| frame could be empty. | frame could be empty. | |||
| A TCP connection error is signaled with RST_STREAM. A proxy treats | A TCP connection error is signaled with RST_STREAM. A proxy treats | |||
| any error in the TCP connection, which includes receiving a TCP | any error in the TCP connection, which includes receiving a TCP | |||
| segment with the RST bit set, as a stream error (Section 5.4.2) of | segment with the RST bit set, as a stream error (Section 5.4.2) of | |||
| type CONNECT_ERROR. Correspondingly, a proxy MUST send a TCP segment | type CONNECT_ERROR. Correspondingly, a proxy MUST send a TCP segment | |||
| with the RST bit set if it detects an error with the stream or the | with the RST bit set if it detects an error with the stream or the | |||
| HTTP/2.0 connection. | HTTP/2 connection. | |||
| 9. Additional HTTP Requirements/Considerations | 9. Additional HTTP Requirements/Considerations | |||
| This section outlines attributes of the HTTP protocol that improve | This section outlines attributes of the HTTP protocol that improve | |||
| interoperability, reduce exposure to known security vulnerabilities, | interoperability, reduce exposure to known security vulnerabilities, | |||
| or reduce the potential for implementation variation. | or reduce the potential for implementation variation. | |||
| 9.1. Connection Management | 9.1. Connection Management | |||
| HTTP/2.0 connections are persistent. For best performance, it is | HTTP/2 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 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 | |||
| near to exhausting the available stream identifiers (Section 5.1.1), | near to exhausting the available stream identifiers (Section 5.1.1), | |||
| or to replace connections that have encountered errors | or to replace connections that have encountered errors | |||
| (Section 5.4.1). | (Section 5.4.1). | |||
| Clients MAY use a single connection for more than one origin when | ||||
| each origin's hostname resolves to the same IP address, and they | ||||
| share the same port. For "https" scheme origins, the server's | ||||
| certificate MUST be valid for each origin's hostname. The | ||||
| considerations in RFC 6125 [RFC6125] for verification of identity | ||||
| apply. | ||||
| 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 SHOULD first send a GOAWAY | TCP connection, the terminating endpoint SHOULD 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 | 9.2. Use of TLS Features | |||
| Implementations of HTTP/2.0 MUST support TLS 1.1 [TLS11]. [[anchor18: | Implementations of HTTP/2 MUST support TLS 1.2 [TLS12]. The general | |||
| The working group intends to require at least the use of TLS 1.2 | TLS usage guidance in [TLSBCP] SHOULD be followed, with some | |||
| [TLS12] prior to publication of this document; negotiating TLS 1.1 is | additional restrictions that are specific to HTTP/2. | |||
| permitted to enable the creation of interoperable implementations of | ||||
| early drafts.]] | ||||
| The TLS implementation MUST support the Server Name Indication (SNI) | The TLS implementation MUST support the Server Name Indication (SNI) | |||
| [TLS-EXT] extension to TLS. HTTP/2.0 clients MUST indicate the | [TLS-EXT] extension to TLS. HTTP/2 clients MUST indicate the target | |||
| target domain name when negotiating TLS. | domain name when negotiating TLS. | |||
| A server that receives a TLS handshake that does not include either | The TLS implementation MUST disable compression. TLS compression can | |||
| TLS 1.1 or SNI, MUST NOT negotiate HTTP/2.0. Removing HTTP/2.0 | lead to the exposure of information that would not otherwise be | |||
| protocols from consideration could result in the removal of all | revealed [RFC3749]. Generic compression is unnecessary since HTTP/2 | |||
| protocols from the set of protocols offered by the client. This | provides compression features that are more aware of context and | |||
| causes protocol negotiation failure, as described in Section 3.2 of | therefore likely to be more appropriate for use for performance, | |||
| [TLSALPN]. | security or other reasons. | |||
| Implementations MUST negotiate ephemeral cipher suites (DHE or ECDHE) | ||||
| with a minimum size of 2048 bits (DHE) or security level of 128 bits | ||||
| (ECDHE). Clients MUST accept DHE sizes of up to 4096 bits. | ||||
| An implementation that negotiates a TLS connection that does not meet | ||||
| the requirements in this section, or any policy-based constraints, | ||||
| SHOULD NOT negotiate HTTP/2. Removing HTTP/2 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]. | ||||
| Due to implementation limitations, it might not be possible to fail | ||||
| TLS negotiation based on all of these requirements. An endpoint MUST | ||||
| terminate a HTTP/2 connection that is opened on a TLS session that | ||||
| does not meet these minimum requirements with a connection error | ||||
| (Section 5.4.1) of type INADEQUATE_SECURITY. | ||||
| Implementations are encouraged not to negotiate TLS cipher suites | Implementations are encouraged not to negotiate TLS cipher suites | |||
| with known vulnerabilities, such as [RC4]. | with known vulnerabilities, such as [RC4]. | |||
| 9.3. GZip Content-Encoding | 9.3. GZip Content-Encoding | |||
| Clients MUST support gzip compression for HTTP response bodies. | Clients MUST support gzip compression for HTTP response bodies. | |||
| Regardless of the value of the accept-encoding header field, a server | Regardless of the value of the accept-encoding header field, a server | |||
| MAY send responses with gzip or deflate encoding. A compressed | MAY send responses with gzip or deflate encoding. A compressed | |||
| response MUST still bear an appropriate content-encoding header | response MUST still bear an appropriate content-encoding header | |||
| skipping to change at page 53, line 25 ¶ | skipping to change at page 58, line 12 ¶ | |||
| A server is considered authoritative for an "http" resource if the | A server is considered authoritative for an "http" resource if the | |||
| connection is established to a resolved IP address for the domain in | connection is established to a resolved IP address for the domain in | |||
| the origin of the resource. | the origin of the resource. | |||
| A client MUST NOT use, in any way, resources provided by a server | A client MUST NOT use, in any way, resources provided by a server | |||
| that is not authoritative for those resources. | that is not authoritative for those resources. | |||
| 10.2. Cross-Protocol Attacks | 10.2. Cross-Protocol Attacks | |||
| When using TLS, we believe that HTTP/2.0 introduces no new cross- | When using TLS, we believe that HTTP/2 introduces no new cross- | |||
| protocol attacks. TLS encrypts the contents of all transmission | protocol attacks. TLS encrypts the contents of all transmission | |||
| (except the handshake itself), making it difficult for attackers to | (except the handshake itself), making it difficult for attackers to | |||
| control the data which could be used in a cross-protocol attack. | control the data which could be used in a cross-protocol attack. | |||
| [[anchor21: Issue: This is no longer true]] | [[anchor19: Issue: This is no longer true]] | |||
| 10.3. Intermediary Encapsulation Attacks | 10.3. Intermediary Encapsulation Attacks | |||
| HTTP/2.0 header field names and values are encoded as sequences of | HTTP/2 header field names and values are encoded as sequences of | |||
| octets with a length prefix. This enables HTTP/2.0 to carry any | octets with a length prefix. This enables HTTP/2 to carry any string | |||
| string of octets as the name or value of a header field. An | of octets as the name or value of a header field. An intermediary | |||
| intermediary that translates HTTP/2.0 requests or responses into | that translates HTTP/2 requests or responses into HTTP/1.1 directly | |||
| HTTP/1.1 directly could permit the creation of corrupted HTTP/1.1 | could permit the creation of corrupted HTTP/1.1 messages. An | |||
| messages. An attacker might exploit this behavior to cause the | attacker might exploit this behavior to cause the intermediary to | |||
| intermediary to create HTTP/1.1 messages with illegal header fields, | create HTTP/1.1 messages with illegal header fields, extra header | |||
| extra header fields, or even new messages that are entirely | fields, or even new messages that are entirely falsified. | |||
| falsified. | ||||
| An intermediary that performs translation into HTTP/1.1 cannot alter | An intermediary that performs translation into HTTP/1.1 cannot alter | |||
| the semantics of requests or responses. In particular, header field | the semantics of requests or responses. In particular, header field | |||
| names or values that contain characters not permitted by HTTP/1.1, | names or values that contain characters not permitted by HTTP/1.1, | |||
| including carriage return (U+000D) or line feed (U+000A) MUST NOT be | including carriage return (U+000D) or line feed (U+000A) MUST NOT be | |||
| translated verbatim, as stipulated in [HTTP-p1], Section 3.2.4. | translated verbatim, as stipulated in [HTTP-p1], Section 3.2.4. | |||
| Translation from HTTP/1.x to HTTP/2.0 does not produce the same | Translation from HTTP/1.x to HTTP/2 does not produce the same | |||
| opportunity to an attacker. Intermediaries that perform translation | opportunity to an attacker. Intermediaries that perform translation | |||
| to HTTP/2.0 MUST remove any instances of the "obs-fold" production | to HTTP/2 MUST remove any instances of the "obs-fold" production from | |||
| from header field values. | header field values. | |||
| 10.4. Cacheability of Pushed Resources | 10.4. Cacheability of Pushed Resources | |||
| Pushed resources are responses without an explicit request; the | Pushed resources are responses without an explicit request from the | |||
| request for a pushed resource is synthesized from the request that | client. Request header fields are provided by the server in the | |||
| triggered the push, plus resource identification information provided | PUSH_PROMISE frame. These header fields are provided so that | |||
| by the server. Request header fields are necessary for HTTP cache | existing HTTP semantics can be applied. | |||
| control validations (such as the Vary header field) to work. For | ||||
| this reason, caches MUST associate the request header fields from the | ||||
| PUSH_PROMISE frame with the response headers and content delivered on | ||||
| the pushed stream. This includes the Cookie header field. | ||||
| Caching resources that are pushed is possible, based on the guidance | Caching resources that are pushed is possible based on the guidance | |||
| provided by the origin server in the Cache-Control header field. | provided by the origin server in the Cache-Control header field. | |||
| However, this can cause issues if a single server hosts more than one | However, this can cause issues if a single server hosts more than one | |||
| tenant. For example, a server might offer multiple users each a | tenant. For example, a server might offer multiple users each a | |||
| small portion of its URI space. | small portion of its URI space. | |||
| Where multiple tenants share space on the same server, that server | Where multiple tenants share space on the same server, that server | |||
| MUST ensure that tenants are not able to push representations of | MUST ensure that tenants are not able to push representations of | |||
| resources that they do not have authority over. Failure to enforce | resources that they do not have authority over. Failure to enforce | |||
| this would allow a tenant to provide a representation that would be | this would allow a tenant to provide a representation that would be | |||
| served out of cache, overriding the actual representation that the | served out of cache, overriding the actual representation that the | |||
| authoritative tenant provides. | authoritative tenant provides. | |||
| Pushed resources for which an origin server is not authoritative are | Pushed resources for which an origin server is not authoritative are | |||
| never cached or used. | never cached or used. | |||
| 10.5. Denial of Service Considerations | 10.5. Denial of Service Considerations | |||
| An HTTP/2.0 connection can demand a greater commitment of resources | An HTTP/2 connection can demand a greater commitment of resources to | |||
| to operate than a HTTP/1.1 connection. The use of header compression | operate than a HTTP/1.1 connection. The use of header compression | |||
| and flow control require that an implementation commit resources for | and flow control depend on a commitment of resources for storing a | |||
| storing a greater amount of state. Settings for these features | greater amount of state. Settings for these features ensure that | |||
| ensure that memory commitments for these features are strictly | memory commitments for these features are strictly bounded. | |||
| bounded. Processing capacity cannot be guarded in the same fashion. | Processing capacity cannot be guarded in the same fashion. | |||
| The SETTINGS frame can be abused to cause a peer to expend additional | The SETTINGS frame can be abused to cause a peer to expend additional | |||
| processing time. This might be done by pointlessly changing | processing time. This might be done by pointlessly changing | |||
| settings, setting multiple undefined settings, or changing the same | settings, setting multiple undefined settings, or changing the same | |||
| setting multiple times in the same frame. Similarly, WINDOW_UPDATE | setting multiple times in the same frame. Similarly, WINDOW_UPDATE | |||
| or PRIORITY frames can be abused to cause an unnecessary waste of | or PRIORITY frames can be abused to cause an unnecessary waste of | |||
| resources. | resources. | |||
| Large numbers of small or empty frames can be abused to cause a peer | Large numbers of small or empty frames can be abused to cause a peer | |||
| to expend time processing frame headers. Note however that some uses | to expend time processing frame headers. Note however that some uses | |||
| are entirely legitimate, such as the sending of an empty DATA frame | are entirely legitimate, such as the sending of an empty DATA frame | |||
| to end a stream. | to end a stream. | |||
| Header compression also offers some opportunities to waste processing | Header compression also offers some opportunities to waste processing | |||
| resources, see [COMPRESSION] for more details on potential abuses. | resources, see [COMPRESSION] for more details on potential abuses. | |||
| Limits in settings cannot be reduced instantaneously, which leaves an | ||||
| endpoint exposed to behavior from a peer that could exceed the new | ||||
| limits. In particular, immediately after establishing a connection, | ||||
| limits set by a server are not known to clients and could be exceeded | ||||
| without being an obvious protocol violation. | ||||
| In all these cases, there are legitimate reasons to use these | In all these cases, there are legitimate reasons to use these | |||
| protocol mechanisms. These features become a burden only when they | protocol mechanisms. These features become a burden only when they | |||
| are used unnecessarily or to excess. | are used unnecessarily or to excess. | |||
| An endpoint that doesn't monitor this behavior exposes itself to a | An endpoint that doesn't monitor this behavior exposes itself to a | |||
| risk of denial of service attack. Implementations SHOULD track the | risk of denial of service attack. Implementations SHOULD track the | |||
| use of these types of frames and set limits on their use. An | use of these features and set limits on their use. An endpoint MAY | |||
| endpoint MAY treat activity that is suspicious as a connection error | treat activity that is suspicious as a connection error | |||
| (Section 5.4.1) of type ENHANCE_YOUR_CALM. | (Section 5.4.1) of type ENHANCE_YOUR_CALM. | |||
| 10.6. Use of Padding | ||||
| Padding within HTTP/2 is not intended as a replacement for general | ||||
| purpose padding, such as might be provided by TLS [TLS12]. Redundant | ||||
| padding could even be counterproductive. Correct application can | ||||
| depend on having specific knowledge of the data that is being padded. | ||||
| To mitigate attacks that rely on compression, disabling compression | ||||
| might be preferable to padding as a countermeasure. | ||||
| Padding can be used to obscure the exact size of frame content. | ||||
| Padding is provided to mitigate specific attacks within HTTP. For | ||||
| example, attacks where compressed content includes both attacker- | ||||
| controlled plaintext and secret data (see for example, [BREACH]). | ||||
| Use of padding can result in less protection than might seem | ||||
| immediately obvious. At best, padding only makes it more difficult | ||||
| for an attacker to infer length information by increasing the number | ||||
| of frames an attacker has to observe. Incorrectly implemented | ||||
| padding schemes can be easily defeated. In particular, randomized | ||||
| padding with a predictable distribution provides very little | ||||
| protection; or padding payloads to a fixed size exposes information | ||||
| as payload sizes cross the fixed size boundary, which could be | ||||
| possible if an attacker can control plaintext. | ||||
| Intermediaries SHOULD NOT remove padding; though an intermediary | ||||
| could remove padding and add differing amounts if the intent is to | ||||
| improve the protections padding affords. | ||||
| 11. Privacy Considerations | 11. Privacy Considerations | |||
| HTTP/2.0 aims to keep connections open longer between clients and | HTTP/2 aims to keep connections open longer between clients and | |||
| servers in order to reduce the latency when a user makes a request. | servers in order to reduce the latency when a user makes a request. | |||
| The maintenance of these connections over time could be used to | The maintenance of these connections over time could be used to | |||
| expose private information. For example, a user using a browser | expose private information. For example, a user using a browser | |||
| hours after the previous user stopped using that browser may be able | hours after the previous user stopped using that browser may be able | |||
| to learn about what the previous user was doing. This is a problem | to learn about what the previous user was doing. This is a problem | |||
| with HTTP in its current form as well, however the short lived | with HTTP in its current form as well, however the short lived | |||
| connections make it less of a risk. | connections make it less of a risk. | |||
| 12. IANA Considerations | 12. IANA Considerations | |||
| A string for identifying HTTP/2.0 is entered into the "Application | A string for identifying HTTP/2 is entered into the "Application | |||
| Layer Protocol Negotiation (ALPN) Protocol IDs" registry established | Layer Protocol Negotiation (ALPN) Protocol IDs" registry established | |||
| in [TLSALPN]. | in [TLSALPN]. | |||
| This document establishes registries for frame types, error codes and | This document establishes registries for error codes. This new | |||
| settings. These new registries are entered in a new "Hypertext | registry is entered into a new "Hypertext Transfer Protocol (HTTP) 2 | |||
| Transfer Protocol (HTTP) 2.0 Parameters" section. | Parameters" section. | |||
| This document registers the "HTTP2-Settings" header field for use in | This document registers the "HTTP2-Settings" header field for use in | |||
| HTTP. | HTTP. | |||
| 12.1. Registration of HTTP/2.0 Identification String | This document registers the "PRI" method for use in HTTP, to avoid | |||
| collisions with the connection header (Section 3.5). | ||||
| This document creates a registration for the identification of | ||||
| HTTP/2.0 in the "Application Layer Protocol Negotiation (ALPN) | ||||
| Protocol IDs" registry established in [TLSALPN]. | ||||
| Protocol: HTTP/2.0 | ||||
| Identification Sequence: 0x48 0x54 0x54 0x50 0x2f 0x32 0x2e 0x30 | ||||
| ("HTTP/2.0") | ||||
| Specification: This document (RFCXXXX) | ||||
| 12.2. Frame Type Registry | ||||
| This document establishes a registry for HTTP/2.0 frame types. The | 12.1. Registration of HTTP/2 Identification String | |||
| "HTTP/2.0 Frame Type" registry operates under the "IETF Review" | ||||
| policy [RFC5226]. | ||||
| Frame types are an 8-bit value. When reviewing new frame type | This document creates a registration for the identification of HTTP/2 | |||
| registrations, special attention is advised for any frame type- | in the "Application Layer Protocol Negotiation (ALPN) Protocol IDs" | |||
| specific flags that are defined. Frame flags can interact with | registry established in [TLSALPN]. | |||
| existing flags and could prevent the creation of globally applicable | ||||
| flags. | ||||
| Initial values for the "HTTP/2.0 Frame Type" registry are shown in | Protocol: HTTP/2 | |||
| Table 1. | ||||
| +--------+---------------+---------------------------+--------------+ | Identification Sequence: 0x68 0x32 ("h2") | |||
| | Frame | Name | Flags | Section | | ||||
| | Type | | | | | ||||
| +--------+---------------+---------------------------+--------------+ | ||||
| | 0 | DATA | END_STREAM(1) | Section 6.1 | | ||||
| | 1 | HEADERS | END_STREAM(1), | Section 6.2 | | ||||
| | | | END_HEADERS(4), | | | ||||
| | | | PRIORITY(8) | | | ||||
| | 2 | PRIORITY | - | Section 6.3 | | ||||
| | 3 | RST_STREAM | - | Section 6.4 | | ||||
| | 4 | SETTINGS | ACK(1) | Section 6.5 | | ||||
| | 5 | PUSH_PROMISE | END_PUSH_PROMISE(4) | Section 6.6 | | ||||
| | 6 | PING | ACK(1) | Section 6.7 | | ||||
| | 7 | GOAWAY | - | Section 6.8 | | ||||
| | 9 | WINDOW_UPDATE | - | Section 6.9 | | ||||
| | 10 | CONTINUATION | END_HEADERS(4) | Section 6.10 | | ||||
| +--------+---------------+---------------------------+--------------+ | ||||
| Table 1 | Specification: This document (RFCXXXX) | |||
| 12.3. 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 error codes. The | |||
| "HTTP/2.0 Error Code" registry manages a 32-bit space. The "HTTP/2.0 | "HTTP/2 Error Code" registry manages a 32-bit space. The "HTTP/2 | |||
| Error Code" registry operates under the "Expert Review" policy | Error Code" registry operates under the "Expert Review" policy | |||
| [RFC5226]. | [RFC5226]. | |||
| Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
| of the error code. An expert reviewer is advised to examine new | of the error code. An expert reviewer is advised to examine new | |||
| registrations for possible duplication with existing error codes. | registrations for possible duplication with existing error codes. | |||
| Use of existing registrations is to be encouraged, but not mandated. | Use of existing registrations is to be encouraged, but not mandated. | |||
| New registrations are advised to provide the following information: | New registrations are advised to provide the following information: | |||
| skipping to change at page 57, line 25 ¶ | skipping to change at page 62, line 5 ¶ | |||
| optional. | optional. | |||
| Description: A description of the conditions where the error code is | Description: A description of the conditions where the error code is | |||
| applicable. | applicable. | |||
| Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
| defines the error code. | defines the error code. | |||
| An initial set of error code registrations can be found in Section 7. | An initial set of error code registrations can be found in Section 7. | |||
| 12.4. Settings Registry | 12.3. HTTP2-Settings Header Field Registration | |||
| This document establishes a registry for HTTP/2.0 settings. The | ||||
| "HTTP/2.0 Settings" registry manages a 24-bit space. The "HTTP/2.0 | ||||
| Settings" registry operates under the "Expert Review" policy | ||||
| [RFC5226]. | ||||
| Registrations for settings are required to include a description of | ||||
| the setting. An expert reviewer is advised to examine new | ||||
| registrations for possible duplication with existing settings. Use | ||||
| of existing registrations is to be encouraged, but not mandated. | ||||
| New registrations are advised to provide the following information: | ||||
| Setting: The 24-bit setting value. | ||||
| Name: A name for the setting. Specifying a name is optional. | ||||
| Flags: Any setting-specific flags that apply, including their value | ||||
| and semantics. | ||||
| Description: A description of the setting. This might include the | ||||
| range of values, any applicable units and how to act upon a value | ||||
| when it is provided. | ||||
| Specification: An optional reference for a specification that | ||||
| defines the setting. | ||||
| An initial set of settings registrations can be found in | ||||
| Section 6.5.2. | ||||
| 12.5. HTTP2-Settings Header Field Registration | ||||
| This section registers the "HTTP2-Settings" header field in the | This section registers the "HTTP2-Settings" header field in the | |||
| 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): Section 3.2.1 of 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 | |||
| client for Upgrade-based negotiation. | client for Upgrade-based negotiation. | |||
| 12.4. PRI Method Registration | ||||
| This section registers the "PRI" method in the HTTP Method Registry | ||||
| [HTTP-p2]. | ||||
| Method Name: PRI | ||||
| Safe No | ||||
| Idempotent No | ||||
| Specification document(s) Section 3.5 of this document | ||||
| Related information: This method is never used by an actual client. | ||||
| This method will appear to be used when an HTTP/1.1 server or | ||||
| intermediary attempts to parse an HTTP/2 connection header. | ||||
| 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 | |||
| Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | |||
| Paul Amer, Fan Yang, Jonathan Leighton (SPDY contributors). | Paul Amer, Fan Yang, Jonathan Leighton (SPDY contributors). | |||
| o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism) | o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). | |||
| o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | |||
| Jitu Padhye, Roberto Peon, Rob Trace (Flow control) | Jitu Padhye, Roberto Peon, Rob Trace (Flow control). | |||
| o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | |||
| Bishop, Herve Ruellan (Substantial editorial contributions) | Bishop, Herve Ruellan (Substantial editorial contributions). | |||
| o Alexey Melnikov was an editor of this document during 2013. | ||||
| o A substantial proportion of Martin's contribution was supported by | ||||
| Microsoft during his employment there. | ||||
| 14. References | 14. References | |||
| 14.1. Normative References | 14.1. Normative References | |||
| [COMPRESSION] Ruellan, H. and R. Peon, "HPACK - Header Compression | [COMPRESSION] Ruellan, H. and R. Peon, "HPACK - Header Compression | |||
| for HTTP/2.0", | for HTTP/2", draft-ietf-httpbis-header-compression-06 | |||
| draft-ietf-httpbis-header-compression-05 (work in | (work in progress), February 2014. | |||
| progress), December 2013. | ||||
| [COOKIE] Barth, A., "HTTP State Management Mechanism", | [COOKIE] Barth, A., "HTTP State Management Mechanism", | |||
| RFC 6265, April 2011. | RFC 6265, April 2011. | |||
| [HTTP-p1] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [HTTP-p1] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
| Transfer Protocol (HTTP/1.1): Message Syntax and | Transfer Protocol (HTTP/1.1): Message Syntax and | |||
| Routing", draft-ietf-httpbis-p1-messaging-25 (work in | Routing", draft-ietf-httpbis-p1-messaging-26 (work in | |||
| progress), November 2013. | progress), February 2014. | |||
| [HTTP-p2] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [HTTP-p2] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
| Transfer Protocol (HTTP/1.1): Semantics and Content", | Transfer Protocol (HTTP/1.1): Semantics and Content", | |||
| draft-ietf-httpbis-p2-semantics-25 (work in progress), | draft-ietf-httpbis-p2-semantics-26 (work in progress), | |||
| November 2013. | February 2014. | |||
| [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-25 (work in | draft-ietf-httpbis-p4-conditional-26 (work in | |||
| progress), November 2013. | progress), February 2014. | |||
| [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-25 (work in | Requests", draft-ietf-httpbis-p5-range-26 (work in | |||
| progress), November 2013. | progress), February 2014. | |||
| [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-25 (work in | Caching", draft-ietf-httpbis-p6-cache-26 (work in | |||
| progress), November 2013. | progress), February 2014. | |||
| [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-25 (work in progress), | draft-ietf-httpbis-p7-auth-26 (work in progress), | |||
| November 2013. | February 2014. | |||
| [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, | |||
| "Uniform Resource Identifier (URI): Generic Syntax", | "Uniform Resource Identifier (URI): Generic Syntax", | |||
| STD 66, RFC 3986, January 2005. | STD 66, RFC 3986, January 2005. | |||
| [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. | |||
| [RFC6125] Saint-Andre, P. and J. Hodges, "Representation and | ||||
| Verification of Domain-Based Application Service | ||||
| Identity within Internet Public Key Infrastructure | ||||
| Using X.509 (PKIX) Certificates in the Context of | ||||
| Transport Layer Security (TLS)", RFC 6125, March 2011. | ||||
| [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | |||
| December 2011. | December 2011. | |||
| [TCP] Postel, J., "Transmission Control Protocol", STD 7, | [TCP] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, September 1981. | RFC 793, September 1981. | |||
| [TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) | [TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) | |||
| Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
| January 2011. | 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 | [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer | |||
| Security (TLS) Protocol Version 1.2", RFC 5246, | Security (TLS) Protocol Version 1.2", RFC 5246, | |||
| August 2008. | 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-02 (work in progress), | draft-ietf-tls-applayerprotoneg-04 (work in progress), | |||
| September 2013. | January 2014. | |||
| 14.2. Informative References | 14.2. Informative References | |||
| [AltSvc] Nottingham, M., "HTTP Alternate Services", | ||||
| draft-nottingham-httpbis-alt-svc-01 (work in | ||||
| progress), December 2013. | ||||
| [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. | |||
| [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving | ||||
| the CRIME Attack", July 2013, <http:// | ||||
| breachattack.com/resources/ | ||||
| BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | ||||
| [RC4] Rivest, R., "The RC4 encryption algorithm", RSA Data | [RC4] Rivest, R., "The RC4 encryption algorithm", RSA Data | |||
| Security, Inc. , March 1992. | 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. | |||
| [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | ||||
| Compression Methods", RFC 3749, May 2004. | ||||
| [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>. | |||
| [TLSBCP] Sheffer, Y. and R. Holz, "Recommendations for Secure | ||||
| Use of TLS and DTLS", draft-sheffer-tls-bcp-01 (work | ||||
| in progress), September 2013. | ||||
| 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-08 | A.1. Since draft-ietf-httpbis-http2-09 | |||
| Adding padding for data frames. | ||||
| Renumbering frame types, error codes, and settings. | ||||
| Adding INADEQUATE_SECURITY error code. | ||||
| Updating TLS usage requirements to 1.2; forbidding TLS compression. | ||||
| Removing extensibility for frames and settings. | ||||
| Changing setting identifier size. | ||||
| Removing the ability to disable flow control. | ||||
| Changing the protocol identification token to "h2". | ||||
| Changing the use of :authority to make it optional and to allow | ||||
| userinfo in non-HTTP cases. | ||||
| Allowing split on 0x0 for Cookie. | ||||
| Reserved PRI method in HTTP/1.1 to avoid possible future collisions. | ||||
| A.2. Since draft-ietf-httpbis-http2-08 | ||||
| Added cookie crumbling for more efficient header compression. | Added cookie crumbling for more efficient header compression. | |||
| Added header field ordering with the value-concatenation mechanism. | Added header field ordering with the value-concatenation mechanism. | |||
| A.2. Since draft-ietf-httpbis-http2-07 | A.3. Since draft-ietf-httpbis-http2-07 | |||
| Marked draft for implementation. | Marked draft for implementation. | |||
| A.3. Since draft-ietf-httpbis-http2-06 | A.4. Since draft-ietf-httpbis-http2-06 | |||
| Adding definition for CONNECT method. | Adding definition for CONNECT method. | |||
| Constraining the use of push to safe, cacheable methods with no | Constraining the use of push to safe, cacheable methods with no | |||
| request body. | request body. | |||
| Changing from :host to :authority to remove any potential confusion. | Changing from :host to :authority to remove any potential confusion. | |||
| Adding setting for header compression table size. | Adding setting for header compression table size. | |||
| Adding settings acknowledgement. | Adding settings acknowledgement. | |||
| Removing unnecessary and potentially problematic flags from | Removing unnecessary and potentially problematic flags from | |||
| CONTINUATION. | CONTINUATION. | |||
| Added denial of service considerations. | Added denial of service considerations. | |||
| A.4. Since draft-ietf-httpbis-http2-05 | A.5. Since draft-ietf-httpbis-http2-05 | |||
| Marking the draft ready for implementation. | Marking the draft ready for implementation. | |||
| Renumbering END_PUSH_PROMISE flag. | Renumbering END_PUSH_PROMISE flag. | |||
| Editorial clarifications and changes. | Editorial clarifications and changes. | |||
| A.5. Since draft-ietf-httpbis-http2-04 | A.6. Since draft-ietf-httpbis-http2-04 | |||
| Added CONTINUATION frame for HEADERS and PUSH_PROMISE. | Added CONTINUATION frame for HEADERS and PUSH_PROMISE. | |||
| PUSH_PROMISE is no longer implicitly prohibited if | PUSH_PROMISE is no longer implicitly prohibited if | |||
| SETTINGS_MAX_CONCURRENT_STREAMS is zero. | SETTINGS_MAX_CONCURRENT_STREAMS is zero. | |||
| Push expanded to allow all safe methods without a request body. | Push expanded to allow all safe methods without a request body. | |||
| Clarified the use of HTTP header fields in requests and responses. | Clarified the use of HTTP header fields in requests and responses. | |||
| Prohibited HTTP/1.1 hop-by-hop header fields. | Prohibited HTTP/1.1 hop-by-hop header fields. | |||
| Requiring that intermediaries not forward requests with missing or | Requiring that intermediaries not forward requests with missing or | |||
| illegal routing :-headers. | illegal routing :-headers. | |||
| Clarified requirements around handling different frames after stream | Clarified requirements around handling different frames after stream | |||
| close, stream reset and GOAWAY. | close, stream reset and GOAWAY. | |||
| Added more specific prohibitions for sending of different frame types | Added more specific prohibitions for sending of different frame types | |||
| in various stream states. | in various stream states. | |||
| Making the last received setting value the effective value. | Making the last received setting value the effective value. | |||
| Clarified requirements on TLS version, extension and ciphers. | Clarified requirements on TLS version, extension and ciphers. | |||
| A.6. Since draft-ietf-httpbis-http2-03 | A.7. 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.7. Since draft-ietf-httpbis-http2-02 | A.8. 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.8. Since draft-ietf-httpbis-http2-01 | A.9. 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 63, line 31 ¶ | skipping to change at page 68, line 42 ¶ | |||
| 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.9. Since draft-ietf-httpbis-http2-00 | A.10. 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.10. Since draft-mbelshe-httpbis-spdy-00 | A.11. 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 | |||
| Twist | Twist | |||
| EMail: mbelshe@chromium.org | EMail: mbelshe@chromium.org | |||
| Roberto Peon | Roberto Peon | |||
| Google, Inc | Google, Inc | |||
| EMail: fenix@google.com | EMail: fenix@google.com | |||
| Martin Thomson (editor) | Martin Thomson (editor) | |||
| Microsoft | Mozilla | |||
| 3210 Porter Drive | Suite 300 | |||
| Palo Alto 94304 | 650 Castro Street | |||
| Mountain View, CA 94041 | ||||
| US | US | |||
| EMail: martin.thomson@gmail.com | EMail: martin.thomson@gmail.com | |||
| Alexey Melnikov (editor) | ||||
| Isode Ltd | ||||
| 5 Castle Business Village | ||||
| 36 Station Road | ||||
| Hampton, Middlesex TW12 2BX | ||||
| UK | ||||
| EMail: Alexey.Melnikov@isode.com | ||||
| End of changes. 228 change blocks. | ||||
| 560 lines changed or deleted | 777 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/ | ||||