| draft-ietf-httpbis-http2-14.txt | draft-ietf-httpbis-http2-15.txt | |||
|---|---|---|---|---|
| HTTPbis Working Group M. Belshe | HTTPbis Working Group M. Belshe | |||
| Internet-Draft Twist | Internet-Draft Twist | |||
| Intended status: Standards Track R. Peon | Intended status: Standards Track R. Peon | |||
| Expires: January 31, 2015 Google, Inc | Expires: April 30, 2015 Google, Inc | |||
| M. Thomson, Ed. | M. Thomson, Ed. | |||
| Mozilla | Mozilla | |||
| July 30, 2014 | October 27, 2014 | |||
| Hypertext Transfer Protocol version 2 | Hypertext Transfer Protocol version 2 | |||
| draft-ietf-httpbis-http2-14 | draft-ietf-httpbis-http2-15 | |||
| Abstract | Abstract | |||
| This specification describes an optimized expression of the syntax of | This specification describes an optimized expression of the semantics | |||
| the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more | of 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 specification is an alternative to, but does not obsolete, the | This specification 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. | |||
| Editorial Note (To be removed by RFC Editor) | Editorial Note (To be removed by RFC Editor) | |||
| skipping to change at page 2, line 4 ¶ | skipping to change at page 2, line 4 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on January 31, 2015. | This Internet-Draft will expire on April 30, 2015. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2014 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 | |||
| skipping to change at page 2, line 40 ¶ | skipping to change at page 2, line 40 ¶ | |||
| 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | |||
| 3.3. Starting HTTP/2 for "https" URIs . . . . . . . . . . . . 11 | 3.3. Starting HTTP/2 for "https" URIs . . . . . . . . . . . . 11 | |||
| 3.4. Starting HTTP/2 with Prior Knowledge . . . . . . . . . . 11 | 3.4. Starting HTTP/2 with Prior Knowledge . . . . . . . . . . 11 | |||
| 3.5. HTTP/2 Connection Preface . . . . . . . . . . . . . . . . 11 | 3.5. HTTP/2 Connection Preface . . . . . . . . . . . . . . . . 11 | |||
| 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . 12 | 4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.3. Header Compression and Decompression . . . . . . . . . . 14 | 4.3. Header Compression and Decompression . . . . . . . . . . 14 | |||
| 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . 15 | 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . 15 | |||
| 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 16 | 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . 20 | 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . 21 | |||
| 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . 21 | 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . 21 | |||
| 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . 22 | 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 22 | 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 22 | |||
| 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 23 | 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 23 | |||
| 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 23 | 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.3.1. Stream Dependencies . . . . . . . . . . . . . . . . . 24 | 5.3.1. Stream Dependencies . . . . . . . . . . . . . . . . . 24 | |||
| 5.3.2. Dependency Weighting . . . . . . . . . . . . . . . . 25 | 5.3.2. Dependency Weighting . . . . . . . . . . . . . . . . 25 | |||
| 5.3.3. Reprioritization . . . . . . . . . . . . . . . . . . 25 | 5.3.3. Reprioritization . . . . . . . . . . . . . . . . . . 26 | |||
| 5.3.4. Prioritization State Management . . . . . . . . . . . 26 | 5.3.4. Prioritization State Management . . . . . . . . . . . 26 | |||
| 5.3.5. Default Priorities . . . . . . . . . . . . . . . . . 27 | 5.3.5. Default Priorities . . . . . . . . . . . . . . . . . 27 | |||
| 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . 27 | 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 28 | 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 28 | |||
| 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 28 | 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 28 | |||
| 5.4.3. Connection Termination . . . . . . . . . . . . . . . 29 | 5.4.3. Connection Termination . . . . . . . . . . . . . . . 29 | |||
| 5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . 29 | 5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . 29 | |||
| 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 30 | 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 31 | 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . 33 | 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . 34 | 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . 35 | 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 36 | 6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 37 | |||
| 6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 37 | 6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 37 | |||
| 6.5.3. Settings Synchronization . . . . . . . . . . . . . . 38 | 6.5.3. Settings Synchronization . . . . . . . . . . . . . . 38 | |||
| 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . 38 | 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 44 | 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 45 | 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 46 | |||
| 6.9.2. Initial Flow Control Window Size . . . . . . . . . . 46 | 6.9.2. Initial Flow Control Window Size . . . . . . . . . . 47 | |||
| 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 47 | 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 48 | |||
| 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . 48 | 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 48 | 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 49 | |||
| 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . 50 | 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . 50 | |||
| 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . 50 | 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . 51 | |||
| 8.1.1. Upgrading From HTTP/2 . . . . . . . . . . . . . . . . 51 | 8.1.1. Upgrading From HTTP/2 . . . . . . . . . . . . . . . . 52 | |||
| 8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . 51 | 8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . 52 | |||
| 8.1.3. Examples . . . . . . . . . . . . . . . . . . . . . . 55 | 8.1.3. Examples . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . 57 | 8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . 59 | |||
| 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 58 | 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 59 | |||
| 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 59 | 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 60 | |||
| 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . 60 | 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . 61 | |||
| 8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . 61 | 8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . 62 | |||
| 9. Additional HTTP Requirements/Considerations . . . . . . . . . 62 | 9. Additional HTTP Requirements/Considerations . . . . . . . . . 63 | |||
| 9.1. Connection Management . . . . . . . . . . . . . . . . . . 62 | 9.1. Connection Management . . . . . . . . . . . . . . . . . . 64 | |||
| 9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . 63 | 9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . 64 | |||
| 9.1.2. The 421 (Not Authoritative) Status Code . . . . . . . 63 | 9.1.2. The 421 (Misdirected Request) Status Code . . . . . . 65 | |||
| 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 64 | 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 65 | |||
| 9.2.1. TLS Features . . . . . . . . . . . . . . . . . . . . 64 | 9.2.1. TLS Features . . . . . . . . . . . . . . . . . . . . 66 | |||
| 9.2.2. TLS Cipher Suites . . . . . . . . . . . . . . . . . . 65 | 9.2.2. TLS Cipher Suites . . . . . . . . . . . . . . . . . . 66 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 65 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 67 | |||
| 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 65 | 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 67 | |||
| 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 66 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 67 | |||
| 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 66 | 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 68 | |||
| 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 67 | 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 68 | |||
| 10.5. Denial of Service Considerations . . . . . . . . . . . . 67 | 10.5. Denial of Service Considerations . . . . . . . . . . . . 68 | |||
| 10.5.1. Limits on Header Block Size . . . . . . . . . . . . 68 | 10.5.1. Limits on Header Block Size . . . . . . . . . . . . 70 | |||
| 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 69 | 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 70 | |||
| 10.7. Use of Padding . . . . . . . . . . . . . . . . . . . . . 69 | 10.7. Use of Padding . . . . . . . . . . . . . . . . . . . . . 71 | |||
| 10.8. Privacy Considerations . . . . . . . . . . . . . . . . . 70 | 10.8. Privacy Considerations . . . . . . . . . . . . . . . . . 71 | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 70 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 72 | |||
| 11.1. Registration of HTTP/2 Identification Strings . . . . . 70 | 11.1. Registration of HTTP/2 Identification Strings . . . . . 72 | |||
| 11.2. Frame Type Registry . . . . . . . . . . . . . . . . . . 71 | 11.2. Frame Type Registry . . . . . . . . . . . . . . . . . . 72 | |||
| 11.3. Settings Registry . . . . . . . . . . . . . . . . . . . 72 | 11.3. Settings Registry . . . . . . . . . . . . . . . . . . . 73 | |||
| 11.4. Error Code Registry . . . . . . . . . . . . . . . . . . 72 | 11.4. Error Code Registry . . . . . . . . . . . . . . . . . . 74 | |||
| 11.5. HTTP2-Settings Header Field Registration . . . . . . . . 73 | 11.5. HTTP2-Settings Header Field Registration . . . . . . . . 75 | |||
| 11.6. PRI Method Registration . . . . . . . . . . . . . . . . 74 | 11.6. PRI Method Registration . . . . . . . . . . . . . . . . 76 | |||
| 11.7. The 421 Not Authoritative HTTP Status Code . . . . . . . 74 | 11.7. The 421 (Misdirected Request) HTTP Status Code . . . . . 76 | |||
| 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 74 | 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 76 | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 75 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 77 | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 75 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 77 | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 77 | 13.2. Informative References . . . . . . . . . . . . . . . . . 78 | |||
| 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 78 | 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 79 | |||
| Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 79 | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 80 | |||
| A.1. Since draft-ietf-httpbis-http2-13 . . . . . . . . . . . . 79 | A.1. Since draft-ietf-httpbis-http2-14 . . . . . . . . . . . . 80 | |||
| A.2. Since draft-ietf-httpbis-http2-12 . . . . . . . . . . . . 79 | A.2. Since draft-ietf-httpbis-http2-13 . . . . . . . . . . . . 80 | |||
| A.3. Since draft-ietf-httpbis-http2-11 . . . . . . . . . . . . 79 | A.3. Since draft-ietf-httpbis-http2-12 . . . . . . . . . . . . 80 | |||
| A.4. Since draft-ietf-httpbis-http2-10 . . . . . . . . . . . . 80 | A.4. Since draft-ietf-httpbis-http2-11 . . . . . . . . . . . . 80 | |||
| A.5. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 80 | A.5. Since draft-ietf-httpbis-http2-10 . . . . . . . . . . . . 81 | |||
| A.6. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 80 | A.6. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 81 | |||
| A.7. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 81 | A.7. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 82 | |||
| A.8. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 81 | A.8. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 82 | |||
| A.9. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 81 | A.9. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 82 | |||
| A.10. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 81 | A.10. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 82 | |||
| A.11. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 82 | A.11. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 82 | |||
| A.12. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 82 | A.12. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 83 | |||
| A.13. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 82 | A.13. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 83 | |||
| A.14. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 83 | A.14. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 83 | |||
| A.15. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 83 | A.15. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 84 | |||
| A.16. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 84 | ||||
| 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 ([RFC7230], | protocol. However, the HTTP/1.1 message format ([RFC7230], | |||
| Section 3) was designed to be implemented with the tools at hand in | Section 3) has several characteristics that have a negative overall | |||
| the 1990s, not modern Web application performance. As such it has | effect on application performance today. | |||
| several characteristics that have a negative overall effect on | ||||
| application performance today. | ||||
| In particular, HTTP/1.0 only allows one request to be outstanding at | In particular, HTTP/1.0 allowed only one request to be outstanding at | |||
| a time on a given connection. HTTP/1.1 pipelining only partially | a time on a given TCP connection. HTTP/1.1 added request pipelining, | |||
| addressed request concurrency and suffers from head-of-line blocking. | but this only partially addressed request concurrency and still | |||
| Therefore, clients that need to make many requests typically use | suffers from head-of-line blocking. Therefore, HTTP/1.1 clients that | |||
| multiple connections to a server in order to reduce latency. | need to make many requests typically use multiple connections to a | |||
| server in order to achieve concurrency and thereby reduce latency. | ||||
| Furthermore, HTTP/1.1 header fields are often repetitive and verbose, | Furthermore, HTTP header fields are often repetitive and verbose, | |||
| which, in addition to generating more or larger network packets, can | causing unnecessary network traffic, as well as causing the initial | |||
| cause the small initial TCP [TCP] congestion window to quickly fill. | TCP [TCP] congestion window to quickly fill. This can result in | |||
| This can result in excessive latency when multiple requests are made | excessive latency when multiple requests are made on a new TCP | |||
| on a single new TCP connection. | connection. | |||
| This specification addresses these issues by defining an optimized | HTTP/2 addresses these issues by defining an optimized mapping of | |||
| mapping of HTTP's semantics to an underlying connection. | HTTP's semantics to an underlying connection. Specifically, it | |||
| Specifically, it allows interleaving of request and response messages | allows interleaving of request and response messages on the same | |||
| on the same connection and uses an efficient coding for HTTP header | connection and uses an efficient coding for HTTP header fields. It | |||
| fields. It also allows prioritization of requests, letting more | also allows prioritization of requests, letting more important | |||
| important requests complete more quickly, further improving | requests complete more quickly, further improving performance. | |||
| performance. | ||||
| The resulting protocol is designed to be more friendly to the | The resulting protocol is more friendly to the network, because fewer | |||
| network, because fewer TCP connections can be used in comparison to | TCP connections can be used in comparison to HTTP/1.x. This means | |||
| HTTP/1.x. This means less competition with other flows, and longer- | less competition with other flows, and longer-lived connections, | |||
| lived connections, which in turn leads to better utilization of | which in turn leads to better utilization of available network | |||
| available network capacity. | capacity. | |||
| Finally, this encapsulation also enables more efficient processing of | Finally, HTTP/2 also enables more efficient processing of messages | |||
| messages through use of binary message framing. | through use of binary message framing. | |||
| 2. HTTP/2 Protocol Overview | 2. HTTP/2 Protocol Overview | |||
| HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 | HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 | |||
| supports all of the core features of HTTP/1.1, but aims to be more | supports all of the core features of HTTP/1.1, but aims to be more | |||
| efficient in several ways. | efficient in several ways. | |||
| The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each | The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each | |||
| frame type serves a different purpose. For example, HEADERS and DATA | frame type serves a different purpose. For example, HEADERS and DATA | |||
| frames form the basis of HTTP requests and responses (Section 8.1); | frames form the basis of HTTP requests and responses (Section 8.1); | |||
| other frame types like SETTINGS, WINDOW_UPDATE, and PUSH_PROMISE are | other frame types like SETTINGS, WINDOW_UPDATE, and PUSH_PROMISE are | |||
| used in support of other HTTP/2 features. | used in support of other HTTP/2 features. | |||
| Multiplexing of requests is achieved by having each HTTP request- | Multiplexing of requests is achieved by having each HTTP request- | |||
| response exchanged assigned to a single stream (Section 5). Streams | response exchange associated with its own stream (Section 5). | |||
| are largely independent of each other, so a blocked or stalled | Streams are largely independent of each other, so a blocked or | |||
| request does not prevent progress on other requests. | stalled request or response does not prevent progress on other | |||
| streams. | ||||
| Flow control and prioritization ensure that it is possible to | Flow control and prioritization ensure that it is possible to | |||
| properly use multiplexed streams. Flow control (Section 5.2) helps | efficiently use multiplexed streams. Flow control (Section 5.2) | |||
| to ensure that only data that can be used by a receiver is | helps to ensure that only data that can be used by a receiver is | |||
| transmitted. Prioritization (Section 5.3) ensures that limited | transmitted. Prioritization (Section 5.3) ensures that limited | |||
| resources can be directed to the most important requests first. | resources can be directed to the most important streams first. | |||
| HTTP/2 adds a new interaction mode, whereby a server can push | HTTP/2 adds a new interaction mode, whereby a server can push | |||
| responses to a client (Section 8.2). Server push allows a server to | responses to a client (Section 8.2). Server push allows a server to | |||
| speculatively send a client data that the server anticipates the | speculatively send data to a client that the server anticipates the | |||
| client will need, trading off some network usage against a potential | client will need, trading off some network usage against a potential | |||
| latency gain. The server does this by synthesizing a request, which | latency gain. The server does this by synthesizing a request, which | |||
| it sends as a PUSH_PROMISE frame. The server is then able to send a | it sends as a PUSH_PROMISE frame. The server is then able to send a | |||
| response to the synthetic request on a separate stream. | response to the synthetic request on a separate stream. | |||
| Frames that contain HTTP header fields are compressed (Section 4.3). | Frames that contain HTTP header fields are compressed (Section 4.3). | |||
| HTTP requests can be highly redundant, so compression can reduce the | HTTP requests can be highly redundant, so compression can reduce the | |||
| size of requests and responses significantly. | size of requests and responses significantly. | |||
| 2.1. Document Organization | 2.1. Document Organization | |||
| skipping to change at page 6, line 31 ¶ | skipping to change at page 6, line 31 ¶ | |||
| streams. | streams. | |||
| o Frame (Section 6) and error (Section 7) definitions include | o Frame (Section 6) and error (Section 7) definitions include | |||
| details of the frame and error types used in HTTP/2. | details of the frame and error types used in HTTP/2. | |||
| o HTTP mappings (Section 8) and additional requirements (Section 9) | o HTTP mappings (Section 8) and additional requirements (Section 9) | |||
| describe how HTTP semantics are expressed using frames and | describe how HTTP semantics are expressed using frames and | |||
| streams. | streams. | |||
| While some of the frame and stream layer concepts are isolated from | While some of the frame and stream layer concepts are isolated from | |||
| HTTP, the intent is not to define a completely generic framing layer. | HTTP, this specification does not define a completely generic framing | |||
| The framing and streams layers are tailored to the needs of the HTTP | layer. The framing and streams layers are tailored to the needs of | |||
| protocol and server push. | the HTTP protocol and server push. | |||
| 2.2. Conventions and Terminology | 2.2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
| All numeric values are in network byte order. Values are unsigned | All numeric values are in network byte order. Values are unsigned | |||
| unless otherwise indicated. Literal values are provided in decimal | unless otherwise indicated. Literal values are provided in decimal | |||
| or hexadecimal as appropriate. Hexadecimal literals are prefixed | or hexadecimal as appropriate. Hexadecimal literals are prefixed | |||
| with "0x" to distinguish them from decimal literals. | with "0x" to distinguish them from decimal literals. | |||
| The following terms are used: | The following terms are used: | |||
| client: The endpoint initiating the HTTP/2 connection. | client: The endpoint initiating the HTTP/2 connection. | |||
| connection: A transport-level connection between two endpoints. | connection: A transport-layer connection between two endpoints. | |||
| connection error: An error that affects the entire HTTP/2 | connection error: An error that affects the entire HTTP/2 | |||
| connection. | 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 | 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 octets 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/2 connection. | server: The endpoint which did not initiate the HTTP/2 connection. | |||
| skipping to change at page 7, line 34 ¶ | skipping to change at page 7, line 34 ¶ | |||
| 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 connection. | within the HTTP/2 connection. | |||
| stream error: An error on the individual HTTP/2 stream. | stream error: An error on the individual HTTP/2 stream. | |||
| Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" | Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" | |||
| are defined in Section 2.3 of [RFC7230]. | are defined in Section 2.3 of [RFC7230]. | |||
| 3. Starting HTTP/2 | 3. Starting HTTP/2 | |||
| An HTTP/2 connection is an application level protocol running on top | An HTTP/2 connection is an application layer protocol running on 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. | |||
| HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. | HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. | |||
| HTTP/2 shares the same default port numbers: 80 for "http" URIs and | HTTP/2 shares the same default port numbers: 80 for "http" URIs and | |||
| 443 for "https" URIs. As a result, implementations processing | 443 for "https" URIs. As a result, implementations processing | |||
| requests for target resource URIs like "http://example.org/foo" or | requests for target resource URIs like "http://example.org/foo" or | |||
| "https://example.com/bar" are required to first discover whether the | "https://example.com/bar" are required to first discover whether the | |||
| upstream server (the immediate peer to which the client wishes to | upstream server (the immediate peer to which the client wishes to | |||
| establish a connection) supports HTTP/2. | establish a connection) supports HTTP/2. | |||
| skipping to change at page 8, line 11 ¶ | skipping to change at page 8, line 11 ¶ | |||
| The means by which support for HTTP/2 is determined is different for | The means by which support for HTTP/2 is determined is different for | |||
| "http" and "https" URIs. Discovery for "http" URIs is described in | "http" and "https" URIs. Discovery for "http" URIs is described in | |||
| Section 3.2. Discovery for "https" URIs is described in Section 3.3. | Section 3.2. Discovery for "https" URIs is described in Section 3.3. | |||
| 3.1. HTTP/2 Version Identification | 3.1. HTTP/2 Version Identification | |||
| The protocol defined in this document has two identifiers. | The protocol defined in this document has two identifiers. | |||
| o The string "h2" identifies the protocol where HTTP/2 uses TLS | o The string "h2" identifies the protocol where HTTP/2 uses TLS | |||
| [TLS12]. This identifier is used in the TLS application layer | [TLS12]. This identifier is used in the TLS application layer | |||
| protocol negotiation extension (ALPN) [TLS-ALPN] field and any | protocol negotiation extension (ALPN) [TLS-ALPN] field and in any | |||
| place that HTTP/2 over TLS is identified. | place where HTTP/2 over TLS is identified. | |||
| The "h2" string is serialized into an ALPN protocol identifier as | The "h2" string is serialized into an ALPN protocol identifier as | |||
| the two octet sequence: 0x68, 0x32. | the two octet sequence: 0x68, 0x32. | |||
| o The string "h2c" identifies the protocol where HTTP/2 is run over | o The string "h2c" identifies the protocol where HTTP/2 is run over | |||
| cleartext TCP. This identifier is used in the HTTP/1.1 Upgrade | cleartext TCP. This identifier is used in the HTTP/1.1 Upgrade | |||
| header field and any place that HTTP/2 over TCP is identified. | header field and in any place where HTTP/2 over TCP is identified. | |||
| Negotiating "h2" or "h2c" implies the use of the transport, security, | Negotiating "h2" or "h2c" implies the use of the transport, security, | |||
| framing and message semantics described in this document. | framing and message semantics described in this document. | |||
| [[CREF1: RFC Editor's Note: please remove the remainder of this | [[CREF1: RFC Editor's Note: please remove the remainder of this | |||
| section prior to the publication of a final version of this | section prior to the publication of a final version of this | |||
| document.]] | document.]] | |||
| Only implementations of the final, published RFC can identify | Only implementations of the final, published RFC can identify | |||
| themselves as "h2" or "h2c". Until such an RFC exists, | themselves as "h2" or "h2c". Until such an RFC exists, | |||
| skipping to change at page 9, line 7 ¶ | skipping to change at page 9, line 7 ¶ | |||
| MUST append the string "-" and an experiment name to the identifier. | MUST append the string "-" and an 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-09 might identify itself | encoding based on draft-ietf-httpbis-http2-09 might identify itself | |||
| as "h2-09-emo". Note that any label MUST conform to the "token" | as "h2-09-emo". Note that any label MUST conform to the "token" | |||
| syntax defined in Section 3.2.6 of [RFC7230]. Experimenters are | syntax defined in Section 3.2.6 of [RFC7230]. Experimenters are | |||
| encouraged to coordinate their experiments on the ietf-http-wg@w3.org | encouraged to coordinate their experiments on the ietf-http-wg@w3.org | |||
| mailing list. | mailing list. | |||
| 3.2. Starting HTTP/2 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 for an "http" URI without prior | |||
| knowledge about support for HTTP/2 uses the HTTP Upgrade mechanism | knowledge about support for HTTP/2 uses the HTTP Upgrade mechanism | |||
| (Section 6.7 of [RFC7230]). The client makes an HTTP/1.1 request | (Section 6.7 of [RFC7230]). The client makes an HTTP/1.1 request | |||
| that includes an Upgrade header field identifying HTTP/2 with the | that includes an Upgrade header field identifying HTTP/2 with the | |||
| "h2c" token. The HTTP/1.1 request MUST include exactly one | "h2c" token. The HTTP/1.1 request MUST include exactly one | |||
| HTTP2-Settings (Section 3.2.1) header field. | HTTP2-Settings (Section 3.2.1) header field. | |||
| For example: | For example: | |||
| GET / HTTP/1.1 | GET / HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Connection: Upgrade, HTTP2-Settings | Connection: Upgrade, HTTP2-Settings | |||
| Upgrade: h2c | Upgrade: h2c | |||
| HTTP2-Settings: <base64url encoding of HTTP/2 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 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, an OPTIONS request can be used to perform the upgrade to | |||
| HTTP/2, 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 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 | |||
| ... | ... | |||
| skipping to change at page 10, line 5 ¶ | skipping to change at page 10, line 5 ¶ | |||
| A server MUST ignore a "h2" token in an Upgrade header field. | A server MUST ignore a "h2" token in an Upgrade header field. | |||
| Presence of a token with "h2" implies HTTP/2 over TLS, which is | Presence of a token with "h2" implies HTTP/2 over TLS, which is | |||
| instead negotiated as described in Section 3.3. | instead negotiated as described in Section 3.3. | |||
| A server that supports HTTP/2 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 frames. These | the 101 response, the server can begin sending HTTP/2 frames. These | |||
| frames MUST include a response to the request that initiated the | frames MUST include a response to the request that initiated the | |||
| Upgrade. | Upgrade. | |||
| For example: | ||||
| HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Upgrade: h2c | Upgrade: h2c | |||
| [ HTTP/2 connection ... | [ HTTP/2 connection ... | |||
| The first HTTP/2 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) as the server connection preface (Section 3.5). Upon | |||
| connection preface (Section 3.5), which includes a SETTINGS frame. | receiving the 101 response, the client sends a connection preface | |||
| (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 default priority values (Section 5.3.5). | identifier 1 and is assigned default priority values (Section 5.3.5). | |||
| Stream 1 is implicitly half closed from the client toward the server, | Stream 1 is implicitly half closed from the client toward the server, | |||
| since the request is completed as an HTTP/1.1 request. After | since the request is completed as an HTTP/1.1 request. After | |||
| commencing the HTTP/2 connection, stream 1 is used for the response. | commencing 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 MUST include exactly | A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly | |||
| one "HTTP2-Settings" header field. The "HTTP2-Settings" header field | one "HTTP2-Settings" header field. The "HTTP2-Settings" header field | |||
| is a hop-by-hop header field that includes parameters that govern the | is a connection-specific header field that includes parameters that | |||
| HTTP/2 connection, provided in anticipation of the server accepting | govern the HTTP/2 connection, provided in anticipation of the server | |||
| the request to upgrade. | accepting the request to upgrade. | |||
| HTTP2-Settings = token68 | HTTP2-Settings = token68 | |||
| A server MUST reject an attempt to upgrade if this header field is | A server MUST NOT upgrade the connection to HTTP/2 if this header | |||
| not present. A server MUST NOT send this header field. | field is not present, or if more than one is present. A server MUST | |||
| NOT send this header field. | ||||
| 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 | |||
| [RFC7235]. | [RFC7235]. | |||
| As a hop-by-hop header field, the "Connection" header field MUST | Since the upgrade is only intended to apply to the immediate | |||
| include a value of "HTTP2-Settings" in addition to "Upgrade" when | connection, a client sending "HTTP2-Settings" MUST also send | |||
| upgrading to HTTP/2. | "HTTP2-Settings" as a connection option in the "Connection" header | |||
| field to prevent it from being forwarded (see Section 6.1 of | ||||
| [RFC7230]). | ||||
| 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. Acknowledgement of the SETTINGS parameters | SETTINGS frame. Acknowledgement of the SETTINGS parameters | |||
| (Section 6.5.3) is not necessary, since a 101 response serves as | (Section 6.5.3) is not necessary, since a 101 response serves as | |||
| implicit acknowledgment. Providing these values in the Upgrade | implicit acknowledgment. Providing these values in the Upgrade | |||
| request ensures that the protocol does not require default values for | request gives a client an opportunity to provide parameters prior to | |||
| the above SETTINGS parameters, and gives a client an opportunity to | receiving any frames from the server. | |||
| provide other parameters prior to receiving any frames from the | ||||
| server. | ||||
| 3.3. Starting HTTP/2 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 uses TLS [TLS12] with | |||
| knowledge about support for HTTP/2 uses TLS [TLS12] with the | the application layer protocol negotiation extension [TLS-ALPN]. | |||
| application layer protocol negotiation extension [TLS-ALPN]. | ||||
| HTTP/2 over TLS uses the "h2" application token. The "h2c" token | HTTP/2 over TLS uses the "h2" application token. The "h2c" token | |||
| MUST NOT be sent by a client or selected by a server. | MUST NOT be sent by a client or selected by a server. | |||
| 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 preface (Section 3.5). | a connection preface (Section 3.5). | |||
| 3.4. Starting HTTP/2 with Prior Knowledge | 3.4. Starting HTTP/2 with Prior Knowledge | |||
| A client can learn that a particular server supports HTTP/2 by other | A client can learn that a particular server supports HTTP/2 by other | |||
| means. For example, [ALT-SVC] describes a mechanism for advertising | means. For example, [ALT-SVC] describes a mechanism for advertising | |||
| this capability. | this capability. | |||
| A client MAY immediately send HTTP/2 frames to a server that is known | A client MAY immediately send HTTP/2 frames to a server that is known | |||
| to support HTTP/2, after the connection preface (Section 3.5). A | to support HTTP/2, after the connection preface (Section 3.5); a | |||
| server can identify such a connection by the use of the "PRI" method | server can identify such a connection by the presence of the | |||
| in the connection preface. This only affects the establishment of | connection preface. This only affects the establishment of HTTP/2 | |||
| HTTP/2 connections over cleartext TCP; implementations that support | connections over cleartext TCP; implementations that support HTTP/2 | |||
| HTTP/2 over TLS MUST use protocol negotiation in TLS [TLS-ALPN]. | over TLS MUST use protocol negotiation in TLS [TLS-ALPN]. | |||
| Prior support for HTTP/2 is not a strong signal that a given server | Without additional information, prior support for HTTP/2 is not a | |||
| will support HTTP/2 for future connections. It is possible for | strong signal that a given server will support HTTP/2 for future | |||
| server configurations to change; for configurations to differ between | connections. For example, it is possible for server configurations | |||
| instances in clustered server; or network conditions to change. | to change, for configurations to differ between instances in | |||
| clustered servers, or for network conditions to change. | ||||
| 3.5. HTTP/2 Connection Preface | 3.5. HTTP/2 Connection Preface | |||
| Upon establishment of a TCP connection and determination that HTTP/2 | Upon establishment of a TCP connection and determination that HTTP/2 | |||
| will be used by both peers, each endpoint MUST send a connection | will be used by both peers, each endpoint MUST send a connection | |||
| preface as a final confirmation and to establish the initial SETTINGS | preface as a final confirmation and to establish the initial SETTINGS | |||
| parameters for the HTTP/2 connection. | parameters for the HTTP/2 connection. The client and server each | |||
| send a different connection preface. | ||||
| The client connection preface starts with a sequence of 24 octets, | The client connection preface starts with a sequence of 24 octets, | |||
| which in hex notation are: | which in hex notation are: | |||
| 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | |||
| (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 SETTINGS frame MAY | followed by a SETTINGS frame (Section 6.5). The SETTINGS frame MAY | |||
| be empty. The client sends the client connection preface immediately | be empty. The client sends the client connection preface immediately | |||
| upon receipt of a 101 Switching Protocols response (indicating a | upon receipt of a 101 Switching Protocols response (indicating a | |||
| skipping to change at page 12, line 16 ¶ | skipping to change at page 12, line 23 ¶ | |||
| The client connection preface is selected so that a large | The client connection preface 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 preface consists of a potentially empty | The server connection preface consists of a potentially empty | |||
| SETTINGS frame (Section 6.5) that MUST be the first frame the server | SETTINGS frame (Section 6.5) that MUST be the first frame the server | |||
| sends in the HTTP/2 connection. | sends in the HTTP/2 connection. | |||
| The SETTINGS frames received from a peer as part of the connection | ||||
| preface MUST be acknowledged (see Section 6.5.3) after sending the | ||||
| connection preface. | ||||
| 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 preface, without waiting to receive the server connection | connection preface, without waiting to receive the server connection | |||
| preface. It is important to note, however, that the server | preface. It is important to note, however, that the server | |||
| connection preface SETTINGS frame might include parameters that | connection preface SETTINGS frame might include parameters that | |||
| necessarily alter how a client is expected to communicate with the | necessarily alter how a client is expected to communicate with the | |||
| server. Upon receiving the SETTINGS frame, the client is expected to | server. Upon receiving the SETTINGS frame, the client is expected to | |||
| honor any parameters established. In some configurations, it is | honor any parameters established. In some configurations, it is | |||
| possible for the server to transmit SETTINGS before the client, | possible for the server to transmit SETTINGS before the client sends | |||
| providing an opportunity to avoid this issue. | additional frames, providing an opportunity to avoid this issue. | |||
| Clients and servers MUST terminate the TCP connection if either peer | Clients and servers MUST treat an invalid connection preface as a | |||
| does not begin with a valid connection preface. A GOAWAY frame | connection error (Section 5.4.1) of type PROTOCOL_ERROR. A GOAWAY | |||
| (Section 6.8) can be omitted if it is clear that the peer is not | frame (Section 6.8) MAY be omitted in this case, since an invalid | |||
| using HTTP/2. | preface indicates that the peer is not using HTTP/2. | |||
| 4. HTTP Frames | 4. HTTP Frames | |||
| Once the HTTP/2 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 a fixed 9-octet header followed by a variable- | All frames begin with a fixed 9-octet header followed by a variable- | |||
| length payload. | length payload. | |||
| skipping to change at page 13, line 17 ¶ | skipping to change at page 13, line 17 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (24) | | | Length (24) | | |||
| +---------------+---------------+---------------+ | +---------------+---------------+---------------+ | |||
| | Type (8) | Flags (8) | | | Type (8) | Flags (8) | | |||
| +-+-+-----------+---------------+-------------------------------+ | +-+-+-----------+---------------+-------------------------------+ | |||
| |R| Stream Identifier (31) | | |R| Stream Identifier (31) | | |||
| +=+=============================================================+ | +=+=============================================================+ | |||
| | Frame Payload (0...) ... | | Frame Payload (0...) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Frame Layout | Figure 1: Frame Layout | |||
| The fields of the frame header are defined as: | The fields of the frame header are defined as: | |||
| Length: The length of the frame payload expressed as an unsigned | Length: The length of the frame payload expressed as an unsigned | |||
| 24-bit integer. Values greater than 2^14 (16,384) MUST NOT be | 24-bit integer. Values greater than 2^14 (16,384) MUST NOT be | |||
| sent unless the receiver has set a larger value for | sent unless the receiver has set a larger value for | |||
| SETTINGS_MAX_FRAME_SIZE. | SETTINGS_MAX_FRAME_SIZE. | |||
| The 9 octets of the frame header are not included in this value. | The 9 octets of the frame header are not included in this value. | |||
| skipping to change at page 14, line 20 ¶ | skipping to change at page 14, line 20 ¶ | |||
| (16,777,215) octets, inclusive. | (16,777,215) octets, inclusive. | |||
| All implementations MUST be capable of receiving and minimally | All implementations MUST be capable of receiving and minimally | |||
| processing frames up to 2^14 octets in length, plus the 9 octet frame | processing frames up to 2^14 octets in length, plus the 9 octet frame | |||
| header (Section 4.1). The size of the frame header is not included | header (Section 4.1). The size of the frame header is not included | |||
| when describing frame sizes. | when describing frame sizes. | |||
| Note: Certain frame types, such as PING (Section 6.7), impose | Note: Certain frame types, such as PING (Section 6.7), impose | |||
| additional limits on the amount of payload data allowed. | additional limits on the amount of payload data allowed. | |||
| If a frame size exceeds any defined limit, or is too small to contain | An endpoint MUST send a FRAME_SIZE_ERROR error if a frame exceeds the | |||
| mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | size defined in SETTINGS_MAX_FRAME_SIZE, any limit defined for the | |||
| error. A frame size error in a frame that could alter the state of | frame type, or it is too small to contain mandatory frame data. A | |||
| the entire connection MUST be treated as a connection error | frame size error in a frame that could alter the state of the entire | |||
| (Section 5.4.1); this includes any frame carrying a header block | connection MUST be treated as a connection error (Section 5.4.1); | |||
| (Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), | this includes any frame carrying a header block (Section 4.3) (that | |||
| SETTINGS, and any WINDOW_UPDATE frame with a stream identifier of 0. | is, HEADERS, PUSH_PROMISE, and CONTINUATION), SETTINGS, and any frame | |||
| with a stream identifier of 0. | ||||
| Endpoints are not obligated to use all available space in a frame. | Endpoints are not obligated to use all available space in a frame. | |||
| Responsiveness can be improved by using frames that are smaller than | Responsiveness can be improved by using frames that are smaller than | |||
| the permitted maximum size. Sending large frames can result in | the permitted maximum size. Sending large frames can result in | |||
| delays in sending maintenance frames, such RST_STREAM, WINDOW_UPDATE, | delays in sending time-sensitive frames (such RST_STREAM, | |||
| or PRIORITY, which if blocked by the transmission of a large frame, | WINDOW_UPDATE, or PRIORITY) which if blocked by the transmission of a | |||
| could affect performance. | large frame, could affect performance. | |||
| 4.3. Header Compression and Decompression | 4.3. Header Compression and Decompression | |||
| A header field in HTTP/2 is a name with one or more associated | Just as in HTTP/1, a header field in HTTP/2 is a name with one or | |||
| values. They are used within HTTP request and response messages as | more associated values. They are used within HTTP request and | |||
| well as server push operations (see Section 8.2). | response messages as well as server push operations (see | |||
| Section 8.2). | ||||
| Header lists are collections of zero or more header fields. When | Header lists are collections of zero or more header fields. When | |||
| transmitted over a connection, a header list is serialized into a | transmitted over a connection, a header list is serialized into a | |||
| header block using HTTP Header Compression [COMPRESSION]. The | header block using HTTP Header Compression [COMPRESSION]. The | |||
| serialized header block is then divided into one or more octet | serialized header block is then divided into one or more octet | |||
| sequences, called header block fragments, and transmitted within the | sequences, called header block fragments, and transmitted within the | |||
| payload of HEADERS (Section 6.2), PUSH_PROMISE (Section 6.6) or | payload of HEADERS (Section 6.2), PUSH_PROMISE (Section 6.6) or | |||
| CONTINUATION (Section 6.10) frames. | CONTINUATION (Section 6.10) frames. | |||
| The Cookie header field [COOKIE] is treated specially by the HTTP | The Cookie header field [COOKIE] is treated specially by the HTTP | |||
| skipping to change at page 15, line 18 ¶ | skipping to change at page 15, line 18 ¶ | |||
| A complete header block consists of either: | A complete header block consists of either: | |||
| o a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag | o a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag | |||
| set, or | set, or | |||
| o a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared | o a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared | |||
| and one or more CONTINUATION frames, where the last CONTINUATION | and one or more CONTINUATION frames, where the last CONTINUATION | |||
| frame has the END_HEADERS flag set. | frame has the END_HEADERS flag set. | |||
| Header compression is stateful, using a single compression context | Header compression is stateful. One compression context and one | |||
| for the entire connection. Each header block is processed as a | decompression context is used for the entire connection. Each header | |||
| discrete unit. Header blocks MUST be transmitted as a contiguous | block is processed as a discrete unit. Header blocks MUST be | |||
| sequence of frames, with no interleaved frames of any other type or | transmitted as a contiguous sequence of frames, with no interleaved | |||
| from any other stream. The last frame in a sequence of HEADERS or | frames of any other type or from any other stream. The last frame in | |||
| CONTINUATION frames MUST have the END_HEADERS flag set. The last | a sequence of HEADERS or CONTINUATION frames MUST have the | |||
| frame in a sequence of PUSH_PROMISE or CONTINUATION frames MUST have | END_HEADERS flag set. The last frame in a sequence of PUSH_PROMISE | |||
| the END_HEADERS flag set. This allows a header block to be logically | or CONTINUATION frames MUST have the END_HEADERS flag set. This | |||
| equivalent to a single frame. | allows a header block to be logically equivalent to a single frame. | |||
| 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, because these frames carry data | PUSH_PROMISE or CONTINUATION frames, because these frames carry data | |||
| that can modify the compression context maintained by a receiver. An | that can modify the compression context maintained by a receiver. An | |||
| endpoint receiving HEADERS, PUSH_PROMISE or CONTINUATION frames MUST | endpoint receiving HEADERS, PUSH_PROMISE or CONTINUATION frames MUST | |||
| reassemble header blocks and perform decompression even if the frames | reassemble header blocks and perform decompression even if the frames | |||
| are to be discarded. A receiver MUST terminate the connection with a | are to be discarded. A receiver MUST terminate the connection with a | |||
| connection error (Section 5.4.1) of type COMPRESSION_ERROR if it does | connection error (Section 5.4.1) of type COMPRESSION_ERROR if it does | |||
| not decompress a header block. | not decompress a header block. | |||
| skipping to change at page 16, line 15 ¶ | skipping to change at page 16, line 15 ¶ | |||
| o The order in which frames are sent on a stream is significant. | o The order in which frames are sent on a stream is significant. | |||
| Recipients process frames in the order they are received. In | Recipients process frames in the order they are received. In | |||
| particular, the order of HEADERS, and DATA frames is semantically | particular, the order of HEADERS, and DATA frames is semantically | |||
| significant. | significant. | |||
| o Streams are identified by an integer. Stream identifiers are | o Streams are identified by an integer. Stream identifiers are | |||
| assigned to streams by the endpoint initiating the stream. | assigned to streams by the endpoint initiating the stream. | |||
| 5.1. Stream States | 5.1. Stream States | |||
| The lifecycle of a stream is shown in Figure 1. | The lifecycle of a stream is shown in Figure 2. | |||
| +--------+ | +--------+ | |||
| PP | | PP | PP | | PP | |||
| ,--------| idle |--------. | ,--------| idle |--------. | |||
| / | | \ | / | | \ | |||
| v +--------+ v | v +--------+ v | |||
| +----------+ | +----------+ | +----------+ | +----------+ | |||
| | | | H | | | | | | H | | | |||
| ,---| reserved | | | reserved |---. | ,---| reserved | | | reserved |---. | |||
| | | (local) | v | (remote) | | | | | (local) | v | (remote) | | | |||
| skipping to change at page 16, line 48 ¶ | skipping to change at page 16, line 48 ¶ | |||
| | `----------->| |<-----------' | | | `----------->| |<-----------' | | |||
| | R | closed | R | | | R | closed | R | | |||
| `-------------------->| |<--------------------' | `-------------------->| |<--------------------' | |||
| +--------+ | +--------+ | |||
| H: HEADERS frame (with implied CONTINUATIONs) | H: HEADERS frame (with implied CONTINUATIONs) | |||
| PP: PUSH_PROMISE frame (with implied CONTINUATIONs) | PP: PUSH_PROMISE frame (with implied CONTINUATIONs) | |||
| ES: END_STREAM flag | ES: END_STREAM flag | |||
| R: RST_STREAM frame | R: RST_STREAM frame | |||
| Figure 1: Stream States | Figure 2: Stream States | |||
| Note that this diagram shows stream state transitions and frames that | Note that this diagram shows stream state transitions and the frames | |||
| affect those transitions only. In this regard, CONTINUATION frames | and flags that affect those transitions only. In this regard, | |||
| do not result in state transitions and are effectively part of the | CONTINUATION frames do not result in state transitions; they are | |||
| HEADERS or PUSH_PROMISE that they follow. | effectively part of the HEADERS or PUSH_PROMISE that they follow. | |||
| For this purpose, the END_STREAM flag is processed as a separate | ||||
| event to the frame that bears it; a HEADERS frame with the END_STREAM | ||||
| flag set can cause two state transitions. | ||||
| Both endpoints have a subjective view of the state of a stream that | Both endpoints have a subjective view of the state of a stream that | |||
| could be different when frames are in transit. Endpoints do not | could be different when frames are in transit. Endpoints do not | |||
| coordinate the creation of streams; they are created unilaterally by | coordinate the creation of streams; they are created unilaterally by | |||
| either endpoint. The negative consequences of a mismatch in states | either endpoint. The negative consequences of a mismatch in states | |||
| are limited to the "closed" state after sending RST_STREAM, where | are limited to the "closed" state after sending RST_STREAM, where | |||
| frames might be received for some time after closing. | frames might be received for some time after closing. | |||
| Streams have the following states: | Streams have the following states: | |||
| skipping to change at page 17, line 38 ¶ | skipping to change at page 17, line 41 ¶ | |||
| stream to immediately become "half closed". | stream to immediately become "half closed". | |||
| * Sending a PUSH_PROMISE frame marks the associated stream for | * Sending a PUSH_PROMISE frame marks the associated stream for | |||
| later use. The stream state for the reserved stream | later use. The stream state for the reserved stream | |||
| transitions to "reserved (local)". | transitions to "reserved (local)". | |||
| * Receiving a PUSH_PROMISE frame marks the associated stream as | * Receiving a PUSH_PROMISE frame marks the associated stream as | |||
| reserved by the remote peer. The state of the stream becomes | reserved by the remote peer. The state of the stream becomes | |||
| "reserved (remote)". | "reserved (remote)". | |||
| Receiving any frames other than HEADERS or PUSH_PROMISE on a | ||||
| stream in this state MUST be treated as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| reserved (local): | reserved (local): | |||
| A stream in the "reserved (local)" state is one that has been | A stream in the "reserved (local)" state is one that has been | |||
| promised by sending a PUSH_PROMISE frame. A PUSH_PROMISE frame | promised by sending a PUSH_PROMISE frame. A PUSH_PROMISE frame | |||
| reserves an idle stream by associating the stream with an open | reserves an idle stream by associating the stream with an open | |||
| stream that was initiated by the remote peer (see Section 8.2). | stream that was initiated by the remote peer (see Section 8.2). | |||
| In this state, only the following transitions are possible: | In this state, only the following transitions are possible: | |||
| * The endpoint can send a HEADERS frame. This causes the stream | * The endpoint can send a HEADERS frame. This causes the stream | |||
| to open in a "half closed (remote)" state. | to open in a "half closed (remote)" state. | |||
| * Either endpoint can send a RST_STREAM frame to cause the stream | * Either endpoint can send a RST_STREAM frame to cause the stream | |||
| to become "closed". This releases the stream reservation. | to become "closed". This releases the stream reservation. | |||
| An endpoint MUST NOT send frames other than HEADERS or RST_STREAM | An endpoint MUST NOT send any type of frame other than HEADERS or | |||
| in this state. | RST_STREAM in this state. | |||
| A PRIORITY frame MAY be received in this state. Receiving any | A PRIORITY or WINDOW_UPDATE frame MAY be received in this state. | |||
| frames other than RST_STREAM, or PRIORITY MUST be treated as a | Receiving any type of frame other than RST_STREAM, PRIORITY or | |||
| WINDOW_UPDATE on a stream in this state MUST be treated as a | ||||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| reserved (remote): | reserved (remote): | |||
| A stream in the "reserved (remote)" state has been reserved by a | A stream in the "reserved (remote)" state has been reserved by a | |||
| remote peer. | remote peer. | |||
| In this state, only the following transitions are possible: | In this state, only the following transitions are possible: | |||
| * Receiving a HEADERS frame causes the stream to transition to | * Receiving a HEADERS frame causes the stream to transition to | |||
| "half closed (local)". | "half closed (local)". | |||
| * Either endpoint can send a RST_STREAM frame to cause the stream | * Either endpoint can send a RST_STREAM frame to cause the stream | |||
| to become "closed". This releases the stream reservation. | to become "closed". This releases the stream reservation. | |||
| An endpoint MAY send a PRIORITY frame in this state to | An endpoint MAY send a PRIORITY frame in this state to | |||
| reprioritize the reserved stream. An endpoint MUST NOT send any | reprioritize the reserved stream. An endpoint MUST NOT send any | |||
| other type of frame other than RST_STREAM or PRIORITY. | type of frame other than RST_STREAM, WINDOW_UPDATE, or PRIORITY in | |||
| this state. | ||||
| Receiving any other type of frame other than HEADERS or RST_STREAM | Receiving any type of frame other than HEADERS or RST_STREAM on a | |||
| MUST be treated as a connection error (Section 5.4.1) of type | stream in this state MUST be treated as a connection error | |||
| PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| open: | open: | |||
| A stream in the "open" state may be used by both peers to send | A stream in the "open" state may be used by both peers to send | |||
| frames of any type. In this state, sending peers observe | frames of any type. In this state, sending peers observe | |||
| advertised stream level flow control limits (Section 5.2). | advertised stream level flow control limits (Section 5.2). | |||
| From this state either endpoint can send a frame with an | From this state either endpoint can send a frame with an | |||
| END_STREAM flag set, which causes the stream to transition into | END_STREAM flag set, which causes the stream to transition into | |||
| one of the "half closed" states: an endpoint sending an END_STREAM | one of the "half closed" states: an endpoint sending an END_STREAM | |||
| flag causes the stream state to become "half closed (local)"; an | flag causes the stream state to become "half closed (local)"; an | |||
| skipping to change at page 19, line 39 ¶ | skipping to change at page 19, line 47 ¶ | |||
| continues to observe advertised stream level flow control limits | continues to observe advertised stream level flow control limits | |||
| (Section 5.2). | (Section 5.2). | |||
| A stream can transition from this state to "closed" by sending a | A stream can transition from this state to "closed" by sending a | |||
| frame that contains an END_STREAM flag, or when either peer sends | frame that contains an END_STREAM flag, or when either peer sends | |||
| a RST_STREAM frame. | a RST_STREAM frame. | |||
| closed: | closed: | |||
| The "closed" state is the terminal state. | The "closed" state is the terminal state. | |||
| An endpoint MUST NOT send frames on a closed stream. An endpoint | An endpoint MUST NOT send frames other than PRIORITY on a closed | |||
| that receives any frame other than PRIORITY after receiving a | stream. An endpoint that receives any frame other than PRIORITY | |||
| RST_STREAM MUST treat that as a stream error (Section 5.4.2) of | after receiving a RST_STREAM MUST treat that as a stream error | |||
| type STREAM_CLOSED. Similarly, an endpoint that receives any | (Section 5.4.2) of type STREAM_CLOSED. Similarly, an endpoint | |||
| frames after receiving a frame with the END_STREAM flag set MUST | that receives any frames after receiving a frame with the | |||
| treat that as a connection error (Section 5.4.1) of type | END_STREAM flag set MUST treat that as a connection error | |||
| STREAM_CLOSED, unless the frame is permitted as described below. | (Section 5.4.1) of type STREAM_CLOSED, unless the frame is | |||
| permitted as described below. | ||||
| WINDOW_UPDATE or RST_STREAM frames can be received in this state | WINDOW_UPDATE or RST_STREAM frames can be received in this state | |||
| for a short period after a DATA or HEADERS frame containing an | for a short period after a DATA or HEADERS frame containing an | |||
| END_STREAM flag is sent. Until the remote peer receives and | END_STREAM flag is sent. Until the remote peer receives and | |||
| processes the frame bearing the END_STREAM flag, it might send | processes RST_STREAM or the frame bearing the END_STREAM flag, it | |||
| frames of these types. Endpoints MUST ignore WINDOW_UPDATE or | might send frames of these types. Endpoints MUST ignore | |||
| RST_STREAM frames received in this state, though endpoints MAY | WINDOW_UPDATE or RST_STREAM frames received in this state, though | |||
| choose to treat frames that arrive a significant time after | endpoints MAY choose to treat frames that arrive a significant | |||
| sending END_STREAM as a connection error (Section 5.4.1) of type | time after sending END_STREAM as a connection error | |||
| PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| PRIORITY frames can be sent on closed streams to prioritize | PRIORITY frames can be sent on closed streams to prioritize | |||
| streams that are dependent on the closed stream. Endpoints SHOULD | streams that are dependent on the closed stream. Endpoints SHOULD | |||
| process PRIORITY frame, though they can be ignored if the stream | process PRIORITY frames, though they can be ignored if the stream | |||
| has been removed from the dependency tree (see Section 5.3.4). | has been removed from the dependency tree (see Section 5.3.4). | |||
| If this state is reached as a result of sending a RST_STREAM | If this state is reached as a result of sending a RST_STREAM | |||
| frame, the peer that receives the RST_STREAM might have already | frame, the peer that receives the RST_STREAM might have already | |||
| sent - or enqueued for sending - frames on the stream that cannot | sent - or enqueued for sending - frames on the stream that cannot | |||
| be withdrawn. An endpoint MUST ignore frames that it receives on | be withdrawn. An endpoint MUST ignore frames that it receives on | |||
| closed streams after it has sent a RST_STREAM frame. An endpoint | closed streams after it has sent a RST_STREAM frame. An endpoint | |||
| 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. | |||
| skipping to change at page 20, line 33 ¶ | skipping to change at page 20, line 42 ¶ | |||
| 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 | even if the associated stream has been reset. Therefore, a | |||
| RST_STREAM is needed to close an unwanted promised stream. | RST_STREAM is needed to close an unwanted promised stream. | |||
| 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 frame 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. Frame of unknown types | |||
| are ignored. | ||||
| An example of the state transitions for an HTTP request/response | An example of the state transitions for an HTTP request/response | |||
| exchange can be found in Section 8.1. An example of the state | exchange can be found in Section 8.1. An example of the state | |||
| transitions for server push can be found in Section 8.2.1 and | transitions for server push can be found in Section 8.2.1 and | |||
| Section 8.2.2. | Section 8.2.2. | |||
| 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 | |||
| skipping to change at page 22, line 22 ¶ | skipping to change at page 22, line 33 ¶ | |||
| 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 provides for flow control through use of the WINDOW_UPDATE | HTTP/2 provides for flow control through use of the WINDOW_UPDATE | |||
| frame (Section 6.9). | frame (Section 6.9). | |||
| 5.2.1. Flow Control Principles | 5.2.1. Flow Control Principles | |||
| HTTP/2 stream flow control aims to allow for future improvements to | HTTP/2 stream flow control aims to allow a variety of flow control | |||
| flow control algorithms without requiring protocol changes. Flow | algorithms to be used without requiring protocol changes. Flow | |||
| control in HTTP/2 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 specific to a connection; i.e., it 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 octets they are prepared to receive on a | |||
| and for the entire connection. This is a credit-based scheme. | stream 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 window as a receiver and abide by the flow control limits | control window as a receiver and abide by the flow control 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 octets | |||
| both new streams and the overall connection. | for 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 cannot be disabled. | 6. Flow control cannot be disabled. | |||
| 7. HTTP/2 defines only the format and semantics of the WINDOW_UPDATE | 7. HTTP/2 defines only the format and semantics of the WINDOW_UPDATE | |||
| frame (Section 6.9). This document does not stipulate how a | frame (Section 6.9). This document does not stipulate how a | |||
| receiver decides when to send this frame or the value that it | receiver decides when to send this frame or the value that it | |||
| sends. Nor does it specify how a sender chooses to send packets. | sends, nor does it specify how a sender chooses to send packets. | |||
| Implementations are able to select any algorithm that suits their | Implementations are able to select any algorithm that suits their | |||
| needs. | needs. | |||
| Implementations are also responsible for managing how requests and | Implementations are also responsible for managing how requests and | |||
| responses are sent based on priority; choosing how to avoid head of | responses are sent based on priority; choosing how to avoid head of | |||
| line blocking for requests; and managing the creation of new streams. | line blocking for requests; and managing the creation of new streams. | |||
| Algorithm choices for these could interact with any flow control | Algorithm choices for these could interact with any flow control | |||
| algorithm. | algorithm. | |||
| 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 to process data on one stream, yet wants | |||
| continue to process other streams in the same connection. | to continue to process other streams in the same connection. | |||
| Deployments that do not require this capability can advertise a flow | Deployments that do not require this capability can advertise a flow | |||
| control window of the maximum size, incrementing the available space | control window of the maximum size, incrementing the available space | |||
| when new data is received. This effectively disables flow control | when new data is received. This effectively disables flow control | |||
| for that receiver. Conversely, a sender is always subject to the | for that receiver. Conversely, a sender is always subject to the | |||
| flow control window advertised by the receiver. | flow control window advertised by the receiver. | |||
| Deployments with constrained resources (for example, memory) can | Deployments with constrained resources (for example, memory) can | |||
| 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 [RFC7323]). | |||
| 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 receiver 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 read and acted upon. | critical frames, such as WINDOW_UPDATE, are not read and acted upon. | |||
| 5.3. Stream priority | 5.3. Stream priority | |||
| A client can assign a priority for a new stream by including | A client can assign a priority for a new stream by including | |||
| skipping to change at page 24, line 23 ¶ | skipping to change at page 24, line 33 ¶ | |||
| relative proportion of available resources that are assigned to | relative proportion of available resources that are assigned to | |||
| streams dependent on the same stream. | streams dependent on the same stream. | |||
| Explicitly setting the priority for a stream is input to a | Explicitly setting the priority for a stream is input to a | |||
| prioritization process. It does not guarantee any particular | prioritization process. It does not guarantee any particular | |||
| processing or transmission order for the stream relative to any other | processing or transmission order for the stream relative to any other | |||
| stream. An endpoint cannot force a peer to process concurrent | stream. An endpoint cannot force a peer to process concurrent | |||
| streams in a particular order using priority. Expressing priority is | streams in a particular order using priority. Expressing priority is | |||
| therefore only ever a suggestion. | therefore only ever a suggestion. | |||
| Prioritization information can be specified explicitly for streams as | Providing prioritization information is optional, so default values | |||
| they are created using the HEADERS frame, or changed using the | are used if no explicit indicator is provided (Section 5.3.5). | |||
| PRIORITY frame. Providing prioritization information is optional, so | ||||
| default values are used if no explicit indicator is provided | ||||
| (Section 5.3.5). | ||||
| 5.3.1. Stream Dependencies | 5.3.1. Stream Dependencies | |||
| Each stream can be given an explicit dependency on another stream. | Each stream can be given an explicit dependency on another stream. | |||
| Including a dependency expresses a preference to allocate resources | Including a dependency expresses a preference to allocate resources | |||
| to the identified stream rather than to the dependent stream. | to the identified stream rather than to the dependent stream. | |||
| A stream that is not dependent on any other stream is given a stream | A stream that is not dependent on any other stream is given a stream | |||
| dependency of 0x0. In other words, the non-existent stream 0 forms | dependency of 0x0. In other words, the non-existent stream 0 forms | |||
| the root of the tree. | the root of the tree. | |||
| A stream that depends on another stream is a dependent stream. The | A stream that depends on another stream is a dependent stream. The | |||
| stream upon which a stream is dependent is a parent stream. A | stream upon which a stream is dependent is a parent stream. A | |||
| dependency on a stream that is not currently in the tree - such as a | dependency on a stream that is not currently in the tree - such as a | |||
| stream in the "idle" state - results in the stream being given a | stream in the "idle" state - results in that stream being given a | |||
| default priority (Section 5.3.5). | default priority (Section 5.3.5). | |||
| When assigning a dependency on another stream, the stream is added as | When assigning a dependency on another stream, the stream is added as | |||
| a new dependency of the parent stream. Dependent streams that share | a new dependency of the parent stream. Dependent streams that share | |||
| the same parent are not ordered with respect to each other. For | the same parent are not ordered with respect to each other. For | |||
| example, if streams B and C are dependent on stream A, and if stream | example, if streams B and C are dependent on stream A, and if stream | |||
| D is created with a dependency on stream A, this results in a | D is created with a dependency on stream A, this results in a | |||
| dependency order of A followed by B, C, and D in any order. | dependency order of A followed by B, C, and D in any order. | |||
| A A | A A | |||
| / \ ==> /|\ | / \ ==> /|\ | |||
| B C B D C | B C B D C | |||
| Example of Default Dependency Creation | Figure 3: Example of Default Dependency Creation | |||
| An exclusive flag allows for the insertion of a new level of | An exclusive flag allows for the insertion of a new level of | |||
| dependencies. The exclusive flag causes the stream to become the | dependencies. The exclusive flag causes the stream to become the | |||
| sole dependency of its parent stream, causing other dependencies to | sole dependency of its parent stream, causing other dependencies to | |||
| become dependent on the prioritized stream. In the previous example, | become dependent on the exclusive stream. In the previous example, | |||
| if stream D is created with an exclusive dependency on stream A, this | if stream D is created with an exclusive dependency on stream A, this | |||
| results in D becoming the dependency parent of B and C. | results in D becoming the dependency parent of B and C. | |||
| A | A | |||
| A | | A | | |||
| / \ ==> D | / \ ==> D | |||
| B C / \ | B C / \ | |||
| B C | B C | |||
| Example of Exclusive Dependency Creation | Figure 4: Example of Exclusive Dependency Creation | |||
| Inside the dependency tree, a dependent stream SHOULD only be | Inside the dependency tree, a dependent stream SHOULD only be | |||
| allocated resources if all of the streams that it depends on (the | allocated resources if all of the streams that it depends on (the | |||
| chain of parent streams up to 0x0) are either closed, or it is not | chain of parent streams up to 0x0) are either closed, or it is not | |||
| possible to make progress on them. | possible to make progress on them. | |||
| A stream cannot depend on itself. An endpoint MUST treat this as a | A stream cannot depend on itself. An endpoint MUST treat this as a | |||
| stream error (Section 5.4.2) of type PROTOCOL_ERROR. | stream error (Section 5.4.2) of type PROTOCOL_ERROR. | |||
| 5.3.2. Dependency Weighting | 5.3.2. Dependency Weighting | |||
| All dependent streams are allocated an integer weight between 1 to | All dependent streams are allocated an integer weight between 1 and | |||
| 256 (inclusive). | 256 (inclusive). | |||
| Streams with the same parent SHOULD be allocated resources | Streams with the same parent SHOULD be allocated resources | |||
| proportionally based on their weight. Thus, if stream B depends on | proportionally based on their weight. Thus, if stream B depends on | |||
| stream A with weight 4, and C depends on stream A with weight 12, and | stream A with weight 4, and C depends on stream A with weight 12, and | |||
| if no progress can be made on A, stream B ideally receives one third | if no progress can be made on A, stream B ideally receives one third | |||
| of the resources allocated to stream C. | of the resources allocated to stream C. | |||
| 5.3.3. Reprioritization | 5.3.3. Reprioritization | |||
| skipping to change at page 26, line 29 ¶ | skipping to change at page 26, line 38 ¶ | |||
| | / \ | | | | / \ | | | |||
| A D A D D | A D A D D | |||
| / \ / / \ / \ | | / \ / / \ / \ | | |||
| B C ==> F B C ==> F A OR A | B C ==> F B C ==> F A OR A | |||
| / \ | / \ /|\ | / \ | / \ /|\ | |||
| D E E B C B C F | D E E B C B C F | |||
| | | | | | | | | |||
| F E E | F E E | |||
| (intermediate) (non-exclusive) (exclusive) | (intermediate) (non-exclusive) (exclusive) | |||
| Example of Dependency Reordering | Figure 5: Example of Dependency Reordering | |||
| 5.3.4. Prioritization State Management | 5.3.4. Prioritization State Management | |||
| When a stream is removed from the dependency tree, its dependencies | When a stream is removed from the dependency tree, its dependencies | |||
| can be moved to become dependent on the parent of the closed stream. | can be moved to become dependent on the parent of the closed stream. | |||
| The weights of new dependencies are recalculated by distributing the | The weights of new dependencies are recalculated by distributing the | |||
| weight of the dependency of the closed stream proportionally based on | weight of the dependency of the closed stream proportionally based on | |||
| the weights of its dependencies. | the weights of its dependencies. | |||
| Streams that are removed from the dependency tree cause some | Streams that are removed from the dependency tree cause some | |||
| skipping to change at page 26, line 44 ¶ | skipping to change at page 27, line 4 ¶ | |||
| can be moved to become dependent on the parent of the closed stream. | can be moved to become dependent on the parent of the closed stream. | |||
| The weights of new dependencies are recalculated by distributing the | The weights of new dependencies are recalculated by distributing the | |||
| weight of the dependency of the closed stream proportionally based on | weight of the dependency of the closed stream proportionally based on | |||
| the weights of its dependencies. | the weights of its dependencies. | |||
| Streams that are removed from the dependency tree cause some | Streams that are removed from the dependency tree cause some | |||
| prioritization information to be lost. Resources are shared between | prioritization information to be lost. Resources are shared between | |||
| streams with the same parent stream, which means that if a stream in | streams with the same parent stream, which means that if a stream in | |||
| that set closes or becomes blocked, any spare capacity allocated to a | that set closes or becomes blocked, any spare capacity allocated to a | |||
| stream is distributed to the immediate neighbors of the stream. | stream is distributed to the immediate neighbors of the stream. | |||
| However, if the common dependency is removed from the tree, those | However, if the common dependency is removed from the tree, those | |||
| streams share resources with streams at the next highest level. | streams share resources with streams at the next highest level. | |||
| For example, assume streams A and B share a parent, and streams C and | For example, assume streams A and B share a parent, and streams C and | |||
| D both depend on stream A. Prior to the removal of stream A, if | D both depend on stream A. Prior to the removal of stream A, if | |||
| streams A and D are unable to proceed, then stream C receives all the | streams A and D are unable to proceed, then stream C receives all the | |||
| resources dedicated to stream A. If stream A is removed from the | resources dedicated to stream A. If stream A is removed from the | |||
| tree, the weight of stream A is divided between streams C and D. If | tree, the weight of stream A is divided between streams C and D. If | |||
| stream D is still unable to proceed, this results in stream C | stream D is still unable to proceed, this results in stream C | |||
| receiving a reduced proportion of resources. For equal starting | receiving a reduced proportion of resources. For equal starting | |||
| weights, C receives one third, rather than one half, of available | weights, C receives one third, rather than one half, of available | |||
| resources. | resources. | |||
| It is possible for a stream to become closed while prioritization | It is possible for a stream to become closed while prioritization | |||
| information that creates a dependency on that stream is in transit. | information that creates a dependency on that stream is in transit. | |||
| If a stream identified in a dependency has had any associated | If a stream identified in a dependency has no associated priority | |||
| priority information destroyed, then the dependent stream is instead | information, then the dependent stream is instead assigned a default | |||
| assigned a default priority. This potentially creates suboptimal | priority (Section 5.3.5). This potentially creates suboptimal | |||
| prioritization, since the stream could be given a priority that is | prioritization, since the stream could be given a priority that is | |||
| higher than intended. | different to what is intended. | |||
| To avoid these problems, an endpoint SHOULD retain stream | To avoid these problems, an endpoint SHOULD retain stream | |||
| prioritization state for a period after streams become closed. The | prioritization state for a period after streams become closed. The | |||
| longer state is retained, the lower the chance that streams are | longer state is retained, the lower the chance that streams are | |||
| assigned incorrect or default priority values. | assigned incorrect or default priority values. | |||
| This could create a large state burden for an endpoint, so this state | This could create a large state burden for an endpoint, so this state | |||
| MAY be limited. An endpoint MAY apply a fixed upper limit on the | MAY be limited. An endpoint MAY apply a fixed upper limit on the | |||
| number of closed streams for which prioritization state is tracked to | number of closed streams for which prioritization state is tracked to | |||
| limit state exposure. The amount of additional state an endpoint | limit state exposure. The amount of additional state an endpoint | |||
| skipping to change at page 28, line 16 ¶ | skipping to change at page 28, line 25 ¶ | |||
| 5.4.1. Connection Error Handling | 5.4.1. Connection Error Handling | |||
| A connection error is any error which prevents further processing of | A connection error is any error which prevents further processing of | |||
| the framing layer, or which corrupts any connection state. | the framing layer, or which corrupts any connection state. | |||
| An endpoint that encounters a connection error SHOULD first send a | An endpoint that encounters a connection error SHOULD first send a | |||
| GOAWAY frame (Section 6.8) with the stream identifier of the last | GOAWAY frame (Section 6.8) with the stream identifier of the last | |||
| stream that it successfully received from its peer. The GOAWAY frame | stream that it successfully received from its peer. The GOAWAY frame | |||
| includes an error code that indicates why the connection is | includes an error code that indicates why the connection is | |||
| terminating. After sending the GOAWAY frame, the endpoint MUST close | terminating. After sending the GOAWAY frame for an error condition, | |||
| the TCP connection. | the endpoint MUST close the TCP connection. | |||
| It is possible that the GOAWAY will not be reliably received by the | It is possible that the GOAWAY will not be reliably received by the | |||
| receiving endpoint. In the event of a connection error, GOAWAY only | receiving endpoint (see [RFC7230], Section 6.6). In the event of a | |||
| provides a best effort attempt to communicate with the peer about why | connection error, GOAWAY only provides a best effort attempt to | |||
| the connection is being terminated. | communicate with the peer about why the connection is being | |||
| terminated. | ||||
| An endpoint can end a connection at any time. In particular, an | An endpoint can end a connection at any time. In particular, an | |||
| endpoint MAY choose to treat a stream error as a connection error. | endpoint MAY choose to treat a stream error as a connection error. | |||
| Endpoints SHOULD send a GOAWAY frame when ending a connection, | Endpoints SHOULD send a GOAWAY frame when ending a connection, | |||
| providing that circumstances permit it. | providing that circumstances permit it. | |||
| 5.4.2. Stream Error Handling | 5.4.2. Stream Error Handling | |||
| A stream error is an error related to a specific stream that does not | A stream error is an error related to a specific stream that does not | |||
| affect processing of other streams. | affect processing of other streams. | |||
| skipping to change at page 29, line 10 ¶ | skipping to change at page 29, line 18 ¶ | |||
| for any stream. However, an endpoint MAY send additional RST_STREAM | for any stream. However, an endpoint MAY send additional RST_STREAM | |||
| frames if it receives frames on a closed stream after more than a | frames if it receives frames on a closed stream after more than a | |||
| round-trip time. This behavior is permitted to deal with misbehaving | round-trip time. This behavior is permitted to deal with misbehaving | |||
| implementations. | implementations. | |||
| An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | |||
| frame, to avoid looping. | frame, to avoid looping. | |||
| 5.4.3. Connection Termination | 5.4.3. Connection Termination | |||
| If the TCP connection is torn down while streams remain in open or | If the TCP connection is closed or reset while streams remain in open | |||
| half closed states, then the endpoint MUST assume that those streams | or half closed states, then the endpoint MUST assume that those | |||
| were abnormally interrupted and could be incomplete. | streams were abnormally interrupted and could be incomplete. | |||
| 5.5. Extending HTTP/2 | 5.5. Extending HTTP/2 | |||
| HTTP/2 permits extension of the protocol. Protocol extensions can be | HTTP/2 permits extension of the protocol. Protocol extensions can be | |||
| used to provide additional services or alter any aspect of the | used to provide additional services or alter any aspect of the | |||
| protocol, within the limitations described in this section. | protocol, within the limitations described in this section. | |||
| Extensions are effective only within the scope of a single HTTP/2 | Extensions are effective only within the scope of a single HTTP/2 | |||
| connection. | connection. | |||
| Extensions are permitted to use new frame types (Section 4.1), new | Extensions are permitted to use new frame types (Section 4.1), new | |||
| settings (Section 6.5.2), or new error codes (Section 7). Registries | settings (Section 6.5.2), or new error codes (Section 7). Registries | |||
| are established for managing these extension points: frame types | are established for managing these extension points: frame types | |||
| (Section 11.2), settings (Section 11.3) and error codes | (Section 11.2), settings (Section 11.3) and error codes | |||
| (Section 11.4). | (Section 11.4). | |||
| Implementations MUST ignore unknown or unsupported values in all | Implementations MUST ignore unknown or unsupported values in all | |||
| extensible protocol elements. Implementations MUST discard frames | extensible protocol elements. Implementations MUST discard frames | |||
| that have unknown or unsupported types. This means that any of these | that have unknown or unsupported types. This means that any of these | |||
| extension points can be safely used by extensions without prior | extension points can be safely used by extensions without prior | |||
| arrangement or negotiation. | arrangement or negotiation. However, extension frames that appear in | |||
| the middle of a header block (Section 4.3) are not permitted; these | ||||
| MUST be treated as a connection error (Section 5.4.1) of type | ||||
| PROTOCOL_ERROR. | ||||
| However, extensions that could change the semantics of existing | However, extensions that could change the semantics of existing | |||
| protocol components MUST be negotiated before being used. For | protocol components MUST be negotiated before being used. For | |||
| example, an extension that changes the layout of the HEADERS frame | example, an extension that changes the layout of the HEADERS frame | |||
| cannot be used until the peer has given a positive signal that this | cannot be used until the peer has given a positive signal that this | |||
| is acceptable. In this case, it could also be necessary to | is acceptable. In this case, it could also be necessary to | |||
| coordinate when the revised layout comes into effect. Note that | coordinate when the revised layout comes into effect. Note that | |||
| treating any frame other than DATA frames as flow controlled is such | treating any frame other than DATA frames as flow controlled is such | |||
| a change in semantics, and can only be done through negotiation. | a change in semantics, and can only be done through negotiation. | |||
| This document doesn't mandate a specific method for negotiating the | This document doesn't mandate a specific method for negotiating the | |||
| use of an extension, but notes that a setting (Section 6.5.2) could | use of an extension, but notes that a setting (Section 6.5.2) could | |||
| be used for that purpose. If both peers set a value that indicates | be used for that purpose. If both peers set a value that indicates | |||
| willingness to use the extension, then the extension can be used. If | willingness to use the extension, then the extension can be used. If | |||
| a setting is used for extension negotiation, the initial value MUST | a setting is used for extension negotiation, the initial value MUST | |||
| be defined so that the extension is initially disabled. | be defined in such a fashion that the extension is initially | |||
| disabled. | ||||
| 6. Frame Definitions | 6. Frame Definitions | |||
| This specification defines a number of frame types, each identified | This specification defines a number of frame types, each identified | |||
| by a unique 8-bit type code. Each frame type serves a distinct | by a unique 8-bit type code. Each frame type serves a distinct | |||
| purpose either in the establishment and management of the connection | purpose either in the establishment and management of the connection | |||
| as a whole, or of individual streams. | as a whole, or of individual streams. | |||
| The transmission of specific frame types can alter the state of a | The transmission of specific frame types can alter the state of a | |||
| connection. If endpoints fail to maintain a synchronized view of the | connection. If endpoints fail to maintain a synchronized view of the | |||
| skipping to change at page 30, line 38 ¶ | skipping to change at page 30, line 48 ¶ | |||
| 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 Length? (8)| | |Pad Length? (8)| | |||
| +---------------+-----------------------------------------------+ | +---------------+-----------------------------------------------+ | |||
| | Data (*) ... | | Data (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Padding (*) ... | | Padding (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| DATA Frame Payload | Figure 6: DATA Frame Payload | |||
| The DATA frame contains the following fields: | The DATA frame contains the following fields: | |||
| Pad Length: An 8-bit field containing the length of the frame | Pad Length: An 8-bit field containing the length of the frame | |||
| padding in units of octets. This field is optional and is only | padding in units of octets. This field is optional and is only | |||
| present if the PADDED flag is set. | present if the PADDED flag is set. | |||
| Data: Application data. The amount of data is the remainder of the | Data: Application data. The amount of data is the remainder of the | |||
| frame payload after subtracting the length of the other fields | frame payload after subtracting the length of the other fields | |||
| that are present. | that are present. | |||
| Padding: Padding octets that contain no application semantic value. | Padding: Padding octets that contain no application semantic value. | |||
| Padding octets MUST be set to zero when sending and ignored when | Padding octets MUST be set to zero when sending. A receiver is | |||
| receiving. | not obligated to verify padding, but MAY treat non-zero padding as | |||
| a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 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 0 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 the "half | Setting this flag causes the stream to enter one of the "half | |||
| closed" states or the "closed" state (Section 5.1). | closed" states or the "closed" state (Section 5.1). | |||
| PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | PADDED (0x8): Bit 3 being set indicates that the Pad Length field | |||
| present. | and any padding that it describes is present. | |||
| 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. The entire | stream is in the "open" or "half closed (remote)" states. The entire | |||
| DATA frame payload is included in flow control, including Pad Length | DATA frame payload is included in flow control, including Pad Length | |||
| and Padding fields if present. If a DATA frame is received whose | and Padding fields if present. If a DATA frame is received whose | |||
| stream is not in "open" or "half closed (local)" state, the recipient | stream is not in "open" or "half closed (local)" state, the recipient | |||
| MUST respond with a stream error (Section 5.4.2) of type | MUST respond with a stream error (Section 5.4.2) of type | |||
| STREAM_CLOSED. | STREAM_CLOSED. | |||
| The total number of padding octets is determined by the value of the | The total number of padding octets is determined by the value of the | |||
| Pad Length field. If the length of the padding is greater than the | Pad Length field. If the length of the padding is the length of the | |||
| length of the remainder of the frame payload, the recipient MUST | frame payload or greater, the recipient MUST treat this as a | |||
| treat this as a connection error (Section 5.4.1) of type | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| PROTOCOL_ERROR. | ||||
| Note: A frame can be increased in size by one octet by including a | Note: A frame can be increased in size by one octet by including a | |||
| Pad Length field with a value of zero. | Pad Length field with a value of zero. | |||
| Use of padding is a security feature; as such, its use demands some | Padding is a security feature; see Section 10.7. | |||
| care, see Section 10.7. | ||||
| 6.2. HEADERS | 6.2. HEADERS | |||
| The HEADERS frame (type=0x1) carries name-value pairs. It is used to | The HEADERS frame (type=0x1) is used to open a stream (Section 5.1), | |||
| open a stream (Section 5.1). HEADERS frames can be sent on a stream | and additionally carries a header block fragment. HEADERS frames can | |||
| in the "open" or "half closed (remote)" states. | be sent on a stream 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |Pad Length? (8)| | |Pad Length? (8)| | |||
| +-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| |E| Stream Dependency? (31) | | |E| Stream Dependency? (31) | | |||
| +-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| | Weight? (8) | | | Weight? (8) | | |||
| +-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| | Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Padding (*) ... | | Padding (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| HEADERS Frame Payload | Figure 7: HEADERS Frame Payload | |||
| The HEADERS frame payload has the following fields: | The HEADERS frame payload has the following fields: | |||
| Pad Length: An 8-bit field containing the length of the frame | Pad Length: An 8-bit field containing the length of the frame | |||
| padding in units of octets. This field is optional and is only | padding in units of octets. This field is only present if the | |||
| present if the PADDED flag is set. | PADDED flag is set. | |||
| E: A single bit flag indicates that the stream dependency is | E: A single bit flag indicates that the stream dependency is | |||
| exclusive, see Section 5.3. This field is optional and is only | exclusive, see Section 5.3. This field is only present if the | |||
| present if the PRIORITY flag is set. | PRIORITY flag is set. | |||
| Stream Dependency: A 31-bit stream identifier for the stream that | Stream Dependency: A 31-bit stream identifier for the stream that | |||
| this stream depends on, see Section 5.3. This field is optional | this stream depends on, see Section 5.3. This field is only | |||
| and is only present if the PRIORITY flag is set. | present if the PRIORITY flag is set. | |||
| Weight: An 8-bit weight for the stream, see Section 5.3. Add one to | Weight: An 8-bit weight for the stream, see Section 5.3. Add one to | |||
| the value to obtain a weight between 1 and 256. This field is | the value to obtain a weight between 1 and 256. This field is | |||
| optional and is only present if the PRIORITY flag is set. | only present if the PRIORITY flag is set. | |||
| Header Block Fragment: A header block fragment (Section 4.3). | Header Block Fragment: A header block fragment (Section 4.3). | |||
| Padding: Padding octets. | Padding: Padding octets that contain no application semantic value. | |||
| Padding octets MUST be set to zero when sending and ignored when | ||||
| receiving. | ||||
| 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 0 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 carries the END_STREAM flag that signals the end | |||
| the END_STREAM flag that signals the end of a stream. A | of a stream. However, a HEADERS frame with the END_STREAM flag | |||
| CONTINUATION frame cannot be used to terminate a stream. | set can be followed by CONTINUATION frames on the same stream. | |||
| Logically, the CONTINUATION frames are part of the HEADERS frame. | ||||
| END_HEADERS (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): Bit 2 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. | |||
| PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | PADDED (0x8): Bit 3 being set indicates that the Pad Length field | |||
| present. | and any padding that it describes is present. | |||
| PRIORITY (0x20): Bit 6 being set indicates that the Exclusive Flag | PRIORITY (0x20): Bit 5 being set indicates that the Exclusive Flag | |||
| (E), Stream Dependency, and Weight fields are present; see | (E), Stream Dependency, and Weight fields are present; see | |||
| Section 5.3. | Section 5.3. | |||
| 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 | The HEADERS frame includes optional padding. Padding fields and | |||
| flags are identical to those defined for DATA frames (Section 6.1). | flags are identical to those defined for DATA frames (Section 6.1). | |||
| Prioritization information in a HEADERS frame is logically equivalent | ||||
| to a separate PRIORITY frame, but inclusion in HEADERS avoids the | ||||
| potential for churn in stream prioritization when new streams are | ||||
| created. Priorization fields in HEADERS frames subsequent to the | ||||
| first on a stream reprioritize the stream (Section 5.3.3). | ||||
| 6.3. PRIORITY | 6.3. PRIORITY | |||
| The PRIORITY frame (type=0x2) specifies the sender-advised priority | The PRIORITY frame (type=0x2) specifies the sender-advised priority | |||
| of a stream (Section 5.3). It can be sent at any time for an | of a stream (Section 5.3). It can be sent at any time for an | |||
| existing stream, including closed streams. This enables | existing stream, including closed streams. This enables | |||
| reprioritization of existing streams. | reprioritization 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |E| Stream Dependency (31) | | |E| Stream Dependency (31) | | |||
| +-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| | Weight (8) | | | Weight (8) | | |||
| +-+-------------+ | +-+-------------+ | |||
| PRIORITY Frame Payload | Figure 8: PRIORITY Frame Payload | |||
| The payload of a PRIORITY frame contains the following fields: | The payload of a PRIORITY frame contains the following fields: | |||
| E: A single bit flag indicates that the stream dependency is | E: A single bit flag indicates that the stream dependency is | |||
| exclusive, see Section 5.3. | exclusive, see Section 5.3. | |||
| Stream Dependency: A 31-bit stream identifier for the stream that | Stream Dependency: A 31-bit stream identifier for the stream that | |||
| this stream depends on, see Section 5.3. | this stream depends on, see Section 5.3. | |||
| Weight: An 8-bit weight for the identified stream dependency, see | Weight: An 8-bit weight for the identified stream dependency, see | |||
| skipping to change at page 34, line 41 ¶ | skipping to change at page 35, line 9 ¶ | |||
| this frame can only affect processing of the current stream and not | this frame can only affect processing of the current stream and not | |||
| frame transmission. | frame transmission. | |||
| The PRIORITY frame is the only frame that can be sent for a stream in | The PRIORITY frame is the only frame that can be sent for a stream in | |||
| the "closed" state. This allows for the reprioritization of a group | the "closed" state. This allows for the reprioritization of a group | |||
| of dependent streams by altering the priority of a parent stream, | of dependent streams by altering the priority of a parent stream, | |||
| which might be closed. However, a PRIORITY frame sent on a closed | which might be closed. However, a PRIORITY frame sent on a closed | |||
| stream risks being ignored due to the peer having discarded priority | stream risks being ignored due to the peer having discarded priority | |||
| state information for that stream. | state information for that stream. | |||
| A PRIORITY frame with a length other than 5 octets MUST be treated as | ||||
| a stream error (Section 5.4.2) of type FRAME_SIZE_ERROR. | ||||
| 6.4. RST_STREAM | 6.4. RST_STREAM | |||
| The RST_STREAM frame (type=0x3) allows for abnormal termination of a | The RST_STREAM frame (type=0x3) allows for immediate termination of a | |||
| stream. When sent by the initiator of a stream, it indicates that | stream. RST_STREAM is sent to request cancellation of a stream, or | |||
| they wish to cancel the stream or that an error condition has | to indicate that an error condition has occurred. | |||
| occurred. When sent by the receiver of a stream, it indicates that | ||||
| either the receiver is rejecting the stream, requesting that the | ||||
| stream be cancelled, or that an error condition has occurred. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (32) | | | Error Code (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| RST_STREAM Frame Payload | Figure 9: RST_STREAM Frame Payload | |||
| The RST_STREAM frame contains a single unsigned, 32-bit integer | The RST_STREAM frame contains a single unsigned, 32-bit integer | |||
| identifying the error code (Section 7). The error code indicates why | identifying the error code (Section 7). The error code indicates why | |||
| the stream is being terminated. | the stream is being terminated. | |||
| The RST_STREAM frame does not define any flags. | The RST_STREAM frame does not define any flags. | |||
| The RST_STREAM frame fully terminates the referenced stream and | The RST_STREAM frame fully terminates the referenced stream and | |||
| causes it to enter the closed state. After receiving a RST_STREAM on | causes it to enter the closed state. After receiving a RST_STREAM on | |||
| a stream, the receiver MUST NOT send additional frames for that | a stream, the receiver MUST NOT send additional frames for that | |||
| stream. However, after sending the RST_STREAM, the sending endpoint | stream, with the exception of PRIORITY. However, after sending the | |||
| MUST be prepared to receive and process additional frames sent on the | RST_STREAM, the sending endpoint MUST be prepared to receive and | |||
| stream that might have been sent by the peer prior to the arrival of | process additional frames sent on the stream that might have been | |||
| the RST_STREAM. | sent by the peer prior to the arrival of the RST_STREAM. | |||
| RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | |||
| frame is received with a stream identifier of 0x0, the recipient MUST | frame is received with a stream identifier of 0x0, the recipient MUST | |||
| treat this as a connection error (Section 5.4.1) of type | treat this as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. | RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. | |||
| If a RST_STREAM frame identifying an idle stream is received, the | If a RST_STREAM frame identifying an idle stream is received, the | |||
| recipient MUST treat this as a connection error (Section 5.4.1) of | recipient MUST treat this as a connection error (Section 5.4.1) of | |||
| type PROTOCOL_ERROR. | type PROTOCOL_ERROR. | |||
| A RST_STREAM frame with a length other than 4 octets MUST be treated | ||||
| as a connection error (Section 5.4.1) of type FRAME_SIZE_ERROR. | ||||
| 6.5. SETTINGS | 6.5. SETTINGS | |||
| The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x4) conveys configuration parameters that | |||
| affect how endpoints communicate, such as preferences and constraints | affect how endpoints communicate, such as preferences and constraints | |||
| on peer behavior. The SETTINGS frame is also used to acknowledge the | on peer behavior. The SETTINGS frame is also used to acknowledge the | |||
| receipt of those parameters. Individually, a SETTINGS parameter can | receipt of those parameters. Individually, a SETTINGS parameter can | |||
| also be referred to as a "setting". | also be referred to as a "setting". | |||
| SETTINGS parameters are not negotiated; they describe characteristics | SETTINGS parameters are not negotiated; they describe characteristics | |||
| of the sending peer, which are used by the receiving peer. Different | of the sending peer, which are used by the receiving peer. Different | |||
| skipping to change at page 36, line 17 ¶ | skipping to change at page 36, line 34 ¶ | |||
| Each parameter in a SETTINGS frame replaces any existing value for | Each parameter in a SETTINGS frame replaces any existing value for | |||
| that parameter. Parameters are processed in the order in which they | that parameter. Parameters are processed in the order in which they | |||
| appear, and a receiver of a SETTINGS frame does not need to maintain | appear, and a receiver of a SETTINGS frame does not need to maintain | |||
| any state other than the current value of its parameters. Therefore, | any state other than the current value of its parameters. Therefore, | |||
| the value of a SETTINGS parameter is the last value that is seen by a | the value of a SETTINGS parameter is the last value that is seen by a | |||
| receiver. | receiver. | |||
| SETTINGS parameters are acknowledged by the receiving peer. To | SETTINGS parameters are acknowledged by the receiving peer. To | |||
| enable this, the SETTINGS frame defines the following flag: | enable this, the SETTINGS frame defines the following flag: | |||
| ACK (0x1): Bit 1 being set indicates that this frame acknowledges | ACK (0x1): Bit 0 being set indicates that this frame acknowledges | |||
| receipt and application of the peer's SETTINGS frame. When this | receipt and application of the peer's SETTINGS frame. When this | |||
| bit is set, the payload of the SETTINGS frame MUST be empty. | bit is set, the payload of the SETTINGS frame MUST be empty. | |||
| Receipt of a SETTINGS frame with the ACK flag set and a length | Receipt of a SETTINGS frame with the ACK flag set and a length | |||
| field value other than 0 MUST be treated as a connection error | field value other than 0 MUST be treated as a connection error | |||
| (Section 5.4.1) of type FRAME_SIZE_ERROR. For more info, see | (Section 5.4.1) of type FRAME_SIZE_ERROR. For more info, see | |||
| Settings Synchronization (Section 6.5.3). | Settings Synchronization (Section 6.5.3). | |||
| SETTINGS frames always apply to a connection, never a single stream. | SETTINGS frames always apply to a connection, never a single stream. | |||
| The stream identifier for a SETTINGS frame MUST be zero (0x0). If an | The stream identifier for a SETTINGS frame MUST be zero (0x0). If an | |||
| endpoint receives a SETTINGS frame whose stream identifier field is | endpoint receives a SETTINGS frame whose stream identifier field is | |||
| anything other than 0x0, the endpoint MUST respond with a connection | anything other than 0x0, the endpoint MUST respond with a connection | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The SETTINGS frame affects connection state. A badly formed or | The SETTINGS frame affects connection state. A badly formed or | |||
| incomplete SETTINGS frame MUST be treated as a connection error | incomplete SETTINGS frame MUST be treated as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| A SETTINGS frame with a length other than a multiple of 6 octets MUST | ||||
| be treated as a connection error (Section 5.4.1) of type | ||||
| FRAME_SIZE_ERROR. | ||||
| 6.5.1. SETTINGS Format | 6.5.1. SETTINGS Format | |||
| The payload of a SETTINGS frame consists of zero or more parameters, | The payload of a SETTINGS frame consists of zero or more parameters, | |||
| each consisting of an unsigned 16-bit setting identifier and an | each consisting of an unsigned 16-bit 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Identifier (16) | | | Identifier (16) | | |||
| +-------------------------------+-------------------------------+ | +-------------------------------+-------------------------------+ | |||
| | Value (32) | | | Value (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Setting Format | Figure 10: Setting Format | |||
| 6.5.2. Defined SETTINGS Parameters | 6.5.2. Defined SETTINGS Parameters | |||
| The following parameters are defined: | The following parameters are defined: | |||
| SETTINGS_HEADER_TABLE_SIZE (0x1): Allows the sender to inform the | SETTINGS_HEADER_TABLE_SIZE (0x1): Allows the sender to inform the | |||
| remote endpoint of the maximum size of the header compression | remote endpoint of the maximum size of the header compression | |||
| table used to decode header blocks. The encoder can select any | table used to decode header blocks, in octets. The encoder can | |||
| size equal to or less than this value by using signaling specific | select any size equal to or less than this value by using | |||
| to the header compression format inside a header block. The | signaling specific to the header compression format inside a | |||
| initial value is 4,096 bytes. | header block. The initial value is 4,096 octets. | |||
| SETTINGS_ENABLE_PUSH (0x2): This setting can be use to disable | SETTINGS_ENABLE_PUSH (0x2): This setting can be use to disable | |||
| server push (Section 8.2). An endpoint MUST NOT send a | server push (Section 8.2). An endpoint MUST NOT send a | |||
| PUSH_PROMISE frame if it receives this parameter set to a value of | PUSH_PROMISE frame if it receives this parameter set to a value of | |||
| 0. An endpoint that has both set this parameter to 0 and had it | 0. An endpoint that has both set this parameter to 0 and had it | |||
| acknowledged MUST treat the receipt of a PUSH_PROMISE frame as a | acknowledged MUST treat the receipt of a PUSH_PROMISE frame as a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| The initial value is 1, which indicates that server push is | The initial value is 1, which indicates that server push is | |||
| permitted. Any value other than 0 or 1 MUST be treated as a | permitted. Any value other than 0 or 1 MUST be treated as a | |||
| skipping to change at page 37, line 42 ¶ | skipping to change at page 38, line 13 ¶ | |||
| 100, so as to not unnecessarily limit parallelism. | 100, so as to not unnecessarily limit parallelism. | |||
| A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be | A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be | |||
| treated as special by endpoints. A zero value does prevent the | treated as special by endpoints. A zero value does prevent the | |||
| creation of new streams, however this can also happen for any | creation of new streams, however this can also happen for any | |||
| limit that is exhausted with active streams. Servers SHOULD only | limit that is exhausted with active streams. Servers SHOULD only | |||
| set a zero value for short durations; if a server does not wish to | set a zero value for short durations; if a server does not wish to | |||
| accept requests, closing the connection could be preferable. | accept requests, closing the connection could be preferable. | |||
| SETTINGS_INITIAL_WINDOW_SIZE (0x4): Indicates the sender's initial | SETTINGS_INITIAL_WINDOW_SIZE (0x4): Indicates the sender's initial | |||
| window size (in bytes) for stream level flow control. The initial | window size (in octets) for stream level flow control. The | |||
| value is 2^16-1 (65,535) octets. | initial value is 2^16-1 (65,535) octets. | |||
| This setting affects the window size of all streams, including | This setting affects the window size of all streams, including | |||
| existing streams, see Section 6.9.2. | existing streams, see Section 6.9.2. | |||
| Values above the maximum flow control window size of 2^31-1 MUST | Values above the maximum flow control window size of 2^31-1 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 | |||
| FLOW_CONTROL_ERROR. | FLOW_CONTROL_ERROR. | |||
| SETTINGS_MAX_FRAME_SIZE (0x5): Indicates the size of the largest | SETTINGS_MAX_FRAME_SIZE (0x5): Indicates the size of the largest | |||
| frame payload that a receiver is willing to accept. | frame payload that the sender is willing to receive, in octets. | |||
| The initial value is 2^14 (16,384) octets. The value advertised | The initial value is 2^14 (16,384) octets. The value advertised | |||
| by an endpoint MUST be between this initial value and the maximum | by an endpoint MUST be between this initial value and the maximum | |||
| allowed frame size (2^24-1 or 16,777,215 octets), inclusive. | allowed frame size (2^24-1 or 16,777,215 octets), inclusive. | |||
| Values outside this range MUST be treated as a connection error | Values outside this range MUST be treated as a connection error | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE (0x6): This advisory setting informs a | SETTINGS_MAX_HEADER_LIST_SIZE (0x6): This advisory setting informs a | |||
| peer of the maximum size of header list that the sender is | peer of the maximum size of header list that the sender is | |||
| prepared to accept. The value is based on the uncompressed size | prepared to accept, in octets. The value is based on the | |||
| of header fields, including the length of the name and value in | uncompressed size of header fields, including the length of the | |||
| octets plus an overhead of 32 octets for each header field. | name and value in octets plus an overhead of 32 octets for each | |||
| header field. | ||||
| For any given request, a lower limit than what is advertised MAY | For any given request, a lower limit than what is advertised MAY | |||
| be enforced. The initial value of this setting is unlimited. | be enforced. The initial value of this setting is unlimited. | |||
| An endpoint that receives a SETTINGS frame with any unknown or | An endpoint that receives a SETTINGS frame with any unknown or | |||
| unsupported identifier MUST ignore that setting. | unsupported identifier MUST ignore that setting. | |||
| 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 | |||
| skipping to change at page 39, line 19 ¶ | skipping to change at page 39, line 38 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |Pad Length? (8)| | |Pad Length? (8)| | |||
| +-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| |R| Promised Stream ID (31) | | |R| Promised Stream ID (31) | | |||
| +-+-----------------------------+-------------------------------+ | +-+-----------------------------+-------------------------------+ | |||
| | Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Padding (*) ... | | Padding (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| PUSH_PROMISE Payload Format | Figure 11: PUSH_PROMISE Payload Format | |||
| The PUSH_PROMISE frame payload has the following fields: | The PUSH_PROMISE frame payload has the following fields: | |||
| Pad Length: An 8-bit field containing the length of the frame | Pad Length: An 8-bit field containing the length of the frame | |||
| padding in units of octets. This field is optional and is only | padding in units of octets. This field is only present if the | |||
| present if the PADDED flag is set. | PADDED flag is set. | |||
| R: A single reserved bit. | R: A single reserved bit. | |||
| Promised Stream ID: This unsigned 31-bit integer identifies the | Promised Stream ID: An unsigned 31-bit integer that identifies the | |||
| stream the endpoint intends to start sending frames for. The | stream that is reserved by the PUSH_PROMISE. The promised stream | |||
| promised stream identifier MUST be a valid choice for the next | identifier MUST be a valid choice for the next stream sent by the | |||
| stream sent by the sender (see new stream identifier | sender (see new stream identifier (Section 5.1.1)). | |||
| (Section 5.1.1)). | ||||
| Header Block Fragment: A header block fragment (Section 4.3) | Header Block Fragment: A header block fragment (Section 4.3) | |||
| containing request header fields. | containing request header fields. | |||
| Padding: Padding octets. | Padding: Padding octets. | |||
| The PUSH_PROMISE frame defines the following flags: | The PUSH_PROMISE frame defines the following flags: | |||
| END_HEADERS (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): Bit 2 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 PUSH_PROMISE frame without the END_HEADERS flag set MUST be | A PUSH_PROMISE frame without the END_HEADERS flag set MUST be | |||
| followed by a CONTINUATION frame for the same stream. A receiver | followed by a CONTINUATION frame for the same stream. A receiver | |||
| MUST treat the receipt of any other type of frame or a frame on a | MUST treat the receipt of any other type of frame or a frame on a | |||
| different stream as a connection error (Section 5.4.1) of type | different stream as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | PADDED (0x8): Bit 3 being set indicates that the Pad Length field | |||
| present. | and any padding that it describes is present. | |||
| PUSH_PROMISE frames MUST be associated with an existing, peer- | PUSH_PROMISE frames MUST be associated with an existing, peer- | |||
| initiated stream. The stream identifier of a PUSH_PROMISE frame | initiated stream. The stream identifier of a PUSH_PROMISE frame | |||
| indicates the stream it is associated with. If the stream identifier | indicates the stream it is associated with. If the stream identifier | |||
| field specifies the value 0x0, a recipient MUST respond with a | field specifies the value 0x0, a recipient MUST respond with a | |||
| connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| Promised streams are not required to be used in the order they are | Promised streams are not required to be used in the order they are | |||
| promised. The PUSH_PROMISE only reserves stream identifiers for | promised. The PUSH_PROMISE only reserves stream identifiers for | |||
| later use. | later use. | |||
| skipping to change at page 40, line 42 ¶ | skipping to change at page 41, line 11 ¶ | |||
| "reserved" state. A sender MUST NOT send a PUSH_PROMISE on a stream | "reserved" state. A sender MUST NOT send a PUSH_PROMISE on a stream | |||
| unless that stream is either "open" or "half closed (remote)"; the | unless that stream is either "open" or "half closed (remote)"; the | |||
| sender MUST ensure that the promised stream is a valid choice for a | sender MUST ensure that the promised stream is a valid choice for a | |||
| new stream identifier (Section 5.1.1) (that is, the promised stream | new stream identifier (Section 5.1.1) (that is, the promised stream | |||
| MUST be in the "idle" state). | MUST be in the "idle" 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. However, an endpoint that | |||
| treat the receipt of a PUSH_PROMISE that promises an illegal stream | has sent RST_STREAM on the associated stream MUST handle PUSH_PROMISE | |||
| identifier (Section 5.1.1) (that is, an identifier for a stream that | frames that might have been created before the RST_STREAM frame is | |||
| is not currently in the "idle" state) as a connection error | received and processed. | |||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| A receiver MUST treat the receipt of a PUSH_PROMISE that promises an | ||||
| illegal stream identifier (Section 5.1.1) (that is, an identifier for | ||||
| a stream that is not currently in the "idle" state) as a connection | ||||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| The PUSH_PROMISE frame includes optional padding. Padding fields and | The PUSH_PROMISE frame includes optional padding. Padding fields and | |||
| flags are identical to those defined for DATA frames (Section 6.1). | flags are identical to those defined for DATA frames (Section 6.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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| | Opaque Data (64) | | | Opaque Data (64) | | |||
| | | | | | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| PING Payload Format | Figure 12: 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 octets in any fashion. | |||
| Receivers of a PING frame that does not include an ACK flag MUST send | Receivers of a PING frame that does not include an 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 be given higher priority than any | payload. PING responses SHOULD be given higher priority than any | |||
| other 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 0 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 | |||
| skipping to change at page 42, line 10 ¶ | skipping to change at page 42, line 31 ¶ | |||
| streams on this connection. GOAWAY can be sent by either the client | streams on this connection. GOAWAY can be sent by either the client | |||
| or the server. Once sent, the sender will ignore frames sent on any | or the server. Once sent, the sender will ignore frames sent on any | |||
| new streams with identifiers higher than the included last stream | new streams with identifiers higher than the included last stream | |||
| identifier. Receivers of a GOAWAY frame MUST NOT open additional | identifier. Receivers of a GOAWAY frame MUST NOT open additional | |||
| streams on the connection, although a new connection can be | streams on the connection, although a new connection can be | |||
| established for new streams. | established for new streams. | |||
| The purpose of this frame is to allow an endpoint to gracefully stop | The purpose of this frame is to allow an endpoint to gracefully stop | |||
| accepting new streams, while still finishing processing of previously | accepting new streams, while still finishing processing of previously | |||
| established streams. This enables administrative actions, like | established streams. This enables administrative actions, like | |||
| server maintainence. | server maintainance. | |||
| 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 peer- | case, the GOAWAY contains the stream identifier of the last peer- | |||
| initiated stream which was or might be processed on the sending | initiated stream which was or might be processed on the sending | |||
| endpoint in this connection. For instance, if the server sends a | endpoint in this connection. For instance, if the server sends a | |||
| GOAWAY frame, the identifed stream is the highest numbered stream | GOAWAY frame, the identified stream is the highest numbered stream | |||
| initiated by the client. | initiated by the client. | |||
| If the receiver of the GOAWAY has sent data on streams with a higher | If the receiver of the GOAWAY has sent data on streams with a higher | |||
| stream identifier than what is indicated in the GOAWAY frame, those | stream identifier than what is indicated in the GOAWAY frame, those | |||
| streams are not or will not be processed. The receiver of the GOAWAY | streams are not or will not be processed. The receiver of the GOAWAY | |||
| frame can treat the streams as though they had never been created at | frame can treat the streams as though they had never been created at | |||
| all, thereby allowing those streams to be retried later on a new | all, thereby allowing those streams to be retried later on a new | |||
| connection. | connection. | |||
| Endpoints SHOULD always send a GOAWAY frame before closing a | Endpoints SHOULD always send a GOAWAY frame before closing a | |||
| skipping to change at page 42, line 48 ¶ | skipping to change at page 43, line 20 ¶ | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |R| Last-Stream-ID (31) | | |R| Last-Stream-ID (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| | Error Code (32) | | | Error Code (32) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| | Additional Debug Data (*) | | | Additional Debug Data (*) | | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| GOAWAY Payload Format | Figure 13: 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. | |||
| An endpoint MUST treat a GOAWAY frame with a stream identifier other | An endpoint MUST treat a GOAWAY frame with a stream identifier other | |||
| than 0x0 as a connection error (Section 5.4.1) of type | than 0x0 as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | 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 | |||
| skipping to change at page 45, line 11 ¶ | skipping to change at page 45, line 34 ¶ | |||
| respond with a stream error (Section 5.4.2) or connection error | respond with a stream error (Section 5.4.2) or connection error | |||
| (Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable to accept | (Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable to accept | |||
| a frame. | a frame. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |R| Window Size Increment (31) | | |R| Window Size Increment (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| WINDOW_UPDATE Payload Format | Figure 14: WINDOW_UPDATE Payload Format | |||
| The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | |||
| unsigned 31-bit integer indicating the number of bytes that the | unsigned 31-bit integer indicating the number of octets that the | |||
| sender can transmit in addition to the existing flow control window. | sender can transmit in addition to the existing flow control window. | |||
| The legal range for the increment to the flow control window is 1 to | The legal range for the increment to the flow control window is 1 to | |||
| 2^31-1 (0x7fffffff) bytes. | 2^31-1 (2,147,483,647) octets. | |||
| The WINDOW_UPDATE frame does not define any flags. | The WINDOW_UPDATE frame does not define any flags. | |||
| The WINDOW_UPDATE frame can be specific to a stream or to the entire | The WINDOW_UPDATE frame can be specific to a stream or to the entire | |||
| connection. In the former case, the frame's stream identifier | connection. In the former case, the frame's stream identifier | |||
| indicates the affected stream; in the latter, the value "0" indicates | indicates the affected stream; in the latter, the value "0" indicates | |||
| that the entire connection is the subject of the frame. | that the entire connection is the subject of the frame. | |||
| A receiver MUST treat the recipt of a WINDOW_UPDATE frame with an | A receiver MUST treat the receipt of a WINDOW_UPDATE frame with an | |||
| flow control window increment of 0 as a stream error (Section 5.4.2) | flow control window increment of 0 as a stream error (Section 5.4.2) | |||
| of type PROTOCOL_ERROR; errors on the connection flow control window | of type PROTOCOL_ERROR; errors on the connection flow control window | |||
| MUST be treated as a connection error (Section 5.4.1). | MUST be treated as a connection error (Section 5.4.1). | |||
| WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the | WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the | |||
| END_STREAM flag. This means that a receiver could receive a | END_STREAM flag. This means that a receiver could receive a | |||
| WINDOW_UPDATE frame on a "half closed (remote)" or "closed" stream. | WINDOW_UPDATE frame on a "half closed (remote)" or "closed" stream. | |||
| A receiver MUST NOT treat this as an error, see Section 5.1. | A receiver MUST NOT treat this as an error, see Section 5.1. | |||
| 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. | |||
| A WINDOW_UPDATE frame with a length other than 4 octets MUST be | ||||
| treated as a connection error (Section 5.4.1) of type | ||||
| FRAME_SIZE_ERROR. | ||||
| 6.9.1. The Flow Control Window | 6.9.1. The Flow Control Window | |||
| Flow control in HTTP/2 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 octets of data the sender is permitted | |||
| to transmit; as such, its size is a measure of the buffering capacity | to transmit; as such, its size is a measure of the buffering capacity | |||
| of the receiver. | 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 (that | receiver. Frames with zero length with the END_STREAM flag set (that | |||
| is, an empty DATA frame) MAY be sent if there is no available space | is, an empty DATA frame) MAY be sent if there is no available space | |||
| in either flow control window. | in either flow control window. | |||
| For flow control calculations, the 8 byte frame header is not | For flow control calculations, the 9 octet frame header is not | |||
| counted. | counted. | |||
| After sending a flow controlled frame, the sender reduces the space | After sending a flow controlled frame, the sender reduces the space | |||
| available in both windows by the length of the transmitted frame. | available in both windows by the length of the transmitted frame. | |||
| The receiver of a frame sends a WINDOW_UPDATE frame as it consumes | The receiver of a frame sends a WINDOW_UPDATE frame as it consumes | |||
| data and frees up space in flow control windows. Separate | data and frees up space in flow control windows. Separate | |||
| WINDOW_UPDATE frames are sent for the stream and connection level | WINDOW_UPDATE frames are sent for the stream and connection level | |||
| flow control windows. | flow control windows. | |||
| A sender that receives a WINDOW_UPDATE frame updates the | A sender that receives a WINDOW_UPDATE frame updates the | |||
| corresponding window by the amount specified in the frame. | corresponding window by the amount specified in the frame. | |||
| A sender MUST NOT allow a flow control window to exceed 2^31-1 bytes. | A sender MUST NOT allow a flow control window to exceed 2^31-1 | |||
| If a sender receives a WINDOW_UPDATE that causes a flow control | octets. If a sender receives a WINDOW_UPDATE that causes a flow | |||
| window to exceed this maximum it MUST terminate either the stream or | control window to exceed this maximum it MUST terminate either the | |||
| the connection, as appropriate. For streams, the sender sends a | stream or the connection, as appropriate. For streams, the sender | |||
| RST_STREAM with the error code of FLOW_CONTROL_ERROR code; for the | sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | |||
| 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 an HTTP/2 connection is first established, new streams are | When an 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 octets. | |||
| The connection flow control window is 65,535 bytes. Both endpoints | The connection flow control window is 65,535 octets. 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 preface. The connection flow control | forms part of the connection preface. The connection flow control | |||
| window can only be changed using WINDOW_UPDATE frames. | window can only be changed using WINDOW_UPDATE frames. | |||
| 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. | |||
| skipping to change at page 48, line 19 ¶ | skipping to change at page 48, line 42 ¶ | |||
| 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 is on the same stream and is a HEADERS, PUSH_PROMISE or | frame is on the same stream and is a HEADERS, PUSH_PROMISE or | |||
| CONTINUATION frame without the END_HEADERS flag set. | CONTINUATION frame without the END_HEADERS 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| CONTINUATION Frame Payload | Figure 15: CONTINUATION Frame Payload | |||
| The CONTINUATION frame payload contains a header block fragment | The CONTINUATION frame payload contains a header block fragment | |||
| (Section 4.3). | (Section 4.3). | |||
| The CONTINUATION frame defines the following flag: | The CONTINUATION frame defines the following flag: | |||
| END_HEADERS (0x4): Bit 3 being set indicates that this frame ends a | END_HEADERS (0x4): Bit 2 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. | |||
| 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. | |||
| skipping to change at page 49, line 32 ¶ | skipping to change at page 50, line 8 ¶ | |||
| FLOW_CONTROL_ERROR (0x3): The endpoint detected that its peer | FLOW_CONTROL_ERROR (0x3): The endpoint detected that its peer | |||
| violated the flow control protocol. | violated the flow control protocol. | |||
| SETTINGS_TIMEOUT (0x4): The endpoint sent a SETTINGS frame, but did | SETTINGS_TIMEOUT (0x4): The endpoint sent a SETTINGS frame, but did | |||
| not receive a response in a timely manner. See Settings | not receive a response in a timely manner. See Settings | |||
| Synchronization (Section 6.5.3). | Synchronization (Section 6.5.3). | |||
| STREAM_CLOSED (0x5): The endpoint received a frame after a stream | STREAM_CLOSED (0x5): The endpoint received a frame after a stream | |||
| was half closed. | was half closed. | |||
| FRAME_SIZE_ERROR (0x6): The endpoint received a frame that was | FRAME_SIZE_ERROR (0x6): The endpoint received a frame with an | |||
| larger than the maximum size that it supports. | invalid size. | |||
| REFUSED_STREAM (0x7): The endpoint refuses the stream prior to | REFUSED_STREAM (0x7): The endpoint refuses the stream prior to | |||
| performing any application processing, see Section 8.1.4 for | performing any application processing, see Section 8.1.4 for | |||
| details. | details. | |||
| CANCEL (0x8): Used by the endpoint to indicate that the stream is no | CANCEL (0x8): Used by the endpoint to indicate that the stream is no | |||
| longer needed. | longer needed. | |||
| COMPRESSION_ERROR (0x9): The endpoint is unable to maintain the | COMPRESSION_ERROR (0x9): The endpoint is unable to maintain the | |||
| header compression context for the connection. | header compression context for the connection. | |||
| CONNECT_ERROR (0xa): The connection established in response to a | CONNECT_ERROR (0xa): 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 (0xb): The endpoint detected that its peer is | ENHANCE_YOUR_CALM (0xb): The endpoint detected that its peer is | |||
| exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
| INADEQUATE_SECURITY (0xc): The underlying transport has properties | INADEQUATE_SECURITY (0xc): The underlying transport has properties | |||
| that do not meet minimum security requirements (see Section 9.2). | that do not meet minimum security requirements (see Section 9.2). | |||
| HTTP_1_1_REQUIRED (0xd): The endpoint requires that HTTP/1.1 be used | ||||
| instead of HTTP/2. | ||||
| Unknown or unsupported error codes MUST NOT trigger any special | Unknown or unsupported error codes MUST NOT trigger any special | |||
| behavior. These MAY be treated by an implementation as being | behavior. These MAY be treated by an implementation as being | |||
| equivalent to INTERNAL_ERROR. | equivalent to INTERNAL_ERROR. | |||
| 8. HTTP Message Exchanges | 8. HTTP Message Exchanges | |||
| HTTP/2 is intended to be as compatible as possible with current uses | HTTP/2 is intended to be as compatible as possible with current uses | |||
| of HTTP. This means that, from the application perspective, the | of HTTP. This means that, from the application perspective, the | |||
| features of the protocol are largely unchanged. To achieve this, all | features of the protocol are largely unchanged. To achieve this, all | |||
| request and response semantics are preserved, although the syntax of | request and response semantics are preserved, although the syntax of | |||
| skipping to change at page 51, line 8 ¶ | skipping to change at page 51, line 36 ¶ | |||
| [RFC7230], Section 4.1.2). | [RFC7230], Section 4.1.2). | |||
| The last frame in the sequence bears an END_STREAM flag, noting that | The last frame in the sequence bears an END_STREAM flag, noting that | |||
| a HEADERS frame bearing the END_STREAM flag can be followed by | a HEADERS frame bearing the END_STREAM flag can be followed by | |||
| CONTINUATION frames that carry any remaining portions of the header | CONTINUATION frames that carry any remaining portions of the header | |||
| block. | block. | |||
| Other frames (from any stream) MUST NOT occur between either HEADERS | Other frames (from any stream) MUST NOT occur between either HEADERS | |||
| frame and any CONTINUATION frames that might follow. | frame and any CONTINUATION frames that might follow. | |||
| A HEADERS frame (and associated CONTINUATION frames) can only appear | HTTP/2 uses DATA frames to carry message payloads. The "chunked" | |||
| at the start or end of a stream. An endpoint that receives a second | transfer encoding defined in Section 4.1 of [RFC7230] MUST NOT be | |||
| HEADERS frame without the END_STREAM flag set MUST treat the | used in HTTP/2. | |||
| corresponding request or response as malformed (Section 8.1.2.6). | ||||
| Trailing header fields are carried in a header block that also | Trailing header fields are carried in a header block that also | |||
| terminates the stream. That is, a sequence starting with a HEADERS | terminates the stream. Such a header block is a sequence starting | |||
| frame, followed by zero or more CONTINUATION frames, where the | with a HEADERS frame, followed by zero or more CONTINUATION frames, | |||
| HEADERS frame bears an END_STREAM flag. Header blocks after the | where the HEADERS frame bears an END_STREAM flag. Header blocks | |||
| first that do not terminate the stream are not part of an HTTP | after the first that do not terminate the stream are not part of an | |||
| request or response. | HTTP request or response. | |||
| A HEADERS frame (and associated CONTINUATION frames) can only appear | ||||
| at the start or end of a stream. An endpoint that receives a HEADERS | ||||
| frame without the END_STREAM flag set after receiving a final (non- | ||||
| informational) status code MUST treat the corresponding request or | ||||
| response as malformed (Section 8.1.2.6). | ||||
| 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. The request ends with a frame bearing END_STREAM, | "open" state. The request ends with a frame bearing END_STREAM, | |||
| which causes the stream to become "half closed (local)" for the | which causes the stream to become "half closed (local)" for the | |||
| client and "half closed (remote)" for the server. A response starts | client and "half closed (remote)" for the server. A response starts | |||
| with a HEADERS frame and ends with a frame bearing END_STREAM, which | with a HEADERS frame and ends with a frame bearing END_STREAM, which | |||
| places the stream in the "closed" state. | places the stream in the "closed" state. | |||
| An HTTP response is complete after the server sends - or the client | ||||
| receives - a frame with the END_STREAM flag set (including any | ||||
| CONTINUATION frames needed to complete a header block). A server can | ||||
| send a complete response prior to the client sending an entire | ||||
| request if the response does not depend on any portion of the request | ||||
| that has not been sent and received. When this is true, a server MAY | ||||
| request that the client abort transmission of a request without error | ||||
| by sending a RST_STREAM with an error code of NO_ERROR after sending | ||||
| a complete response (i.e., a frame with the END_STREAM flag). | ||||
| Clients MUST NOT discard responses as a result of receiving such a | ||||
| RST_STREAM, though clients can always discard responses at their | ||||
| discretion for other reasons. | ||||
| 8.1.1. Upgrading From HTTP/2 | 8.1.1. Upgrading From HTTP/2 | |||
| HTTP/2 removes support for the 101 (Switching Protocols) | HTTP/2 removes support for the 101 (Switching Protocols) | |||
| informational status code ([RFC7231], Section 6.2.2). | informational status code ([RFC7231], Section 6.2.2). | |||
| The semantics of 101 (Switching Protocols) aren't applicable to a | The semantics of 101 (Switching Protocols) aren't applicable to a | |||
| multiplexed protocol. Alternative protocols are able to use the same | multiplexed protocol. Alternative protocols are able to use the same | |||
| mechanisms that HTTP/2 uses to negotiate their use (see Section 3). | mechanisms that HTTP/2 uses to negotiate their use (see Section 3). | |||
| 8.1.2. HTTP Header Fields | 8.1.2. HTTP Header Fields | |||
| skipping to change at page 51, line 50 ¶ | skipping to change at page 52, line 48 ¶ | |||
| For a listing of registered HTTP headers, see the Message Header | For a listing of registered HTTP headers, see the Message Header | |||
| Field Registry maintained at [4]. | Field Registry maintained at [4]. | |||
| 8.1.2.1. Pseudo-Header Fields | 8.1.2.1. Pseudo-Header Fields | |||
| While HTTP/1.x used the message start-line (see [RFC7230], | While HTTP/1.x used the message start-line (see [RFC7230], | |||
| Section 3.1) to convey the target URI and method of the request, and | Section 3.1) to convey the target URI and method of the request, and | |||
| the status code for the response, HTTP/2 uses special pseudo-header | the status code for the response, HTTP/2 uses special pseudo-header | |||
| fields beginning with ':' character (ASCII 0x3a) for this purpose. | fields beginning with ':' character (ASCII 0x3a) for this purpose. | |||
| Pseudo-header fields are only valid in the HTTP/2 context. These are | Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT | |||
| not HTTP header fields. Endpoints MUST NOT generate pseudo-header | generate pseudo-header fields other than those defined in this | |||
| fields other than those defined in this document. | document. | |||
| Pseudo-header fields are only valid in the context in which they are | Pseudo-header fields are only valid in the context in which they are | |||
| defined. Pseudo-header fields defined for requests MUST NOT appear | defined. Pseudo-header fields defined for requests MUST NOT appear | |||
| in responses; pseudo-header fields defined for responses MUST NOT | in responses; pseudo-header fields defined for responses MUST NOT | |||
| appear in requests. Pseudo-header fields MUST NOT appear in | appear in requests. Pseudo-header fields MUST NOT appear in | |||
| trailers. Endpoints MUST treat a request or response that contains | trailers. Endpoints MUST treat a request or response that contains | |||
| undefined or invalid pseudo-header fields as malformed | undefined or invalid pseudo-header fields as malformed | |||
| (Section 8.1.2.6). | (Section 8.1.2.6). | |||
| Just as in HTTP/1.x, header field names are strings of ASCII | Just as in HTTP/1.x, header field names are strings of ASCII | |||
| characters that are compared in a case-insensitive fashion. However, | characters that are compared in a case-insensitive fashion. However, | |||
| header field names MUST be converted to lowercase prior to their | header field names MUST be converted to lowercase prior to their | |||
| encoding in HTTP/2. A request or response containing uppercase | encoding in HTTP/2. A request or response containing uppercase | |||
| header field names MUST be treated as malformed (Section 8.1.2.6). | header field names MUST be treated as malformed (Section 8.1.2.6). | |||
| All pseudo-header fields MUST appear in the header block before | All pseudo-header fields MUST appear in the header block before | |||
| regular header fields. Any request or response that contains a | regular header fields. Any request or response that contains a | |||
| pseudo-header field that appears in a header block after a regular | pseudo-header field that appears in a header block after a regular | |||
| header field MUST be treated as malformed (Section 8.1.2.6). | header field MUST be treated as malformed (Section 8.1.2.6). | |||
| 8.1.2.2. Hop-by-Hop Header Fields | 8.1.2.2. Connection-Specific Header Fields | |||
| HTTP/2 does not use the Connection header field to indicate "hop-by- | HTTP/2 does not use the "Connection" header field to indicate | |||
| hop" header fields; in this protocol, connection-specific metadata is | connection-specific header fields; in this protocol, connection- | |||
| conveyed by other means. As such, a HTTP/2 message containing | specific metadata is conveyed by other means. An endpoint MUST NOT | |||
| Connection MUST be treated as malformed (Section 8.1.2.6). | generate an HTTP/2 message containing connection-specific header | |||
| fields; any message containing connection-specific header fields MUST | ||||
| be treated as malformed (Section 8.1.2.6). | ||||
| This means that an intermediary transforming an HTTP/1.x message to | This means that an intermediary transforming an HTTP/1.x message to | |||
| HTTP/2 will need to remove any header fields nominated by the | HTTP/2 will need to remove any header fields nominated by the | |||
| Connection header field, along with the Connection header field | Connection header field, along with the Connection header field | |||
| itself. Such intermediaries SHOULD also remove other connection- | itself. Such intermediaries SHOULD also remove other connection- | |||
| specific header fields, such as Keep-Alive, Proxy-Connection, | specific header fields, such as Keep-Alive, Proxy-Connection, | |||
| Transfer-Encoding and Upgrade, even if they are not nominated by | Transfer-Encoding and Upgrade, even if they are not nominated by | |||
| Connection. | Connection. | |||
| One exception to this is the TE header field, which MAY be present in | One exception to this is the TE header field, which MAY be present in | |||
| an HTTP/2 request, but when it is MUST NOT contain any value other | an HTTP/2 request, but when it is, it MUST NOT contain any value | |||
| than "trailers". | other than "trailers". | |||
| Note: HTTP/2 purposefully does not support upgrade to another | Note: HTTP/2 purposefully does not support upgrade to another | |||
| protocol. The handshake methods described in Section 3 are | protocol. The handshake methods described in Section 3 are | |||
| believed sufficient to negotiate the use of alternative protocols. | believed sufficient to negotiate the use of alternative protocols. | |||
| 8.1.2.3. Request Header Fields | 8.1.2.3. Request Pseudo-Header Fields | |||
| HTTP/2 defines a number of pseudo header fields starting with a colon | The following pseudo-header fields are defined for HTTP/2 requests: | |||
| ':' character that carry information about the request target: | ||||
| o The ":method" header field includes the HTTP method ([RFC7231], | o The ":method" pseudo-header field includes the HTTP method | |||
| Section 4). | ([RFC7231], Section 4). | |||
| o The ":scheme" header field includes the scheme portion of the | o The ":scheme" pseudo-header field includes the scheme portion of | |||
| target URI ([RFC3986], Section 3.1). | the target URI ([RFC3986], Section 3.1). | |||
| ":scheme" is not restricted to "http" and "https" schemed URIs. A | ":scheme" is not restricted to "http" and "https" schemed URIs. A | |||
| proxy or gateway can translate requests for non-HTTP schemes, | proxy or gateway can translate requests for non-HTTP schemes, | |||
| enabling the use of HTTP to interact with non-HTTP services. | enabling the use of HTTP to interact with non-HTTP services. | |||
| o The ":authority" header field includes the authority portion of | o The ":authority" pseudo-header field includes the authority | |||
| the target URI ([RFC3986], Section 3.2). The authority MUST NOT | portion of the target URI ([RFC3986], Section 3.2). The authority | |||
| include the deprecated "userinfo" subcomponent for "http" or | MUST NOT include the deprecated "userinfo" subcomponent for "http" | |||
| "https" schemed URIs. | or "https" schemed 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 pseudo-header field MUST be omitted when | |||
| from an HTTP/1.1 request that has a request target in origin or | translating from an HTTP/1.1 request that has a request target in | |||
| asterisk form (see [RFC7230], Section 5.3). Clients that generate | origin or asterisk form (see [RFC7230], Section 5.3). Clients | |||
| HTTP/2 requests directly SHOULD instead omit the "Host" header | that generate HTTP/2 requests directly SHOULD use the _:authority_ | |||
| field. An intermediary that converts an HTTP/2 request to | pseudo-header field instead of the "Host" header field. An | |||
| HTTP/1.1 MUST create a "Host" header field if one is not present | intermediary that converts an HTTP/2 request to HTTP/1.1 MUST | |||
| in a request by copying the value of the ":authority" header | create a "Host" header field if one is not present in a request by | |||
| field. | copying the value of the ":authority" pseudo-header field. | |||
| o The ":path" header field includes the path and query parts of the | o The ":path" pseudo-header field includes the path and query parts | |||
| target URI (the "path-absolute" production from [RFC3986] and | of the target URI (the "path-absolute" production from [RFC3986] | |||
| optionally a '?' character followed by the "query" production, see | and optionally a '?' character followed by the "query" production, | |||
| [RFC3986], Section 3.3 and [RFC3986], Section 3.4). A request in | see [RFC3986], Section 3.3 and [RFC3986], Section 3.4). A request | |||
| asterisk form includes the value '*' for the ":path" header field. | in asterisk form includes the value '*' for the ":path" pseudo- | |||
| header field. | ||||
| This field MUST NOT be empty for "http" or "https" URIs; "http" or | This pseudo-header field MUST NOT be empty for "http" or "https" | |||
| "https" URIs that do not contain a path component MUST include a | URIs; "http" or "https" URIs that do not contain a path component | |||
| value of '/'. The exception to this rule is an OPTIONS request | MUST include a value of '/'. The exception to this rule is an | |||
| for an "http" or "https" URI that does not include a path | OPTIONS request for an "http" or "https" URI that does not include | |||
| component; these MUST include a ":path" header field with a value | a path component; these MUST include a ":path" pseudo-header field | |||
| of '*' (see [RFC7230], Section 5.3.4). | with a value of '*' (see [RFC7230], Section 5.3.4). | |||
| All HTTP/2 requests MUST include exactly one valid value for the | All HTTP/2 requests MUST include exactly one valid value for the | |||
| ":method", ":scheme", and ":path" header fields, unless this is a | ":method", ":scheme", and ":path" pseudo-header fields, unless it is | |||
| CONNECT request (Section 8.3). An HTTP request that omits mandatory | a CONNECT request (Section 8.3). An HTTP request that omits | |||
| header fields is malformed (Section 8.1.2.6). | mandatory pseudo-header fields is malformed (Section 8.1.2.6). | |||
| HTTP/2 does not define a way to carry the version identifier that is | HTTP/2 does not define a way to carry the version identifier that is | |||
| included in the HTTP/1.1 request line. | included in the HTTP/1.1 request line. | |||
| 8.1.2.4. Response Header Fields | 8.1.2.4. Response Pseudo-Header Fields | |||
| A single ":status" header field is defined that carries the HTTP | For HTTP/2 responses, a single ":status" pseudo-header field is | |||
| status code field (see [RFC7231], Section 6). This header field MUST | defined that carries the HTTP status code field (see [RFC7231], | |||
| be included in all responses, otherwise the response is malformed | Section 6). This pseudo-header field MUST be included in all | |||
| (Section 8.1.2.6). | responses, otherwise the response is malformed (Section 8.1.2.6). | |||
| HTTP/2 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.2.5. Compressing the Cookie Header Field | 8.1.2.5. Compressing the Cookie Header Field | |||
| The Cookie header field [COOKIE] can carry a significant amount of | The Cookie header field [COOKIE] can carry a significant amount of | |||
| redundant data. | redundant data. | |||
| The Cookie header field uses a semi-colon (";") to delimit cookie- | The Cookie header field uses a semi-colon (";") to delimit cookie- | |||
| skipping to change at page 55, line 8 ¶ | skipping to change at page 56, line 10 ¶ | |||
| A malformed request or response is one that is an otherwise valid | A malformed request or response is one that is an otherwise valid | |||
| sequence of HTTP/2 frames, but is otherwise invalid due to the | sequence of HTTP/2 frames, but is otherwise invalid due to the | |||
| presence of extraneous frames, prohibited header fields, the absence | presence of extraneous frames, prohibited header fields, the absence | |||
| of mandatory header fields, or the inclusion of uppercase header | of mandatory header fields, or the inclusion of uppercase header | |||
| field names. | 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. | |||
| with the exception of responses to HEAD requests, which always | A response that is defined to have no payload, as described in | |||
| contain no DATA frames. | [RFC7230], Section 3.3.2, can have a non-zero "content-length" header | |||
| field, even though no content is included in DATA frames. | ||||
| Intermediaries that process HTTP requests or responses (i.e., any | Intermediaries that process HTTP requests or responses (i.e., any | |||
| intermediary not acting as a tunnel) MUST NOT forward a malformed | intermediary not acting as a tunnel) MUST NOT forward a malformed | |||
| request or response. Malformed requests or responses that are | request or response. Malformed requests or responses that are | |||
| detected MUST be treated as a stream error (Section 5.4.2) of type | detected MUST be treated as a stream error (Section 5.4.2) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| For malformed requests, a server MAY send an HTTP response prior to | For malformed requests, a server MAY send an HTTP response prior to | |||
| closing or resetting the stream. Clients MUST NOT accept a malformed | closing or resetting the stream. Clients MUST NOT accept a malformed | |||
| response. Note that these requirements are intended to protect | response. Note that these requirements are intended to protect | |||
| skipping to change at page 56, line 24 ¶ | skipping to change at page 57, line 26 ¶ | |||
| 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 | |||
| :path = /resource | :path = /resource | |||
| {binary data} content-type = image/jpeg | {binary data} :scheme = https | |||
| CONTINUATION | CONTINUATION | |||
| + END_HEADERS | + END_HEADERS | |||
| content-type = image/jpeg | ||||
| host = example.org | host = example.org | |||
| :scheme = https | ||||
| content-length = 123 | content-length = 123 | |||
| DATA | DATA | |||
| + END_STREAM | + END_STREAM | |||
| {binary data} | {binary data} | |||
| Note that data contributing to any given header field could be spread | Note that data contributing to any given header field could be spread | |||
| between header block fragments. The allocation of header fields to | between header block fragments. The allocation of header fields to | |||
| frames in this example is illustrative only. | frames in this example is illustrative only. | |||
| skipping to change at page 57, line 16 ¶ | skipping to change at page 58, line 16 ¶ | |||
| Content-Type: image/jpeg ==> - END_STREAM | Content-Type: image/jpeg ==> - END_STREAM | |||
| Content-Length: 123 + END_HEADERS | Content-Length: 123 + END_HEADERS | |||
| :status = 200 | :status = 200 | |||
| {binary data} content-type = image/jpeg | {binary data} content-type = image/jpeg | |||
| content-length = 123 | content-length = 123 | |||
| DATA | DATA | |||
| + END_STREAM | + END_STREAM | |||
| {binary data} | {binary data} | |||
| An informational response using a 1xx status code other than 101 is | ||||
| transmitted as a HEADERS frame, followed by zero or more CONTINUATION | ||||
| frames. | ||||
| 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 HEADERS frame starting the trailers header block has the | sent. The HEADERS frame starting the trailers header block has the | |||
| END_STREAM flag set. | END_STREAM flag set. | |||
| The following example includes both a 100 (Continue) status code, | ||||
| which is sent in response to a request containing a "100-continue" | ||||
| token in the Expect header field, and trailing header fields: | ||||
| HTTP/1.1 100 Continue HEADERS | ||||
| Extension-Field: bar ==> - END_STREAM | ||||
| + END_HEADERS | ||||
| :status = 100 | ||||
| extension-field = bar | ||||
| HTTP/1.1 200 OK HEADERS | HTTP/1.1 200 OK HEADERS | |||
| Content-Type: image/jpeg ==> - END_STREAM | Content-Type: image/jpeg ==> - END_STREAM | |||
| Transfer-Encoding: chunked + END_HEADERS | Transfer-Encoding: chunked + END_HEADERS | |||
| Trailer: Foo :status = 200 | Trailer: Foo :status = 200 | |||
| content-length = 123 | content-length = 123 | |||
| 123 content-type = image/jpeg | 123 content-type = image/jpeg | |||
| {binary data} trailer = Foo | {binary data} trailer = Foo | |||
| 0 | 0 | |||
| Foo: bar DATA | Foo: bar DATA | |||
| - END_STREAM | - END_STREAM | |||
| {binary data} | {binary data} | |||
| HEADERS | HEADERS | |||
| + END_STREAM | + END_STREAM | |||
| + END_HEADERS | + END_HEADERS | |||
| foo = bar | foo = bar | |||
| An informational response using a 1xx status code other than 101 is | ||||
| transmitted as a HEADERS frame, followed by zero or more CONTINUATION | ||||
| frames: | ||||
| HTTP/1.1 103 BAR HEADERS | ||||
| Extension-Field: bar ==> - END_STREAM | ||||
| + END_HEADERS | ||||
| :status = 103 | ||||
| extension-field = bar | ||||
| 8.1.4. Request Reliability Mechanisms in HTTP/2 | 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 provides two mechanisms for providing a guarantee to a client | HTTP/2 provides two mechanisms for providing a guarantee to a client | |||
| that a request has not been processed: | that a request has not been processed: | |||
| skipping to change at page 58, line 38 ¶ | skipping to change at page 59, line 44 ¶ | |||
| 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 enables a server to pre-emptively send (or "push") one or more | HTTP/2 allows a server to pre-emptively send (or "push") responses | |||
| associated responses to a client in response to a single request. | (along with corresponding "promised" requests) to a client in | |||
| This feature becomes particularly helpful when the server knows the | association with a previous client-initiated request. This can be | |||
| client will need to have those responses available in order to fully | useful when the server knows the client will need to have those | |||
| process the response to the original request. | responses available in order to fully process the response to the | |||
| original request. | ||||
| Pushing additional responses is optional, and is negotiated between | Pushing additional message exchanges in this fashion is optional, and | |||
| individual endpoints. The SETTINGS_ENABLE_PUSH setting can be set to | is negotiated between individual endpoints. The SETTINGS_ENABLE_PUSH | |||
| 0 to indicate that server push is disabled. | setting can be set to 0 to indicate that server push is disabled. | |||
| Because pushing responses is effectively hop-by-hop, an intermediary | Promised requests MUST be cacheable (see [RFC7231], Section 4.2.3), | |||
| could receive pushed responses from the server and choose not to | MUST be safe (see [RFC7231], Section 4.2.1) and MUST NOT include a | |||
| forward those on to the client. In other words, how to make use of | request body. Clients that receive a promised request that is not | |||
| the pushed responses is up to that intermediary. Equally, the | cacheable, unsafe or that includes a request body MUST reset the | |||
| intermediary might choose to push additional responses to the client, | stream with a stream error (Section 5.4.2) of type PROTOCOL_ERROR. | |||
| Pushed responses that are cacheable (see [RFC7234], Section 3) can be | ||||
| stored by the client, if it implements an HTTP cache. Pushed | ||||
| responses are considered successfully validated on the origin server | ||||
| (e.g., if the "no-cache" cache response directive [RFC7234], | ||||
| Section 5.2.2 is present) while the stream identified by the promised | ||||
| stream ID is still open. | ||||
| Pushed responses that are not cacheable MUST NOT be stored by any | ||||
| HTTP cache. They MAY be made available to the application | ||||
| separately. | ||||
| An intermediary can receive pushes from the server and choose not to | ||||
| forward them on to the client. In other words, how to make use of | ||||
| the pushed information is up to that intermediary. Equally, the | ||||
| intermediary might choose to make additional pushes to the client, | ||||
| without any action taken by the server. | without any action taken by the server. | |||
| A client cannot push. Thus, servers MUST treat the receipt of a | A client cannot push. Thus, servers MUST treat the receipt of a | |||
| PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. Clients MUST reject any attempt to change the | PROTOCOL_ERROR. Clients MUST reject any attempt to change the | |||
| SETTINGS_ENABLE_PUSH setting to a value other than 0 by treating the | SETTINGS_ENABLE_PUSH setting to a value other than 0 by treating the | |||
| message as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | message as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| A server can only push responses that are cacheable (see [RFC7234], | ||||
| Section 3); promised requests MUST be safe (see [RFC7231], | ||||
| Section 4.2.1) and MUST NOT include a 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; however, in this case that request is also sent by the | request; however, in this case that request is also sent by the | |||
| server, as a PUSH_PROMISE frame. | server, as a PUSH_PROMISE frame. | |||
| The PUSH_PROMISE frame includes a header block that contains a | The PUSH_PROMISE frame includes a header block that contains a | |||
| complete set of request header fields that the server attributes to | complete set of request header fields that the server attributes to | |||
| the request. It is not possible to push a response to a request that | the request. It is not possible to push a response to a request that | |||
| includes a request body. | includes a request body. | |||
| skipping to change at page 61, line 5 ¶ | skipping to change at page 62, line 25 ¶ | |||
| and referencing the pushed stream's identifier. | and referencing the pushed stream's identifier. | |||
| A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | |||
| the number of responses that can be concurrently pushed by a server. | the number of responses 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 either the | |||
| authorized to provide the response, see Section 10.1. For example, a | server is authoritative (see Section 10.1), or the proxy that | |||
| server that offers a certificate for only the "example.com" DNS-ID or | provided the pushed response is configured for the corresponding | |||
| Common Name is not permitted to push a response for | request. For example, a server that offers a certificate for only | |||
| "https://www.example.org/doc". | the "example.com" DNS-ID or Common Name is not permitted to push a | |||
| response for "https://www.example.org/doc". | ||||
| The response for a PUSH_PROMISE stream begins with a HEADERS frame, | The response for a PUSH_PROMISE stream begins with a HEADERS frame, | |||
| which immediately puts the stream into the "half closed (remote)" | which immediately puts the stream into the "half closed (remote)" | |||
| state for the server and "half closed (local)" state for the client, | state for the server and "half closed (local)" state for the client, | |||
| and ends with a frame bearing END_STREAM, which places the stream in | and ends with a frame bearing END_STREAM, which places the stream in | |||
| the "closed" state. | the "closed" state. | |||
| Note: The client never sends a frame with the END_STREAM flag for a | Note: The client never sends a frame with the END_STREAM flag for a | |||
| server push. | server push. | |||
| 8.3. The CONNECT Method | 8.3. The CONNECT Method | |||
| In HTTP/1.x, the pseudo-method CONNECT ([RFC7231], Section 4.3.6) is | In HTTP/1.x, the pseudo-method CONNECT ([RFC7231], Section 4.3.6) is | |||
| used to convert an HTTP connection into a tunnel to a remote host. | used to convert an HTTP connection into a tunnel to a remote host. | |||
| CONNECT is primarily used with HTTP proxies to establish a TLS | CONNECT is primarily used with HTTP proxies to establish a TLS | |||
| session with an origin server for the purposes of interacting with | session with an origin server for the purposes of interacting with | |||
| "https" resources. | "https" resources. | |||
| In HTTP/2, 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 stream to a remote host, for similar purposes. The | single HTTP/2 stream to a remote host, for similar purposes. The | |||
| HTTP header field mapping works as mostly as defined in Request | HTTP header field mapping works as defined in Request Header Fields | |||
| Header Fields (Section 8.1.2.3), with a few differences. | (Section 8.1.2.3), with a few differences. Specifically: | |||
| 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 [RFC7230], Section 5.3). | of CONNECT requests, see [RFC7230], Section 5.3). | |||
| A proxy that supports CONNECT establishes a TCP connection [TCP] to | A proxy that supports CONNECT establishes a TCP connection [TCP] to | |||
| the server identified in the ":authority" header field. Once this | the server identified in the ":authority" header field. Once this | |||
| connection is successfully established, the proxy sends a HEADERS | connection is successfully established, the proxy sends a HEADERS | |||
| frame containing a 2xx series status code to the client, as defined | frame containing a 2xx series status code to the client, as defined | |||
| in [RFC7231], Section 4.3.6. | in [RFC7231], Section 4.3.6. | |||
| After the initial HEADERS frame sent by each peer, all subsequent | After the initial HEADERS frame sent by each peer, all subsequent | |||
| DATA frames correspond to data sent on the TCP connection. The | DATA frames correspond to data sent on the TCP connection. The | |||
| payload of any DATA frames sent by the client are transmitted by the | payload of any DATA frames sent by the client is transmitted by the | |||
| proxy to the TCP server; data received from the TCP server is | proxy to the TCP server; data received from the TCP server is | |||
| assembled into DATA frames by the proxy. Frame types other than DATA | assembled into DATA frames by the proxy. Frame types other than DATA | |||
| or stream management frames (RST_STREAM, WINDOW_UPDATE, and PRIORITY) | or stream management frames (RST_STREAM, WINDOW_UPDATE, and PRIORITY) | |||
| MUST NOT be sent on a connected stream, and MUST be treated as a | MUST NOT be sent on a connected stream, and MUST be treated as a | |||
| stream error (Section 5.4.2) if received. | stream error (Section 5.4.2) if received. | |||
| The TCP connection can be closed by either peer. The END_STREAM flag | The TCP connection can be closed by either peer. The END_STREAM flag | |||
| on a DATA frame is treated as being equivalent to the TCP FIN bit. A | on a DATA frame is treated as being equivalent to the TCP FIN bit. A | |||
| client is expected to send a DATA frame with the END_STREAM flag set | client is expected to send a DATA frame with the END_STREAM flag set | |||
| after receiving a frame bearing the END_STREAM flag. A proxy that | after receiving a frame bearing the END_STREAM flag. A proxy that | |||
| skipping to change at page 63, line 9 ¶ | skipping to change at page 64, line 30 ¶ | |||
| a TLS connection, or to replace connections that have encountered | a TLS connection, or to replace connections that have encountered | |||
| errors (Section 5.4.1). | errors (Section 5.4.1). | |||
| A client MAY open multiple connections to the same IP address and TCP | A client MAY open multiple connections to the same IP address and TCP | |||
| port using different Server Name Indication [TLS-EXT] values or to | port using different Server Name Indication [TLS-EXT] values or to | |||
| provide different TLS client certificates, but SHOULD avoid creating | provide different TLS client certificates, but SHOULD avoid creating | |||
| multiple connections with the same configuration. | multiple connections with the same configuration. | |||
| 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-layer | |||
| 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.1.1. Connection Reuse | 9.1.1. Connection Reuse | |||
| Clients MAY use a single server connection to send requests for URIs | Connections that are made to an origin servers, either directly or | |||
| with multiple different authority components as long as the server is | through a tunnel created using the CONNECT method (Section 8.3) MAY | |||
| authoritative (Section 10.1). For "http" resources, this depends on | be reused for requests with multiple different URI authority | |||
| the host having resolved to the same IP address. | components. A connection can be reused as long as the origin server | |||
| is authoritative (Section 10.1). For "http" resources, this depends | ||||
| on the host having resolved to the same IP address. | ||||
| For "https" resources, connection reuse additionally depends on | For "https" resources, connection reuse additionally depends on | |||
| having a certificate that is valid for the host in the URI. That is | having a certificate that is valid for the host in the URI. An | |||
| the use of server certificate with multiple "subjectAltName" | origin server might offer a certificate with multiple | |||
| attributes, or names with wildcards. For example, a certificate with | "subjectAltName" attributes, or names with wildcards, one of which is | |||
| valid for the authority in the URI. For example, a certificate with | ||||
| a "subjectAltName" of "*.example.com" might permit the use of the | a "subjectAltName" of "*.example.com" might permit the use of the | |||
| same connection for "a.example.com" and "b.example.com". | same connection for requests to URIs starting with | |||
| "https://a.example.com/" and "https://b.example.com/". | ||||
| In some deployments, reusing a connection for multiple origins can | In some deployments, reusing a connection for multiple origins can | |||
| result in requests being directed to the wrong origin server. For | result in requests being directed to the wrong origin server. For | |||
| example, TLS termination might be performed by a middlebox that uses | example, TLS termination might be performed by a middlebox that uses | |||
| the TLS Server Name Indication (SNI) [TLS-EXT] extension to select | the TLS Server Name Indication (SNI) [TLS-EXT] extension to select an | |||
| the an origin server. This means that it is possible for clients to | origin server. This means that it is possible for clients to send | |||
| send confidential information to servers that might not be the | confidential information to servers that might not be the intended | |||
| intended target for the request, even though the server has valid | target for the request, even though the server is otherwise | |||
| authentication credentials. | authoritative. | |||
| A server that does not wish clients to reuse connections can indicate | A server that does not wish clients to reuse connections can indicate | |||
| that it is not authoritative for a request by sending a 421 (Not | that it is not authoritative for a request by sending a 421 | |||
| Authoritative) status code in response to the request (see | (Misdirected Request) status code in response to the request (see | |||
| Section 9.1.2). | Section 9.1.2). | |||
| 9.1.2. The 421 (Not Authoritative) Status Code | A client that is configured to use a proxy over HTTP/2 directs | |||
| requests to that proxy through a single connection. That is, all | ||||
| requests sent via a proxy reuse the connection to the proxy. | ||||
| The 421 (Not Authoritative) status code indicates that the current | 9.1.2. The 421 (Misdirected Request) Status Code | |||
| origin server is not authoritative for the requested resource, in the | ||||
| sense of [RFC7230], Section 9.1 (see also Section 10.1). | ||||
| Clients receiving a 421 (Not Authoritative) response from a server | The 421 (Misdirected Request) status code indicates that the request | |||
| was directed at a server that is not able to produce a response. | ||||
| This can be sent by a server that is not configured to produce | ||||
| responses for the combination of scheme and authority that are | ||||
| included in the request URI. | ||||
| Clients receiving a 421 (Misdirected Request) response from a server | ||||
| MAY retry the request - whether the request method is idempotent or | MAY retry the request - whether the request method is idempotent or | |||
| not - over a different connection. This is possible if a connection | not - over a different connection. This is possible if a connection | |||
| is reused (Section 9.1.1) or if an alternative service is selected | is reused (Section 9.1.1) or if an alternative service is selected | |||
| ([ALT-SVC]). | ([ALT-SVC]). | |||
| This status code MUST NOT be generated by proxies. | This status code MUST NOT be generated by proxies. | |||
| A 421 response is cacheable by default; i.e., unless otherwise | A 421 response is cacheable by default; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [RFC7234]). | Section 4.2.2 of [RFC7234]). | |||
| skipping to change at page 65, line 7 ¶ | skipping to change at page 66, line 35 ¶ | |||
| of messages the underlying cipher suite can encipher. | of messages the underlying cipher suite can encipher. | |||
| A client MAY use renegotiation to provide confidentiality protection | A client MAY use renegotiation to provide confidentiality protection | |||
| for client credentials offered in the handshake, but any | for client credentials offered in the handshake, but any | |||
| renegotiation MUST occur prior to sending the connection preface. A | renegotiation MUST occur prior to sending the connection preface. A | |||
| server SHOULD request a client certificate if it sees a renegotiation | server SHOULD request a client certificate if it sees a renegotiation | |||
| request immediately after establishing a connection. | request immediately after establishing a connection. | |||
| This effectively prevents the use of renegotiation in response to a | This effectively prevents the use of renegotiation in response to a | |||
| request for a specific protected resource. A future specification | request for a specific protected resource. A future specification | |||
| might provide a way to support this use case. | might provide a way to support this use case. Alternatively, a | |||
| server might use a connection error (Section 5.4.1) of type | ||||
| HTTP_1_1_REQUIRED to request the client use a protocol which supports | ||||
| renegotiation. | ||||
| 9.2.2. TLS Cipher Suites | 9.2.2. TLS Cipher Suites | |||
| The set of TLS cipher suites that are permitted in HTTP/2 is | The set of TLS cipher suites that are permitted in HTTP/2 is | |||
| restricted. HTTP/2 MUST only be used with cipher suites that have | restricted. HTTP/2 MUST only be used with cipher suites that have | |||
| ephemeral key exchange, such as the ephemeral Diffie-Hellman (DHE) | ephemeral key exchange, such as the ephemeral Diffie-Hellman (DHE) | |||
| [TLS12] or the elliptic curve variant (ECDHE) [RFC4492]. Ephemeral | [TLS12] or the elliptic curve variant (ECDHE) [RFC4492]. Ephemeral | |||
| key exchange MUST have a minimum size of 2048 bits for DHE or | key exchange MUST have a minimum size of 2048 bits for DHE or | |||
| security level of 128 bits for ECDHE. Clients MUST accept DHE sizes | security level of 128 bits for ECDHE. Clients MUST accept DHE sizes | |||
| of up to 4096 bits. HTTP MUST NOT be used with cipher suites that | of up to 4096 bits. HTTP MUST NOT be used with cipher suites that | |||
| skipping to change at page 65, line 39 ¶ | skipping to change at page 67, line 22 ¶ | |||
| Clients MAY advertise support of cipher suites that are prohibited by | Clients MAY advertise support of cipher suites that are prohibited by | |||
| the above restrictions in order to allow for connection to servers | the above restrictions in order to allow for connection to servers | |||
| that do not support HTTP/2. This enables a fallback to protocols | that do not support HTTP/2. This enables a fallback to protocols | |||
| without these constraints without the additional latency imposed by | without these constraints without the additional latency imposed by | |||
| using a separate connection for fallback. | using a separate connection for fallback. | |||
| 10. Security Considerations | 10. Security Considerations | |||
| 10.1. Server Authority | 10.1. Server Authority | |||
| A client is only able to accept HTTP/2 responses from servers that | ||||
| are authoritative for those resources. This is particularly | ||||
| important for server push (Section 8.2), where the client validates | ||||
| the PUSH_PROMISE before accepting the response. | ||||
| HTTP/2 relies on the HTTP/1.1 definition of authority for determining | HTTP/2 relies on the HTTP/1.1 definition of authority for determining | |||
| whether a server is authoritative in providing a given response, see | whether a server is authoritative in providing a given response, see | |||
| [RFC7230], Section 9.1. This relies on local name resolution for the | [RFC7230], Section 9.1. This relies on local name resolution for the | |||
| "http" URI scheme, and the authenticated server identity for the | "http" URI scheme, and the authenticated server identity for the | |||
| "https" scheme (see [RFC2818], Section 3). | "https" scheme (see [RFC2818], Section 3). | |||
| A client MUST discard responses provided by a server that is not | ||||
| authoritative for those resources. | ||||
| 10.2. Cross-Protocol Attacks | 10.2. Cross-Protocol Attacks | |||
| In a cross-protocol attack, an attacker causes a client to initiate a | In a cross-protocol attack, an attacker causes a client to initiate a | |||
| transaction in one protocol toward a server that understands a | transaction in one protocol toward a server that understands a | |||
| different protocol. An attacker might be able to cause the | different protocol. An attacker might be able to cause the | |||
| transaction to appear as valid transaction in the second protocol. | transaction to appear as valid transaction in the second protocol. | |||
| In combination with the capabilities of the web context, this can be | In combination with the capabilities of the web context, this can be | |||
| used to interact with poorly protected servers in private networks. | used to interact with poorly protected servers in private networks. | |||
| Completing a TLS handshake with an ALPN identifier for HTTP/2 can be | Completing a TLS handshake with an ALPN identifier for HTTP/2 can be | |||
| skipping to change at page 66, line 34 ¶ | skipping to change at page 68, line 9 ¶ | |||
| The cleartext version of HTTP/2 has minimal protection against cross- | The cleartext version of HTTP/2 has minimal protection against cross- | |||
| protocol attacks. The connection preface (Section 3.5) contains a | protocol attacks. The connection preface (Section 3.5) contains a | |||
| string that is designed to confuse HTTP/1.1 servers, but no special | string that is designed to confuse HTTP/1.1 servers, but no special | |||
| protection is offered for other protocols. A server that is willing | protection is offered for other protocols. A server that is willing | |||
| to ignore parts of an HTTP/1.1 request containing an Upgrade header | to ignore parts of an HTTP/1.1 request containing an Upgrade header | |||
| field in addition to the client connection preface could be exposed | field in addition to the client connection preface could be exposed | |||
| to a cross-protocol attack. | to a cross-protocol attack. | |||
| 10.3. Intermediary Encapsulation Attacks | 10.3. Intermediary Encapsulation Attacks | |||
| HTTP/2 header field names and values are encoded as sequences of | The HTTP/2 header field encoding allows the expression of names that | |||
| octets with a length prefix. This enables HTTP/2 to carry any string | are not valid field names in the Internet Message Syntax used by | |||
| of octets as the name or value of a header field. An intermediary | HTTP/1.1. Requests or responses containing invalid header field | |||
| that translates HTTP/2 requests or responses into HTTP/1.1 directly | names MUST be treated as malformed (Section 8.1.2.6). An | |||
| could permit the creation of corrupted HTTP/1.1 messages. An | intermediary therefore cannot translate an HTTP/2 request or response | |||
| attacker might exploit this behavior to cause the intermediary to | containing an invalid field name into an HTTP/1.1 message. | |||
| create HTTP/1.1 messages with illegal header fields, extra header | ||||
| fields, or even new messages that are entirely falsified. | ||||
| Header field names or values that contain characters not permitted by | ||||
| HTTP/1.1, including carriage return (ASCII 0xd) or line feed (ASCII | ||||
| 0xa) MUST NOT be translated verbatim by an intermediary, as | ||||
| stipulated in [RFC7230], Section 3.2.4. | ||||
| Translation from HTTP/1.x to HTTP/2 does not produce the same | Similarly, HTTP/2 allows header field values that are not valid. | |||
| opportunity to an attacker. Intermediaries that perform translation | While most of the values that can be encoded will not alter header | |||
| to HTTP/2 MUST remove any instances of the "obs-fold" production from | field parsing, carriage return (CR, ASCII 0xd), line feed (LF, ASCII | |||
| header field values. | 0xa), and the zero character (NUL, ASCII 0x0) might be exploited by | |||
| an attacker if they are translater verbatim. Any request or response | ||||
| that contains a character not permitted in a header field value MUST | ||||
| be treated as malformed (Section 8.1.2.6). Valid characters are | ||||
| defined by the "field-content" ABNF rule in Section 3.2 of [RFC7230]. | ||||
| 10.4. Cacheability of Pushed Responses | 10.4. Cacheability of Pushed Responses | |||
| Pushed responses do not have an explicit request from the client; the | Pushed responses do not have an explicit request from the client; the | |||
| request is provided by the server in the PUSH_PROMISE frame. | request is provided by the server in the PUSH_PROMISE frame. | |||
| Caching responses that are pushed is possible based on the guidance | Caching responses 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 | |||
| skipping to change at page 68, line 4 ¶ | skipping to change at page 69, line 25 ¶ | |||
| 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 SETTINGS | processing time. This might be done by pointlessly changing SETTINGS | |||
| parameters, setting multiple undefined parameters, or changing the | parameters, setting multiple undefined parameters, or changing the | |||
| same setting multiple times in the same frame. WINDOW_UPDATE or | same setting multiple times in the same frame. WINDOW_UPDATE or | |||
| PRIORITY frames can be abused to cause an unnecessary waste of | 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 or | |||
| to end a stream. | CONTINUATION frame at the end of a stream. | |||
| Header compression also offers some opportunities to waste processing | Header compression also offers some opportunities to waste processing | |||
| resources; see Section 8 of [COMPRESSION] for more details on | resources; see Section 8 of [COMPRESSION] for more details on | |||
| potential abuses. | potential abuses. | |||
| Limits in SETTINGS parameters cannot be reduced instantaneously, | Limits in SETTINGS parameters cannot be reduced instantaneously, | |||
| which leaves an endpoint exposed to behavior from a peer that could | which leaves an endpoint exposed to behavior from a peer that could | |||
| exceed the new limits. In particular, immediately after establishing | exceed the new limits. In particular, immediately after establishing | |||
| a connection, limits set by a server are not known to clients and | a connection, limits set by a server are not known to clients and | |||
| could be exceeded without being an obvious protocol violation. | could be exceeded without being an obvious protocol violation. | |||
| skipping to change at page 68, line 30 ¶ | skipping to change at page 70, line 8 ¶ | |||
| 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 features and set limits on their use. An endpoint MAY | use of these features and set limits on their use. An 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.5.1. Limits on Header Block Size | 10.5.1. Limits on Header Block Size | |||
| A large header block (Section 4.3) can cause an implementation to | A large header block (Section 4.3) can cause an implementation to | |||
| commit a large amount of state. In servers and intermediaries, | commit a large amount of state. Header fields that are critical for | |||
| header fields that are critical to routing, such as ":authority", | routing can appear toward the end of a header block, which prevents | |||
| ":path", and ":scheme" are not guaranteed to be present early in the | streaming of header fields to their ultimate destination. For this | |||
| header block. In particular, values that are in the reference set | an other reasons, such as ensuring cache correctness, means that an | |||
| cannot be emitted until the header block ends. | endpoint might need to buffer the entire header block. Since there | |||
| is no hard limit to the size of a header block, some endpoints could | ||||
| This can prevent streaming of the header fields to their ultimate | be forced commit a large amount of available memory for header | |||
| destination, and forces the endpoint to buffer the entire header | fields. | |||
| block. Since there is no hard limit to the size of a header block, | ||||
| an endpoint could be forced to exhaust available memory. | ||||
| An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to avise peers | An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to advise peers | |||
| of limits that might apply on the size of header blocks. This | of limits that might apply on the size of header blocks. This | |||
| setting is only advisory, so endpoints MAY choose to send header | setting is only advisory, so endpoints MAY choose to send header | |||
| blocks that exceed this limit and risk having the request or response | blocks that exceed this limit and risk having the request or response | |||
| being treated as malformed. This setting is advertised hop-by-hop, | being treated as malformed. This setting specific to a connection, | |||
| so any request or response could encounter a hop with a lower, | so any request or response could encounter a hop with a lower, | |||
| unknown limit. An intermediary can attempt to avoid this problem by | unknown limit. An intermediary can attempt to avoid this problem by | |||
| passing on values presented by different peers, but they are not | passing on values presented by different peers, but they are not | |||
| obligated to do so. | obligated to do so. | |||
| A server that receives a larger header block than it is willing to | A server that receives a larger header block than it is willing to | |||
| handle can send an HTTP 431 (Request Header Fields Too Large) status | handle can send an HTTP 431 (Request Header Fields Too Large) status | |||
| code [RFC6585]. A client can discard responses that it cannot | code [RFC6585]. A client can discard responses that it cannot | |||
| process. The header block MUST be processed to ensure a consistent | process. The header block MUST be processed to ensure a consistent | |||
| connection state, unless the connection is closed. | connection state, unless the connection is closed. | |||
| skipping to change at page 69, line 28 ¶ | skipping to change at page 70, line 50 ¶ | |||
| There are demonstrable attacks on compression that exploit the | There are demonstrable attacks on compression that exploit the | |||
| characteristics of the web (e.g., [BREACH]). The attacker induces | characteristics of the web (e.g., [BREACH]). The attacker induces | |||
| multiple requests containing varying plaintext, observing the length | multiple requests containing varying plaintext, observing the length | |||
| of the resulting ciphertext in each, which reveals a shorter length | of the resulting ciphertext in each, which reveals a shorter length | |||
| when a guess about the secret is correct. | when a guess about the secret is correct. | |||
| Implementations communicating on a secure channel MUST NOT compress | Implementations communicating on a secure channel MUST NOT compress | |||
| content that includes both confidential and attacker-controlled data | content that includes both confidential and attacker-controlled data | |||
| unless separate compression dictionaries are used for each source of | unless separate compression dictionaries are used for each source of | |||
| data. Compression MUST NOT be used if the source of data cannot be | data. Compression MUST NOT be used if the source of data cannot be | |||
| reliably determined. | reliably determined. Generic stream compression, such as that | |||
| provided by TLS MUST NOT be used with HTTP/2 (Section 9.2.1). | ||||
| Further considerations regarding the compression of header fields are | Further considerations regarding the compression of header fields are | |||
| described in [COMPRESSION]. | described in [COMPRESSION]. | |||
| 10.7. Use of Padding | 10.7. Use of Padding | |||
| Padding within HTTP/2 is not intended as a replacement for general | Padding within HTTP/2 is not intended as a replacement for general | |||
| purpose padding, such as might be provided by TLS [TLS12]. Redundant | purpose padding, such as might be provided by TLS [TLS12]. Redundant | |||
| padding could even be counterproductive. Correct application can | padding could even be counterproductive. Correct application can | |||
| depend on having specific knowledge of the data that is being padded. | depend on having specific knowledge of the data that is being padded. | |||
| skipping to change at page 70, line 38 ¶ | skipping to change at page 72, line 16 ¶ | |||
| A string for identifying HTTP/2 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 [TLS-ALPN]. | in [TLS-ALPN]. | |||
| This document establishes a registry for frame types, settings, and | This document establishes a registry for frame types, settings, and | |||
| error codes. These new registries are entered into a new "Hypertext | error codes. These new registries are entered into a new "Hypertext | |||
| Transfer Protocol (HTTP) 2 Parameters" section. | Transfer Protocol (HTTP) 2 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; and the 421 (Not Authoritative) status code. | HTTP; and the 421 (Misdirected Request) status code. | |||
| This document registers the "PRI" method for use in HTTP, to avoid | This document registers the "PRI" method for use in HTTP, to avoid | |||
| collisions with the connection preface (Section 3.5). | collisions with the connection preface (Section 3.5). | |||
| 11.1. Registration of HTTP/2 Identification Strings | 11.1. Registration of HTTP/2 Identification Strings | |||
| This document creates two registrations for the identification of | This document creates two registrations for the identification of | |||
| HTTP/2 in the "Application Layer Protocol Negotiation (ALPN) Protocol | HTTP/2 in the "Application Layer Protocol Negotiation (ALPN) Protocol | |||
| IDs" registry established in [TLS-ALPN]. | IDs" registry established in [TLS-ALPN]. | |||
| skipping to change at page 71, line 4 ¶ | skipping to change at page 72, line 30 ¶ | |||
| 11.1. Registration of HTTP/2 Identification Strings | 11.1. Registration of HTTP/2 Identification Strings | |||
| This document creates two registrations for the identification of | This document creates two registrations for the identification of | |||
| HTTP/2 in the "Application Layer Protocol Negotiation (ALPN) Protocol | HTTP/2 in the "Application Layer Protocol Negotiation (ALPN) Protocol | |||
| IDs" registry established in [TLS-ALPN]. | IDs" registry established in [TLS-ALPN]. | |||
| The "h2" string identifies HTTP/2 when used over TLS: | The "h2" string identifies HTTP/2 when used over TLS: | |||
| Protocol: HTTP/2 over TLS | Protocol: HTTP/2 over TLS | |||
| Identification Sequence: 0x68 0x32 ("h2") | Identification Sequence: 0x68 0x32 ("h2") | |||
| Specification: This document | Specification: This document | |||
| The "h2c" string identifies HTTP/2 when used over cleartext TCP: | The "h2c" string identifies HTTP/2 when used over cleartext TCP: | |||
| Protocol: HTTP/2 over TCP | Protocol: HTTP/2 over TCP | |||
| Identification Sequence: 0x68 0x32 0x63 ("h2c") | Identification Sequence: 0x68 0x32 0x63 ("h2c") | |||
| Specification: This document | Specification: This document | |||
| 11.2. Frame Type Registry | 11.2. Frame Type Registry | |||
| This document establishes a registry for HTTP/2 frame types codes. | This document establishes a registry for HTTP/2 frame type codes. | |||
| The "HTTP/2 Frame Type" registry manages an 8-bit space. The "HTTP/2 | The "HTTP/2 Frame Type" registry manages an 8-bit space. The "HTTP/2 | |||
| Frame Type" registry operates under either of the "IETF Review" or | Frame Type" registry operates under either of the "IETF Review" or | |||
| "IESG Approval" policies [RFC5226] for values between 0x00 and 0xef, | "IESG Approval" policies [RFC5226] for values between 0x00 and 0xef, | |||
| with values between 0xf0 and 0xff being reserved for experimental | with values between 0xf0 and 0xff being reserved for experimental | |||
| use. | use. | |||
| New entries in this registry require the following information: | New entries in this registry require the following information: | |||
| Frame Type: A name or label for the frame type. | Frame Type: A name or label for the frame type. | |||
| Code: The 8-bit code assigned to the frame type. | Code: The 8-bit code assigned to the frame type. | |||
| Specification: A reference to a specification that includes a | Specification: A reference to a specification that includes a | |||
| description of the frame layout, it's semantics and flags that the | description of the frame layout, its semantics, and flags that the | |||
| frame type uses, including any parts of the frame that are | frame type uses, including any parts of the frame that are | |||
| conditionally present based on the value of flags. | conditionally present based on the value of flags. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +---------------+------+--------------+ | +---------------+------+--------------+ | |||
| | Frame Type | Code | Section | | | Frame Type | Code | Section | | |||
| +---------------+------+--------------+ | +---------------+------+--------------+ | |||
| | DATA | 0x0 | Section 6.1 | | | DATA | 0x0 | Section 6.1 | | |||
| | HEADERS | 0x1 | Section 6.2 | | | HEADERS | 0x1 | Section 6.2 | | |||
| skipping to change at page 72, line 22 ¶ | skipping to change at page 73, line 48 ¶ | |||
| New registrations are advised to provide the following information: | New registrations are advised to provide the following information: | |||
| Name: A symbolic name for the setting. Specifying a setting name is | Name: A symbolic name for the setting. Specifying a setting name is | |||
| optional. | optional. | |||
| Code: The 16-bit code assigned to the setting. | Code: The 16-bit code assigned to the setting. | |||
| Initial Value: An initial value for the setting. | Initial Value: An initial value for the setting. | |||
| Specification: A stable reference to a specification that describes | Specification: An optional reference to a specification that | |||
| the use of the setting. | describes the use of the setting. | |||
| An initial set of setting registrations can be found in | An initial set of setting registrations can be found in | |||
| Section 6.5.2. | Section 6.5.2. | |||
| +------------------------+------+---------------+---------------+ | +------------------------+------+---------------+---------------+ | |||
| | Name | Code | Initial Value | Specification | | | Name | Code | Initial Value | Specification | | |||
| +------------------------+------+---------------+---------------+ | +------------------------+------+---------------+---------------+ | |||
| | HEADER_TABLE_SIZE | 0x1 | 4096 | Section 6.5.2 | | | HEADER_TABLE_SIZE | 0x1 | 4096 | Section 6.5.2 | | |||
| | ENABLE_PUSH | 0x2 | 1 | Section 6.5.2 | | | ENABLE_PUSH | 0x2 | 1 | Section 6.5.2 | | |||
| | MAX_CONCURRENT_STREAMS | 0x3 | (infinite) | Section 6.5.2 | | | MAX_CONCURRENT_STREAMS | 0x3 | (infinite) | Section 6.5.2 | | |||
| | INITIAL_WINDOW_SIZE | 0x4 | 65535 | Section 6.5.2 | | | INITIAL_WINDOW_SIZE | 0x4 | 65535 | Section 6.5.2 | | |||
| | MAX_FRAME_SIZE | 0x5 | 65536 | Section 6.5.2 | | | MAX_FRAME_SIZE | 0x5 | 16384 | Section 6.5.2 | | |||
| | MAX_HEADER_LIST_SIZE | 0x6 | (infinite) | Section 6.5.2 | | | MAX_HEADER_LIST_SIZE | 0x6 | (infinite) | Section 6.5.2 | | |||
| +------------------------+------+---------------+---------------+ | +------------------------+------+---------------+---------------+ | |||
| 11.4. Error Code Registry | 11.4. Error Code Registry | |||
| This document establishes a registry for HTTP/2 error codes. The | This document establishes a registry for HTTP/2 error codes. The | |||
| "HTTP/2 Error Code" registry manages a 32-bit space. The "HTTP/2 | "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]. | |||
| skipping to change at page 73, line 43 ¶ | skipping to change at page 75, line 30 ¶ | |||
| | CANCEL | 0x8 | Stream cancelled | Section 7 | | | CANCEL | 0x8 | Stream cancelled | Section 7 | | |||
| | COMPRESSION_ERROR | 0x9 | Compression state | Section 7 | | | COMPRESSION_ERROR | 0x9 | Compression state | Section 7 | | |||
| | | | not updated | | | | | | not updated | | | |||
| | CONNECT_ERROR | 0xa | TCP connection error | Section 7 | | | CONNECT_ERROR | 0xa | TCP connection error | Section 7 | | |||
| | | | for CONNECT method | | | | | | for CONNECT method | | | |||
| | ENHANCE_YOUR_CALM | 0xb | Processing capacity | Section 7 | | | ENHANCE_YOUR_CALM | 0xb | Processing capacity | Section 7 | | |||
| | | | exceeded | | | | | | exceeded | | | |||
| | INADEQUATE_SECURITY | 0xc | Negotiated TLS | Section 7 | | | INADEQUATE_SECURITY | 0xc | Negotiated TLS | Section 7 | | |||
| | | | parameters not | | | | | | parameters not | | | |||
| | | | acceptable | | | | | | acceptable | | | |||
| | HTTP_1_1_REQUIRED | 0xc | Use HTTP/1.1 for the | Section 7 | | ||||
| | | | request | | | ||||
| +---------------------+------+----------------------+---------------+ | +---------------------+------+----------------------+---------------+ | |||
| 11.5. HTTP2-Settings Header Field Registration | 11.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 | |||
| skipping to change at page 74, line 30 ¶ | skipping to change at page 76, line 22 ¶ | |||
| Safe No | Safe No | |||
| Idempotent No | Idempotent No | |||
| Specification document(s) Section 3.5 of this document | Specification document(s) Section 3.5 of this document | |||
| Related information: This method is never used by an actual client. | 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 | This method will appear to be used when an HTTP/1.1 server or | |||
| intermediary attempts to parse an HTTP/2 connection preface. | intermediary attempts to parse an HTTP/2 connection preface. | |||
| 11.7. The 421 Not Authoritative HTTP Status Code | 11.7. The 421 (Misdirected Request) HTTP Status Code | |||
| This document registers the 421 (Not Authoritative) HTTP Status code | This document registers the 421 (Misdirected Request) HTTP Status | |||
| in the Hypertext Transfer Protocol (HTTP) Status Code Registry | code in the Hypertext Transfer Protocol (HTTP) Status Code Registry | |||
| ([RFC7231], Section 8.2). | ([RFC7231], Section 8.2). | |||
| Status Code: 421 | Status Code: 421 | |||
| Short Description: Not Authoritative | Short Description: Misdirected Request | |||
| Specification: Section 9.1.2 of this document | Specification: Section 9.1.2 of this document | |||
| 12. Acknowledgements | 12. Acknowledgements | |||
| This document includes substantial input from the following | This document includes substantial input from the following | |||
| individuals: | individuals: | |||
| o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | |||
| Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | |||
| skipping to change at page 76, line 40 ¶ | skipping to change at page 78, line 29 ¶ | |||
| [TCP] Postel, J., "Transmission Control Protocol", STD 7, RFC | [TCP] Postel, J., "Transmission Control Protocol", STD 7, RFC | |||
| 793, September 1981. | 793, September 1981. | |||
| [TLS-ALPN] | [TLS-ALPN] | |||
| Friedl, S., Popov, A., Langley, A., and E. Stephan, | Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, July 2014. | Negotiation Extension", RFC 7301, July 2014. | |||
| [TLS-ECDHE] | [TLS-ECDHE] | |||
| Rescorla, E., "TLS Elliptic Curve Cipher Suites with SHA- | Rescorla, E., "TLS Elliptic Curve Cipher Suites with | |||
| 256/384 and AES Galois Counter Mode (GCM)", RFC 5289, | SHA-256/384 and AES Galois Counter Mode (GCM)", RFC 5289, | |||
| August 2008. | August 2008. | |||
| [TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) Extensions: | [TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) Extensions: | |||
| Extension Definitions", RFC 6066, January 2011. | Extension Definitions", RFC 6066, January 2011. | |||
| [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security | [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
| (TLS) Protocol Version 1.2", RFC 5246, August 2008. | (TLS) Protocol Version 1.2", RFC 5246, August 2008. | |||
| 13.2. Informative References | 13.2. Informative References | |||
| [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", draft-ietf-httpbis-alt-svc-01 (work | Alternative Services", draft-ietf-httpbis-alt-svc-04 (work | |||
| in progress), April 2014. | in progress), October 2014. | |||
| [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, RFC 3864, | Procedures for Message Header Fields", BCP 90, RFC 3864, | |||
| September 2004. | September 2004. | |||
| [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | |||
| CRIME Attack", July 2013, | CRIME Attack", July 2013, <http://breachattack.com/ | |||
| <http://breachattack.com/resources/ | resources/ | |||
| BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | |||
| [HTML5] Berjon, R., Faulkner, S., Leithead, T., Doyle Navara, E., | [HTML5] Berjon, R., Faulkner, S., Leithead, T., Doyle Navara, E., | |||
| O'Connor, E., and S. Pfeiffer, "HTML5", W3C Candidate | O'Connor, E., and S. Pfeiffer, "HTML5", W3C Candidate | |||
| Recommendation CR-html5-20140204, Febuary 2014, | Recommendation CR-html5-20140731, July 2014, | |||
| <http://www.w3.org/TR/2014/CR-html5-20140204/>. | <http://www.w3.org/TR/2014/CR-html5-20140731/>. | |||
| Latest version available at [5]. | Latest version available at [5]. | |||
| [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP Extensions | ||||
| for High Performance", RFC 1323, May 1992. | ||||
| [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | |||
| Compression Methods", RFC 3749, May 2004. | Compression Methods", RFC 3749, May 2004. | |||
| [RFC4492] Blake-Wilson, S., Bolyard, N., Gupta, V., Hawk, C., and B. | [RFC4492] Blake-Wilson, S., Bolyard, N., Gupta, V., Hawk, C., and B. | |||
| Moeller, "Elliptic Curve Cryptography (ECC) Cipher Suites | Moeller, "Elliptic Curve Cryptography (ECC) Cipher Suites | |||
| for Transport Layer Security (TLS)", RFC 4492, May 2006. | for Transport Layer Security (TLS)", RFC 4492, May 2006. | |||
| [RFC5288] Salowey, J., Choudhury, A., and D. McGrew, "AES Galois | [RFC5288] Salowey, J., Choudhury, A., and D. McGrew, "AES Galois | |||
| Counter Mode (GCM) Cipher Suites for TLS", RFC 5288, | Counter Mode (GCM) Cipher Suites for TLS", RFC 5288, | |||
| August 2008. | August 2008. | |||
| [RFC6585] Nottingham, N. and R. Fielding, "Additional HTTP Status | [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | |||
| Codes", RFC 6585, April 2012. | Codes", RFC 6585, April 2012. | |||
| [RFC7323] Borman, D., Braden, B., Jacobson, V., and R. | ||||
| Scheffenegger, "TCP Extensions for High Performance", RFC | ||||
| 7323, September 2014. | ||||
| [TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | [TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | |||
| Jackson, "Talking to Yourself for Fun and Profit", 2011, | Jackson, "Talking to Yourself for Fun and Profit", 2011, | |||
| <http://w2spconf.com/2011/papers/websocket.pdf>. | <http://w2spconf.com/2011/papers/websocket.pdf>. | |||
| [TLSBCP] Sheffer, Y., Holz, R., and P. Saint-Andre, | [TLSBCP] Sheffer, Y., Holz, R., and P. Saint-Andre, | |||
| "Recommendations for Secure Use of TLS and DTLS", draft- | "Recommendations for Secure Use of TLS and DTLS", draft- | |||
| sheffer-tls-bcp-02 (work in progress), February 2014. | ietf-uta-tls-bcp-01 (work in progress), June 2014. | |||
| 13.3. URIs | 13.3. URIs | |||
| [1] https://www.iana.org/assignments/message-headers | [1] https://www.iana.org/assignments/message-headers | |||
| [2] https://groups.google.com/forum/?fromgroups#!topic/spdy-dev/ | [2] https://groups.google.com/forum/?fromgroups#!topic/spdy-dev/ | |||
| cfUef2gL3iU | cfUef2gL3iU | |||
| [3] https://tools.ietf.org/html/draft-montenegro-httpbis-http2-fc- | [3] https://tools.ietf.org/html/draft-montenegro-httpbis-http2-fc- | |||
| principles-01 | principles-01 | |||
| Appendix A. Change Log | Appendix A. Change Log | |||
| This section is to be removed by RFC Editor before publication. | This section is to be removed by RFC Editor before publication. | |||
| A.1. Since draft-ietf-httpbis-http2-13 | A.1. Since draft-ietf-httpbis-http2-14 | |||
| Renamed Not Authoritative status code to Misdirected Request. | ||||
| A.2. Since draft-ietf-httpbis-http2-13 | ||||
| Pseudo-header fields are now required to appear strictly before | Pseudo-header fields are now required to appear strictly before | |||
| regular ones. | regular ones. | |||
| Restored 1xx series status codes, except 101. | Restored 1xx series status codes, except 101. | |||
| Changed frame length field 24-bits. Expanded frame header to 9 | Changed frame length field 24-bits. Expanded frame header to 9 | |||
| octets. Added a setting to limit the damage. | octets. Added a setting to limit the damage. | |||
| Added a setting to advise peers of header set size limits. | Added a setting to advise peers of header set size limits. | |||
| Removed segments. | Removed segments. | |||
| Made non-semantic-bearing HEADERS frames illegal in the HTTP mapping. | Made non-semantic-bearing HEADERS frames illegal in the HTTP mapping. | |||
| A.2. Since draft-ietf-httpbis-http2-12 | A.3. Since draft-ietf-httpbis-http2-12 | |||
| Restored extensibility options. | Restored extensibility options. | |||
| Restricting TLS cipher suites to AEAD only. | Restricting TLS cipher suites to AEAD only. | |||
| Removing Content-Encoding requirements. | Removing Content-Encoding requirements. | |||
| Permitting the use of PRIORITY after stream close. | Permitting the use of PRIORITY after stream close. | |||
| Removed ALTSVC frame. | Removed ALTSVC frame. | |||
| Removed BLOCKED frame. | Removed BLOCKED frame. | |||
| Reducing the maximum padding size to 256 octets; removing padding | Reducing the maximum padding size to 256 octets; removing padding | |||
| from CONTINUATION frames. | from CONTINUATION frames. | |||
| Removed per-frame GZIP compression. | Removed per-frame GZIP compression. | |||
| A.3. Since draft-ietf-httpbis-http2-11 | A.4. Since draft-ietf-httpbis-http2-11 | |||
| Added BLOCKED frame (at risk). | Added BLOCKED frame (at risk). | |||
| Simplified priority scheme. | Simplified priority scheme. | |||
| Added DATA per-frame GZIP compression. | Added DATA per-frame GZIP compression. | |||
| A.4. Since draft-ietf-httpbis-http2-10 | A.5. Since draft-ietf-httpbis-http2-10 | |||
| Changed "connection header" to "connection preface" to avoid | Changed "connection header" to "connection preface" to avoid | |||
| confusion. | confusion. | |||
| Added dependency-based stream prioritization. | Added dependency-based stream prioritization. | |||
| Added "h2c" identifier to distinguish between cleartext and secured | Added "h2c" identifier to distinguish between cleartext and secured | |||
| HTTP/2. | HTTP/2. | |||
| Adding missing padding to PUSH_PROMISE. | Adding missing padding to PUSH_PROMISE. | |||
| Integrate ALTSVC frame and supporting text. | Integrate ALTSVC frame and supporting text. | |||
| Dropping requirement on "deflate" Content-Encoding. | Dropping requirement on "deflate" Content-Encoding. | |||
| Improving security considerations around use of compression. | Improving security considerations around use of compression. | |||
| A.5. Since draft-ietf-httpbis-http2-09 | A.6. Since draft-ietf-httpbis-http2-09 | |||
| Adding padding for data frames. | Adding padding for data frames. | |||
| Renumbering frame types, error codes, and settings. | Renumbering frame types, error codes, and settings. | |||
| Adding INADEQUATE_SECURITY error code. | Adding INADEQUATE_SECURITY error code. | |||
| Updating TLS usage requirements to 1.2; forbidding TLS compression. | Updating TLS usage requirements to 1.2; forbidding TLS compression. | |||
| Removing extensibility for frames and settings. | Removing extensibility for frames and settings. | |||
| skipping to change at page 80, line 48 ¶ | skipping to change at page 82, line 5 ¶ | |||
| Changing the protocol identification token to "h2". | Changing the protocol identification token to "h2". | |||
| Changing the use of :authority to make it optional and to allow | Changing the use of :authority to make it optional and to allow | |||
| userinfo in non-HTTP cases. | userinfo in non-HTTP cases. | |||
| Allowing split on 0x0 for Cookie. | Allowing split on 0x0 for Cookie. | |||
| Reserved PRI method in HTTP/1.1 to avoid possible future collisions. | Reserved PRI method in HTTP/1.1 to avoid possible future collisions. | |||
| A.6. Since draft-ietf-httpbis-http2-08 | A.7. 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.7. Since draft-ietf-httpbis-http2-07 | A.8. Since draft-ietf-httpbis-http2-07 | |||
| Marked draft for implementation. | Marked draft for implementation. | |||
| A.8. Since draft-ietf-httpbis-http2-06 | A.9. 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.9. Since draft-ietf-httpbis-http2-05 | A.10. 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.10. Since draft-ietf-httpbis-http2-04 | A.11. 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. | |||
| skipping to change at page 82, line 12 ¶ | skipping to change at page 83, line 18 ¶ | |||
| 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.11. Since draft-ietf-httpbis-http2-03 | A.12. 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.12. Since draft-ietf-httpbis-http2-02 | A.13. 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.13. Since draft-ietf-httpbis-http2-01 | A.14. 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 83, line 23 ¶ | skipping to change at page 84, line 29 ¶ | |||
| 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.14. Since draft-ietf-httpbis-http2-00 | A.15. 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 [6]. | Changed INTERNAL_ERROR on GOAWAY to have a value of 2 [6]. | |||
| 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 [7]. | Added flow control principles (Section 5.2.1) based on [7]. | |||
| A.15. Since draft-mbelshe-httpbis-spdy-00 | A.16. Since draft-mbelshe-httpbis-spdy-00 | |||
| Adopted as base for draft-ietf-httpbis-http2. | Adopted as base for draft-ietf-httpbis-http2. | |||
| Updated authors/editors list. | Updated authors/editors list. | |||
| Added status note. | Added status note. | |||
| Authors' Addresses | Authors' Addresses | |||
| Mike Belshe | Mike Belshe | |||
| End of changes. 226 change blocks. | ||||
| 539 lines changed or deleted | 639 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/ | ||||