| draft-ietf-quic-http-23.txt | draft-ietf-quic-http-24.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track September 12, 2019 | Intended status: Standards Track November 04, 2019 | |||
| Expires: March 15, 2020 | Expires: May 7, 2020 | |||
| Hypertext Transfer Protocol Version 3 (HTTP/3) | Hypertext Transfer Protocol Version 3 (HTTP/3) | |||
| draft-ietf-quic-http-23 | draft-ietf-quic-http-24 | |||
| Abstract | Abstract | |||
| The QUIC transport protocol has several features that are desirable | The QUIC transport protocol has several features that are desirable | |||
| in a transport for HTTP, such as stream multiplexing, per-stream flow | in a transport for HTTP, such as stream multiplexing, per-stream flow | |||
| control, and low-latency connection establishment. This document | control, and low-latency connection establishment. This document | |||
| describes a mapping of HTTP semantics over QUIC. This document also | describes a mapping of HTTP semantics over QUIC. This document also | |||
| identifies HTTP/2 features that are subsumed by QUIC, and describes | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| how HTTP/2 extensions can be ported to HTTP/3. | how HTTP/2 extensions can be ported to HTTP/3. | |||
| skipping to change at page 1, line 45 ¶ | skipping to change at page 1, line 45 ¶ | |||
| 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 https://datatracker.ietf.org/drafts/current/. | Drafts is at https://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 March 15, 2020. | This Internet-Draft will expire on May 7, 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 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 | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://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 31 ¶ | skipping to change at page 2, line 31 ¶ | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4 | 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4 | |||
| 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 5 | 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 5 | |||
| 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 5 | 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 5 | |||
| 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | |||
| 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | |||
| 3. Connection Setup and Management . . . . . . . . . . . . . . . 8 | 3. Connection Setup and Management . . . . . . . . . . . . . . . 8 | |||
| 3.1. Draft Version Identification . . . . . . . . . . . . . . 8 | 3.1. Draft Version Identification . . . . . . . . . . . . . . 8 | |||
| 3.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 8 | 3.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 8 | |||
| 3.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 9 | 3.3. Connection Establishment . . . . . . . . . . . . . . . . 9 | |||
| 3.3. Connection Establishment . . . . . . . . . . . . . . . . 10 | 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 10 | 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 10 | |||
| 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 11 | 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 10 | |||
| 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 11 | ||||
| 4.1.1. Header Formatting and Compression . . . . . . . . . . 12 | 4.1.1. Header Formatting and Compression . . . . . . . . . . 12 | |||
| 4.1.2. Request Cancellation and Rejection . . . . . . . . . 13 | 4.1.2. Request Cancellation and Rejection . . . . . . . . . 13 | |||
| 4.1.3. Malformed Requests and Responses . . . . . . . . . . 14 | 4.1.3. Malformed Requests and Responses . . . . . . . . . . 13 | |||
| 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 15 | 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 16 | 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 16 | 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 17 | 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 18 | 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 18 | 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.3. Immediate Application Closure . . . . . . . . . . . . . . 19 | 5.3. Immediate Application Closure . . . . . . . . . . . . . . 19 | |||
| 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 20 | 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 19 | |||
| 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 20 | 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 19 | |||
| 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 20 | 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 20 | |||
| 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 21 | 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 20 | |||
| 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 22 | 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 23 | 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 22 | |||
| 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 23 | 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 23 | |||
| 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 23 | ||||
| 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 24 | ||||
| 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 24 | 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 25 | 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 25 | 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 26 | 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 26 | 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 27 | 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 30 | 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 31 | 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 31 | 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 7.2.8. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 32 | 7.2.8. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 32 | |||
| 7.2.9. Reserved Frame Types . . . . . . . . . . . . . . . . 33 | 7.2.9. Reserved Frame Types . . . . . . . . . . . . . . . . 33 | |||
| 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 33 | 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 34 | 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 34 | |||
| 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 35 | 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 35 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 36 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 36 | |||
| 10.1. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 36 | 10.1. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 36 | |||
| 10.2. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 36 | 10.2. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 10.3. Early Data . . . . . . . . . . . . . . . . . . . . . . . 36 | 10.3. Early Data . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 10.4. Migration . . . . . . . . . . . . . . . . . . . . . . . 37 | 10.4. Migration . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 11.1. Registration of HTTP/3 Identification String . . . . . . 37 | 11.1. Registration of HTTP/3 Identification String . . . . . . 37 | |||
| 11.2. Registration of QUIC Version Hint Alt-Svc Parameter . . 37 | 11.2. Frame Types . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 11.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . 37 | 11.3. Settings Parameters . . . . . . . . . . . . . . . . . . 39 | |||
| 11.4. Settings Parameters . . . . . . . . . . . . . . . . . . 39 | 11.4. Error Codes . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 11.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 40 | 11.5. Stream Types . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 11.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 42 | ||||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . 43 | 12.1. Normative References . . . . . . . . . . . . . . . . . . 43 | |||
| 12.2. Informative References . . . . . . . . . . . . . . . . . 44 | 12.2. Informative References . . . . . . . . . . . . . . . . . 45 | |||
| 12.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 45 | 12.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
| Appendix A. Considerations for Transitioning from HTTP/2 . . . . 45 | Appendix A. Considerations for Transitioning from HTTP/2 . . . . 45 | |||
| A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 45 | A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 45 | A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 46 | |||
| A.2.1. Prioritization Differences . . . . . . . . . . . . . 46 | A.2.1. Prioritization Differences . . . . . . . . . . . . . 47 | |||
| A.2.2. Header Compression Differences . . . . . . . . . . . 46 | A.2.2. Header Compression Differences . . . . . . . . . . . 47 | |||
| A.2.3. Guidance for New Frame Type Definitions . . . . . . . 47 | A.2.3. Guidance for New Frame Type Definitions . . . . . . . 48 | |||
| A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 47 | A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 48 | |||
| A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 48 | A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 49 | |||
| A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 49 | A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 50 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 50 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 51 | |||
| B.1. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 50 | B.1. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 51 | |||
| B.2. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 51 | B.2. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 51 | |||
| B.3. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 51 | B.3. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 52 | |||
| B.4. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 52 | B.4. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 52 | |||
| B.5. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 52 | B.5. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 53 | |||
| B.6. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 53 | B.6. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 53 | |||
| B.7. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 53 | B.7. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 54 | |||
| B.8. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 53 | B.8. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 54 | |||
| B.9. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 53 | B.9. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 54 | |||
| B.10. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 54 | B.10. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 55 | |||
| B.11. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 54 | B.11. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 55 | |||
| B.12. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 54 | B.12. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 55 | |||
| B.13. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 54 | B.13. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 56 | |||
| B.14. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 54 | B.14. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 56 | |||
| B.15. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 55 | B.15. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 56 | |||
| B.16. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 55 | B.16. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 56 | |||
| B.17. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 55 | B.17. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 56 | |||
| B.18. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 55 | B.18. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 56 | |||
| B.19. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 55 | B.19. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 56 | |||
| B.20. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 56 | B.20. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 57 | |||
| B.21. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 56 | B.21. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 57 | |||
| B.22. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 56 | B.22. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 57 | |||
| B.23. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 56 | B.23. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 57 | |||
| B.24. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 57 | B.24. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 58 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 57 | B.25. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 58 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 57 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 58 | ||||
| 1. Introduction | 1. Introduction | |||
| HTTP semantics are used for a broad range of services on the | HTTP semantics are used for a broad range of services on the | |||
| Internet. These semantics have commonly been used with two different | Internet. These semantics have commonly been used with two different | |||
| TCP mappings, HTTP/1.1 and HTTP/2. HTTP/3 supports the same | TCP mappings, HTTP/1.1 and HTTP/2. HTTP/3 supports the same | |||
| semantics over a new transport protocol, QUIC. | semantics over a new transport protocol, QUIC. | |||
| 1.1. Prior versions of HTTP | 1.1. Prior versions of HTTP | |||
| skipping to change at page 7, line 30 ¶ | skipping to change at page 7, line 30 ¶ | |||
| connection: A transport-layer connection between two endpoints, | connection: A transport-layer connection between two endpoints, | |||
| using QUIC as the transport protocol. | using QUIC as the transport protocol. | |||
| connection error: An error that affects the entire HTTP/3 | connection error: An error that affects the entire HTTP/3 | |||
| connection. | connection. | |||
| endpoint: Either the client or server of the connection. | endpoint: Either the client or server of the connection. | |||
| frame: The smallest unit of communication on a stream in HTTP/3, | frame: The smallest unit of communication on a stream in HTTP/3, | |||
| consisting of a header and a variable-length sequence of octets | consisting of a header and a variable-length sequence of bytes | |||
| structured according to the frame type. Protocol elements called | structured according to the frame type. Protocol elements called | |||
| "frames" exist in both this document and [QUIC-TRANSPORT]. Where | "frames" exist in both this document and [QUIC-TRANSPORT]. Where | |||
| frames from [QUIC-TRANSPORT] are referenced, the frame name will | frames from [QUIC-TRANSPORT] are referenced, the frame name will | |||
| be prefaced with "QUIC." For example, "QUIC CONNECTION_CLOSE | be prefaced with "QUIC." For example, "QUIC CONNECTION_CLOSE | |||
| frames." References without this preface refer to frames defined | frames." References without this preface refer to frames defined | |||
| in Section 7.2. | in Section 7.2. | |||
| peer: An endpoint. When discussing a particular endpoint, "peer" | peer: An endpoint. When discussing a particular endpoint, "peer" | |||
| refers to the endpoint that is remote to the primary subject of | refers to the endpoint that is remote to the primary subject of | |||
| discussion. | discussion. | |||
| skipping to change at page 9, line 15 ¶ | skipping to change at page 9, line 15 ¶ | |||
| described in this document. | described in this document. | |||
| Connectivity problems (e.g. firewall blocking UDP) can result in QUIC | Connectivity problems (e.g. firewall blocking UDP) can result in QUIC | |||
| connection establishment failure, in which case the client SHOULD | connection establishment failure, in which case the client SHOULD | |||
| continue using the existing connection or try another alternative | continue using the existing connection or try another alternative | |||
| endpoint offered by the origin. | endpoint offered by the origin. | |||
| Servers MAY serve HTTP/3 on any UDP port, since an alternative always | Servers MAY serve HTTP/3 on any UDP port, since an alternative always | |||
| includes an explicit port. | includes an explicit port. | |||
| 3.2.1. QUIC Version Hints | ||||
| This document defines the "quic" parameter for Alt-Svc, which MAY be | ||||
| used to provide version-negotiation hints to HTTP/3 clients. QUIC | ||||
| versions are four-byte sequences with no additional constraints on | ||||
| format. Leading zeros SHOULD be omitted for brevity. | ||||
| Syntax: | ||||
| quic = DQUOTE version-number [ "," version-number ] * DQUOTE | ||||
| version-number = 1*8HEXDIG; hex-encoded QUIC version | ||||
| Where multiple versions are listed, the order of the values reflects | ||||
| the server's preference (with the first value being the most | ||||
| preferred version). Reserved versions MAY be listed, but unreserved | ||||
| versions which are not supported by the alternative SHOULD NOT be | ||||
| present in the list. Origins MAY omit supported versions for any | ||||
| reason. | ||||
| Clients MUST ignore any included versions which they do not support. | ||||
| The "quic" parameter MUST NOT occur more than once; clients SHOULD | ||||
| process only the first occurrence. | ||||
| For example, suppose a server supported both version 0x00000001 and | ||||
| the version rendered in ASCII as "Q034". If it also opted to include | ||||
| the reserved version (from Section 15 of [QUIC-TRANSPORT]) | ||||
| 0x1abadaba, it could specify the following header field: | ||||
| Alt-Svc: h3=":49288";quic="1,1abadaba,51303334" | ||||
| A client acting on this header field would drop the reserved version | ||||
| (not supported), then attempt to connect to the alternative using the | ||||
| first version in the list which it does support, if any. | ||||
| 3.3. Connection Establishment | 3.3. Connection Establishment | |||
| HTTP/3 relies on QUIC as the underlying transport. The QUIC version | HTTP/3 relies on QUIC as the underlying transport. The QUIC version | |||
| being used MUST use TLS version 1.3 or greater as its handshake | being used MUST use TLS version 1.3 or greater as its handshake | |||
| protocol. HTTP/3 clients MUST indicate the target domain name during | protocol. HTTP/3 clients MUST indicate the target domain name during | |||
| the TLS handshake. This may be done using the Server Name Indication | the TLS handshake. This may be done using the Server Name Indication | |||
| (SNI) [RFC6066] extension to TLS or using some other mechanism. | (SNI) [RFC6066] extension to TLS or using some other mechanism. | |||
| QUIC connections are established as described in [QUIC-TRANSPORT]. | QUIC connections are established as described in [QUIC-TRANSPORT]. | |||
| During connection establishment, HTTP/3 support is indicated by | During connection establishment, HTTP/3 support is indicated by | |||
| skipping to change at page 12, line 7 ¶ | skipping to change at page 11, line 17 ¶ | |||
| The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | |||
| MUST NOT be used. | MUST NOT be used. | |||
| A response MAY consist of multiple messages when and only when one or | A response MAY consist of multiple messages when and only when one or | |||
| more informational responses (1xx; see [RFC7231], Section 6.2) | more informational responses (1xx; see [RFC7231], Section 6.2) | |||
| precede a final response to the same request. Non-final responses do | precede a final response to the same request. Non-final responses do | |||
| not contain a payload body or trailers. | not contain a payload body or trailers. | |||
| If an endpoint receives an invalid sequence of frames on either a | If an endpoint receives an invalid sequence of frames on either a | |||
| request or a push stream, it MUST respond with a connection error of | request or a push stream, it MUST respond with a connection error of | |||
| type HTTP_FRAME_UNEXPECTED (Section 8). In particular, a DATA frame | type H3_FRAME_UNEXPECTED (Section 8). In particular, a DATA frame | |||
| before any HEADERS frame, or a HEADERS or DATA frame after the | before any HEADERS frame, or a HEADERS or DATA frame after the | |||
| trailing HEADERS frame is considered invalid. | trailing HEADERS frame is considered invalid. | |||
| An HTTP request/response exchange fully consumes a bidirectional QUIC | An HTTP request/response exchange fully consumes a bidirectional QUIC | |||
| stream. After sending a request, a client MUST close the stream for | stream. After sending a request, a client MUST close the stream for | |||
| sending. Unless using the CONNECT method (see Section 4.2), clients | sending. Unless using the CONNECT method (see Section 4.2), clients | |||
| MUST NOT make stream closure dependent on receiving a response to | MUST NOT make stream closure dependent on receiving a response to | |||
| their request. After sending a final response, the server MUST close | their request. After sending a final response, the server MUST close | |||
| the stream for sending. At this point, the QUIC stream is fully | the stream for sending. At this point, the QUIC stream is fully | |||
| closed. | closed. | |||
| When a stream is closed, this indicates the end of an HTTP message. | When a stream is closed, this indicates the end of an HTTP message. | |||
| Because some messages are large or unbounded, endpoints SHOULD begin | Because some messages are large or unbounded, endpoints SHOULD begin | |||
| processing partial HTTP messages once enough of the message has been | processing partial HTTP messages once enough of the message has been | |||
| received to make progress. If a client stream terminates without | received to make progress. If a client stream terminates without | |||
| enough of the HTTP message to provide a complete response, the server | enough of the HTTP message to provide a complete response, the server | |||
| SHOULD abort its response with the error code | SHOULD abort its response with the error code H3_REQUEST_INCOMPLETE. | |||
| HTTP_REQUEST_INCOMPLETE. | ||||
| A server can send a complete response prior to the client sending an | A server can send a complete response prior to the client sending an | |||
| entire request if the response does not depend on any portion of the | entire request if the response does not depend on any portion of the | |||
| request that has not been sent and received. When this is true, a | request that has not been sent and received. When the server does | |||
| server MAY abort reading the request stream with error code | not need to receive the remainder of the request, it MAY abort | |||
| HTTP_EARLY_RESPONSE, send a complete response, and cleanly close the | reading the request stream with error code H3_EARLY_RESPONSE, send a | |||
| sending part of the stream. Clients MUST NOT discard complete | complete response, and cleanly close the sending part of the stream. | |||
| responses as a result of having their request terminated abruptly, | Clients MUST NOT discard complete responses as a result of having | |||
| though clients can always discard responses at their discretion for | their request terminated abruptly, though clients can always discard | |||
| other reasons. | responses at their discretion for other reasons. If the server sends | |||
| a partial or complete response but does not abort reading, clients | ||||
| SHOULD continue sending the body of the request and close the stream | ||||
| normally. | ||||
| 4.1.1. Header Formatting and Compression | 4.1.1. Header Formatting and Compression | |||
| HTTP message headers carry information as a series of key-value | HTTP message headers carry information as a series of key-value | |||
| pairs, called header fields. For a listing of registered HTTP header | pairs, called header fields. For a listing of registered HTTP header | |||
| fields, see the "Message Header Field" registry maintained at | fields, see the "Message Header Field" registry maintained at | |||
| https://www.iana.org/assignments/message-headers [4]. | https://www.iana.org/assignments/message-headers [4]. | |||
| Just as in previous versions of HTTP, header field names are strings | Just as in previous versions of HTTP, header field names are strings | |||
| of ASCII characters that are compared in a case-insensitive fashion. | of ASCII characters that are compared in a case-insensitive fashion. | |||
| skipping to change at page 13, line 11 ¶ | skipping to change at page 12, line 27 ¶ | |||
| to lowercase prior to their encoding. A request or response | to lowercase prior to their encoding. A request or response | |||
| containing uppercase header field names MUST be treated as malformed | containing uppercase header field names MUST be treated as malformed | |||
| (Section 4.1.3). | (Section 4.1.3). | |||
| As in HTTP/2, HTTP/3 uses special pseudo-header fields beginning with | As in HTTP/2, HTTP/3 uses special pseudo-header fields beginning with | |||
| the ':' character (ASCII 0x3a) to convey the target URI, the method | the ':' character (ASCII 0x3a) to convey the target URI, the method | |||
| of the request, and the status code for the response. These pseudo- | of the request, and the status code for the response. These pseudo- | |||
| header fields are defined in Section 8.1.2.3 and 8.1.2.4 of [HTTP2]. | header fields are defined in Section 8.1.2.3 and 8.1.2.4 of [HTTP2]. | |||
| Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT | Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT | |||
| generate pseudo-header fields other than those defined in [HTTP2]. | generate pseudo-header fields other than those defined in [HTTP2]. | |||
| The restrictions on the use of pseudo-header fields in | The restrictions on the use of pseudo-header fields in Section 8.1.2 | |||
| Section 8.1.2.1 of [HTTP2] also apply to HTTP/3. | of [HTTP2] also apply to HTTP/3. Messages which are considered | |||
| malformed under these restrictions are handled as described in | ||||
| Section 4.1.3. | ||||
| HTTP/3 uses QPACK header compression as described in [QPACK], a | HTTP/3 uses QPACK header compression as described in [QPACK], a | |||
| variation of HPACK which allows the flexibility to avoid header- | variation of HPACK which allows the flexibility to avoid header- | |||
| compression-induced head-of-line blocking. See that document for | compression-induced head-of-line blocking. See that document for | |||
| additional details. | additional details. | |||
| To allow for better compression efficiency, the cookie header field | To allow for better compression efficiency, the cookie header field | |||
| [RFC6265] MAY be split into separate header fields, each with one or | [RFC6265] MAY be split into separate header fields, each with one or | |||
| more cookie-pairs, before compression. If a decompressed header list | more cookie-pairs, before compression. If a decompressed header list | |||
| contains multiple cookie header fields, these MUST be concatenated | contains multiple cookie header fields, these MUST be concatenated | |||
| skipping to change at page 13, line 47 ¶ | skipping to change at page 13, line 16 ¶ | |||
| be conveyed as a number of bytes in the | be conveyed as a number of bytes in the | |||
| "SETTINGS_MAX_HEADER_LIST_SIZE" parameter. An implementation which | "SETTINGS_MAX_HEADER_LIST_SIZE" parameter. An implementation which | |||
| has received this parameter SHOULD NOT send an HTTP message header | has received this parameter SHOULD NOT send an HTTP message header | |||
| which exceeds the indicated size, as the peer will likely refuse to | which exceeds the indicated size, as the peer will likely refuse to | |||
| process it. However, because this limit is applied at each hop, | process it. However, because this limit is applied at each hop, | |||
| messages below this limit are not guaranteed to be accepted. | messages below this limit are not guaranteed to be accepted. | |||
| 4.1.2. Request Cancellation and Rejection | 4.1.2. Request Cancellation and Rejection | |||
| Clients can cancel requests by resetting and aborting the request | Clients can cancel requests by resetting and aborting the request | |||
| stream with an error code of HTTP_REQUEST_CANCELLED (Section 8.1). | stream with an error code of H3_REQUEST_CANCELLED (Section 8.1). | |||
| When the client aborts reading a response, it indicates that this | When the client aborts reading a response, it indicates that this | |||
| response is no longer of interest. Implementations SHOULD cancel | response is no longer of interest. Implementations SHOULD cancel | |||
| requests by abruptly terminating any directions of a stream that are | requests by abruptly terminating any directions of a stream that are | |||
| still open. | still open. | |||
| When the server rejects a request without performing any application | When the server rejects a request without performing any application | |||
| processing, it SHOULD abort its response stream with the error code | processing, it SHOULD abort its response stream with the error code | |||
| HTTP_REQUEST_REJECTED. In this context, "processed" means that some | H3_REQUEST_REJECTED. In this context, "processed" means that some | |||
| data from the stream was passed to some higher layer of software that | data from the stream was passed to some higher layer of software that | |||
| might have taken some action as a result. The client can treat | might have taken some action as a result. The client can treat | |||
| requests rejected by the server as though they had never been sent at | requests rejected by the server as though they had never been sent at | |||
| all, thereby allowing them to be retried later on a new connection. | all, thereby allowing them to be retried later on a new connection. | |||
| Servers MUST NOT use the HTTP_REQUEST_REJECTED error code for | Servers MUST NOT use the H3_REQUEST_REJECTED error code for requests | |||
| requests which were partially or fully processed. When a server | which were partially or fully processed. When a server abandons a | |||
| abandons a response after partial processing, it SHOULD abort its | response after partial processing, it SHOULD abort its response | |||
| response stream with the error code HTTP_REQUEST_CANCELLED. | stream with the error code H3_REQUEST_CANCELLED. | |||
| When a client resets a request with the error code | When a client resets a request with the error code | |||
| HTTP_REQUEST_CANCELLED, a server MAY abruptly terminate the response | H3_REQUEST_CANCELLED, a server MAY abruptly terminate the response | |||
| using the error code HTTP_REQUEST_REJECTED if no processing was | using the error code H3_REQUEST_REJECTED if no processing was | |||
| performed. Clients MUST NOT use the HTTP_REQUEST_REJECTED error | performed. Clients MUST NOT use the H3_REQUEST_REJECTED error code, | |||
| code, except when a server has requested closure of the request | except when a server has requested closure of the request stream with | |||
| stream with this error code. | this error code. | |||
| If a stream is cancelled after receiving a complete response, the | If a stream is cancelled after receiving a complete response, the | |||
| client MAY ignore the cancellation and use the response. However, if | client MAY ignore the cancellation and use the response. However, if | |||
| a stream is cancelled after receiving a partial response, the | a stream is cancelled after receiving a partial response, the | |||
| response SHOULD NOT be used. Automatically retrying such requests is | response SHOULD NOT be used. Automatically retrying such requests is | |||
| not possible, unless this is otherwise permitted (e.g., idempotent | not possible, unless this is otherwise permitted (e.g., idempotent | |||
| actions like GET, PUT, or DELETE). | actions like GET, PUT, or DELETE). | |||
| 4.1.3. Malformed Requests and Responses | 4.1.3. Malformed Requests and Responses | |||
| skipping to change at page 14, line 50 ¶ | skipping to change at page 14, line 19 ¶ | |||
| 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. | |||
| A response that is defined to have no payload, as described in | A response that is defined to have no payload, as described in | |||
| Section 3.3.2 of [RFC7230] can have a non-zero content-length header | Section 3.3.2 of [RFC7230] can have a non-zero content-length header | |||
| field, even though no content is included in DATA frames. | field, even though no content is included in DATA frames. | |||
| Intermediaries that process HTTP requests or responses (i.e., any | Intermediaries that process HTTP requests or responses (i.e., any | |||
| intermediary not acting as a tunnel) MUST NOT forward a malformed | intermediary not acting as a tunnel) MUST NOT forward a malformed | |||
| request or response. Malformed requests or responses that are | request or response. Malformed requests or responses that are | |||
| detected MUST be treated as a stream error (Section 8) of type | detected MUST be treated as a stream error (Section 8) of type | |||
| HTTP_GENERAL_PROTOCOL_ERROR. | H3_GENERAL_PROTOCOL_ERROR. | |||
| For malformed requests, a server MAY send an HTTP response prior to | For malformed requests, a server MAY send an HTTP response prior to | |||
| closing or resetting the stream. Clients MUST NOT accept a malformed | closing or resetting the stream. Clients MUST NOT accept a malformed | |||
| response. Note that these requirements are intended to protect | response. Note that these requirements are intended to protect | |||
| against several types of common attacks against HTTP; they are | against several types of common attacks against HTTP; they are | |||
| deliberately strict because being permissive can expose | deliberately strict because being permissive can expose | |||
| implementations to these vulnerabilities. | implementations to these vulnerabilities. | |||
| 4.2. The CONNECT Method | 4.2. The CONNECT Method | |||
| skipping to change at page 15, line 45 ¶ | skipping to change at page 15, line 13 ¶ | |||
| the TCP connection. Any DATA frame sent by the client is transmitted | the TCP connection. Any DATA frame sent by the client is transmitted | |||
| by the proxy to the TCP server; data received from the TCP server is | by the proxy to the TCP server; data received from the TCP server is | |||
| packaged into DATA frames by the proxy. Note that the size and | packaged into DATA frames by the proxy. Note that the size and | |||
| number of TCP segments is not guaranteed to map predictably to the | number of TCP segments is not guaranteed to map predictably to the | |||
| size and number of HTTP DATA or QUIC STREAM frames. | size and number of HTTP DATA or QUIC STREAM frames. | |||
| Once the CONNECT method has completed, only DATA frames are permitted | Once the CONNECT method has completed, only DATA frames are permitted | |||
| to be sent on the stream. Extension frames MAY be used if | to be sent on the stream. Extension frames MAY be used if | |||
| specifically permitted by the definition of the extension. Receipt | specifically permitted by the definition of the extension. Receipt | |||
| of any other frame type MUST be treated as a connection error of type | of any other frame type MUST be treated as a connection error of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| The TCP connection can be closed by either peer. When the client | The TCP connection can be closed by either peer. When the client | |||
| ends the request stream (that is, the receive stream at the proxy | ends the request stream (that is, the receive stream at the proxy | |||
| enters the "Data Recvd" state), the proxy will set the FIN bit on its | enters the "Data Recvd" state), the proxy will set the FIN bit on its | |||
| connection to the TCP server. When the proxy receives a packet with | connection to the TCP server. When the proxy receives a packet with | |||
| the FIN bit set, it will terminate the send stream that it sends to | the FIN bit set, it will terminate the send stream that it sends to | |||
| the client. TCP connections which remain half-closed in a single | the client. TCP connections which remain half-closed in a single | |||
| direction are not invalid, but are often handled poorly by servers, | direction are not invalid, but are often handled poorly by servers, | |||
| so clients SHOULD NOT close a stream for sending while they still | so clients SHOULD NOT close a stream for sending while they still | |||
| expect to receive data from the target of the CONNECT. | expect to receive data from the target of the CONNECT. | |||
| A TCP connection error is signaled by abruptly terminating the | A TCP connection error is signaled by abruptly terminating the | |||
| stream. A proxy treats any error in the TCP connection, which | stream. A proxy treats any error in the TCP connection, which | |||
| includes receiving a TCP segment with the RST bit set, as a stream | includes receiving a TCP segment with the RST bit set, as a stream | |||
| error of type HTTP_CONNECT_ERROR (Section 8.1). Correspondingly, if | error of type H3_CONNECT_ERROR (Section 8.1). Correspondingly, if a | |||
| a proxy detects an error with the stream or the QUIC connection, it | proxy detects an error with the stream or the QUIC connection, it | |||
| MUST close the TCP connection. If the underlying TCP implementation | MUST close the TCP connection. If the underlying TCP implementation | |||
| permits it, the proxy SHOULD send a TCP segment with the RST bit set. | permits it, the proxy SHOULD send a TCP segment with the RST bit set. | |||
| 4.3. HTTP Upgrade | 4.3. HTTP Upgrade | |||
| HTTP/3 does not support the HTTP Upgrade mechanism ([RFC7230], | HTTP/3 does not support the HTTP Upgrade mechanism ([RFC7230], | |||
| Section 6.7) or 101 (Switching Protocols) informational status code | Section 6.7) or 101 (Switching Protocols) informational status code | |||
| ([RFC7231], Section 6.2.2). | ([RFC7231], Section 6.2.2). | |||
| 4.4. Server Push | 4.4. Server Push | |||
| skipping to change at page 16, line 44 ¶ | skipping to change at page 16, line 14 ¶ | |||
| frames (see Section 7.2.8), then included with the push stream which | frames (see Section 7.2.8), then included with the push stream which | |||
| ultimately fulfills those promises. | ultimately fulfills those promises. | |||
| Server push is only enabled on a connection when a client sends a | Server push is only enabled on a connection when a client sends a | |||
| MAX_PUSH_ID frame (see Section 7.2.7). A server cannot use server | MAX_PUSH_ID frame (see Section 7.2.7). A server cannot use server | |||
| push until it receives a MAX_PUSH_ID frame. A client sends | push until it receives a MAX_PUSH_ID frame. A client sends | |||
| additional MAX_PUSH_ID frames to control the number of pushes that a | additional MAX_PUSH_ID frames to control the number of pushes that a | |||
| server can promise. A server SHOULD use Push IDs sequentially, | server can promise. A server SHOULD use Push IDs sequentially, | |||
| starting at 0. A client MUST treat receipt of a push stream with a | starting at 0. A client MUST treat receipt of a push stream with a | |||
| Push ID that is greater than the maximum Push ID as a connection | Push ID that is greater than the maximum Push ID as a connection | |||
| error of type HTTP_ID_ERROR. | error of type H3_ID_ERROR. | |||
| The header of the request message is carried by a PUSH_PROMISE frame | The header of the request message is carried by a PUSH_PROMISE frame | |||
| (see Section 7.2.5) on the request stream which generated the push. | (see Section 7.2.5) on the request stream which generated the push. | |||
| This allows the server push to be associated with a client request. | This allows the server push to be associated with a client request. | |||
| Promised requests MUST conform to the requirements in Section 8.2 of | Promised requests MUST conform to the requirements in Section 8.2 of | |||
| [HTTP2]. | [HTTP2]. | |||
| The same server push can be associated with additional client | The same server push can be associated with additional client | |||
| requests using a DUPLICATE_PUSH frame (see Section 7.2.8). | requests using a DUPLICATE_PUSH frame (see Section 7.2.8). | |||
| skipping to change at page 17, line 39 ¶ | skipping to change at page 17, line 8 ¶ | |||
| already being pushed. When a client receives a new push stream with | already being pushed. When a client receives a new push stream with | |||
| an as-yet-unknown Push ID, both the associated client request and the | an as-yet-unknown Push ID, both the associated client request and the | |||
| pushed request headers are unknown. The client can buffer the stream | pushed request headers are unknown. The client can buffer the stream | |||
| data in expectation of the matching PUSH_PROMISE. The client can use | data in expectation of the matching PUSH_PROMISE. The client can use | |||
| stream flow control (see section 4.1 of [QUIC-TRANSPORT]) to limit | stream flow control (see section 4.1 of [QUIC-TRANSPORT]) to limit | |||
| the amount of data a server may commit to the pushed stream. | the amount of data a server may commit to the pushed stream. | |||
| If a promised server push is not needed by the client, the client | If a promised server push is not needed by the client, the client | |||
| SHOULD send a CANCEL_PUSH frame. If the push stream is already open | SHOULD send a CANCEL_PUSH frame. If the push stream is already open | |||
| or opens after sending the CANCEL_PUSH frame, the client can abort | or opens after sending the CANCEL_PUSH frame, the client can abort | |||
| reading the stream with an error code of HTTP_REQUEST_CANCELLED. | reading the stream with an error code of H3_REQUEST_CANCELLED. This | |||
| This asks the server not to transfer additional data and indicates | asks the server not to transfer additional data and indicates that it | |||
| that it will be discarded upon receipt. | will be discarded upon receipt. | |||
| 5. Connection Closure | 5. Connection Closure | |||
| Once established, an HTTP/3 connection can be used for many requests | Once established, an HTTP/3 connection can be used for many requests | |||
| and responses over time until the connection is closed. Connection | and responses over time until the connection is closed. Connection | |||
| closure can happen in any of several different ways. | closure can happen in any of several different ways. | |||
| 5.1. Idle Connections | 5.1. Idle Connections | |||
| Each QUIC endpoint declares an idle timeout during the handshake. If | Each QUIC endpoint declares an idle timeout during the handshake. If | |||
| skipping to change at page 19, line 39 ¶ | skipping to change at page 19, line 5 ¶ | |||
| NOT increase the MAX_STREAMS limit thereafter. This signals to the | NOT increase the MAX_STREAMS limit thereafter. This signals to the | |||
| client that a shutdown is imminent and that initiating further | client that a shutdown is imminent and that initiating further | |||
| requests is prohibited. After allowing time for any in-flight | requests is prohibited. After allowing time for any in-flight | |||
| requests (at least one round-trip time), the server MAY send another | requests (at least one round-trip time), the server MAY send another | |||
| GOAWAY frame with an updated last Stream ID. This ensures that a | GOAWAY frame with an updated last Stream ID. This ensures that a | |||
| connection can be cleanly shut down without losing requests. | connection can be cleanly shut down without losing requests. | |||
| Once all accepted requests have been processed, the server can permit | Once all accepted requests have been processed, the server can permit | |||
| the connection to become idle, or MAY initiate an immediate closure | the connection to become idle, or MAY initiate an immediate closure | |||
| of the connection. An endpoint that completes a graceful shutdown | of the connection. An endpoint that completes a graceful shutdown | |||
| SHOULD use the HTTP_NO_ERROR code when closing the connection. | SHOULD use the H3_NO_ERROR code when closing the connection. | |||
| If a client has consumed all available bidirectional stream IDs with | If a client has consumed all available bidirectional stream IDs with | |||
| requests, the server need not send a GOAWAY frame, since the client | requests, the server need not send a GOAWAY frame, since the client | |||
| is unable to make further requests. | is unable to make further requests. | |||
| 5.3. Immediate Application Closure | 5.3. Immediate Application Closure | |||
| An HTTP/3 implementation can immediately close the QUIC connection at | An HTTP/3 implementation can immediately close the QUIC connection at | |||
| any time. This results in sending a QUIC CONNECTION_CLOSE frame to | any time. This results in sending a QUIC CONNECTION_CLOSE frame to | |||
| the peer; the error code in this frame indicates to the peer why the | the peer; the error code in this frame indicates to the peer why the | |||
| skipping to change at page 20, line 50 ¶ | skipping to change at page 20, line 18 ¶ | |||
| maps to a particular HTTP transaction or connection context. | maps to a particular HTTP transaction or connection context. | |||
| 6.1. Bidirectional Streams | 6.1. Bidirectional Streams | |||
| All client-initiated bidirectional streams are used for HTTP requests | All client-initiated bidirectional streams are used for HTTP requests | |||
| and responses. A bidirectional stream ensures that the response can | and responses. A bidirectional stream ensures that the response can | |||
| be readily correlated with the request. This means that the client's | be readily correlated with the request. This means that the client's | |||
| first request occurs on QUIC stream 0, with subsequent requests on | first request occurs on QUIC stream 0, with subsequent requests on | |||
| stream 4, 8, and so on. In order to permit these streams to open, an | stream 4, 8, and so on. In order to permit these streams to open, an | |||
| HTTP/3 server SHOULD configure non-zero minimum values for the number | HTTP/3 server SHOULD configure non-zero minimum values for the number | |||
| of permitted streams and the initial stream flow control window. It | of permitted streams and the initial stream flow control window. So | |||
| is RECOMMENDED that at least 100 requests be permitted at a time, so | as to not unnecessarily limit parallelism, at least 100 requests | |||
| as to not unnecessarily limit parallelism. | SHOULD be permitted at a time. | |||
| HTTP/3 does not use server-initiated bidirectional streams, though an | HTTP/3 does not use server-initiated bidirectional streams, though an | |||
| extension could define a use for these streams. Clients MUST treat | extension could define a use for these streams. Clients MUST treat | |||
| receipt of a server-initiated bidirectional stream as a connection | receipt of a server-initiated bidirectional stream as a connection | |||
| error of type HTTP_STREAM_CREATION_ERROR unless such an extension has | error of type H3_STREAM_CREATION_ERROR unless such an extension has | |||
| been negotiated. | been negotiated. | |||
| 6.2. Unidirectional Streams | 6.2. Unidirectional Streams | |||
| Unidirectional streams, in either direction, are used for a range of | Unidirectional streams, in either direction, are used for a range of | |||
| purposes. The purpose is indicated by a stream type, which is sent | purposes. The purpose is indicated by a stream type, which is sent | |||
| as a variable-length integer at the start of the stream. The format | as a variable-length integer at the start of the stream. The format | |||
| and structure of data that follows this integer is determined by the | and structure of data that follows this integer is determined by the | |||
| stream type. | stream type. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream Type (i) ... | | Stream Type (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 1: Unidirectional Stream Header | Figure 1: Unidirectional Stream Header | |||
| Some stream types are reserved (Section 6.2.3). Two stream types are | Some stream types are reserved (Section 6.2.3). Two stream types are | |||
| defined in this document: control streams (Section 6.2.1) and push | defined in this document: control streams (Section 6.2.1) and push | |||
| streams (Section 6.2.2). Other stream types can be defined by | streams (Section 6.2.2). [QPACK] defines two additional stream | |||
| extensions to HTTP/3; see Section 9 for more details. | types. Other stream types can be defined by extensions to HTTP/3; | |||
| see Section 9 for more details. | ||||
| The performance of HTTP/3 connections in the early phase of their | The performance of HTTP/3 connections in the early phase of their | |||
| lifetime is sensitive to the creation and exchange of data on | lifetime is sensitive to the creation and exchange of data on | |||
| unidirectional streams. Endpoints that excessively restrict the | unidirectional streams. Endpoints that excessively restrict the | |||
| number of streams or the flow control window of these streams will | number of streams or the flow control window of these streams will | |||
| increase the chance that the remote peer reaches the limit early and | increase the chance that the remote peer reaches the limit early and | |||
| becomes blocked. In particular, implementations should consider that | becomes blocked. In particular, implementations should consider that | |||
| remote peers may wish to exercise reserved stream behavior | remote peers may wish to exercise reserved stream behavior | |||
| (Section 6.2.3) with some of the unidirectional streams they are | (Section 6.2.3) with some of the unidirectional streams they are | |||
| permitted to use. To avoid blocking, the transport parameters sent | permitted to use. To avoid blocking, the transport parameters sent | |||
| skipping to change at page 22, line 11 ¶ | skipping to change at page 21, line 29 ¶ | |||
| initial credits before creating the critical unidirectional streams. | initial credits before creating the critical unidirectional streams. | |||
| Endpoints SHOULD create the HTTP control stream as well as the | Endpoints SHOULD create the HTTP control stream as well as the | |||
| unidirectional streams required by mandatory extensions (such as the | unidirectional streams required by mandatory extensions (such as the | |||
| QPACK encoder and decoder streams) first, and then create additional | QPACK encoder and decoder streams) first, and then create additional | |||
| streams as allowed by their peer. | streams as allowed by their peer. | |||
| If the stream header indicates a stream type which is not supported | If the stream header indicates a stream type which is not supported | |||
| by the recipient, the remainder of the stream cannot be consumed as | by the recipient, the remainder of the stream cannot be consumed as | |||
| the semantics are unknown. Recipients of unknown stream types MAY | the semantics are unknown. Recipients of unknown stream types MAY | |||
| abort reading of the stream with an error code of | abort reading of the stream with an error code of | |||
| HTTP_STREAM_CREATION_ERROR, but MUST NOT consider such streams to be | H3_STREAM_CREATION_ERROR, but MUST NOT consider such streams to be a | |||
| a connection error of any kind. | connection error of any kind. | |||
| Implementations MAY send stream types before knowing whether the peer | Implementations MAY send stream types before knowing whether the peer | |||
| supports them. However, stream types which could modify the state or | supports them. However, stream types which could modify the state or | |||
| semantics of existing protocol components, including QPACK or other | semantics of existing protocol components, including QPACK or other | |||
| extensions, MUST NOT be sent until the peer is known to support them. | extensions, MUST NOT be sent until the peer is known to support them. | |||
| A sender can close or reset a unidirectional stream unless otherwise | A sender can close or reset a unidirectional stream unless otherwise | |||
| specified. A receiver MUST tolerate unidirectional streams being | specified. A receiver MUST tolerate unidirectional streams being | |||
| closed or reset prior to the reception of the unidirectional stream | closed or reset prior to the reception of the unidirectional stream | |||
| header. | header. | |||
| 6.2.1. Control Streams | 6.2.1. Control Streams | |||
| A control stream is indicated by a stream type of "0x00". Data on | A control stream is indicated by a stream type of "0x00". Data on | |||
| this stream consists of HTTP/3 frames, as defined in Section 7.2. | this stream consists of HTTP/3 frames, as defined in Section 7.2. | |||
| Each side MUST initiate a single control stream at the beginning of | Each side MUST initiate a single control stream at the beginning of | |||
| the connection and send its SETTINGS frame as the first frame on this | the connection and send its SETTINGS frame as the first frame on this | |||
| stream. If the first frame of the control stream is any other frame | stream. If the first frame of the control stream is any other frame | |||
| type, this MUST be treated as a connection error of type | type, this MUST be treated as a connection error of type | |||
| HTTP_MISSING_SETTINGS. Only one control stream per peer is | H3_MISSING_SETTINGS. Only one control stream per peer is permitted; | |||
| permitted; receipt of a second stream which claims to be a control | receipt of a second stream which claims to be a control stream MUST | |||
| stream MUST be treated as a connection error of type | be treated as a connection error of type H3_STREAM_CREATION_ERROR. | |||
| HTTP_STREAM_CREATION_ERROR. The sender MUST NOT close the control | The sender MUST NOT close the control stream, and the receiver MUST | |||
| stream, and the receiver MUST NOT request that the sender close the | NOT request that the sender close the control stream. If either | |||
| control stream. If either control stream is closed at any point, | control stream is closed at any point, this MUST be treated as a | |||
| this MUST be treated as a connection error of type | connection error of type H3_CLOSED_CRITICAL_STREAM. | |||
| HTTP_CLOSED_CRITICAL_STREAM. | ||||
| A pair of unidirectional streams is used rather than a single | A pair of unidirectional streams is used rather than a single | |||
| bidirectional stream. This allows either peer to send data as soon | bidirectional stream. This allows either peer to send data as soon | |||
| as it is able. Depending on whether 0-RTT is enabled on the | as it is able. Depending on whether 0-RTT is enabled on the | |||
| connection, either client or server might be able to send stream data | connection, either client or server might be able to send stream data | |||
| first after the cryptographic handshake completes. | first after the cryptographic handshake completes. | |||
| 6.2.2. Push Streams | 6.2.2. Push Streams | |||
| Server push is an optional feature introduced in HTTP/2 that allows a | Server push is an optional feature introduced in HTTP/2 that allows a | |||
| skipping to change at page 23, line 21 ¶ | skipping to change at page 22, line 33 ¶ | |||
| A push stream is indicated by a stream type of "0x01", followed by | A push stream is indicated by a stream type of "0x01", followed by | |||
| the Push ID of the promise that it fulfills, encoded as a variable- | the Push ID of the promise that it fulfills, encoded as a variable- | |||
| length integer. The remaining data on this stream consists of HTTP/3 | length integer. The remaining data on this stream consists of HTTP/3 | |||
| frames, as defined in Section 7.2, and fulfills a promised server | frames, as defined in Section 7.2, and fulfills a promised server | |||
| push by zero or more non-final HTTP responses followed by a single | push by zero or more non-final HTTP responses followed by a single | |||
| final HTTP response, as defined in Section 4.1. Server push and Push | final HTTP response, as defined in Section 4.1. Server push and Push | |||
| IDs are described in Section 4.4. | IDs are described in Section 4.4. | |||
| Only servers can push; if a server receives a client-initiated push | Only servers can push; if a server receives a client-initiated push | |||
| stream, this MUST be treated as a connection error of type | stream, this MUST be treated as a connection error of type | |||
| HTTP_STREAM_CREATION_ERROR. | H3_STREAM_CREATION_ERROR. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | 0x01 (i) ... | | 0x01 (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 2: Push Stream Header | Figure 2: Push Stream Header | |||
| Each Push ID MUST only be used once in a push stream header. If a | Each Push ID MUST only be used once in a push stream header. If a | |||
| push stream header includes a Push ID that was used in another push | push stream header includes a Push ID that was used in another push | |||
| stream header, the client MUST treat this as a connection error of | stream header, the client MUST treat this as a connection error of | |||
| type HTTP_ID_ERROR. | type H3_ID_ERROR. | |||
| 6.2.3. Reserved Stream Types | 6.2.3. Reserved Stream Types | |||
| Stream types of the format "0x1f * N + 0x21" for integer values of N | Stream types of the format "0x1f * N + 0x21" for integer values of N | |||
| are reserved to exercise the requirement that unknown types be | are reserved to exercise the requirement that unknown types be | |||
| ignored. These streams have no semantics, and can be sent when | ignored. These streams have no semantics, and can be sent when | |||
| application-layer padding is desired. They MAY also be sent on | application-layer padding is desired. They MAY also be sent on | |||
| connections where no data is currently being transferred. Endpoints | connections where no data is currently being transferred. Endpoints | |||
| MUST NOT consider these streams to have any meaning upon receipt. | MUST NOT consider these streams to have any meaning upon receipt. | |||
| skipping to change at page 24, line 14 ¶ | skipping to change at page 24, line 5 ¶ | |||
| 7. HTTP Framing Layer | 7. HTTP Framing Layer | |||
| HTTP frames are carried on QUIC streams, as described in Section 6. | HTTP frames are carried on QUIC streams, as described in Section 6. | |||
| HTTP/3 defines three stream types: control stream, request stream, | HTTP/3 defines three stream types: control stream, request stream, | |||
| and push stream. This section describes HTTP/3 frame formats and the | and push stream. This section describes HTTP/3 frame formats and the | |||
| streams types on which they are permitted; see Table 1 for an | streams types on which they are permitted; see Table 1 for an | |||
| overview. A comparison between HTTP/2 and HTTP/3 frames is provided | overview. A comparison between HTTP/2 and HTTP/3 frames is provided | |||
| in Appendix A.2. | in Appendix A.2. | |||
| +----------------+---------+----------+---------+-------------------+ | +----------------+------------+------------+-----------+------------+ | |||
| | Frame | Control | Request | Push | Section | | | Frame | Control | Request | Push | Section | | |||
| | | Stream | Stream | Stream | | | | | Stream | Stream | Stream | | | |||
| +----------------+---------+----------+---------+-------------------+ | +----------------+------------+------------+-----------+------------+ | |||
| | DATA | No | Yes | Yes | Section 7.2.1 | | | DATA | No | Yes | Yes | Section | | |||
| | | | | | | | | | | | | 7.2.1 | | |||
| | HEADERS | No | Yes | Yes | Section 7.2.2 | | | | | | | | | |||
| | | | | | | | | HEADERS | No | Yes | Yes | Section | | |||
| | CANCEL_PUSH | Yes | No | No | Section 7.2.3 | | | | | | | 7.2.2 | | |||
| | | | | | | | | | | | | | | |||
| | SETTINGS | Yes (1) | No | No | Section 7.2.4 | | | CANCEL_PUSH | Yes | No | No | Section | | |||
| | | | | | | | | | | | | 7.2.3 | | |||
| | PUSH_PROMISE | No | Yes | No | Section 7.2.5 | | | | | | | | | |||
| | | | | | | | | SETTINGS | Yes (1) | No | No | Section | | |||
| | GOAWAY | Yes | No | No | Section 7.2.6 | | | | | | | 7.2.4 | | |||
| | | | | | | | | | | | | | | |||
| | MAX_PUSH_ID | Yes | No | No | Section 7.2.7 | | | PUSH_PROMISE | No | Yes | No | Section | | |||
| | | | | | | | | | | | | 7.2.5 | | |||
| | DUPLICATE_PUSH | No | Yes | No | Section 7.2.8 | | | | | | | | | |||
| | | | | | | | | GOAWAY | Yes | No | No | Section | | |||
| | Reserved | Yes | Yes | Yes | {{frame-reserved} | | | | | | | 7.2.6 | | |||
| +----------------+---------+----------+---------+-------------------+ | | | | | | | | |||
| | MAX_PUSH_ID | Yes | No | No | Section | | ||||
| | | | | | 7.2.7 | | ||||
| | | | | | | | ||||
| | DUPLICATE_PUSH | No | Yes | No | Section | | ||||
| | | | | | 7.2.8 | | ||||
| | | | | | | | ||||
| | Reserved | Yes | Yes | Yes | Section | | ||||
| | | | | | 7.2.9 | | ||||
| +----------------+------------+------------+-----------+------------+ | ||||
| Table 1: HTTP/3 frames and stream type overview | Table 1: HTTP/3 frames and stream type overview | |||
| Certain frames can only occur as the first frame of a particular | Certain frames can only occur as the first frame of a particular | |||
| stream type; these are indicated in Table 1 with a (1). Specific | stream type; these are indicated in Table 1 with a (1). Specific | |||
| guidance is provided in the relevant section. | guidance is provided in the relevant section. | |||
| Note that, unlike QUIC frames, HTTP/3 frames can span multiple | Note that, unlike QUIC frames, HTTP/3 frames can span multiple | |||
| packets. | packets. | |||
| skipping to change at page 25, line 21 ¶ | skipping to change at page 25, line 21 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame Payload (*) ... | | Frame Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: HTTP/3 frame format | Figure 3: HTTP/3 frame format | |||
| A frame includes the following fields: | A frame includes the following fields: | |||
| Type: A variable-length integer that identifies the frame type. | Type: A variable-length integer that identifies the frame type. | |||
| Length: A variable-length integer that describes the length of the | Length: A variable-length integer that describes the length in bytes | |||
| Frame Payload. | of the Frame Payload. | |||
| Frame Payload: A payload, the semantics of which are determined by | Frame Payload: A payload, the semantics of which are determined by | |||
| the Type field. | the Type field. | |||
| Each frame's payload MUST contain exactly the fields identified in | Each frame's payload MUST contain exactly the fields identified in | |||
| its description. A frame payload that contains additional bytes | its description. A frame payload that contains additional bytes | |||
| after the identified fields or a frame payload that terminates before | after the identified fields or a frame payload that terminates before | |||
| the end of the identified fields MUST be treated as a connection | the end of the identified fields MUST be treated as a connection | |||
| error of type HTTP_FRAME_ERROR. | error of type H3_FRAME_ERROR. | |||
| When a stream terminates cleanly, if the last frame on the stream was | When a stream terminates cleanly, if the last frame on the stream was | |||
| truncated, this MUST be treated as a connection error (Section 8) of | truncated, this MUST be treated as a connection error (Section 8) of | |||
| type HTTP_FRAME_ERROR. Streams which terminate abruptly may be reset | type H3_FRAME_ERROR. Streams which terminate abruptly may be reset | |||
| at any point in a frame. | at any point in a frame. | |||
| 7.2. Frame Definitions | 7.2. Frame Definitions | |||
| 7.2.1. DATA | 7.2.1. DATA | |||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
| bytes associated with an HTTP request or response payload. | bytes associated with an HTTP request or response payload. | |||
| DATA frames MUST be associated with an HTTP request or response. If | DATA frames MUST be associated with an HTTP request or response. If | |||
| a DATA frame is received on a control stream, the recipient MUST | a DATA frame is received on a control stream, the recipient MUST | |||
| respond with a connection error (Section 8) of type | respond with a connection error (Section 8) of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Payload (*) ... | | Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 4: DATA frame payload | Figure 4: DATA frame payload | |||
| 7.2.2. HEADERS | 7.2.2. HEADERS | |||
| skipping to change at page 26, line 29 ¶ | skipping to change at page 26, line 29 ¶ | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: HEADERS frame payload | Figure 5: HEADERS frame payload | |||
| HEADERS frames can only be sent on request / push streams. If a | HEADERS frames can only be sent on request / push streams. If a | |||
| HEADERS frame is received on a control stream, the recipient MUST | HEADERS frame is received on a control stream, the recipient MUST | |||
| respond with a connection error (Section 8) of type | respond with a connection error (Section 8) of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| 7.2.3. CANCEL_PUSH | 7.2.3. CANCEL_PUSH | |||
| The CANCEL_PUSH frame (type=0x3) is used to request cancellation of a | The CANCEL_PUSH frame (type=0x3) is used to request cancellation of a | |||
| server push prior to the push stream being received. The CANCEL_PUSH | server push prior to the push stream being received. The CANCEL_PUSH | |||
| frame identifies a server push by Push ID (see Section 7.2.5), | frame identifies a server push by Push ID (see Section 7.2.5), | |||
| encoded as a variable-length integer. | encoded as a variable-length integer. | |||
| When a server receives this frame, it aborts sending the response for | When a client sends CANCEL_PUSH, it is indicating that it does not | |||
| the identified server push. If the server has not yet started to | wish to receive the promised resource. The server SHOULD abort | |||
| send the server push, it can use the receipt of a CANCEL_PUSH frame | sending the resource, but the mechanism to do so depends on the state | |||
| to avoid opening a push stream. If the push stream has been opened | of the corresponding push stream. If the server has not yet created | |||
| by the server, the server SHOULD abruptly terminate that stream. | a push stream, it does not create one. If the push stream is open, | |||
| the server SHOULD abruptly terminate that stream. If the push stream | ||||
| has already ended, the server MAY still abruptly terminate the stream | ||||
| or MAY take no action. | ||||
| A server can send the CANCEL_PUSH frame to indicate that it will not | When a server sends CANCEL_PUSH, it is indicating that it will not be | |||
| be fulfilling a promise prior to creation of a push stream. Once the | fulfilling a promise and has not created a push stream. The client | |||
| push stream has been created, sending CANCEL_PUSH has no effect on | should not expect the corresponding promise to be fulfilled. | |||
| the state of the push stream. The server SHOULD abruptly terminate | ||||
| the push stream instead. | Sending CANCEL_PUSH has no direct effect on the state of existing | |||
| push streams. A server SHOULD NOT send a CANCEL_PUSH when it has | ||||
| already created a corresponding push stream, and a client SHOULD NOT | ||||
| send a CANCEL_PUSH when it has already received a corresponding push | ||||
| stream. | ||||
| A CANCEL_PUSH frame is sent on the control stream. Receiving a | A CANCEL_PUSH frame is sent on the control stream. Receiving a | |||
| CANCEL_PUSH frame on a stream other than the control stream MUST be | CANCEL_PUSH frame on a stream other than the control stream MUST be | |||
| treated as a connection error of type HTTP_FRAME_UNEXPECTED. | treated as a connection error of type H3_FRAME_UNEXPECTED. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 6: CANCEL_PUSH frame payload | Figure 6: CANCEL_PUSH frame payload | |||
| The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | |||
| integer. The Push ID identifies the server push that is being | integer. The Push ID identifies the server push that is being | |||
| cancelled (see Section 7.2.5). | cancelled (see Section 7.2.5). If a CANCEL_PUSH frame is received | |||
| which references a Push ID greater than currently allowed on the | ||||
| connection, this MUST be treated as a connection error of type | ||||
| H3_ID_ERROR. | ||||
| If the client receives a CANCEL_PUSH frame, that frame might identify | If the client receives a CANCEL_PUSH frame, that frame might identify | |||
| a Push ID that has not yet been mentioned by a PUSH_PROMISE frame. | a Push ID that has not yet been mentioned by a PUSH_PROMISE frame due | |||
| to reordering. If a server receives a CANCEL_PUSH frame for a Push | ||||
| ID that has not yet been mentioned by a PUSH_PROMISE frame, this MUST | ||||
| be treated as a connection error of type H3_ID_ERROR. | ||||
| 7.2.4. SETTINGS | 7.2.4. SETTINGS | |||
| The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x4) conveys configuration parameters that | |||
| affect how endpoints communicate, such as preferences and constraints | affect how endpoints communicate, such as preferences and constraints | |||
| on peer behavior. Individually, a SETTINGS parameter can also be | on peer behavior. Individually, a SETTINGS parameter can also be | |||
| referred to as a "setting"; the identifier and value of each setting | referred to as a "setting"; the identifier and value of each setting | |||
| parameter can be referred to as a "setting identifier" and a "setting | parameter can be referred to as a "setting identifier" and a "setting | |||
| value". | value". | |||
| SETTINGS frames always apply to a connection, never a single stream. | SETTINGS frames always apply to a connection, never a single stream. | |||
| A SETTINGS frame MUST be sent as the first frame of each control | A SETTINGS frame MUST be sent as the first frame of each control | |||
| stream (see Section 6.2.1) by each peer, and MUST NOT be sent | stream (see Section 6.2.1) by each peer, and MUST NOT be sent | |||
| subsequently. If an endpoint receives a second SETTINGS frame on the | subsequently. If an endpoint receives a second SETTINGS frame on the | |||
| control stream, the endpoint MUST respond with a connection error of | control stream, the endpoint MUST respond with a connection error of | |||
| type HTTP_FRAME_UNEXPECTED. | type H3_FRAME_UNEXPECTED. | |||
| SETTINGS frames MUST NOT be sent on any stream other than the control | SETTINGS frames MUST NOT be sent on any stream other than the control | |||
| stream. If an endpoint receives a SETTINGS frame on a different | stream. If an endpoint receives a SETTINGS frame on a different | |||
| stream, the endpoint MUST respond with a connection error of type | stream, the endpoint MUST respond with a connection error of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| SETTINGS parameters are not negotiated; they describe characteristics | SETTINGS parameters are not negotiated; they describe characteristics | |||
| of the sending peer, which can be used by the receiving peer. | of the sending peer, which can be used by the receiving peer. | |||
| However, a negotiation can be implied by the use of SETTINGS - each | However, a negotiation can be implied by the use of SETTINGS - each | |||
| peer uses SETTINGS to advertise a set of supported values. The | peer uses SETTINGS to advertise a set of supported values. The | |||
| definition of the setting would describe how each peer combines the | definition of the setting would describe how each peer combines the | |||
| two sets to conclude which choice will be used. SETTINGS does not | two sets to conclude which choice will be used. SETTINGS does not | |||
| provide a mechanism to identify when the choice takes effect. | provide a mechanism to identify when the choice takes effect. | |||
| Different values for the same parameter can be advertised by each | Different values for the same parameter can be advertised by each | |||
| peer. For example, a client might be willing to consume a very large | peer. For example, a client might be willing to consume a very large | |||
| response header, while servers are more cautious about request size. | response header, while servers are more cautious about request size. | |||
| The same setting identifier MUST NOT occur more than once in the | The same setting identifier MUST NOT occur more than once in the | |||
| SETTINGS frame. A receiver MAY treat the presence of duplicate | SETTINGS frame. A receiver MAY treat the presence of duplicate | |||
| setting identifiers as a connection error of type | setting identifiers as a connection error of type H3_SETTINGS_ERROR. | |||
| HTTP_SETTINGS_ERROR. | ||||
| The payload of a SETTINGS frame consists of zero or more parameters. | The payload of a SETTINGS frame consists of zero or more parameters. | |||
| Each parameter consists of a setting identifier and a value, both | Each parameter consists of a setting identifier and a value, both | |||
| encoded as QUIC variable-length integers. | encoded as QUIC variable-length integers. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Identifier (i) ... | | Identifier (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 29, line 51 ¶ | skipping to change at page 30, line 16 ¶ | |||
| server cannot determine that the settings remembered by a client are | server cannot determine that the settings remembered by a client are | |||
| compatible with its current settings, it MUST NOT accept 0-RTT data. | compatible with its current settings, it MUST NOT accept 0-RTT data. | |||
| Remembered settings are compatible if a client complying with those | Remembered settings are compatible if a client complying with those | |||
| settings would not violate the server's current settings. | settings would not violate the server's current settings. | |||
| A server MAY accept 0-RTT and subsequently provide different settings | A server MAY accept 0-RTT and subsequently provide different settings | |||
| in its SETTINGS frame. If 0-RTT data is accepted by the server, its | in its SETTINGS frame. If 0-RTT data is accepted by the server, its | |||
| SETTINGS frame MUST NOT reduce any limits or alter any values that | SETTINGS frame MUST NOT reduce any limits or alter any values that | |||
| might be violated by the client with its 0-RTT data. The server MUST | might be violated by the client with its 0-RTT data. The server MUST | |||
| include all settings which differ from their default values. If a | include all settings which differ from their default values. If a | |||
| server accepts 0-RTT, but then sends a SETTINGS frame which reduces a | server accepts 0-RTT but then sends settings that are not compatible | |||
| setting the client understands or omits a value that was previously | with the previously specified settings, this MUST be treated as a | |||
| specified to have a non-default value, this MUST be treated as a | connection error of type H3_SETTINGS_ERROR. If a server accepts | |||
| connection error of type HTTP_SETTINGS_ERROR. | 0-RTT but then sends a SETTINGS frame that omits a setting value that | |||
| the client understands (apart from reserved setting identifiers) that | ||||
| was previously specified to have a non-default value, this MUST be | ||||
| treated as a connection error of type H3_SETTINGS_ERROR. | ||||
| 7.2.5. PUSH_PROMISE | 7.2.5. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x5) is used to carry a promised request | The PUSH_PROMISE frame (type=0x5) is used to carry a promised request | |||
| header set from server to client on a request stream, as in HTTP/2. | header set from server to client on a request stream, as in HTTP/2. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| skipping to change at page 30, line 35 ¶ | skipping to change at page 31, line 5 ¶ | |||
| operation. A Push ID is used in push stream headers | operation. A Push ID is used in push stream headers | |||
| (Section 4.4), CANCEL_PUSH frames (Section 7.2.3), and | (Section 4.4), CANCEL_PUSH frames (Section 7.2.3), and | |||
| DUPLICATE_PUSH frames (Section 7.2.8). | DUPLICATE_PUSH frames (Section 7.2.8). | |||
| Header Block: QPACK-compressed request header fields for the | Header Block: QPACK-compressed request header fields for the | |||
| promised response. See [QPACK] for more details. | promised response. See [QPACK] for more details. | |||
| A server MUST NOT use a Push ID that is larger than the client has | A server MUST NOT use a Push ID that is larger than the client has | |||
| provided in a MAX_PUSH_ID frame (Section 7.2.7). A client MUST treat | provided in a MAX_PUSH_ID frame (Section 7.2.7). A client MUST treat | |||
| receipt of a PUSH_PROMISE frame that contains a larger Push ID than | receipt of a PUSH_PROMISE frame that contains a larger Push ID than | |||
| the client has advertised as a connection error of HTTP_ID_ERROR. | the client has advertised as a connection error of H3_ID_ERROR. | |||
| A server MUST NOT use the same Push ID in multiple PUSH_PROMISE | A server MUST NOT use the same Push ID in multiple PUSH_PROMISE | |||
| frames. A client MUST treat receipt of a Push ID which has already | frames. A client MUST treat receipt of a Push ID which has already | |||
| been promised as a connection error of type HTTP_ID_ERROR. | been promised as a connection error of type H3_ID_ERROR. | |||
| If a PUSH_PROMISE frame is received on the control stream, the client | If a PUSH_PROMISE frame is received on the control stream, the client | |||
| MUST respond with a connection error (Section 8) of type | MUST respond with a connection error (Section 8) of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| A client MUST NOT send a PUSH_PROMISE frame. A server MUST treat the | A client MUST NOT send a PUSH_PROMISE frame. A server MUST treat the | |||
| receipt of a PUSH_PROMISE frame as a connection error of type | receipt of a PUSH_PROMISE frame as a connection error of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| See Section 4.4 for a description of the overall server push | See Section 4.4 for a description of the overall server push | |||
| mechanism. | mechanism. | |||
| 7.2.6. GOAWAY | 7.2.6. GOAWAY | |||
| The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | |||
| a connection by a server. GOAWAY allows a server to stop accepting | a connection by a server. GOAWAY allows a server to stop accepting | |||
| new requests while still finishing processing of previously received | new requests while still finishing processing of previously received | |||
| requests. This enables administrative actions, like server | requests. This enables administrative actions, like server | |||
| skipping to change at page 31, line 25 ¶ | skipping to change at page 31, line 42 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 9: GOAWAY frame payload | Figure 9: GOAWAY frame payload | |||
| The GOAWAY frame is always sent on the control stream. It carries a | The GOAWAY frame is always sent on the control stream. It carries a | |||
| QUIC Stream ID for a client-initiated bidirectional stream encoded as | QUIC Stream ID for a client-initiated bidirectional stream encoded as | |||
| a variable-length integer. A client MUST treat receipt of a GOAWAY | a variable-length integer. A client MUST treat receipt of a GOAWAY | |||
| frame containing a Stream ID of any other type as a connection error | frame containing a Stream ID of any other type as a connection error | |||
| of type HTTP_ID_ERROR. | of type H3_ID_ERROR. | |||
| Clients do not need to send GOAWAY to initiate a graceful shutdown; | Clients do not need to send GOAWAY to initiate a graceful shutdown; | |||
| they simply stop making new requests. A server MUST treat receipt of | they simply stop making new requests. A server MUST treat receipt of | |||
| a GOAWAY frame on any stream as a connection error (Section 8) of | a GOAWAY frame on any stream as a connection error (Section 8) of | |||
| type HTTP_FRAME_UNEXPECTED. | type H3_FRAME_UNEXPECTED. | |||
| The GOAWAY frame applies to the connection, not a specific stream. A | The GOAWAY frame applies to the connection, not a specific stream. A | |||
| client MUST treat a GOAWAY frame on a stream other than the control | client MUST treat a GOAWAY frame on a stream other than the control | |||
| stream as a connection error (Section 8) of type | stream as a connection error (Section 8) of type H3_FRAME_UNEXPECTED. | |||
| HTTP_FRAME_UNEXPECTED. | ||||
| See Section 5.2 for more information on the use of the GOAWAY frame. | See Section 5.2 for more information on the use of the GOAWAY frame. | |||
| 7.2.7. MAX_PUSH_ID | 7.2.7. MAX_PUSH_ID | |||
| The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | |||
| number of server pushes that the server can initiate. This sets the | number of server pushes that the server can initiate. This sets the | |||
| maximum value for a Push ID that the server can use in a PUSH_PROMISE | maximum value for a Push ID that the server can use in PUSH_PROMISE | |||
| frame. Consequently, this also limits the number of push streams | and CANCEL_PUSH frames. Consequently, this also limits the number of | |||
| that the server can initiate in addition to the limit maintained by | push streams that the server can initiate in addition to the limit | |||
| the QUIC transport. | maintained by the QUIC transport. | |||
| The MAX_PUSH_ID frame is always sent on the control stream. Receipt | The MAX_PUSH_ID frame is always sent on the control stream. Receipt | |||
| of a MAX_PUSH_ID frame on any other stream MUST be treated as a | of a MAX_PUSH_ID frame on any other stream MUST be treated as a | |||
| connection error of type HTTP_FRAME_UNEXPECTED. | connection error of type H3_FRAME_UNEXPECTED. | |||
| A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the | A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the | |||
| receipt of a MAX_PUSH_ID frame as a connection error of type | receipt of a MAX_PUSH_ID frame as a connection error of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| The maximum Push ID is unset when a connection is created, meaning | The maximum Push ID is unset when a connection is created, meaning | |||
| that a server cannot push until it receives a MAX_PUSH_ID frame. A | that a server cannot push until it receives a MAX_PUSH_ID frame. A | |||
| client that wishes to manage the number of promised server pushes can | client that wishes to manage the number of promised server pushes can | |||
| increase the maximum Push ID by sending MAX_PUSH_ID frames as the | increase the maximum Push ID by sending MAX_PUSH_ID frames as the | |||
| server fulfills or cancels server pushes. | server fulfills or cancels server pushes. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 10: MAX_PUSH_ID frame payload | Figure 10: MAX_PUSH_ID frame payload | |||
| The MAX_PUSH_ID frame carries a single variable-length integer that | The MAX_PUSH_ID frame carries a single variable-length integer that | |||
| identifies the maximum value for a Push ID that the server can use | identifies the maximum value for a Push ID that the server can use | |||
| (see Section 7.2.5). A MAX_PUSH_ID frame cannot reduce the maximum | (see Section 7.2.5). A MAX_PUSH_ID frame cannot reduce the maximum | |||
| Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | |||
| previously received MUST be treated as a connection error of type | previously received MUST be treated as a connection error of type | |||
| HTTP_ID_ERROR. | H3_ID_ERROR. | |||
| 7.2.8. DUPLICATE_PUSH | 7.2.8. DUPLICATE_PUSH | |||
| The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate | The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate | |||
| that an existing pushed resource is related to multiple client | that an existing pushed resource is related to multiple client | |||
| requests. | requests. | |||
| The DUPLICATE_PUSH frame is always sent on a request stream. Receipt | The DUPLICATE_PUSH frame is always sent on a request stream. Receipt | |||
| of a DUPLICATE_PUSH frame on any other stream MUST be treated as a | of a DUPLICATE_PUSH frame on any other stream MUST be treated as a | |||
| connection error of type HTTP_FRAME_UNEXPECTED. | connection error of type H3_FRAME_UNEXPECTED. | |||
| A client MUST NOT send a DUPLICATE_PUSH frame. A server MUST treat | A client MUST NOT send a DUPLICATE_PUSH frame. A server MUST treat | |||
| the receipt of a DUPLICATE_PUSH frame as a connection error of type | the receipt of a DUPLICATE_PUSH frame as a connection error of type | |||
| HTTP_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 11: DUPLICATE_PUSH frame payload | Figure 11: DUPLICATE_PUSH frame payload | |||
| The DUPLICATE_PUSH frame carries a single variable-length integer | The DUPLICATE_PUSH frame carries a single variable-length integer | |||
| that identifies the Push ID of a resource that the server has | that identifies the Push ID of a resource that the server has | |||
| previously promised (see Section 7.2.5), though that promise might | previously promised (see Section 7.2.5), though that promise might | |||
| not be received before this frame. A server MUST NOT use a Push ID | not be received before this frame. A server MUST NOT use a Push ID | |||
| that is larger than the client has provided in a MAX_PUSH_ID frame | that is larger than the client has provided in a MAX_PUSH_ID frame | |||
| (Section 7.2.7). A client MUST treat receipt of a DUPLICATE_PUSH | (Section 7.2.7). A client MUST treat receipt of a DUPLICATE_PUSH | |||
| that contains a larger Push ID than the client has advertised as a | that contains a larger Push ID than the client has advertised as a | |||
| connection error of type HTTP_ID_ERROR. | connection error of type H3_ID_ERROR. | |||
| This frame allows the server to use the same server push in response | This frame allows the server to use the same server push in response | |||
| to multiple concurrent requests. Referencing the same server push | to multiple concurrent requests. Referencing the same server push | |||
| ensures that a promise can be made in relation to every response in | ensures that a promise can be made in relation to every response in | |||
| which server push might be needed without duplicating request headers | which server push might be needed without duplicating request headers | |||
| or pushed responses. | or pushed responses. | |||
| Allowing duplicate references to the same Push ID is primarily to | Allowing duplicate references to the same Push ID is primarily to | |||
| reduce duplication caused by concurrent requests. A server SHOULD | reduce duplication caused by concurrent requests. A server SHOULD | |||
| avoid reusing a Push ID over a long period. Clients are likely to | avoid reusing a Push ID over a long period. Clients are likely to | |||
| skipping to change at page 33, line 42 ¶ | skipping to change at page 34, line 9 ¶ | |||
| ignored (Section 9). These frames have no semantics, and can be sent | ignored (Section 9). These frames have no semantics, and can be sent | |||
| on any open stream when application-layer padding is desired. They | on any open stream when application-layer padding is desired. They | |||
| MAY also be sent on connections where no data is currently being | MAY also be sent on connections where no data is currently being | |||
| transferred. Endpoints MUST NOT consider these frames to have any | transferred. Endpoints MUST NOT consider these frames to have any | |||
| meaning upon receipt. | meaning upon receipt. | |||
| The payload and length of the frames are selected in any manner the | The payload and length of the frames are selected in any manner the | |||
| implementation chooses. | implementation chooses. | |||
| Frame types which were used in HTTP/2 where there is no corresponding | Frame types which were used in HTTP/2 where there is no corresponding | |||
| HTTP/3 frame have also been reserved (Section 11.3). These frame | HTTP/3 frame have also been reserved (Section 11.2). These frame | |||
| types MUST NOT be sent, and receipt MAY be treated as an error of | types MUST NOT be sent, and receipt MAY be treated as an error of | |||
| type HTTP_UNEXPECTED_FRAME. | type H3_FRAME_UNEXPECTED. | |||
| 8. Error Handling | 8. Error Handling | |||
| QUIC allows the application to abruptly terminate (reset) individual | QUIC allows the application to abruptly terminate (reset) individual | |||
| streams or the entire connection when an error is encountered. These | streams or the entire connection when an error is encountered. These | |||
| are referred to as "stream errors" or "connection errors" and are | are referred to as "stream errors" or "connection errors" and are | |||
| described in more detail in [QUIC-TRANSPORT]. An endpoint MAY choose | described in more detail in [QUIC-TRANSPORT]. An endpoint MAY choose | |||
| to treat a stream error as a connection error. | to treat a stream error as a connection error. | |||
| Because new error codes can be defined without negotiation (see | Because new error codes can be defined without negotiation (see | |||
| skipping to change at page 34, line 20 ¶ | skipping to change at page 34, line 36 ¶ | |||
| This section describes HTTP/3-specific error codes which can be used | This section describes HTTP/3-specific error codes which can be used | |||
| to express the cause of a connection or stream error. | to express the cause of a connection or stream error. | |||
| 8.1. HTTP/3 Error Codes | 8.1. HTTP/3 Error Codes | |||
| The following error codes are defined for use when abruptly | The following error codes are defined for use when abruptly | |||
| terminating streams, aborting reading of streams, or immediately | terminating streams, aborting reading of streams, or immediately | |||
| closing connections. | closing connections. | |||
| HTTP_NO_ERROR (0x100): No error. This is used when the connection | H3_NO_ERROR (0x100): No error. This is used when the connection or | |||
| or stream needs to be closed, but there is no error to signal. | stream needs to be closed, but there is no error to signal. | |||
| HTTP_GENERAL_PROTOCOL_ERROR (0x101): Peer violated protocol | H3_GENERAL_PROTOCOL_ERROR (0x101): Peer violated protocol | |||
| requirements in a way which doesn't match a more specific error | requirements in a way which doesn't match a more specific error | |||
| code, or endpoint declines to use the more specific error code. | code, or endpoint declines to use the more specific error code. | |||
| HTTP_INTERNAL_ERROR (0x102): An internal error has occurred in the | H3_INTERNAL_ERROR (0x102): An internal error has occurred in the | |||
| HTTP stack. | HTTP stack. | |||
| HTTP_STREAM_CREATION_ERROR (0x103): The endpoint detected that its | H3_STREAM_CREATION_ERROR (0x103): The endpoint detected that its | |||
| peer created a stream that it will not accept. | peer created a stream that it will not accept. | |||
| HTTP_CLOSED_CRITICAL_STREAM (0x104): A stream required by the | H3_CLOSED_CRITICAL_STREAM (0x104): A stream required by the | |||
| connection was closed or reset. | connection was closed or reset. | |||
| HTTP_FRAME_UNEXPECTED (0x105): A frame was received which was not | H3_FRAME_UNEXPECTED (0x105): A frame was received which was not | |||
| permitted in the current state or on the current stream. | permitted in the current state or on the current stream. | |||
| HTTP_FRAME_ERROR (0x106): A frame that fails to satisfy layout | H3_FRAME_ERROR (0x106): A frame that fails to satisfy layout | |||
| requirements or with an invalid size was received. | requirements or with an invalid size was received. | |||
| HTTP_EXCESSIVE_LOAD (0x107): The endpoint detected that its peer is | H3_EXCESSIVE_LOAD (0x107): The endpoint detected that its peer is | |||
| exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
| HTTP_ID_ERROR (0x108): A Stream ID or Push ID was used incorrectly, | H3_ID_ERROR (0x108): A Stream ID or Push ID was used incorrectly, | |||
| such as exceeding a limit, reducing a limit, or being reused. | such as exceeding a limit, reducing a limit, or being reused. | |||
| HTTP_SETTINGS_ERROR (0x109): An endpoint detected an error in the | H3_SETTINGS_ERROR (0x109): An endpoint detected an error in the | |||
| payload of a SETTINGS frame. | payload of a SETTINGS frame. | |||
| HTTP_MISSING_SETTINGS (0x10A): No SETTINGS frame was received at the | H3_MISSING_SETTINGS (0x10A): No SETTINGS frame was received at the | |||
| beginning of the control stream. | beginning of the control stream. | |||
| HTTP_REQUEST_REJECTED (0x10B): A server rejected a request without | H3_REQUEST_REJECTED (0x10B): A server rejected a request without | |||
| performing any application processing. | performing any application processing. | |||
| HTTP_REQUEST_CANCELLED (0x10C): The request or its response | H3_REQUEST_CANCELLED (0x10C): The request or its response (including | |||
| (including pushed response) is cancelled. | pushed response) is cancelled. | |||
| HTTP_REQUEST_INCOMPLETE (0x10D): The client's stream terminated | H3_REQUEST_INCOMPLETE (0x10D): The client's stream terminated | |||
| without containing a fully-formed request. | without containing a fully-formed request. | |||
| HTTP_EARLY_RESPONSE (0x10E): The remainder of the client's request | H3_EARLY_RESPONSE (0x10E): The remainder of the client's request is | |||
| is not needed to produce a response. For use in STOP_SENDING | not needed to produce a response. For use in STOP_SENDING only. | |||
| only. | ||||
| HTTP_CONNECT_ERROR (0x10F): The connection established in response | H3_CONNECT_ERROR (0x10F): The connection established in response to | |||
| to a CONNECT request was reset or abnormally closed. | a CONNECT request was reset or abnormally closed. | |||
| HTTP_VERSION_FALLBACK (0x110): The requested operation cannot be | H3_VERSION_FALLBACK (0x110): The requested operation cannot be | |||
| served over HTTP/3. The peer should retry over HTTP/1.1. | served over HTTP/3. The peer should retry over HTTP/1.1. | |||
| 9. Extensions to HTTP/3 | 9. Extensions to HTTP/3 | |||
| HTTP/3 permits extension of the protocol. Within the limitations | HTTP/3 permits extension of the protocol. Within the limitations | |||
| described in this section, protocol extensions can be used to provide | described in this section, protocol extensions can be used to provide | |||
| additional services or alter any aspect of the protocol. Extensions | additional services or alter any aspect of the protocol. Extensions | |||
| are effective only within the scope of a single HTTP/3 connection. | are effective only within the scope of a single HTTP/3 connection. | |||
| This applies to the protocol elements defined in this document. This | This applies to the protocol elements defined in this document. This | |||
| does not affect the existing options for extending HTTP, such as | does not affect the existing options for extending HTTP, such as | |||
| defining new methods, status codes, or header fields. | defining new methods, status codes, or header fields. | |||
| Extensions are permitted to use new frame types (Section 7.2), new | Extensions are permitted to use new frame types (Section 7.2), new | |||
| settings (Section 7.2.4.1), new error codes (Section 8), or new | settings (Section 7.2.4.1), new error codes (Section 8), or new | |||
| unidirectional stream types (Section 6.2). Registries are | unidirectional stream types (Section 6.2). Registries are | |||
| established for managing these extension points: frame types | established for managing these extension points: frame types | |||
| (Section 11.3), settings (Section 11.4), error codes (Section 11.5), | (Section 11.2), settings (Section 11.3), error codes (Section 11.4), | |||
| and stream types (Section 11.6). | and stream types (Section 11.5). | |||
| 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 | |||
| and unidirectional streams that have unknown or unsupported types. | and unidirectional streams that have unknown or unsupported types. | |||
| This means that any of these extension points can be safely used by | This means that any of these extension points can be safely used by | |||
| extensions without prior arrangement or negotiation. However, where | extensions without prior arrangement or negotiation. However, where | |||
| a known frame type is required to be in a specific location, such as | a known frame type is required to be in a specific location, such as | |||
| the SETTINGS frame as the first frame of the control stream (see | the SETTINGS frame as the first frame of the control stream (see | |||
| Section 6.2.1), an unknown frame type does not satisfy that | Section 6.2.1), an unknown frame type does not satisfy that | |||
| requirement and SHOULD be treated as an error. | requirement and SHOULD be treated as an error. | |||
| skipping to change at page 37, line 31 ¶ | skipping to change at page 37, line 47 ¶ | |||
| IDs" registry established in [RFC7301]. | IDs" registry established in [RFC7301]. | |||
| The "h3" string identifies HTTP/3: | The "h3" string identifies HTTP/3: | |||
| Protocol: HTTP/3 | Protocol: HTTP/3 | |||
| Identification Sequence: 0x68 0x33 ("h3") | Identification Sequence: 0x68 0x33 ("h3") | |||
| Specification: This document | Specification: This document | |||
| 11.2. Registration of QUIC Version Hint Alt-Svc Parameter | 11.2. Frame Types | |||
| This document creates a new registration for version-negotiation | ||||
| hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" | ||||
| registry established in [RFC7838]. | ||||
| Parameter: "quic" | ||||
| Specification: This document, Section 3.2.1 | ||||
| 11.3. Frame Types | ||||
| This document establishes a registry for HTTP/3 frame type codes. | This document establishes a registry for HTTP/3 frame type codes. | |||
| The "HTTP/3 Frame Type" registry governs a 62-bit space. This space | The "HTTP/3 Frame Type" registry governs a 62-bit space. This space | |||
| is split into three spaces that are governed by different policies. | is split into three spaces that are governed by different policies. | |||
| Values between "0x00" and "0x3f" (in hexadecimal) are assigned via | Values between "0x00" and "0x3f" (in hexadecimal) are assigned via | |||
| the Standards Action or IESG Review policies [RFC8126]. Values from | the Standards Action or IESG Review policies [RFC8126]. Values from | |||
| "0x40" to "0x3fff" operate on the Specification Required policy | "0x40" to "0x3fff" operate on the Specification Required policy | |||
| [RFC8126]. All other values are assigned to Private Use [RFC8126]. | [RFC8126]. All other values are assigned to Private Use [RFC8126]. | |||
| While this registry is separate from the "HTTP/2 Frame Type" registry | While this registry is separate from the "HTTP/2 Frame Type" registry | |||
| defined in [HTTP2], it is preferable that the assignments parallel | defined in [HTTP2], it is preferable that the assignments parallel | |||
| each other where the code spaces overlap. If an entry is present in | each other where the code spaces overlap. If an entry is present in | |||
| only one registry, every effort SHOULD be made to avoid assigning the | only one registry, every effort SHOULD be made to avoid assigning the | |||
| corresponding value to an unrelated operation. | corresponding value to an unrelated operation. | |||
| skipping to change at page 39, line 5 ¶ | skipping to change at page 39, line 37 ¶ | |||
| | | | | | | | | | | |||
| | MAX_PUSH_ID | 0xD | Section 7.2.7 | | | MAX_PUSH_ID | 0xD | Section 7.2.7 | | |||
| | | | | | | | | | | |||
| | DUPLICATE_PUSH | 0xE | Section 7.2.8 | | | DUPLICATE_PUSH | 0xE | Section 7.2.8 | | |||
| +----------------+------+---------------+ | +----------------+------+---------------+ | |||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for integer | |||
| values of N (that is, "0x21", "0x40", ..., through | values of N (that is, "0x21", "0x40", ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | |||
| 11.4. Settings Parameters | 11.3. Settings Parameters | |||
| This document establishes a registry for HTTP/3 settings. The | This document establishes a registry for HTTP/3 settings. The | |||
| "HTTP/3 Settings" registry governs a 62-bit space. This space is | "HTTP/3 Settings" registry governs a 62-bit space. This space is | |||
| split into three spaces that are governed by different policies. | split into three spaces that are governed by different policies. | |||
| Values between "0x00" and "0x3f" (in hexadecimal) are assigned via | Values between "0x00" and "0x3f" (in hexadecimal) are assigned via | |||
| the Standards Action or IESG Review policies [RFC8126]. Values from | the Standards Action or IESG Review policies [RFC8126]. Values from | |||
| "0x40" to "0x3fff" operate on the Specification Required policy | "0x40" to "0x3fff" operate on the Specification Required policy | |||
| [RFC8126]. All other values are assigned to Private Use [RFC8126]. | [RFC8126]. All other values are assigned to Private Use [RFC8126]. | |||
| The designated experts are the same as those for the "HTTP/2 | The designated experts are the same as those for the "HTTP/2 | |||
| Settings" registry defined in [HTTP2]. | Settings" registry defined in [HTTP2]. | |||
| skipping to change at page 40, line 9 ¶ | skipping to change at page 40, line 40 ¶ | |||
| | | | | | | | | | | | | |||
| | Reserved | 0x5 | N/A | N/A | | | Reserved | 0x5 | N/A | N/A | | |||
| | | | | | | | | | | | | |||
| | MAX_HEADER_LIST_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | | MAX_HEADER_LIST_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | |||
| +----------------------+------+-----------------+-----------+ | +----------------------+------+-----------------+-----------+ | |||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for integer | |||
| values of N (that is, "0x21", "0x40", ..., through | values of N (that is, "0x21", "0x40", ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | |||
| 11.5. Error Codes | 11.4. Error Codes | |||
| This document establishes a registry for HTTP/3 error codes. The | This document establishes a registry for HTTP/3 error codes. The | |||
| "HTTP/3 Error Code" registry manages a 62-bit space. The "HTTP/3 | "HTTP/3 Error Code" registry manages a 62-bit space. The "HTTP/3 | |||
| Error Code" registry operates under the "Expert Review" policy | Error Code" registry operates under the "Expert Review" policy | |||
| [RFC8126]. | [RFC8126]. | |||
| Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
| of the error code. An expert reviewer is advised to examine new | of the error code. An expert reviewer is advised to examine new | |||
| registrations for possible duplication with existing error codes. | registrations for possible duplication with existing error codes. | |||
| Use of existing registrations is to be encouraged, but not mandated. | Use of existing registrations is to be encouraged, but not mandated. | |||
| skipping to change at page 40, line 36 ¶ | skipping to change at page 41, line 20 ¶ | |||
| Code: The 62-bit error code value. | Code: The 62-bit error code value. | |||
| Description: A brief description of the error code semantics, longer | Description: A brief description of the error code semantics, longer | |||
| if no detailed specification is provided. | if no detailed specification is provided. | |||
| Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
| defines the error code. | defines the error code. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +----------------------------+--------+-------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | Name | Code | Description | Specification | | | Name | Code | Description | Specification | | |||
| +----------------------------+--------+-------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | HTTP_NO_ERROR | 0x0100 | No error | Section 8.1 | | | H3_NO_ERROR | 0x0100 | No error | Section 8.1 | | |||
| | | | | | | | | | | | | |||
| | HTTP_GENERAL_PROTOCOL_ERRO | 0x0101 | General | Section 8.1 | | | H3_GENERAL_PROTOCOL_ERROR | 0x0101 | General | Section 8.1 | | |||
| | R | | protocol | | | | | | protocol | | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | HTTP_INTERNAL_ERROR | 0x0102 | Internal | Section 8.1 | | | H3_INTERNAL_ERROR | 0x0102 | Internal | Section 8.1 | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | HTTP_STREAM_CREATION_ERROR | 0x0103 | Stream | Section 8.1 | | | H3_STREAM_CREATION_ERROR | 0x0103 | Stream | Section 8.1 | | |||
| | | | creation | | | | | | creation | | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | HTTP_CLOSED_CRITICAL_STREA | 0x0104 | Critical | Section 8.1 | | | H3_CLOSED_CRITICAL_STREAM | 0x0104 | Critical | Section 8.1 | | |||
| | M | | stream was | | | | | | stream was | | | |||
| | | | closed | | | | | | closed | | | |||
| | | | | | | | | | | | | |||
| | HTTP_FRAME_UNEXPECTED | 0x0105 | Frame not | Section 8.1 | | | H3_FRAME_UNEXPECTED | 0x0105 | Frame not | Section 8.1 | | |||
| | | | permitted | | | | | | permitted in | | | |||
| | | | in the | | | | | | the current | | | |||
| | | | current | | | | | | state | | | |||
| | | | state | | | | | | | | | |||
| | | | | | | | H3_FRAME_ERROR | 0x0106 | Frame | Section 8.1 | | |||
| | HTTP_FRAME_ERROR | 0x0106 | Frame | Section 8.1 | | | | | violated | | | |||
| | | | violated | | | | | | layout or | | | |||
| | | | layout or | | | | | | size rules | | | |||
| | | | size rules | | | | | | | | | |||
| | | | | | | | H3_EXCESSIVE_LOAD | 0x0107 | Peer | Section 8.1 | | |||
| | HTTP_EXCESSIVE_LOAD | 0x0107 | Peer | Section 8.1 | | | | | generating | | | |||
| | | | generating | | | | | | excessive | | | |||
| | | | excessive | | | | | | load | | | |||
| | | | load | | | | | | | | | |||
| | | | | | | | H3_ID_ERROR | 0x0108 | An | Section 8.1 | | |||
| | HTTP_ID_ERROR | 0x0108 | An | Section 8.1 | | | | | identifier | | | |||
| | | | identifier | | | | | | was used | | | |||
| | | | was used | | | | | | incorrectly | | | |||
| | | | incorrectly | | | | | | | | | |||
| | | | | | | | H3_SETTINGS_ERROR | 0x0109 | SETTINGS | Section 8.1 | | |||
| | HTTP_SETTINGS_ERROR | 0x0109 | SETTINGS | Section 8.1 | | | | | frame | | | |||
| | | | frame | | | | | | contained | | | |||
| | | | contained | | | | | | invalid | | | |||
| | | | invalid | | | | | | values | | | |||
| | | | values | | | | | | | | | |||
| | | | | | | | H3_MISSING_SETTINGS | 0x010A | No SETTINGS | Section 8.1 | | |||
| | HTTP_MISSING_SETTINGS | 0x010A | No SETTINGS | Section 8.1 | | | | | frame | | | |||
| | | | frame | | | | | | received | | | |||
| | | | received | | | | | | | | | |||
| | | | | | | | H3_REQUEST_REJECTED | 0x010B | Request not | Section 8.1 | | |||
| | HTTP_REQUEST_REJECTED | 0x010B | Request not | Section 8.1 | | | | | processed | | | |||
| | | | processed | | | | | | | | | |||
| | | | | | | | H3_REQUEST_CANCELLED | 0x010C | Data no | Section 8.1 | | |||
| | HTTP_REQUEST_CANCELLED | 0x010C | Data no | Section 8.1 | | | | | longer | | | |||
| | | | longer | | | | | | needed | | | |||
| | | | needed | | | | | | | | | |||
| | | | | | | | H3_REQUEST_INCOMPLETE | 0x010D | Stream | Section 8.1 | | |||
| | HTTP_REQUEST_INCOMPLETE | 0x010D | Stream | Section 8.1 | | | | | terminated | | | |||
| | | | terminated | | | | | | early | | | |||
| | | | early | | | | | | | | | |||
| | | | | | | | H3_EARLY_RESPONSE | 0x010E | Remainder of | Section 8.1 | | |||
| | HTTP_EARLY_RESPONSE | 0x010E | Remainder | Section 8.1 | | | | | request not | | | |||
| | | | of request | | | | | | needed | | | |||
| | | | not needed | | | | | | | | | |||
| | | | | | | | H3_CONNECT_ERROR | 0x010F | TCP reset or | Section 8.1 | | |||
| | HTTP_CONNECT_ERROR | 0x010F | TCP reset | Section 8.1 | | | | | error on | | | |||
| | | | or error on | | | | | | CONNECT | | | |||
| | | | CONNECT | | | | | | request | | | |||
| | | | request | | | | | | | | | |||
| | | | | | | | H3_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 | | |||
| | HTTP_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 | | | | | HTTP/1.1 | | | |||
| | | | HTTP/1.1 | | | +---------------------------+--------+--------------+---------------+ | |||
| +----------------------------+--------+-------------+---------------+ | ||||
| 11.6. Stream Types | 11.5. Stream Types | |||
| This document establishes a registry for HTTP/3 unidirectional stream | This document establishes a registry for HTTP/3 unidirectional stream | |||
| types. The "HTTP/3 Stream Type" registry governs a 62-bit space. | types. The "HTTP/3 Stream Type" registry governs a 62-bit space. | |||
| This space is split into three spaces that are governed by different | This space is split into three spaces that are governed by different | |||
| policies. Values between "0x00" and 0x3f (in hexadecimal) are | policies. Values between "0x00" and 0x3f (in hexadecimal) are | |||
| assigned via the Standards Action or IESG Review policies [RFC8126]. | assigned via the Standards Action or IESG Review policies [RFC8126]. | |||
| Values from "0x40" to "0x3fff" operate on the Specification Required | Values from "0x40" to "0x3fff" operate on the Specification Required | |||
| policy [RFC8126]. All other values are assigned to Private Use | policy [RFC8126]. All other values are assigned to Private Use | |||
| [RFC8126]. | [RFC8126]. | |||
| New entries in this registry require the following information: | New entries in this registry require the following information: | |||
| Stream Type: A name or label for the stream type. | Stream Type: A name or label for the stream type. | |||
| Code: The 62-bit code assigned to the stream type. | Code: The 62-bit code assigned to the stream type. | |||
| skipping to change at page 43, line 25 ¶ | skipping to change at page 44, line 7 ¶ | |||
| Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | |||
| 2018, <https://www.rfc-editor.org/info/rfc8470>. | 2018, <https://www.rfc-editor.org/info/rfc8470>. | |||
| [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
| [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | |||
| Header Compression for HTTP over QUIC", draft-ietf-quic- | Header Compression for HTTP over QUIC", draft-ietf-quic- | |||
| qpack-10 (work in progress), September 2019. | qpack-11 (work in progress), November 2019. | |||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", draft-ietf-quic- | Multiplexed and Secure Transport", draft-ietf-quic- | |||
| transport-23 (work in progress), September 2019. | transport-24 (work in progress), November 2019. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [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, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 45, line 45 ¶ | skipping to change at page 46, line 24 ¶ | |||
| These departures are noted in this section. | These departures are noted in this section. | |||
| A.1. Streams | A.1. Streams | |||
| HTTP/3 permits use of a larger number of streams (2^62-1) than | HTTP/3 permits use of a larger number of streams (2^62-1) than | |||
| HTTP/2. The considerations about exhaustion of stream identifier | HTTP/2. The considerations about exhaustion of stream identifier | |||
| space apply, though the space is significantly larger such that it is | space apply, though the space is significantly larger such that it is | |||
| likely that other limits in QUIC are reached first, such as the limit | likely that other limits in QUIC are reached first, such as the limit | |||
| on the connection flow control window. | on the connection flow control window. | |||
| In contrast to HTTP/2, stream concurrency in HTTP/3 is managed by | ||||
| QUIC. QUIC considers a stream closed when all data has been received | ||||
| and sent data has been acknowledged by the peer. HTTP/2 considers a | ||||
| stream closed when the frame containing the END_STREAM bit has been | ||||
| committed to the transport. As a result, the stream for an | ||||
| equivalent exchange could remain "active" for a longer period of | ||||
| time. HTTP/3 servers might choose to permit a larger number of | ||||
| concurrent client-initiated bidirectional streams to achieve | ||||
| equivalent concurrency to HTTP/2, depending on the expected usage | ||||
| patterns. | ||||
| Due to the presence of other unidirectional stream types, HTTP/3 does | ||||
| not rely exclusively on the number of concurrent unidirectional | ||||
| streams to control the number of concurrent in-flight pushes. | ||||
| Instead, HTTP/3 clients use the MAX_PUSH_ID frame to control the | ||||
| number of pushes received from an HTTP/3 server. | ||||
| A.2. HTTP Frame Types | A.2. HTTP Frame Types | |||
| Many framing concepts from HTTP/2 can be elided on QUIC, because the | Many framing concepts from HTTP/2 can be elided on QUIC, because the | |||
| transport deals with them. Because frames are already on a stream, | transport deals with them. Because frames are already on a stream, | |||
| they can omit the stream number. Because frames do not block | they can omit the stream number. Because frames do not block | |||
| multiplexing (QUIC's multiplexing occurs below this layer), the | multiplexing (QUIC's multiplexing occurs below this layer), the | |||
| support for variable-maximum-length packets can be removed. Because | support for variable-maximum-length packets can be removed. Because | |||
| stream termination is handled by QUIC, an END_STREAM flag is not | stream termination is handled by QUIC, an END_STREAM flag is not | |||
| required. This permits the removal of the Flags field from the | required. This permits the removal of the Flags field from the | |||
| generic frame layout. | generic frame layout. | |||
| skipping to change at page 48, line 16 ¶ | skipping to change at page 49, line 16 ¶ | |||
| provides flow control. | provides flow control. | |||
| CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | |||
| larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted. | larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted. | |||
| Frame types defined by extensions to HTTP/2 need to be separately | Frame types defined by extensions to HTTP/2 need to be separately | |||
| registered for HTTP/3 if still applicable. The IDs of frames defined | registered for HTTP/3 if still applicable. The IDs of frames defined | |||
| in [HTTP2] have been reserved for simplicity. Note that the frame | in [HTTP2] have been reserved for simplicity. Note that the frame | |||
| type space in HTTP/3 is substantially larger (62 bits versus 8 bits), | type space in HTTP/3 is substantially larger (62 bits versus 8 bits), | |||
| so many HTTP/3 frame types have no equivalent HTTP/2 code points. | so many HTTP/3 frame types have no equivalent HTTP/2 code points. | |||
| See Section 11.3. | See Section 11.2. | |||
| A.3. HTTP/2 SETTINGS Parameters | A.3. HTTP/2 SETTINGS Parameters | |||
| An important difference from HTTP/2 is that settings are sent once, | An important difference from HTTP/2 is that settings are sent once, | |||
| as the first frame of the control stream, and thereafter cannot | as the first frame of the control stream, and thereafter cannot | |||
| change. This eliminates many corner cases around synchronization of | change. This eliminates many corner cases around synchronization of | |||
| changes. | changes. | |||
| Some transport-level options that HTTP/2 specifies via the SETTINGS | Some transport-level options that HTTP/2 specifies via the SETTINGS | |||
| frame are superseded by QUIC transport parameters in HTTP/3. The | frame are superseded by QUIC transport parameters in HTTP/3. The | |||
| skipping to change at page 49, line 14 ¶ | skipping to change at page 50, line 14 ¶ | |||
| This will often produce a shorter encoding, but can produce a longer | This will often produce a shorter encoding, but can produce a longer | |||
| encoding for settings which use the full 32-bit space. Settings | encoding for settings which use the full 32-bit space. Settings | |||
| ported from HTTP/2 might choose to redefine the format of their | ported from HTTP/2 might choose to redefine the format of their | |||
| settings to avoid using the 62-bit encoding. | settings to avoid using the 62-bit encoding. | |||
| Settings need to be defined separately for HTTP/2 and HTTP/3. The | Settings need to be defined separately for HTTP/2 and HTTP/3. The | |||
| IDs of settings defined in [HTTP2] have been reserved for simplicity. | IDs of settings defined in [HTTP2] have been reserved for simplicity. | |||
| Note that the settings identifier space in HTTP/3 is substantially | Note that the settings identifier space in HTTP/3 is substantially | |||
| larger (62 bits versus 16 bits), so many HTTP/3 settings have no | larger (62 bits versus 16 bits), so many HTTP/3 settings have no | |||
| equivalent HTTP/2 code point. See Section 11.4. | equivalent HTTP/2 code point. See Section 11.3. | |||
| As QUIC streams might arrive out-of-order, endpoints are advised to | As QUIC streams might arrive out-of-order, endpoints are advised to | |||
| not wait for the peers' settings to arrive before responding to other | not wait for the peers' settings to arrive before responding to other | |||
| streams. See Section 7.2.4.2. | streams. See Section 7.2.4.2. | |||
| A.4. HTTP/2 Error Codes | A.4. HTTP/2 Error Codes | |||
| QUIC has the same concepts of "stream" and "connection" errors that | QUIC has the same concepts of "stream" and "connection" errors that | |||
| HTTP/2 provides. However, there is no direct portability of HTTP/2 | HTTP/2 provides. However, there is no direct portability of HTTP/2 | |||
| error codes to HTTP/3 error codes; the values are shifted in order to | error codes to HTTP/3 error codes; the values are shifted in order to | |||
| prevent accidental or implicit conversion. | prevent accidental or implicit conversion. | |||
| The HTTP/2 error codes defined in Section 7 of [HTTP2] logically map | The HTTP/2 error codes defined in Section 7 of [HTTP2] logically map | |||
| to the HTTP/3 error codes as follows: | to the HTTP/3 error codes as follows: | |||
| NO_ERROR (0x0): HTTP_NO_ERROR in Section 8.1. | NO_ERROR (0x0): H3_NO_ERROR in Section 8.1. | |||
| PROTOCOL_ERROR (0x1): This is mapped to HTTP_GENERAL_PROTOCOL_ERROR | PROTOCOL_ERROR (0x1): This is mapped to H3_GENERAL_PROTOCOL_ERROR | |||
| except in cases where more specific error codes have been defined. | except in cases where more specific error codes have been defined. | |||
| This includes HTTP_FRAME_UNEXPECTED and | This includes H3_FRAME_UNEXPECTED and H3_CLOSED_CRITICAL_STREAM | |||
| HTTP_CLOSED_CRITICAL_STREAM defined in Section 8.1. | defined in Section 8.1. | |||
| INTERNAL_ERROR (0x2): HTTP_INTERNAL_ERROR in Section 8.1. | INTERNAL_ERROR (0x2): H3_INTERNAL_ERROR in Section 8.1. | |||
| FLOW_CONTROL_ERROR (0x3): Not applicable, since QUIC handles flow | FLOW_CONTROL_ERROR (0x3): Not applicable, since QUIC handles flow | |||
| control. | control. | |||
| SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of | SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of | |||
| SETTINGS is defined. | SETTINGS is defined. | |||
| STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream | STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream | |||
| management. | management. | |||
| FRAME_SIZE_ERROR (0x6): HTTP_FRAME_ERROR error code defined in | FRAME_SIZE_ERROR (0x6): H3_FRAME_ERROR error code defined in | |||
| Section 8.1. | Section 8.1. | |||
| REFUSED_STREAM (0x7): HTTP_REQUEST_REJECTED (in Section 8.1) is used | REFUSED_STREAM (0x7): H3_REQUEST_REJECTED (in Section 8.1) is used | |||
| to indicate that a request was not processed. Otherwise, not | to indicate that a request was not processed. Otherwise, not | |||
| applicable because QUIC handles stream management. | applicable because QUIC handles stream management. | |||
| CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 8.1. | CANCEL (0x8): H3_REQUEST_CANCELLED in Section 8.1. | |||
| COMPRESSION_ERROR (0x9): Multiple error codes are defined in | COMPRESSION_ERROR (0x9): Multiple error codes are defined in | |||
| [QPACK]. | [QPACK]. | |||
| CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 8.1. | CONNECT_ERROR (0xa): H3_CONNECT_ERROR in Section 8.1. | |||
| ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 8.1. | ENHANCE_YOUR_CALM (0xb): H3_EXCESSIVE_LOAD in Section 8.1. | |||
| INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to | INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to | |||
| provide sufficient security on all connections. | provide sufficient security on all connections. | |||
| HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 8.1. | H3_1_1_REQUIRED (0xd): H3_VERSION_FALLBACK in Section 8.1. | |||
| Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | |||
| Section 11.5. | Section 11.4. | |||
| Appendix B. Change Log | Appendix B. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| B.1. Since draft-ietf-quic-http-22 | B.1. Since draft-ietf-quic-http-23 | |||
| o Removed "quic" Alt-Svc parameter (#3061,#3118) | ||||
| o Clients need not persist unknown settings for use in 0-RTT | ||||
| (#3110,#3113) | ||||
| o Clarify error cases around CANCEL_PUSH (#2819,#3083) | ||||
| B.2. Since draft-ietf-quic-http-22 | ||||
| o Removed priority signaling (#2922,#2924) | o Removed priority signaling (#2922,#2924) | |||
| o Further changes to error codes (#2662,#2551): | o Further changes to error codes (#2662,#2551): | |||
| * Error codes renumbered | * Error codes renumbered | |||
| * HTTP_MALFORMED_FRAME replaced by HTTP_FRAME_ERROR, | * HTTP_MALFORMED_FRAME replaced by HTTP_FRAME_ERROR, | |||
| HTTP_ID_ERROR, and others | HTTP_ID_ERROR, and others | |||
| skipping to change at page 51, line 4 ¶ | skipping to change at page 52, line 12 ¶ | |||
| o Clarify how unknown frame types interact with required frame | o Clarify how unknown frame types interact with required frame | |||
| sequence (#2867,#2858) | sequence (#2867,#2858) | |||
| o Describe interactions with the transport in terms of defined | o Describe interactions with the transport in terms of defined | |||
| interface terms (#2857,#2805) | interface terms (#2857,#2805) | |||
| o Require the use of the "http-opportunistic" resource (RFC 8164) | o Require the use of the "http-opportunistic" resource (RFC 8164) | |||
| when scheme is "http" (#2439,#2973) | when scheme is "http" (#2439,#2973) | |||
| o Settings identifiers cannot be duplicated (#2979) | o Settings identifiers cannot be duplicated (#2979) | |||
| o Changes to SETTINGS frames in 0-RTT (#2972,#2790,#2945): | o Changes to SETTINGS frames in 0-RTT (#2972,#2790,#2945): | |||
| * Servers must send all settings with non-default values in their | * Servers must send all settings with non-default values in their | |||
| SETTINGS frame, even when resuming | SETTINGS frame, even when resuming | |||
| * If a client doesn't have settings associated with a 0-RTT | * If a client doesn't have settings associated with a 0-RTT | |||
| ticket, it uses the defaults | ticket, it uses the defaults | |||
| * Servers can't accept early data if they cannot recover the | * Servers can't accept early data if they cannot recover the | |||
| settings the client will have remembered | settings the client will have remembered | |||
| o Clarify that Upgrade and the 101 status code are prohibited | o Clarify that Upgrade and the 101 status code are prohibited | |||
| (#2898,#2889) | (#2898,#2889) | |||
| o Clarify that frame types reserved for greasing can occur on any | o Clarify that frame types reserved for greasing can occur on any | |||
| stream, but frame types reserved due to HTTP/2 correspondence are | stream, but frame types reserved due to HTTP/2 correspondence are | |||
| prohibited (#2997,#2692,#2693) | prohibited (#2997,#2692,#2693) | |||
| o Unknown error codes cannot be treated as errors (#2998,#2816) | o Unknown error codes cannot be treated as errors (#2998,#2816) | |||
| B.2. Since draft-ietf-quic-http-21 | B.3. Since draft-ietf-quic-http-21 | |||
| o No changes | No changes | |||
| B.3. Since draft-ietf-quic-http-20 | B.4. Since draft-ietf-quic-http-20 | |||
| o Prohibit closing the control stream (#2509, #2666) | o Prohibit closing the control stream (#2509, #2666) | |||
| o Change default priority to use an orphan node (#2502, #2690) | o Change default priority to use an orphan node (#2502, #2690) | |||
| o Exclusive priorities are restored (#2754, #2781) | o Exclusive priorities are restored (#2754, #2781) | |||
| o Restrict use of frames when using CONNECT (#2229, #2702) | o Restrict use of frames when using CONNECT (#2229, #2702) | |||
| o Close and maybe reset streams if a connection error occurs for | o Close and maybe reset streams if a connection error occurs for | |||
| skipping to change at page 52, line 4 ¶ | skipping to change at page 53, line 11 ¶ | |||
| o Encourage provision of sufficient unidirectional streams for QPACK | o Encourage provision of sufficient unidirectional streams for QPACK | |||
| (#2100, #2529, #2762) | (#2100, #2529, #2762) | |||
| o Allow extensions to use server-initiated bidirectional streams | o Allow extensions to use server-initiated bidirectional streams | |||
| (#2711, #2773) | (#2711, #2773) | |||
| o Clarify use of maximum header list size setting (#2516, #2774) | o Clarify use of maximum header list size setting (#2516, #2774) | |||
| o Extensive changes to error codes and conditions of their sending | o Extensive changes to error codes and conditions of their sending | |||
| * Require connection errors for more error conditions (#2511, | * Require connection errors for more error conditions (#2511, | |||
| #2510) | #2510) | |||
| * Updated the error codes for illegal GOAWAY frames (#2714, | * Updated the error codes for illegal GOAWAY frames (#2714, | |||
| #2707) | #2707) | |||
| * Specified error code for HEADERS on control stream (#2708) | * Specified error code for HEADERS on control stream (#2708) | |||
| * Specified error code for servers receiving PUSH_PROMISE (#2709) | * Specified error code for servers receiving PUSH_PROMISE (#2709) | |||
| * Specified error code for receiving DATA before HEADERS (#2715) | * Specified error code for receiving DATA before HEADERS (#2715) | |||
| * Describe malformed messages and their handling (#2410, #2764) | * Describe malformed messages and their handling (#2410, #2764) | |||
| * Remove HTTP_PUSH_ALREADY_IN_CACHE error (#2812, #2813) | * Remove HTTP_PUSH_ALREADY_IN_CACHE error (#2812, #2813) | |||
| * Refactor Push ID related errors (#2818, #2820) | * Refactor Push ID related errors (#2818, #2820) | |||
| * Rationalize HTTP/3 stream creation errors (#2821, #2822) | * Rationalize HTTP/3 stream creation errors (#2821, #2822) | |||
| B.4. Since draft-ietf-quic-http-19 | B.5. Since draft-ietf-quic-http-19 | |||
| o SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | o SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | |||
| o Non-zero bits in the Empty field of the PRIORITY frame MAY be | o Non-zero bits in the Empty field of the PRIORITY frame MAY be | |||
| treated as an error (#2501) | treated as an error (#2501) | |||
| B.5. Since draft-ietf-quic-http-18 | B.6. Since draft-ietf-quic-http-18 | |||
| o Resetting streams following a GOAWAY is recommended, but not | o Resetting streams following a GOAWAY is recommended, but not | |||
| required (#2256,#2457) | required (#2256,#2457) | |||
| o Use variable-length integers throughout (#2437,#2233,#2253,#2275) | o Use variable-length integers throughout (#2437,#2233,#2253,#2275) | |||
| * Variable-length frame types, stream types, and settings | * Variable-length frame types, stream types, and settings | |||
| identifiers | identifiers | |||
| * Renumbered stream type assignments | * Renumbered stream type assignments | |||
| * Modified associated reserved values | * Modified associated reserved values | |||
| o Frame layout switched from Length-Type-Value to Type-Length-Value | o Frame layout switched from Length-Type-Value to Type-Length-Value | |||
| (#2395,#2235) | (#2395,#2235) | |||
| o Specified error code for servers receiving DUPLICATE_PUSH (#2497) | o Specified error code for servers receiving DUPLICATE_PUSH (#2497) | |||
| o Use connection error for invalid PRIORITY (#2507, #2508) | o Use connection error for invalid PRIORITY (#2507, #2508) | |||
| B.6. Since draft-ietf-quic-http-17 | B.7. Since draft-ietf-quic-http-17 | |||
| o HTTP_REQUEST_REJECTED is used to indicate a request can be retried | o HTTP_REQUEST_REJECTED is used to indicate a request can be retried | |||
| (#2106, #2325) | (#2106, #2325) | |||
| o Changed error code for GOAWAY on the wrong stream (#2231, #2343) | o Changed error code for GOAWAY on the wrong stream (#2231, #2343) | |||
| B.7. Since draft-ietf-quic-http-16 | B.8. Since draft-ietf-quic-http-16 | |||
| o Rename "HTTP/QUIC" to "HTTP/3" (#1973) | o Rename "HTTP/QUIC" to "HTTP/3" (#1973) | |||
| o Changes to PRIORITY frame (#1865, #2075) | o Changes to PRIORITY frame (#1865, #2075) | |||
| * Permitted as first frame of request streams | * Permitted as first frame of request streams | |||
| * Remove exclusive reprioritization | * Remove exclusive reprioritization | |||
| * Changes to Prioritized Element Type bits | * Changes to Prioritized Element Type bits | |||
| skipping to change at page 53, line 38 ¶ | skipping to change at page 54, line 45 ¶ | |||
| (#1809, #1846, #2038) | (#1809, #1846, #2038) | |||
| o Clarify message processing rules for streams that aren't closed | o Clarify message processing rules for streams that aren't closed | |||
| (#1972, #2003) | (#1972, #2003) | |||
| o Removed reservation of error code 0 and moved HTTP_NO_ERROR to | o Removed reservation of error code 0 and moved HTTP_NO_ERROR to | |||
| this value (#1922) | this value (#1922) | |||
| o Removed prohibition of zero-length DATA frames (#2098) | o Removed prohibition of zero-length DATA frames (#2098) | |||
| B.8. Since draft-ietf-quic-http-15 | B.9. Since draft-ietf-quic-http-15 | |||
| Substantial editorial reorganization; no technical changes. | Substantial editorial reorganization; no technical changes. | |||
| B.9. Since draft-ietf-quic-http-14 | B.10. Since draft-ietf-quic-http-14 | |||
| o Recommend sensible values for QUIC transport parameters | o Recommend sensible values for QUIC transport parameters | |||
| (#1720,#1806) | (#1720,#1806) | |||
| o Define error for missing SETTINGS frame (#1697,#1808) | o Define error for missing SETTINGS frame (#1697,#1808) | |||
| o Setting values are variable-length integers (#1556,#1807) and do | o Setting values are variable-length integers (#1556,#1807) and do | |||
| not have separate maximum values (#1820) | not have separate maximum values (#1820) | |||
| o Expanded discussion of connection closure (#1599,#1717,#1712) | o Expanded discussion of connection closure (#1599,#1717,#1712) | |||
| skipping to change at page 54, line 4 ¶ | skipping to change at page 55, line 16 ¶ | |||
| o Recommend sensible values for QUIC transport parameters | o Recommend sensible values for QUIC transport parameters | |||
| (#1720,#1806) | (#1720,#1806) | |||
| o Define error for missing SETTINGS frame (#1697,#1808) | o Define error for missing SETTINGS frame (#1697,#1808) | |||
| o Setting values are variable-length integers (#1556,#1807) and do | o Setting values are variable-length integers (#1556,#1807) and do | |||
| not have separate maximum values (#1820) | not have separate maximum values (#1820) | |||
| o Expanded discussion of connection closure (#1599,#1717,#1712) | o Expanded discussion of connection closure (#1599,#1717,#1712) | |||
| o HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | o HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | |||
| B.10. Since draft-ietf-quic-http-13 | B.11. Since draft-ietf-quic-http-13 | |||
| o Reserved some frame types for grease (#1333, #1446) | o Reserved some frame types for grease (#1333, #1446) | |||
| o Unknown unidirectional stream types are tolerated, not errors; | o Unknown unidirectional stream types are tolerated, not errors; | |||
| some reserved for grease (#1490, #1525) | some reserved for grease (#1490, #1525) | |||
| o Require settings to be remembered for 0-RTT, prohibit reductions | o Require settings to be remembered for 0-RTT, prohibit reductions | |||
| (#1541, #1641) | (#1541, #1641) | |||
| o Specify behavior for truncated requests (#1596, #1643) | o Specify behavior for truncated requests (#1596, #1643) | |||
| B.11. Since draft-ietf-quic-http-12 | B.12. Since draft-ietf-quic-http-12 | |||
| o TLS SNI extension isn't mandatory if an alternative method is used | o TLS SNI extension isn't mandatory if an alternative method is used | |||
| (#1459, #1462, #1466) | (#1459, #1462, #1466) | |||
| o Removed flags from HTTP/3 frames (#1388, #1398) | o Removed flags from HTTP/3 frames (#1388, #1398) | |||
| o Reserved frame types and settings for use in preserving | o Reserved frame types and settings for use in preserving | |||
| extensibility (#1333, #1446) | extensibility (#1333, #1446) | |||
| o Added general error code (#1391, #1397) | o Added general error code (#1391, #1397) | |||
| o Unidirectional streams carry a type byte and are extensible | o Unidirectional streams carry a type byte and are extensible | |||
| (#910,#1359) | (#910,#1359) | |||
| o Priority mechanism now uses explicit placeholders to enable | o Priority mechanism now uses explicit placeholders to enable | |||
| persistent structure in the tree (#441,#1421,#1422) | persistent structure in the tree (#441,#1421,#1422) | |||
| B.12. Since draft-ietf-quic-http-11 | B.13. Since draft-ietf-quic-http-11 | |||
| o Moved QPACK table updates and acknowledgments to dedicated streams | o Moved QPACK table updates and acknowledgments to dedicated streams | |||
| (#1121, #1122, #1238) | (#1121, #1122, #1238) | |||
| B.13. Since draft-ietf-quic-http-10 | B.14. Since draft-ietf-quic-http-10 | |||
| o Settings need to be remembered when attempting and accepting 0-RTT | o Settings need to be remembered when attempting and accepting 0-RTT | |||
| (#1157, #1207) | (#1157, #1207) | |||
| B.14. Since draft-ietf-quic-http-09 | B.15. Since draft-ietf-quic-http-09 | |||
| o Selected QCRAM for header compression (#228, #1117) | o Selected QCRAM for header compression (#228, #1117) | |||
| o The server_name TLS extension is now mandatory (#296, #495) | o The server_name TLS extension is now mandatory (#296, #495) | |||
| o Specified handling of unsupported versions in Alt-Svc (#1093, | o Specified handling of unsupported versions in Alt-Svc (#1093, | |||
| #1097) | #1097) | |||
| B.15. Since draft-ietf-quic-http-08 | B.16. Since draft-ietf-quic-http-08 | |||
| o Clarified connection coalescing rules (#940, #1024) | o Clarified connection coalescing rules (#940, #1024) | |||
| B.16. Since draft-ietf-quic-http-07 | B.17. Since draft-ietf-quic-http-07 | |||
| o Changes for integer encodings in QUIC (#595,#905) | o Changes for integer encodings in QUIC (#595,#905) | |||
| o Use unidirectional streams as appropriate (#515, #240, #281, #886) | o Use unidirectional streams as appropriate (#515, #240, #281, #886) | |||
| o Improvement to the description of GOAWAY (#604, #898) | o Improvement to the description of GOAWAY (#604, #898) | |||
| o Improve description of server push usage (#947, #950, #957) | o Improve description of server push usage (#947, #950, #957) | |||
| B.17. Since draft-ietf-quic-http-06 | B.18. Since draft-ietf-quic-http-06 | |||
| o Track changes in QUIC error code usage (#485) | o Track changes in QUIC error code usage (#485) | |||
| B.18. Since draft-ietf-quic-http-05 | B.19. Since draft-ietf-quic-http-05 | |||
| o Made push ID sequential, add MAX_PUSH_ID, remove | o Made push ID sequential, add MAX_PUSH_ID, remove | |||
| SETTINGS_ENABLE_PUSH (#709) | SETTINGS_ENABLE_PUSH (#709) | |||
| o Guidance about keep-alive and QUIC PINGs (#729) | o Guidance about keep-alive and QUIC PINGs (#729) | |||
| o Expanded text on GOAWAY and cancellation (#757) | o Expanded text on GOAWAY and cancellation (#757) | |||
| B.19. Since draft-ietf-quic-http-04 | B.20. Since draft-ietf-quic-http-04 | |||
| o Cite RFC 5234 (#404) | o Cite RFC 5234 (#404) | |||
| o Return to a single stream per request (#245,#557) | o Return to a single stream per request (#245,#557) | |||
| o Use separate frame type and settings registries from HTTP/2 (#81) | o Use separate frame type and settings registries from HTTP/2 (#81) | |||
| o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| o Restored GOAWAY (#696) | o Restored GOAWAY (#696) | |||
| o Identify server push using Push ID rather than a stream ID | o Identify server push using Push ID rather than a stream ID | |||
| (#702,#281) | (#702,#281) | |||
| o DATA frames cannot be empty (#700) | o DATA frames cannot be empty (#700) | |||
| B.20. Since draft-ietf-quic-http-03 | B.21. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.21. Since draft-ietf-quic-http-02 | B.22. Since draft-ietf-quic-http-02 | |||
| o Track changes in transport draft | o Track changes in transport draft | |||
| B.22. Since draft-ietf-quic-http-01 | B.23. Since draft-ietf-quic-http-01 | |||
| o SETTINGS changes (#181): | o SETTINGS changes (#181): | |||
| * SETTINGS can be sent only once at the start of a connection; no | * SETTINGS can be sent only once at the start of a connection; no | |||
| changes thereafter | changes thereafter | |||
| * SETTINGS_ACK removed | * SETTINGS_ACK removed | |||
| * Settings can only occur in the SETTINGS frame a single time | * Settings can only occur in the SETTINGS frame a single time | |||
| skipping to change at page 56, line 35 ¶ | skipping to change at page 58, line 4 ¶ | |||
| o Alt-Svc parameter changed from "v" to "quic"; format updated | o Alt-Svc parameter changed from "v" to "quic"; format updated | |||
| (#229) | (#229) | |||
| o Closing the connection control stream or any message control | o Closing the connection control stream or any message control | |||
| stream is a fatal error (#176) | stream is a fatal error (#176) | |||
| o HPACK Sequence counter can wrap (#173) | o HPACK Sequence counter can wrap (#173) | |||
| o 0-RTT guidance added | o 0-RTT guidance added | |||
| o Guide to differences from HTTP/2 and porting HTTP/2 extensions | o Guide to differences from HTTP/2 and porting HTTP/2 extensions | |||
| added (#127,#242) | added (#127,#242) | |||
| B.23. Since draft-ietf-quic-http-00 | B.24. Since draft-ietf-quic-http-00 | |||
| o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | |||
| o Changed from using HTTP/2 framing within Stream 3 to new framing | o Changed from using HTTP/2 framing within Stream 3 to new framing | |||
| format and two-stream-per-request model (#71,#72,#73) | format and two-stream-per-request model (#71,#72,#73) | |||
| o Adopted SETTINGS format from draft-bishop-httpbis-extended- | o Adopted SETTINGS format from draft-bishop-httpbis-extended- | |||
| settings-01 | settings-01 | |||
| o Reworked SETTINGS_ACK to account for indeterminate inter-stream | o Reworked SETTINGS_ACK to account for indeterminate inter-stream | |||
| skipping to change at page 57, line 4 ¶ | skipping to change at page 58, line 21 ¶ | |||
| o Changed from using HTTP/2 framing within Stream 3 to new framing | o Changed from using HTTP/2 framing within Stream 3 to new framing | |||
| format and two-stream-per-request model (#71,#72,#73) | format and two-stream-per-request model (#71,#72,#73) | |||
| o Adopted SETTINGS format from draft-bishop-httpbis-extended- | o Adopted SETTINGS format from draft-bishop-httpbis-extended- | |||
| settings-01 | settings-01 | |||
| o Reworked SETTINGS_ACK to account for indeterminate inter-stream | o Reworked SETTINGS_ACK to account for indeterminate inter-stream | |||
| order (#75) | order (#75) | |||
| o Described CONNECT pseudo-method (#95) | o Described CONNECT pseudo-method (#95) | |||
| o Updated ALPN token and Alt-Svc guidance (#13,#87) | o Updated ALPN token and Alt-Svc guidance (#13,#87) | |||
| o Application-layer-defined error codes (#19,#74) | o Application-layer-defined error codes (#19,#74) | |||
| B.24. Since draft-shade-quic-http2-mapping-00 | B.25. Since draft-shade-quic-http2-mapping-00 | |||
| o Adopted as base for draft-ietf-quic-http | o Adopted as base for draft-ietf-quic-http | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| Acknowledgements | Acknowledgements | |||
| The original authors of this specification were Robbie Shade and Mike | The original authors of this specification were Robbie Shade and Mike | |||
| Warres. | Warres. | |||
| End of changes. 141 change blocks. | ||||
| 375 lines changed or deleted | 386 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/ | ||||