| draft-ietf-httpbis-http2-13.txt | draft-ietf-httpbis-http2-14.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: December 19, 2014 Google, Inc | Expires: January 31, 2015 Google, Inc | |||
| M. Thomson, Ed. | M. Thomson, Ed. | |||
| Mozilla | Mozilla | |||
| June 17, 2014 | July 30, 2014 | |||
| Hypertext Transfer Protocol version 2 | Hypertext Transfer Protocol version 2 | |||
| draft-ietf-httpbis-http2-13 | draft-ietf-httpbis-http2-14 | |||
| Abstract | Abstract | |||
| This specification describes an optimized expression of the syntax of | This specification describes an optimized expression of the syntax of | |||
| the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more | the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more | |||
| efficient use of network resources and a reduced perception of | efficient use of network resources and a reduced perception of | |||
| latency by introducing header field compression and allowing multiple | latency by introducing header field compression and allowing multiple | |||
| concurrent messages on the same connection. It also introduces | concurrent messages on the same connection. It also introduces | |||
| unsolicited push of representations from servers to clients. | unsolicited push of representations from servers to clients. | |||
| 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 December 19, 2014. | This Internet-Draft will expire on January 31, 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 36 ¶ | skipping to change at page 2, line 36 ¶ | |||
| 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | |||
| 3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 7 | 3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. HTTP/2 Version Identification . . . . . . . . . . . . . . 8 | 3.1. HTTP/2 Version Identification . . . . . . . . . . . . . . 8 | |||
| 3.2. Starting HTTP/2 for "http" URIs . . . . . . . . . . . . . 9 | 3.2. Starting HTTP/2 for "http" URIs . . . . . . . . . . . . . 9 | |||
| 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | |||
| 3.3. Starting HTTP/2 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 . . . . . . . . . . . . . . . . . . . . . . . 13 | 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 . . . . . . . . . . . . . . . . . . . . . . 15 | 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . 20 | 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . 20 | |||
| 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . 21 | 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . 21 | |||
| 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . 21 | 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 21 | 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 22 | |||
| 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 22 | 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 23 | |||
| 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 23 | 5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 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 . . . . . . . . . . . . . . . . . . 25 | |||
| 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 . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 27 | 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 . . . . . . . . . . . . . . . 28 | 5.4.3. Connection Termination . . . . . . . . . . . . . . . 29 | |||
| 5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . 28 | 5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . 29 | |||
| 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 29 | 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 31 | 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . 33 | 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . 34 | 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . 35 | 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 36 | 6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 36 | |||
| 6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 36 | 6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 37 | |||
| 6.5.3. Settings Synchronization . . . . . . . . . . . . . . 37 | 6.5.3. Settings Synchronization . . . . . . . . . . . . . . 38 | |||
| 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . 38 | 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 43 | 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 44 | |||
| 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 44 | 6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 45 | |||
| 6.9.2. Initial Flow Control Window Size . . . . . . . . . . 45 | 6.9.2. Initial Flow Control Window Size . . . . . . . . . . 46 | |||
| 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 46 | 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 47 | |||
| 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . 47 | 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 47 | 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . 49 | 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . 50 | |||
| 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . 49 | 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . 50 | |||
| 8.1.1. Informational Responses . . . . . . . . . . . . . . . 50 | 8.1.1. Upgrading From HTTP/2 . . . . . . . . . . . . . . . . 51 | |||
| 8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . 51 | 8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . 51 | |||
| 8.1.3. Examples . . . . . . . . . . . . . . . . . . . . . . 55 | 8.1.3. Examples . . . . . . . . . . . . . . . . . . . . . . 55 | |||
| 8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . 58 | 8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . 57 | |||
| 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 59 | 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 59 | 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 59 | |||
| 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . 60 | 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . 60 | |||
| 8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . 61 | 8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . 61 | |||
| 9. Additional HTTP Requirements/Considerations . . . . . . . . . 62 | 9. Additional HTTP Requirements/Considerations . . . . . . . . . 62 | |||
| 9.1. Connection Management . . . . . . . . . . . . . . . . . . 62 | 9.1. Connection Management . . . . . . . . . . . . . . . . . . 62 | |||
| 9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . 63 | 9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . 63 | |||
| 9.1.2. The 421 (Not Authoritative) Status Code . . . . . . . 64 | 9.1.2. The 421 (Not Authoritative) Status Code . . . . . . . 63 | |||
| 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 64 | 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 64 | |||
| 9.2.1. TLS Features . . . . . . . . . . . . . . . . . . . . 64 | 9.2.1. TLS Features . . . . . . . . . . . . . . . . . . . . 64 | |||
| 9.2.2. TLS Cipher Suites . . . . . . . . . . . . . . . . . . 65 | 9.2.2. TLS Cipher Suites . . . . . . . . . . . . . . . . . . 65 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 65 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 65 | |||
| 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 65 | 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 65 | |||
| 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 66 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 66 | |||
| 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 66 | 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 66 | |||
| 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 67 | 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 67 | |||
| 10.5. Denial of Service Considerations . . . . . . . . . . . . 67 | 10.5. Denial of Service Considerations . . . . . . . . . . . . 67 | |||
| 10.5.1. Limits on Header Block Size . . . . . . . . . . . . 68 | 10.5.1. Limits on Header Block Size . . . . . . . . . . . . 68 | |||
| skipping to change at page 4, line 16 ¶ | skipping to change at page 4, line 16 ¶ | |||
| 11.1. Registration of HTTP/2 Identification Strings . . . . . 70 | 11.1. Registration of HTTP/2 Identification Strings . . . . . 70 | |||
| 11.2. Frame Type Registry . . . . . . . . . . . . . . . . . . 71 | 11.2. Frame Type Registry . . . . . . . . . . . . . . . . . . 71 | |||
| 11.3. Settings Registry . . . . . . . . . . . . . . . . . . . 72 | 11.3. Settings Registry . . . . . . . . . . . . . . . . . . . 72 | |||
| 11.4. Error Code Registry . . . . . . . . . . . . . . . . . . 72 | 11.4. Error Code Registry . . . . . . . . . . . . . . . . . . 72 | |||
| 11.5. HTTP2-Settings Header Field Registration . . . . . . . . 73 | 11.5. HTTP2-Settings Header Field Registration . . . . . . . . 73 | |||
| 11.6. PRI Method Registration . . . . . . . . . . . . . . . . 74 | 11.6. PRI Method Registration . . . . . . . . . . . . . . . . 74 | |||
| 11.7. The 421 Not Authoritative HTTP Status Code . . . . . . . 74 | 11.7. The 421 Not Authoritative HTTP Status Code . . . . . . . 74 | |||
| 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 74 | 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 74 | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 75 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 75 | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 75 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 75 | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 76 | 13.2. Informative References . . . . . . . . . . . . . . . . . 77 | |||
| 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 77 | 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 78 | |||
| Appendix A. Change Log (to be removed by RFC Editor before | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 79 | |||
| publication) . . . . . . . . . . . . . . . . . . . . 78 | A.1. Since draft-ietf-httpbis-http2-13 . . . . . . . . . . . . 79 | |||
| A.1. Since draft-ietf-httpbis-http2-12 . . . . . . . . . . . . 78 | A.2. Since draft-ietf-httpbis-http2-12 . . . . . . . . . . . . 79 | |||
| A.2. Since draft-ietf-httpbis-http2-11 . . . . . . . . . . . . 78 | A.3. Since draft-ietf-httpbis-http2-11 . . . . . . . . . . . . 79 | |||
| A.3. Since draft-ietf-httpbis-http2-10 . . . . . . . . . . . . 78 | A.4. Since draft-ietf-httpbis-http2-10 . . . . . . . . . . . . 80 | |||
| A.4. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 79 | A.5. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 80 | |||
| A.5. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 79 | A.6. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 80 | |||
| A.6. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 79 | A.7. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 81 | |||
| A.7. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 79 | A.8. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 81 | |||
| A.8. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 80 | A.9. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 81 | |||
| A.9. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 80 | A.10. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 81 | |||
| A.10. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 80 | A.11. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 82 | |||
| A.11. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 81 | A.12. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 82 | |||
| A.12. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 81 | A.13. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 82 | |||
| A.13. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 82 | A.14. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 83 | |||
| A.14. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 82 | A.15. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 83 | |||
| 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) was designed to be implemented with the tools at hand in | |||
| the 1990s, not modern Web application performance. As such it has | the 1990s, not modern Web application performance. As such it has | |||
| several characteristics that have a negative overall effect on | several characteristics that have a negative overall effect on | |||
| application performance today. | application performance today. | |||
| 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) [TLSALPN] field and any | protocol negotiation extension (ALPN) [TLS-ALPN] field and any | |||
| place that HTTP/2 over TLS is identified. | place that 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 any place that 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, | |||
| skipping to change at page 11, line 9 ¶ | skipping to change at page 11, line 9 ¶ | |||
| 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 ensures that the protocol does not require default values for | |||
| the above SETTINGS parameters, and gives a client an opportunity to | the above SETTINGS parameters, and gives a client an opportunity to | |||
| provide other parameters prior to receiving any frames from the | provide other parameters prior to receiving any frames from the | |||
| server. | 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 without prior | |||
| knowledge about support for HTTP/2 uses TLS [TLS12] with the | knowledge about support for HTTP/2 uses TLS [TLS12] with the | |||
| application layer protocol negotiation extension [TLSALPN]. | application layer protocol negotiation extension [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 use of the "PRI" method | |||
| in the connection preface. This only affects the establishment of | in the connection preface. This only affects the establishment of | |||
| HTTP/2 connections over cleartext TCP; implementations that support | HTTP/2 connections over cleartext TCP; implementations that support | |||
| HTTP/2 over TLS MUST use protocol negotiation in TLS [TLSALPN]. | HTTP/2 over TLS MUST use protocol negotiation in TLS [TLS-ALPN]. | |||
| Prior support for HTTP/2 is not a strong signal that a given server | Prior support for HTTP/2 is not a strong signal that a given server | |||
| will support HTTP/2 for future connections. It is possible for | will support HTTP/2 for future connections. It is possible for | |||
| server configurations to change; for configurations to differ between | server configurations to change; for configurations to differ between | |||
| instances in clustered server; or network conditions to change. | instances in clustered server; or 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 | |||
| skipping to change at page 12, line 23 ¶ | skipping to change at page 12, line 23 ¶ | |||
| 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. | |||
| 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. | honor any parameters established. In some configurations, it is | |||
| possible for the server to transmit SETTINGS before the client, | ||||
| providing an opportunity to avoid this issue. | ||||
| Clients and servers MUST terminate the TCP connection if either peer | Clients and servers MUST terminate the TCP connection if either peer | |||
| does not begin with a valid connection preface. A GOAWAY frame | does not begin with a valid connection preface. A GOAWAY frame | |||
| (Section 6.8) can be omitted if it is clear that the peer is not | (Section 6.8) can be omitted if it is clear that the peer is not | |||
| using HTTP/2. | 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 8-octet header followed by a payload of | All frames begin with a fixed 9-octet header followed by a variable- | |||
| between 0 and 16,383 octets. | length payload. | |||
| 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 | Length (14) | Type (8) | Flags (8) | | | Length (24) | | |||
| +---------------+---------------+---------------+ | ||||
| | Type (8) | Flags (8) | | ||||
| +-+-+-----------+---------------+-------------------------------+ | +-+-+-----------+---------------+-------------------------------+ | |||
| |R| Stream Identifier (31) | | |R| Stream Identifier (31) | | |||
| +=+=============================================================+ | +=+=============================================================+ | |||
| | Frame Payload (0...) ... | | Frame Payload (0...) ... | |||
| +---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Frame Layout | Frame Layout | |||
| The fields of the frame header are defined as: | The fields of the frame header are defined as: | |||
| R: A reserved 2-bit field. The semantics of these bits are undefined | ||||
| and the bits MUST remain unset (0) when sending and MUST be | ||||
| ignored when receiving. | ||||
| Length: The length of the frame payload expressed as an unsigned | Length: The length of the frame payload expressed as an unsigned | |||
| 14-bit integer. The 8 octets of the frame header are not included | 24-bit integer. Values greater than 2^14 (16,384) MUST NOT be | |||
| in this value. | sent unless the receiver has set a larger value for | |||
| SETTINGS_MAX_FRAME_SIZE. | ||||
| The 9 octets of the frame header are not included in this value. | ||||
| Type: The 8-bit type of the frame. The frame type determines the | Type: The 8-bit type of the frame. The frame type determines the | |||
| format and semantics of the frame. Implementations MUST ignore | format and semantics of the frame. Implementations MUST ignore | |||
| and discard any frame that has a type that is unknown. | and discard any frame that has a type that is unknown. | |||
| Flags: An 8-bit field reserved for frame-type specific boolean | Flags: An 8-bit field reserved for frame-type specific boolean | |||
| flags. | flags. | |||
| Flags are assigned semantics specific to the indicated frame type. | Flags are assigned semantics specific to the indicated frame type. | |||
| Flags that have no defined semantics for a particular frame type | Flags that have no defined semantics for a particular frame type | |||
| skipping to change at page 13, line 39 ¶ | skipping to change at page 14, line 7 ¶ | |||
| Stream Identifier: A 31-bit stream identifier (see Section 5.1.1). | Stream Identifier: A 31-bit stream identifier (see Section 5.1.1). | |||
| The value 0 is reserved for frames that are associated with the | The value 0 is reserved for frames that are associated with the | |||
| connection as a whole as opposed to an individual stream. | connection as a whole as opposed to an individual stream. | |||
| The structure and content of the frame payload is dependent entirely | The structure and content of the frame payload is dependent entirely | |||
| on the frame type. | on the frame type. | |||
| 4.2. Frame Size | 4.2. Frame Size | |||
| The maximum size of a frame payload varies by frame type. The | The size of a frame payload is limited by the maximum size that a | |||
| absolute maximum size of a frame payload is 2^14-1 (16,383) octets, | receiver advertises in the SETTINGS_MAX_FRAME_SIZE setting. This | |||
| meaning that the maximum frame size is 16,391 octets. All | setting can have any value between 2^14 (16,384) and 2^24-1 | |||
| implementations MUST be capable of receiving and minimally processing | (16,777,215) octets, inclusive. | |||
| frames up to this maximum size. | ||||
| Certain frame types, such as PING (Section 6.7), impose additional | All implementations MUST be capable of receiving and minimally | |||
| limits on the amount of payload data allowed. | 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 | ||||
| when describing frame sizes. | ||||
| Note: Certain frame types, such as PING (Section 6.7), impose | ||||
| additional limits on the amount of payload data allowed. | ||||
| If a frame size exceeds any defined limit, or is too small to contain | If a frame size exceeds any defined limit, or is too small to contain | |||
| mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | |||
| error. A frame size error in a frame that could alter the state of | error. A frame size error in a frame that could alter the state of | |||
| the entire connection MUST be treated as a connection error | the entire connection MUST be treated as a connection error | |||
| (Section 5.4.1); this includes any frame carrying a header block | (Section 5.4.1); this includes any frame carrying a header block | |||
| (Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), | (Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), | |||
| SETTINGS, and any WINDOW_UPDATE frame with a stream identifier of 0. | SETTINGS, and any WINDOW_UPDATE frame with a stream identifier of 0. | |||
| Endpoints are not obligated to use all available space in a frame. | ||||
| Responsiveness can be improved by using frames that are smaller than | ||||
| the permitted maximum size. Sending large frames can result in | ||||
| delays in sending maintenance frames, such RST_STREAM, WINDOW_UPDATE, | ||||
| or PRIORITY, which if blocked by the transmission of a 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 | A header field in HTTP/2 is a name with one or more associated | |||
| values. They are used within HTTP request and response messages as | values. They are used within HTTP request and response messages as | |||
| well as server push operations (see Section 8.2). | well as server push operations (see Section 8.2). | |||
| Header sets are 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 set 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. | |||
| HTTP Header Compression does not preserve the relative ordering of | ||||
| header fields. Header fields with multiple values are encoded into a | ||||
| single header field using a special delimiter (see Section 8.1.2.3), | ||||
| this preserves the relative order of values for that header field. | ||||
| The Cookie header field [COOKIE] is treated specially by the HTTP | The Cookie header field [COOKIE] is treated specially by the HTTP | |||
| mapping (see Section 8.1.2.4). | mapping (see Section 8.1.2.5). | |||
| A receiving endpoint reassembles the header block by concatenating | A receiving endpoint reassembles the header block by concatenating | |||
| its fragments, then decompresses the block to reconstruct the header | its fragments, then decompresses the block to reconstruct the header | |||
| set. | list. | |||
| 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. | |||
| skipping to change at page 16, line 5 ¶ | skipping to change at page 16, line 17 ¶ | |||
| 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 1. | |||
| +--------+ | +--------+ | |||
| PP | | PP | PP | | PP | |||
| ,--------| idle |--------. | ,--------| idle |--------. | |||
| / | | \ | / | | \ | |||
| v +--------+ v | v +--------+ v | |||
| +----------+ | +----------+ | +----------+ | +----------+ | |||
| | | | H | | | | | | H | | | |||
| ,---| reserved | | | reserved |---. | ,---| reserved | | | reserved |---. | |||
| | | (local) | v | (remote) | | | | | (local) | v | (remote) | | | |||
| | +----------+ +--------+ +----------+ | | | +----------+ +--------+ +----------+ | | |||
| | | ES | | ES | | | | | ES | | ES | | | |||
| | | H ,-------| open |-------. | H | | | | H ,-------| open |-------. | H | | |||
| | | / | | \ | | | | | / | | \ | | | |||
| | v v +--------+ v v | | | v v +--------+ v v | | |||
| | +----------+ | +----------+ | | | +----------+ | +----------+ | | |||
| | | half | | | half | | | | | half | | | half | | | |||
| | | closed | | R | closed | | | | | closed | | R | closed | | | |||
| | | (remote) | | | (local) | | | | | (remote) | | | (local) | | | |||
| | +----------+ | +----------+ | | | +----------+ | +----------+ | | |||
| | | v | | | | | v | | | |||
| | | ES / R +--------+ ES / R | | | | | ES / R +--------+ ES / R | | | |||
| | `----------->| |<-----------' | | | `----------->| |<-----------' | | |||
| | 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 1: Stream States | |||
| Note that this diagram shows stream state transitions and frames that | Note that this diagram shows stream state transitions and frames that | |||
| affect those transitions only. In this regard, CONTINUATION frames | affect those transitions only. In this regard, CONTINUATION frames | |||
| do not result in state transitions and are effectively part of the | do not result in state transitions and are effectively part of the | |||
| HEADERS or PUSH_PROMISE that they follow. | HEADERS or PUSH_PROMISE that they follow. | |||
| 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 | |||
| skipping to change at page 19, line 10 ¶ | skipping to change at page 19, line 27 ¶ | |||
| A stream that is "half closed (remote)" is no longer being used by | A stream that is "half closed (remote)" is no longer being used by | |||
| the peer to send frames. In this state, an endpoint is no longer | the peer to send frames. In this state, an endpoint is no longer | |||
| obligated to maintain a receiver flow control window if it | obligated to maintain a receiver flow control window if it | |||
| performs flow control. | performs flow control. | |||
| If an endpoint receives additional frames for a stream that is in | If an endpoint receives additional frames for a stream that is in | |||
| this state, other than WINDOW_UPDATE, PRIORITY or RST_STREAM, it | this state, other than WINDOW_UPDATE, PRIORITY or RST_STREAM, it | |||
| 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. | |||
| A stream that is "half closed (remote)" can be used by the | ||||
| endpoint to send frames of any type. In this state, the endpoint | ||||
| continues to observe advertised stream level flow control limits | ||||
| (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 on a closed stream. An endpoint | |||
| that receives any frame other than PRIORITY after receiving a | that receives any frame other than PRIORITY after receiving a | |||
| RST_STREAM MUST treat that as a stream error (Section 5.4.2) of | RST_STREAM MUST treat that as a stream error (Section 5.4.2) of | |||
| skipping to change at page 20, line 15 ¶ | skipping to change at page 20, line 37 ¶ | |||
| 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 message that is not | |||
| expressly permitted in the description of a state as a connection | expressly permitted in the description of a state as a connection | |||
| error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
| An example of the state transitions for an HTTP request/response | ||||
| 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 | ||||
| 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 | |||
| initiated by the server MUST use even-numbered stream identifiers. A | initiated by the server MUST use even-numbered stream identifiers. A | |||
| stream identifier of zero (0x0) is used for connection control | stream identifier of zero (0x0) is used for connection control | |||
| messages; the stream identifier zero cannot be used to establish a | messages; the stream identifier zero cannot be used to establish a | |||
| new stream. | new stream. | |||
| HTTP/1.1 requests that are upgraded to HTTP/2 (see Section 3.2) are | HTTP/1.1 requests that are upgraded to HTTP/2 (see Section 3.2) are | |||
| skipping to change at page 23, line 35 ¶ | skipping to change at page 24, line 16 ¶ | |||
| it would prefer its peer allocate resources when managing concurrent | it would prefer its peer allocate resources when managing concurrent | |||
| streams. Most importantly, priority can be used to select streams | streams. Most importantly, priority can be used to select streams | |||
| for transmitting frames when there is limited capacity for sending. | for transmitting frames when there is limited capacity for sending. | |||
| Streams can be prioritized by marking them as dependent on the | Streams can be prioritized by marking them as dependent on the | |||
| completion of other streams (Section 5.3.1). Each dependency is | completion of other streams (Section 5.3.1). Each dependency is | |||
| assigned a relative weight, a number that is used to determine the | assigned a relative weight, a number that is used to determine the | |||
| 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. | |||
| [[CREF2: Note that stream dependencies have not yet been validated in | ||||
| practice. The theory might be fairly sound, but there are no | ||||
| implementations currently sending these. If it turns out that they | ||||
| are not useful, or actively harmful, implementations will be | ||||
| requested to avoid creating stream dependencies.]] | ||||
| 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 | Prioritization information can be specified explicitly for streams as | |||
| they are created using the HEADERS frame, or changed using the | they are created using the HEADERS frame, or changed using the | |||
| PRIORITY frame. Providing prioritization information is optional, so | PRIORITY frame. Providing prioritization information is optional, so | |||
| skipping to change at page 24, line 16 ¶ | skipping to change at page 24, line 40 ¶ | |||
| 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. | 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 | ||||
| stream in the "idle" state - results in the stream being given a | ||||
| 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 order 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 | Example of Default Dependency Creation | |||
| skipping to change at page 27, line 14 ¶ | skipping to change at page 27, line 40 ¶ | |||
| maintain state for at least as many streams as allowed by their | maintain state for at least as many streams as allowed by their | |||
| setting for SETTINGS_MAX_CONCURRENT_STREAMS. | setting for SETTINGS_MAX_CONCURRENT_STREAMS. | |||
| An endpoint receiving a PRIORITY frame that changes the priority of a | An endpoint receiving a PRIORITY frame that changes the priority of a | |||
| closed stream SHOULD alter the dependencies of the streams that | closed stream SHOULD alter the dependencies of the streams that | |||
| depend on it, if it has retained enough state to do so. | depend on it, if it has retained enough state to do so. | |||
| 5.3.5. Default Priorities | 5.3.5. Default Priorities | |||
| Providing priority information is optional. Streams are assigned a | Providing priority information is optional. Streams are assigned a | |||
| default dependency on stream 0x0. Pushed streams (Section 8.2) | non-exclusive dependency on stream 0x0 by default. Pushed streams | |||
| initially depend on their associated stream. In both cases, streams | (Section 8.2) initially depend on their associated stream. In both | |||
| are assigned a default weight of 16. | cases, streams are assigned a default weight of 16. | |||
| 5.4. Error Handling | 5.4. Error Handling | |||
| HTTP/2 framing permits two classes of error: | HTTP/2 framing permits two classes of error: | |||
| o An error condition that renders the entire connection unusable is | o An error condition that renders the entire connection unusable is | |||
| a connection error. | a connection error. | |||
| o An error in an individual stream is a stream error. | o An error in an individual stream is a stream error. | |||
| skipping to change at page 28, line 46 ¶ | skipping to change at page 29, line 23 ¶ | |||
| 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), new error codes (Section 7), or new header | settings (Section 6.5.2), or new error codes (Section 7). Registries | |||
| fields that start with a colon (:). Of these, registries are | are established for managing these extension points: frame types | |||
| established for frame types (Section 11.2), settings (Section 11.3) | (Section 11.2), settings (Section 11.3) and error codes | |||
| 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, 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 | |||
| skipping to change at page 30, line 38 ¶ | skipping to change at page 31, line 12 ¶ | |||
| Padding octets MUST be set to zero when sending and ignored when | Padding octets MUST be set to zero when sending and ignored when | |||
| receiving. | receiving. | |||
| The DATA frame defines the following flags: | The DATA frame defines the following flags: | |||
| END_STREAM (0x1): Bit 1 being set indicates that this frame is the | END_STREAM (0x1): Bit 1 being set indicates that this frame is the | |||
| last that the endpoint will send for the identified stream. | last that the endpoint will send for the identified stream. | |||
| Setting this flag causes the stream to enter one of 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). | |||
| END_SEGMENT (0x2): Bit 2 being set indicates that this frame is the | ||||
| last for the current segment. Intermediaries MUST NOT coalesce | ||||
| frames across a segment boundary and MUST preserve segment | ||||
| boundaries when forwarding frames. | ||||
| PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | |||
| present. | 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 | |||
| skipping to change at page 32, line 32 ¶ | skipping to change at page 33, line 5 ¶ | |||
| END_STREAM (0x1): Bit 1 being set indicates that the header block | END_STREAM (0x1): Bit 1 being set indicates that the header block | |||
| (Section 4.3) is the last that the endpoint will send for the | (Section 4.3) is the last that the endpoint will send for the | |||
| identified stream. Setting this flag causes the stream to enter | identified stream. Setting this flag causes the stream to enter | |||
| one of "half closed" states (Section 5.1). | one of "half closed" states (Section 5.1). | |||
| A HEADERS frame that is followed by CONTINUATION frames carries | A HEADERS frame that is followed by CONTINUATION frames carries | |||
| the END_STREAM flag that signals the end of a stream. A | the END_STREAM flag that signals the end of a stream. A | |||
| CONTINUATION frame cannot be used to terminate a stream. | CONTINUATION frame cannot be used to terminate a stream. | |||
| END_SEGMENT (0x2): Bit 2 being set indicates that this frame is the | ||||
| last for the current segment. Intermediaries MUST NOT coalesce | ||||
| frames across a segment boundary and MUST preserve segment | ||||
| boundaries when forwarding frames. | ||||
| END_HEADERS (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): Bit 3 being set indicates that this frame | |||
| contains an entire header block (Section 4.3) and is not followed | contains an entire header block (Section 4.3) and is not followed | |||
| by any CONTINUATION frames. | by any CONTINUATION frames. | |||
| A HEADERS frame without the END_HEADERS flag set MUST be followed | A HEADERS frame without the END_HEADERS flag set MUST be followed | |||
| by a CONTINUATION frame for the same stream. A receiver MUST | by a CONTINUATION frame for the same stream. A receiver MUST | |||
| treat the receipt of any other type of frame or a frame on a | treat the receipt of any other type of frame or a frame on a | |||
| different stream as a connection error (Section 5.4.1) of type | different stream as a connection error (Section 5.4.1) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| skipping to change at page 37, line 25 ¶ | skipping to change at page 37, line 43 ¶ | |||
| 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 bytes) for stream level flow control. The initial | |||
| value is 65,535. | 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 | ||||
| frame payload that a receiver is willing to accept. | ||||
| The initial value is 2^14 (16,384) octets. The value advertised | ||||
| by an endpoint MUST be between this initial value and the maximum | ||||
| allowed frame size (2^24-1 or 16,777,215 octets), inclusive. | ||||
| Values outside this range MUST be treated as a connection error | ||||
| (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| SETTINGS_MAX_HEADER_LIST_SIZE (0x6): This advisory setting informs a | ||||
| peer of the maximum size of header list that the sender is | ||||
| prepared to accept. The value is based on the uncompressed size | ||||
| of header fields, including the length of the 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 | ||||
| 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 | |||
| when the peer has received and applied the changed the communicated | when the peer has received and applied the changed parameter values. | |||
| parameter values. In order to provide such synchronization | In order to provide such synchronization timepoints, the recipient of | |||
| timepoints, the recipient of a SETTINGS frame in which the ACK flag | a SETTINGS frame in which the ACK flag is not set MUST apply the | |||
| is not set MUST apply the updated parameters as soon as possible upon | updated parameters as soon as possible upon receipt. | |||
| receipt. | ||||
| The values in the SETTINGS frame MUST be applied in the order they | The values in the SETTINGS frame MUST be processed in the order they | |||
| appear, with no other frame processing between values. Once all | appear, with no other frame processing between values. Unsupported | |||
| values have been applied, the recipient MUST immediately emit a | parameters MUST be ignored. Once all values have been processed, the | |||
| SETTINGS frame with the ACK flag set. Upon receiving a SETTINGS | recipient MUST immediately emit a SETTINGS frame with the ACK flag | |||
| frame with the ACK flag set, the sender of the altered parameters can | set. Upon receiving a SETTINGS frame with the ACK flag set, the | |||
| rely upon their application. | sender of the altered parameters can rely on the setting having been | |||
| applied. | ||||
| If the sender of a SETTINGS frame does not receive an acknowledgement | If the sender of a SETTINGS frame does not receive an acknowledgement | |||
| within a reasonable amount of time, it MAY issue a connection error | within a reasonable amount of time, it MAY issue a connection error | |||
| (Section 5.4.1) of type SETTINGS_TIMEOUT. | (Section 5.4.1) of type SETTINGS_TIMEOUT. | |||
| 6.6. PUSH_PROMISE | 6.6. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | |||
| in advance of streams the sender intends to initiate. The | in advance of streams the sender intends to initiate. The | |||
| PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | |||
| skipping to change at page 41, line 22 ¶ | skipping to change at page 42, line 14 ¶ | |||
| 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 maintainence. | |||
| There is an inherent race condition between an endpoint starting new | There is an inherent race condition between an endpoint starting new | |||
| streams and the remote sending a GOAWAY frame. To deal with this | streams and the remote sending a GOAWAY frame. To deal with this | |||
| case, the GOAWAY contains the stream identifier of the last stream | case, the GOAWAY contains the stream identifier of the last peer- | |||
| which was or might be processed on the sending endpoint in this | initiated stream which was or might be processed on the sending | |||
| connection. If the receiver of the GOAWAY has sent data on streams | endpoint in this connection. For instance, if the server sends a | |||
| with a higher stream identifier than what is indicated in the GOAWAY | GOAWAY frame, the identifed stream is the highest numbered stream | |||
| frame, those streams are not or will not be processed. The receiver | initiated by the client. | |||
| of the GOAWAY frame can treat the streams as though they had never | ||||
| been created at all, thereby allowing those streams to be retried | If the receiver of the GOAWAY has sent data on streams with a higher | |||
| later on a new connection. | stream identifier than what is indicated in the GOAWAY frame, those | |||
| 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 | ||||
| all, thereby allowing those streams to be retried later on a new | ||||
| connection. | ||||
| Endpoints SHOULD always send a GOAWAY frame before closing a | Endpoints SHOULD always send a GOAWAY frame before closing a | |||
| connection so that the remote can know whether a stream has been | connection so that the remote can know whether a stream has been | |||
| partially processed or not. For example, if an HTTP client sends a | partially processed or not. For example, if an HTTP client sends a | |||
| POST at the same time that a server closes a connection, the client | POST at the same time that a server closes a connection, the client | |||
| cannot know if the server started to process that POST request if the | cannot know if the server started to process that POST request if the | |||
| server does not send a GOAWAY frame to indicate what streams it might | server does not send a GOAWAY frame to indicate what streams it might | |||
| have acted on. | have acted on. | |||
| An endpoint might choose to close a connection without sending GOAWAY | An endpoint might choose to close a connection without sending GOAWAY | |||
| skipping to change at page 44, line 19 ¶ | skipping to change at page 45, line 17 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |R| Window Size Increment (31) | | |R| Window Size Increment (31) | | |||
| +-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| WINDOW_UPDATE Payload Format | WINDOW_UPDATE Payload Format | |||
| The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | |||
| unsigned 31-bit integer indicating the number of bytes that the | unsigned 31-bit integer indicating the number of bytes that the | |||
| sender can transmit in addition to the existing flow control window. | sender can transmit in addition to the existing flow control window. | |||
| The legal range for the increment to the flow control window is 1 to | The legal range for the increment to the flow control window is 1 to | |||
| 2^31 - 1 (0x7fffffff) bytes. | 2^31-1 (0x7fffffff) bytes. | |||
| The WINDOW_UPDATE frame 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 | ||||
| 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 | ||||
| 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 | |||
| skipping to change at page 45, line 23 ¶ | skipping to change at page 46, line 27 ¶ | |||
| 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 | A sender MUST NOT allow a flow control window to exceed 2^31-1 bytes. | |||
| bytes. If a sender receives a WINDOW_UPDATE that causes a flow | If a sender receives a WINDOW_UPDATE that causes a flow control | |||
| control window to exceed this maximum it MUST terminate either the | window to exceed this maximum it MUST terminate either the stream or | |||
| stream or the connection, as appropriate. For streams, the sender | the connection, as appropriate. For streams, the sender sends a | |||
| sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | RST_STREAM with the error code of FLOW_CONTROL_ERROR code; for the | |||
| for the connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | 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 bytes. | |||
| skipping to change at page 49, line 33 ¶ | skipping to change at page 50, line 33 ¶ | |||
| this protocol are defined in the sections below. | this protocol are defined in the sections below. | |||
| 8.1. HTTP Request/Response Exchange | 8.1. HTTP Request/Response Exchange | |||
| A client sends an HTTP request on a new stream, using a previously | A client sends an HTTP request on a new stream, using a previously | |||
| unused stream identifier (Section 5.1.1). A server sends an HTTP | unused stream identifier (Section 5.1.1). A server sends an HTTP | |||
| response on the same stream as the request. | response on the same stream as the request. | |||
| An HTTP message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
| 1. one HEADERS frame (followed by zero or more CONTINUATION frames) | 1. for a response only, zero or more HEADERS frames (each followed | |||
| by zero or more CONTINUATION frames) containing the message | ||||
| headers of informational (1xx) HTTP responses (see [RFC7230], | ||||
| Section 3.2 and [RFC7231], Section 6.2), and | ||||
| 2. one HEADERS frame (followed by zero or more CONTINUATION frames) | ||||
| containing the message headers (see [RFC7230], Section 3.2), and | containing the message headers (see [RFC7230], Section 3.2), and | |||
| 2. zero or more DATA frames containing the message payload (see | 3. zero or more DATA frames containing the message payload (see | |||
| [RFC7230], Section 3.3), and | [RFC7230], Section 3.3), and | |||
| 3. optionally, one HEADERS frame, followed by zero or more | 4. optionally, one HEADERS frame, followed by zero or more | |||
| CONTINUATION frames containing the trailer-part, if present (see | CONTINUATION frames containing the trailer-part, if present (see | |||
| [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. | |||
| Otherwise, frames MAY be interspersed on the stream between these | A HEADERS frame (and associated CONTINUATION frames) can only appear | |||
| frames, but those frames do not carry HTTP semantics. In particular, | at the start or end of a stream. An endpoint that receives a second | |||
| HEADERS frames (and any CONTINUATION frames that follow) other than | HEADERS frame without the END_STREAM flag set MUST treat the | |||
| the first and optional last frames in this sequence do not carry HTTP | corresponding request or response as malformed (Section 8.1.2.6). | |||
| semantics. | ||||
| Trailing header fields are carried in a header block that also | Trailing header fields are carried in a header block that also | |||
| terminates the stream. That is, a sequence starting with a HEADERS | terminates the stream. That is, a sequence starting with a HEADERS | |||
| frame, followed by zero or more CONTINUATION frames, where the | frame, followed by zero or more CONTINUATION frames, where the | |||
| HEADERS frame bears an END_STREAM flag. Header blocks after the | HEADERS frame bears an END_STREAM flag. Header blocks after the | |||
| first that do not terminate the stream are not part of an HTTP | first that do not terminate the stream are not part of an HTTP | |||
| request or response. | request or response. | |||
| An HTTP request/response exchange fully consumes a single stream. A | An HTTP request/response exchange fully consumes a single stream. A | |||
| request starts with the HEADERS frame that puts the stream into an | request starts with the HEADERS frame that puts the stream into an | |||
| "open" state and ends with a frame bearing END_STREAM, which causes | "open" state. The request ends with a frame bearing END_STREAM, | |||
| the stream to become "half closed" for the client. A response starts | which causes the stream to become "half closed (local)" for the | |||
| with a HEADERS frame and ends with a frame bearing END_STREAM, | client and "half closed (remote)" for the server. A response starts | |||
| optionally followed by CONTINUATION frames, which places the stream | with a HEADERS frame and ends with a frame bearing END_STREAM, which | |||
| in the "closed" state. | places the stream in the "closed" state. | |||
| 8.1.1. Informational Responses | ||||
| The 1xx series of HTTP response status codes ([RFC7231], Section 6.2) | ||||
| are not supported in HTTP/2. | ||||
| The most common use case for 1xx is using an Expect header field with | ||||
| a "100-continue" token (colloquially, "Expect/continue") to indicate | ||||
| that the client expects a 100 (Continue) non-final response status | ||||
| code, receipt of which indicates that the client should continue | ||||
| sending the request body if it has not already done so. | ||||
| Typically, Expect/continue is used by clients wishing to avoid | ||||
| sending a large amount of data in a request body, only to have the | ||||
| request rejected by the origin server, thereby leaving the connection | ||||
| potentially unusable. | ||||
| HTTP/2 does not enable the Expect/continue mechanism; if the server | ||||
| sends a final status code to reject the request, it can do so without | ||||
| making the underlying connection unusable. | ||||
| Note that this means HTTP/2 clients sending requests with bodies may | ||||
| waste at least one round trip of sent data when the request is | ||||
| rejected. This can be mitigated by restricting the amount of data | ||||
| sent for the first round trip by bandwidth-constrained clients, in | ||||
| anticipation of a final status code. | ||||
| Other defined 1xx status codes are not applicable to HTTP/2. For | ||||
| example, the semantics of 101 (Switching Protocols) aren't suitable | ||||
| to a multiplexed protocol. Likewise, 102 (Processing) [RFC2518] is | ||||
| no longer necessary to ensure connection liveness, because HTTP/2 has | ||||
| a separate means of keeping the connection alive. The use of the 102 | ||||
| (Processing) status code for progress reporting has since been | ||||
| deprecated and is not retained. | ||||
| This difference between protocol versions necessitates special | ||||
| handling by intermediaries that translate between them: | ||||
| o An intermediary that translates HTTP/1.1 requests to HTTP/2 MUST | 8.1.1. Upgrading From HTTP/2 | |||
| generate a 100 (Continue) response if a received request includes | ||||
| and Expect header field with a "100-continue" token ([RFC7231], | ||||
| Section 5.1.1), unless it can immediately generate a final status | ||||
| code. It MUST NOT forward the "100-continue" expectation in the | ||||
| request header fields. | ||||
| o An intermediary that translates HTTP/2 to HTTP/1.1 MAY add an | HTTP/2 removes support for the 101 (Switching Protocols) | |||
| Expect header field with a "100-continue" expectation when | informational status code ([RFC7231], Section 6.2.2). | |||
| forwarding a request that has a body; see [RFC7231], Section 5.1.1 | ||||
| for specific requirements. | ||||
| o An intermediary that gateways HTTP/2 to HTTP/1.1 MUST discard all | The semantics of 101 (Switching Protocols) aren't applicable to a | |||
| other 1xx informational responses. | multiplexed protocol. Alternative protocols are able to use the same | |||
| mechanisms that HTTP/2 uses to negotiate their use (see Section 3). | ||||
| 8.1.2. HTTP Header Fields | 8.1.2. HTTP Header Fields | |||
| HTTP header fields carry information as a series of key-value pairs. | HTTP header fields carry information as a series of key-value pairs. | |||
| 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 | ||||
| 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-headers | the status code for the response, HTTP/2 uses special pseudo-header | |||
| 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 | ||||
| not HTTP header fields. Endpoints MUST NOT generate pseudo-header | ||||
| fields other than those defined in this document. | ||||
| Pseudo-header fields are only valid in the context in which they are | ||||
| defined. Pseudo-header fields defined for requests MUST NOT appear | ||||
| in responses; pseudo-header fields defined for responses MUST NOT | ||||
| appear in requests. Pseudo-header fields MUST NOT appear in | ||||
| trailers. Endpoints MUST treat a request or response that contains | ||||
| undefined or invalid pseudo-header fields as malformed | ||||
| (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.5). | header field names MUST be treated as malformed (Section 8.1.2.6). | |||
| All pseudo-header fields MUST appear in the header block before | ||||
| regular header fields. Any request or response that contains a | ||||
| pseudo-header field that appears in a header block after a regular | ||||
| header field MUST be treated as malformed (Section 8.1.2.6). | ||||
| 8.1.2.2. Hop-by-Hop 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-by- | |||
| hop" header fields; in this protocol, connection-specific metadata is | hop" header fields; in this protocol, connection-specific metadata is | |||
| conveyed by other means. As such, a HTTP/2 message containing | conveyed by other means. As such, a HTTP/2 message containing | |||
| Connection MUST be treated as malformed (Section 8.1.2.5). | Connection 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 MUST NOT contain any value other | |||
| than "trailers". | 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.1. Request Header Fields | 8.1.2.3. Request Header Fields | |||
| HTTP/2 defines a number of pseudo header fields starting with a colon | HTTP/2 defines a number of pseudo header fields starting with a colon | |||
| ':' character that carry information about the request target: | ':' character that carry information about the request target: | |||
| o The ":method" header field includes the HTTP method ([RFC7231], | o The ":method" header field includes the HTTP method ([RFC7231], | |||
| Section 4). | Section 4). | |||
| o The ":scheme" header field includes the scheme portion of the | o The ":scheme" header field includes the scheme portion of the | |||
| target URI ([RFC3986], Section 3.1). | target URI ([RFC3986], Section 3.1). | |||
| skipping to change at page 52, line 50 ¶ | skipping to change at page 53, line 33 ¶ | |||
| asterisk form (see [RFC7230], Section 5.3). Clients that generate | asterisk form (see [RFC7230], Section 5.3). Clients that generate | |||
| HTTP/2 requests directly SHOULD instead omit the "Host" header | HTTP/2 requests directly SHOULD instead omit the "Host" header | |||
| field. An intermediary that converts an HTTP/2 request to | field. An intermediary that converts an HTTP/2 request to | |||
| HTTP/1.1 MUST create a "Host" header field if one is not present | HTTP/1.1 MUST create a "Host" header field if one is not present | |||
| in a request by copying the value of the ":authority" header | in a request by copying the value of the ":authority" header | |||
| field. | field. | |||
| o The ":path" header field includes the path and query parts of the | o The ":path" header field includes the path and query parts of the | |||
| target URI (the "path-absolute" production from [RFC3986] and | target URI (the "path-absolute" production from [RFC3986] and | |||
| optionally a '?' character followed by the "query" production, see | optionally a '?' character followed by the "query" production, see | |||
| [RFC3986], Section 3.3 and [RFC3986], Section 3.4). This field | [RFC3986], Section 3.3 and [RFC3986], Section 3.4). A request in | |||
| MUST NOT be empty; URIs that do not contain a path component MUST | asterisk form includes the value '*' for the ":path" header field. | |||
| include a value of '/', unless the request is an OPTIONS request | ||||
| in asterisk form, in which case the ":path" header field MUST | This field MUST NOT be empty for "http" or "https" URIs; "http" or | |||
| include '*'. | "https" URIs that do not contain a path component MUST include a | |||
| value of '/'. The exception to this rule is an OPTIONS request | ||||
| for an "http" or "https" URI that does not include a path | ||||
| component; these MUST include a ":path" header field 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" header fields, unless this is a | |||
| CONNECT request (Section 8.3). An HTTP request that omits mandatory | CONNECT request (Section 8.3). An HTTP request that omits mandatory | |||
| header fields is malformed (Section 8.1.2.5). | header fields is malformed (Section 8.1.2.6). | |||
| Header field names that start with a colon are only valid in the | ||||
| HTTP/2 context. These are not HTTP header fields. Implementations | ||||
| MUST NOT generate header fields that start with a colon, and they | ||||
| MUST ignore and discard any header field that starts with a colon. | ||||
| In particular, header fields with names starting with a colon MUST | ||||
| NOT be exposed as HTTP header fields. | ||||
| 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.2. Response Header Fields | 8.1.2.4. Response Header Fields | |||
| A single ":status" header field is defined that carries the HTTP | A single ":status" header field is defined that carries the HTTP | |||
| status code field (see [RFC7231], Section 6). This header field MUST | status code field (see [RFC7231], Section 6). This header field MUST | |||
| be included in all responses, otherwise the response is malformed | be included in all responses, otherwise the response is malformed | |||
| (Section 8.1.2.5). | (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.3. Header Field Ordering | 8.1.2.5. Compressing the Cookie Header Field | |||
| HTTP Header Compression [COMPRESSION] does not preserve the order of | ||||
| header fields, because the relative order of header fields with | ||||
| different names is not important. However, the same header field can | ||||
| be repeated to form a list (see [RFC7230], Section 3.2.2), where the | ||||
| relative order of header field values is significant. This | ||||
| repetition can occur either as a single header field with a comma- | ||||
| separated list of values, or as several header fields with a single | ||||
| value, or any combination thereof. Therefore, in the latter case, | ||||
| ordering needs to be preserved before compression takes place. | ||||
| To preserve the order of multiple occurrences of a header field with | ||||
| the same name, its ordered values are concatenated into a single | ||||
| value using a zero-valued octet (0x0) to delimit them. | ||||
| After decompression, header fields that have values containing zero | ||||
| octets (0x0) MUST be split into multiple header fields before being | ||||
| processed. | ||||
| For example, the following HTTP/1.x header block: | ||||
| Content-Type: text/html | ||||
| Cache-Control: max-age=60, private | ||||
| Cache-Control: must-revalidate | ||||
| contains three Cache-Control directives; two directives in the first | ||||
| Cache-Control header field, and the third directive in the second | ||||
| Cache-Control field. Before compression, they would need to be | ||||
| converted to a form similar to this (with 0x0 represented as '\0'): | ||||
| cache-control = max-age=60, private\0must-revalidate | ||||
| content-type = text/html | ||||
| Note here that the ordering between Content-Type and Cache-Control is | ||||
| not preserved, but the relative ordering of the Cache-Control | ||||
| directives - as well as the fact that the first two were comma- | ||||
| separated, while the last was on a different line - is. | ||||
| Header fields containing multiple values MUST be concatenated into a | ||||
| single value unless the ordering of that header field is known to be | ||||
| not significant. | ||||
| The special case of "set-cookie" - which does not form a comma- | ||||
| separated list, but can have multiple values - does not depend on | ||||
| ordering. The "set-cookie" header field MAY be encoded as multiple | ||||
| header field values, or as a single concatenated value. | ||||
| 8.1.2.4. 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- | |||
| pairs (or "crumbs"). This header field doesn't follow the list | pairs (or "crumbs"). This header field doesn't follow the list | |||
| construction rules in HTTP (see [RFC7230], Section 3.2.2), which | construction rules in HTTP (see [RFC7230], Section 3.2.2), which | |||
| prevents cookie-pairs from being separated into different name-value | prevents cookie-pairs from being separated into different name-value | |||
| pairs. This can significantly reduce compression efficiency as | pairs. This can significantly reduce compression efficiency as | |||
| individual cookie-pairs are updated. | individual cookie-pairs are updated. | |||
| To allow for better compression efficiency, the Cookie header field | To allow for better compression efficiency, the Cookie header field | |||
| MAY be split into separate header fields, each with one or more | MAY be split into separate header fields, each with one or more | |||
| cookie-pairs. If there are multiple Cookie header fields after | cookie-pairs. If there are multiple Cookie header fields after | |||
| decompression, these MUST be concatenated into a single octet string | decompression, these MUST be concatenated into a single octet string | |||
| using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; "). | using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; ") | |||
| before being passed into a non-HTTP/2 context, such as an HTTP/1.1 | ||||
| The Cookie header field MAY be split using a zero octet (0x0), as | connection, or a generic HTTP server application. | |||
| defined in Section 8.1.2.3. When decoding, zero octets MUST be | ||||
| replaced with the cookie delimiter ("; "). | ||||
| Therefore, the following sets of Cookie header fields are | Therefore, the following two lists of Cookie header fields are | |||
| semantically equivalent, though the final form might appear in a | semantically equivalent. | |||
| different order after compression and decompression. | ||||
| cookie: a=b; c=d; e=f | cookie: a=b; c=d; e=f | |||
| cookie: a=b\0c=d; e=f | ||||
| cookie: a=b | cookie: a=b | |||
| cookie: c=d | cookie: c=d | |||
| cookie: e=f | cookie: e=f | |||
| 8.1.2.5. Malformed Messages | 8.1.2.6. Malformed Requests and Responses | |||
| A malformed request or response is one that uses a valid sequence of | A malformed request or response is one that is an otherwise valid | |||
| HTTP/2 frames, but is otherwise invalid due to the presence of | sequence of HTTP/2 frames, but is otherwise invalid due to the | |||
| prohibited header fields, the absence of mandatory header fields, or | presence of extraneous frames, prohibited header fields, the absence | |||
| the inclusion of uppercase header field names. | of mandatory header fields, or the inclusion of uppercase header | |||
| field names. | ||||
| A request or response that includes an entity body can include a | A request or response that includes an entity body can include a | |||
| "content-length" header field. A request or response is also | "content-length" header field. A request or response is also | |||
| malformed if the value of a "content-length" header field does not | malformed if the value of a "content-length" header field does not | |||
| equal the sum of the DATA frame payload lengths that form the body. | equal the sum of the DATA frame payload lengths that form the body, | |||
| with the exception of responses to HEAD requests, which always | ||||
| contain no 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. | request or response. Malformed requests or responses that are | |||
| detected MUST be treated as a stream error (Section 5.4.2) of type | ||||
| PROTOCOL_ERROR. | ||||
| Implementations that detect malformed requests or responses need to | For malformed requests, a server MAY send an HTTP response prior to | |||
| ensure that the stream ends. For malformed requests, a server MAY | closing or resetting the stream. Clients MUST NOT accept a malformed | |||
| send an HTTP response prior to closing or resetting the stream. | response. Note that these requirements are intended to protect | |||
| Clients MUST NOT accept a malformed response. Note that these | against several types of common attacks against HTTP; they are | |||
| requirements are intended to protect against several types of common | deliberately strict, because being permissive can expose | |||
| attacks against HTTP; they are deliberately strict, because being | implementations to these vulnerabilities. | |||
| permissive can expose implementations to these vulnerabilities. | ||||
| 8.1.3. Examples | 8.1.3. Examples | |||
| This section shows HTTP/1.1 requests and responses, with | This section shows HTTP/1.1 requests and responses, with | |||
| illustrations of equivalent HTTP/2 requests and responses. | illustrations of equivalent HTTP/2 requests and responses. | |||
| An HTTP GET request includes request header fields and no body and is | An HTTP GET request includes request header fields and no body and is | |||
| therefore transmitted as a single HEADERS frame, followed by zero or | therefore transmitted as a single HEADERS frame, followed by zero or | |||
| more CONTINUATION frames containing the serialized block of request | more CONTINUATION frames containing the serialized block of request | |||
| header fields. The HEADERS frame in the following has both the | header fields. The HEADERS frame in the following has both the | |||
| skipping to change at page 58, line 22 ¶ | skipping to change at page 57, line 38 ¶ | |||
| 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 60, line 13 ¶ | skipping to change at page 59, line 36 ¶ | |||
| includes a request body. | includes a request body. | |||
| Pushed responses are always associated with an explicit request from | Pushed responses are always associated with an explicit request from | |||
| the client. The PUSH_PROMISE frames sent by the server are sent on | the client. The PUSH_PROMISE frames sent by the server are sent on | |||
| that explicit request's stream. The PUSH_PROMISE frame also includes | that explicit request's stream. The PUSH_PROMISE frame also includes | |||
| a promised stream identifier, chosen from the stream identifiers | a promised stream identifier, chosen from the stream identifiers | |||
| available to the server (see Section 5.1.1). | available to the server (see Section 5.1.1). | |||
| The header fields in PUSH_PROMISE and any subsequent CONTINUATION | The header fields in PUSH_PROMISE and any subsequent CONTINUATION | |||
| frames MUST be a valid and complete set of request header fields | frames MUST be a valid and complete set of request header fields | |||
| (Section 8.1.2.1). The server MUST include a method in the ":method" | (Section 8.1.2.3). The server MUST include a method in the ":method" | |||
| header field that is safe and cacheable. If a client receives a | header field that is safe and cacheable. If a client receives a | |||
| PUSH_PROMISE that does not include a complete and valid set of header | PUSH_PROMISE that does not include a complete and valid set of header | |||
| fields, or the ":method" header field identifies a method that is not | fields, or the ":method" header field identifies a method that is not | |||
| safe, it MUST respond with a stream error (Section 5.4.2) of type | safe, it MUST respond with a stream error (Section 5.4.2) of type | |||
| PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
| The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | |||
| sending any frames that reference the promised responses. This | sending any frames that reference the promised responses. This | |||
| avoids a race where clients issue requests prior to receiving any | avoids a race where clients issue requests prior to receiving any | |||
| PUSH_PROMISE frames. | PUSH_PROMISE frames. | |||
| skipping to change at page 60, line 35 ¶ | skipping to change at page 60, line 10 ¶ | |||
| For example, if the server receives a request for a document | For example, if the server receives a request for a document | |||
| containing embedded links to multiple image files, and the server | containing embedded links to multiple image files, and the server | |||
| chooses to push those additional images to the client, sending push | chooses to push those additional images to the client, sending push | |||
| promises before the DATA frames that contain the image links ensures | promises before the DATA frames that contain the image links ensures | |||
| that the client is able to see the promises before discovering | that the client is able to see the promises before discovering | |||
| embedded links. Similarly, if the server pushes responses referenced | embedded links. Similarly, if the server pushes responses referenced | |||
| by the header block (for instance, in Link header fields), sending | by the header block (for instance, in Link header fields), sending | |||
| the push promises before sending the header block ensures that | the push promises before sending the header block ensures that | |||
| clients do not request them. | clients do not request them. | |||
| PUSH_PROMISE frames MUST NOT be sent by the client. PUSH_PROMISE | PUSH_PROMISE frames MUST NOT be sent by the client. | |||
| frames can be sent by the server on any stream that was opened by the | ||||
| client. They MUST be sent on a stream that is in either the "open" | PUSH_PROMISE frames can be sent by the server in response to any | |||
| or "half closed (remote)" state to the server. PUSH_PROMISE frames | client-initiated stream, but the stream MUST be in either the "open" | |||
| are interspersed with the frames that comprise a response, though | or "half closed (remote)" state with respect to the server. | |||
| they cannot be interspersed with HEADERS and CONTINUATION frames that | PUSH_PROMISE frames are interspersed with the frames that comprise a | |||
| comprise a single header block. | response, though they cannot be interspersed with HEADERS and | |||
| CONTINUATION frames that comprise a single header block. | ||||
| Sending a PUSH_PROMISE frame creates a new stream and puts the stream | ||||
| into the "reserved (local)" state for the server and the "reserved | ||||
| (remote)" state for the client. | ||||
| 8.2.2. Push Responses | 8.2.2. Push Responses | |||
| After sending the PUSH_PROMISE frame, the server can begin delivering | After sending the PUSH_PROMISE frame, the server can begin delivering | |||
| the pushed response as a response (Section 8.1.2.2) on a server- | the pushed response as a response (Section 8.1.2.4) on a server- | |||
| initiated stream that uses the promised stream identifier. The | initiated stream that uses the promised stream identifier. The | |||
| server uses this stream to transmit an HTTP response, using the same | server uses this stream to transmit an HTTP response, using the same | |||
| sequence of frames as defined in Section 8.1. This stream becomes | sequence of frames as defined in Section 8.1. This stream becomes | |||
| "half closed" to the client (Section 5.1) after the initial HEADERS | "half closed" to the client (Section 5.1) after the initial HEADERS | |||
| frame is sent. | frame is sent. | |||
| Once a client receives a PUSH_PROMISE frame and chooses to accept the | Once a client receives a PUSH_PROMISE frame and chooses to accept the | |||
| pushed response, the client SHOULD NOT issue any requests for the | pushed response, the client SHOULD NOT issue any requests for the | |||
| promised response until after the promised stream has closed. | promised response until after the promised stream has closed. | |||
| skipping to change at page 61, line 29 ¶ | skipping to change at page 61, line 11 ¶ | |||
| streams. This does not prohibit a server from sending PUSH_PROMISE | streams. This does not prohibit a server from sending PUSH_PROMISE | |||
| frames; clients need to reset any promised streams that are not | frames; clients need to reset any promised streams that are not | |||
| wanted. | wanted. | |||
| Clients receiving a pushed response MUST validate that the server is | Clients receiving a pushed response MUST validate that the server is | |||
| authorized to provide the response, see Section 10.1. For example, a | authorized to provide the response, see Section 10.1. For example, a | |||
| server that offers a certificate for only the "example.com" DNS-ID or | server that offers a certificate for only the "example.com" DNS-ID or | |||
| Common Name is not permitted to push a response for | Common Name is not permitted to push a response for | |||
| "https://www.example.org/doc". | "https://www.example.org/doc". | |||
| The response for a PUSH_PROMISE stream begins with a HEADERS frame, | ||||
| which immediately puts the stream into the "half closed (remote)" | ||||
| 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 | ||||
| the "closed" state. | ||||
| Note: The client never sends a frame with the END_STREAM flag for a | ||||
| 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 mostly as defined in Request | |||
| Header Fields (Section 8.1.2.1), with a few differences. | Header Fields (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). | |||
| skipping to change at page 63, line 49 ¶ | skipping to change at page 63, line 40 ¶ | |||
| 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 | |||
| the an origin server. This means that it is possible for clients to | the an origin server. This means that it is possible for clients to | |||
| send confidential information to servers that might not be the | send confidential information to servers that might not be the | |||
| intended target for the request, even though the server has valid | intended target for the request, even though the server has valid | |||
| authentication credentials. | authentication credentials. | |||
| 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 (Not | |||
| Authoritative) status code in response to request (see | Authoritative) 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 | 9.1.2. The 421 (Not Authoritative) Status Code | |||
| The 421 (Not Authoritative) status code indicates that the current | The 421 (Not Authoritative) status code indicates that the current | |||
| origin server is not authoritative for the requested resource, in the | origin server is not authoritative for the requested resource, in the | |||
| sense of [RFC7230], Section 9.1 (see also Section 10.1). | sense of [RFC7230], Section 9.1 (see also Section 10.1). | |||
| Clients receiving a 421 (Not Authoritative) response from a server | Clients receiving a 421 (Not Authoritative) 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 | |||
| skipping to change at page 64, line 30 ¶ | skipping to change at page 64, line 20 ¶ | |||
| 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]). | |||
| 9.2. Use of TLS Features | 9.2. Use of TLS Features | |||
| Implementations of HTTP/2 MUST support TLS 1.2 [TLS12] for HTTP/2 | Implementations of HTTP/2 MUST support TLS 1.2 [TLS12] for HTTP/2 | |||
| over TLS. The general TLS usage guidance in [TLSBCP] SHOULD be | over TLS. The general TLS usage guidance in [TLSBCP] SHOULD be | |||
| followed, with some additional restrictions that are specific to | followed, with some additional restrictions that are specific to | |||
| HTTP/2. | HTTP/2. | |||
| An implementation of HTTP/2 over TLS MUST use TLS 1.2 or higher with | ||||
| the restrictions on feature set and cipher suite described in this | ||||
| section. Due to implementation limitations, it might not be possible | ||||
| to fail TLS negotiation. An endpoint MUST immediately terminate an | ||||
| HTTP/2 connection that does not meet these minimum requirements with | ||||
| a connection error (Section 5.4.1) of type INADEQUATE_SECURITY. | ||||
| 9.2.1. TLS Features | 9.2.1. TLS Features | |||
| The TLS implementation MUST support the Server Name Indication (SNI) | The TLS implementation MUST support the Server Name Indication (SNI) | |||
| [TLS-EXT] extension to TLS. HTTP/2 clients MUST indicate the target | [TLS-EXT] extension to TLS. HTTP/2 clients MUST indicate the target | |||
| domain name when negotiating TLS. | domain name when negotiating TLS. | |||
| The TLS implementation MUST disable compression. TLS compression can | The TLS implementation MUST disable compression. TLS compression can | |||
| lead to the exposure of information that would not otherwise be | lead to the exposure of information that would not otherwise be | |||
| revealed [RFC3749]. Generic compression is unnecessary since HTTP/2 | revealed [RFC3749]. Generic compression is unnecessary since HTTP/2 | |||
| provides compression features that are more aware of context and | provides compression features that are more aware of context and | |||
| skipping to change at page 65, line 24 ¶ | skipping to change at page 65, line 22 ¶ | |||
| 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 | |||
| use stream or block ciphers. Authenticated Encryption with | use stream or block ciphers. Authenticated Encryption with | |||
| Additional Data (AEAD) modes, such as the Galois Counter Model (GCM) | Additional Data (AEAD) modes, such as the Galois Counter Model (GCM) | |||
| mode for AES [RFC5288] are acceptable. | mode for AES [RFC5288] are acceptable. | |||
| Clients MAY advertise support of other cipher suites in order to | The effect of these restrictions is that TLS 1.2 implementations | |||
| allow for connection to servers that do not support HTTP/2 to | could have non-intersecting sets of available cipher suites, since | |||
| complete without the additional latency imposed by using a separate | these prevent the use of the cipher suite that TLS 1.2 makes | |||
| connection for fallback. | mandatory. To avoid this problem, implementations of HTTP/2 that use | |||
| TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | ||||
| [TLS-ECDHE] with P256 [FIPS186]. | ||||
| An implementation SHOULD NOT negotiate a TLS connection for HTTP/2 | Clients MAY advertise support of cipher suites that are prohibited by | |||
| without also negotiating a cipher suite that meets these | the above restrictions in order to allow for connection to servers | |||
| requirements. Due to implementation limitations, it might not be | that do not support HTTP/2. This enables a fallback to protocols | |||
| possible to fail TLS negotiation. An endpoint MUST immediately | without these constraints without the additional latency imposed by | |||
| terminate an HTTP/2 connection that does not meet these minimum | using a separate connection for fallback. | |||
| requirements with a connection error (Section 5.4.1) of type | ||||
| INADEQUATE_SECURITY. | ||||
| 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 | A client is only able to accept HTTP/2 responses from servers that | |||
| are authoritative for those resources. This is particularly | are authoritative for those resources. This is particularly | |||
| important for server push (Section 8.2), where the client validates | important for server push (Section 8.2), where the client validates | |||
| the PUSH_PROMISE before accepting the response. | the PUSH_PROMISE before accepting the response. | |||
| skipping to change at page 68, line 44 ¶ | skipping to change at page 68, line 41 ¶ | |||
| header fields that are critical to routing, such as ":authority", | header fields that are critical to routing, such as ":authority", | |||
| ":path", and ":scheme" are not guaranteed to be present early in the | ":path", and ":scheme" are not guaranteed to be present early in the | |||
| header block. In particular, values that are in the reference set | header block. In particular, values that are in the reference set | |||
| cannot be emitted until the header block ends. | cannot be emitted until the header block ends. | |||
| This can prevent streaming of the header fields to their ultimate | This can prevent streaming of the header fields to their ultimate | |||
| destination, and forces the endpoint to buffer the entire header | destination, and forces the endpoint to buffer the entire header | |||
| block. Since there is no hard limit to the size of a header block, | 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 could be forced to exhaust available memory. | |||
| An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to avise peers | ||||
| of limits that might apply on the size of header blocks. This | ||||
| setting is only advisory, so endpoints MAY choose to send header | ||||
| blocks that exceed this limit and risk having the request or response | ||||
| being treated as malformed. This setting is advertised hop-by-hop, | ||||
| so any request or response could encounter a hop with a lower, | ||||
| unknown limit. An intermediary can attempt to avoid this problem by | ||||
| passing on values presented by different peers, but they are not | ||||
| 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. | |||
| 10.6. Use of Compression | 10.6. Use of Compression | |||
| HTTP/2 enables greater use of compression for both header fields | HTTP/2 enables greater use of compression for both header fields | |||
| (Section 4.3) and entity bodies. Compression can allow an attacker | (Section 4.3) and entity bodies. Compression can allow an attacker | |||
| skipping to change at page 70, line 27 ¶ | skipping to change at page 70, line 31 ¶ | |||
| features. | features. | |||
| As far as this creates observable differences in behavior, they could | As far as this creates observable differences in behavior, they could | |||
| be used as a basis for fingerprinting a specific client, as defined | be used as a basis for fingerprinting a specific client, as defined | |||
| in Section 1.8 of [HTML5]. | in Section 1.8 of [HTML5]. | |||
| 11. IANA Considerations | 11. IANA Considerations | |||
| 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 [TLSALPN]. | 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 (Not Authoritative) 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 [TLSALPN]. | 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 | |||
| skipping to change at page 72, line 35 ¶ | skipping to change at page 72, line 35 ¶ | |||
| 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_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]. | |||
| Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
| skipping to change at page 75, line 13 ¶ | skipping to change at page 75, line 15 ¶ | |||
| o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). | o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). | |||
| o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | |||
| Jitu Padhye, Roberto Peon, Rob Trace (Flow control). | Jitu Padhye, Roberto Peon, Rob Trace (Flow control). | |||
| o Mike Bishop (Extensibility). | o Mike Bishop (Extensibility). | |||
| o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | |||
| Bishop, Herve Ruellan (Substantial editorial contributions). | Bishop, Herve Ruellan (Substantial editorial contributions). | |||
| o Kari Hurtta, Tatsuhiro Tsujikawa, Greg Wilkins, Poul-Henning Kamp. | ||||
| o Alexey Melnikov was an editor of this document during 2013. | o Alexey Melnikov was an editor of this document during 2013. | |||
| o A substantial proportion of Martin's contribution was supported by | o A substantial proportion of Martin's contribution was supported by | |||
| Microsoft during his employment there. | Microsoft during his employment there. | |||
| 13. References | 13. References | |||
| 13.1. Normative References | 13.1. Normative References | |||
| [COMPRESSION] | [COMPRESSION] | |||
| Ruellan, H. and R. Peon, "HPACK - Header Compression for | Ruellan, H. and R. Peon, "HPACK - Header Compression for | |||
| HTTP/2", draft-ietf-httpbis-header-compression-08 (work in | HTTP/2", draft-ietf-httpbis-header-compression-09 (work in | |||
| progress), June 2014. | progress), July 2014. | |||
| [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
| April 2011. | April 2011. | |||
| [FIPS186] NIST, "Digital Signature Standard (DSS)", FIPS PUB 186-4, | ||||
| July 2013. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Resource Identifier (URI): Generic Syntax", STD 66, RFC | Resource Identifier (URI): Generic Syntax", STD 66, RFC | |||
| 3986, January 2005. | 3986, January 2005. | |||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| skipping to change at page 76, line 27 ¶ | skipping to change at page 76, line 34 ¶ | |||
| [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | |||
| RFC 7234, June 2014. | RFC 7234, June 2014. | |||
| [RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Authentication", RFC 7235, June 2014. | Protocol (HTTP/1.1): Authentication", RFC 7235, June 2014. | |||
| [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] | ||||
| Friedl, S., Popov, A., Langley, A., and E. Stephan, | ||||
| "Transport Layer Security (TLS) Application-Layer Protocol | ||||
| Negotiation Extension", RFC 7301, July 2014. | ||||
| [TLS-ECDHE] | ||||
| Rescorla, E., "TLS Elliptic Curve Cipher Suites with SHA- | ||||
| 256/384 and AES Galois Counter Mode (GCM)", RFC 5289, | ||||
| 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. | |||
| [TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | ||||
| "Transport Layer Security (TLS) Application Layer Protocol | ||||
| Negotiation Extension", draft-ietf-tls-applayerprotoneg-05 | ||||
| (work in progress), March 2014. | ||||
| 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-01 (work | |||
| in progress), April 2014. | in progress), April 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, <http://breachattack.com/ | CRIME Attack", July 2013, | |||
| resources/ | <http://breachattack.com/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-20140204, Febuary 2014, | |||
| <http://www.w3.org/TR/2014/CR-html5-20140204/>. | <http://www.w3.org/TR/2014/CR-html5-20140204/>. | |||
| Latest version available at [5]. | Latest version available at [5]. | |||
| [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP Extensions | [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP Extensions | |||
| for High Performance", RFC 1323, May 1992. | for High Performance", RFC 1323, May 1992. | |||
| [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D. | ||||
| Jensen, "HTTP Extensions for Distributed Authoring -- | ||||
| WEBDAV", RFC 2518, February 1999. | ||||
| [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. | |||
| skipping to change at page 78, line 5 ¶ | skipping to change at page 79, line 5 ¶ | |||
| 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 (to be removed by RFC Editor before publication) | Appendix A. Change Log | |||
| A.1. Since draft-ietf-httpbis-http2-12 | This section is to be removed by RFC Editor before publication. | |||
| A.1. Since draft-ietf-httpbis-http2-13 | ||||
| Pseudo-header fields are now required to appear strictly before | ||||
| regular ones. | ||||
| Restored 1xx series status codes, except 101. | ||||
| Changed frame length field 24-bits. Expanded frame header to 9 | ||||
| octets. Added a setting to limit the damage. | ||||
| Added a setting to advise peers of header set size limits. | ||||
| Removed segments. | ||||
| Made non-semantic-bearing HEADERS frames illegal in the HTTP mapping. | ||||
| A.2. 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.2. Since draft-ietf-httpbis-http2-11 | A.3. 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.3. Since draft-ietf-httpbis-http2-10 | A.4. 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.4. Since draft-ietf-httpbis-http2-09 | A.5. 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 79, line 30 ¶ | skipping to change at page 80, line 48 ¶ | |||
| 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.5. Since draft-ietf-httpbis-http2-08 | A.6. 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.6. Since draft-ietf-httpbis-http2-07 | A.7. Since draft-ietf-httpbis-http2-07 | |||
| Marked draft for implementation. | Marked draft for implementation. | |||
| A.7. Since draft-ietf-httpbis-http2-06 | A.8. 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.8. Since draft-ietf-httpbis-http2-05 | A.9. 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.9. Since draft-ietf-httpbis-http2-04 | A.10. 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 80, line 43 ¶ | skipping to change at page 82, line 12 ¶ | |||
| 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.10. Since draft-ietf-httpbis-http2-03 | A.11. 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.11. Since draft-ietf-httpbis-http2-02 | A.12. 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.12. Since draft-ietf-httpbis-http2-01 | A.13. 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 82, line 7 ¶ | skipping to change at page 83, line 23 ¶ | |||
| 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.13. Since draft-ietf-httpbis-http2-00 | A.14. 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.14. Since draft-mbelshe-httpbis-spdy-00 | A.15. 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. 114 change blocks. | ||||
| 366 lines changed or deleted | 396 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/ | ||||