| < draft-ietf-quic-http-32.txt | draft-ietf-quic-http-33.txt > | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track 20 October 2020 | Intended status: Standards Track 15 December 2020 | |||
| Expires: 23 April 2021 | Expires: 18 June 2021 | |||
| Hypertext Transfer Protocol Version 3 (HTTP/3) | Hypertext Transfer Protocol Version 3 (HTTP/3) | |||
| draft-ietf-quic-http-32 | draft-ietf-quic-http-33 | |||
| 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. | |||
| DO NOT DEPLOY THIS VERSION OF HTTP | ||||
| DO NOT DEPLOY THIS VERSION OF HTTP/3 UNTIL IT IS IN AN RFC. This | ||||
| version is still a work in progress. For trial deployments, please | ||||
| use earlier versions. | ||||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org), which is archived at | |||
| https://mailarchive.ietf.org/arch/search/?email_list=quic. | https://mailarchive.ietf.org/arch/search/?email_list=quic. | |||
| Working Group information can be found at https://github.com/quicwg; | Working Group information can be found at https://github.com/quicwg; | |||
| source code and issues list for this draft can be found at | source code and issues list for this draft can be found at | |||
| https://github.com/quicwg/base-drafts/labels/-http. | https://github.com/quicwg/base-drafts/labels/-http. | |||
| skipping to change at page 1, line 44 ¶ | skipping to change at page 2, line 4 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at 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 18 June 2021. | ||||
| This Internet-Draft will expire on 23 April 2021. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| skipping to change at page 2, line 28 ¶ | skipping to change at page 2, line 29 ¶ | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 5 | 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 5 | |||
| 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 . . . . . . . . . . . . . . . 7 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 7 | |||
| 3. Connection Setup and Management . . . . . . . . . . . . . . . 8 | 3. Connection Setup and Management . . . . . . . . . . . . . . . 8 | |||
| 3.1. Draft Version Identification . . . . . . . . . . . . . . 8 | 3.1. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 8 | |||
| 3.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 9 | 3.1.1. HTTP Alternative Services . . . . . . . . . . . . . . 9 | |||
| 3.2.1. HTTP Alternative Services . . . . . . . . . . . . . . 10 | 3.1.2. Other Schemes . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.2.2. Other Schemes . . . . . . . . . . . . . . . . . . . . 10 | 3.2. Connection Establishment . . . . . . . . . . . . . . . . 10 | |||
| 3.3. Connection Establishment . . . . . . . . . . . . . . . . 10 | 3.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 11 | 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 11 | |||
| 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 12 | 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 11 | |||
| 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 12 | 4.1.1. Field Formatting and Compression . . . . . . . . . . 13 | |||
| 4.1.1. Field Formatting and Compression . . . . . . . . . . 14 | ||||
| 4.1.2. Request Cancellation and Rejection . . . . . . . . . 17 | 4.1.2. Request Cancellation and Rejection . . . . . . . . . 17 | |||
| 4.1.3. Malformed Requests and Responses . . . . . . . . . . 18 | 4.1.3. Malformed Requests and Responses . . . . . . . . . . 18 | |||
| 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 19 | 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 20 | 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 21 | 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 23 | 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 23 | 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 23 | 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 23 | |||
| 5.3. Immediate Application Closure . . . . . . . . . . . . . . 25 | 5.3. Immediate Application Closure . . . . . . . . . . . . . . 25 | |||
| 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 26 | 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 25 | |||
| 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 26 | 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 25 | |||
| 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 26 | 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 26 | |||
| 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 27 | 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 26 | |||
| 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 28 | 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 28 | |||
| 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 29 | 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 28 | |||
| 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 29 | 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 29 | |||
| 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 29 | ||||
| 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 30 | 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 31 | ||||
| 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 31 | 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 31 | 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 32 | 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 32 | 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 34 | 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 37 | 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 36 | |||
| 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 38 | 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 39 | 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 7.2.8. Reserved Frame Types . . . . . . . . . . . . . . . . 40 | 7.2.8. Reserved Frame Types . . . . . . . . . . . . . . . . 39 | |||
| 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 40 | 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 40 | 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 40 | |||
| 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 42 | 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 42 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 43 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 43 | |||
| 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 43 | 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 43 | |||
| 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 43 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 43 | |||
| 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 43 | 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 43 | |||
| 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 44 | 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 44 | |||
| 10.5. Denial-of-Service Considerations . . . . . . . . . . . . 44 | 10.5. Denial-of-Service Considerations . . . . . . . . . . . . 44 | |||
| 10.5.1. Limits on Field Section Size . . . . . . . . . . . . 45 | 10.5.1. Limits on Field Section Size . . . . . . . . . . . . 45 | |||
| 10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . 45 | 10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 46 | 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.7. Padding and Traffic Analysis . . . . . . . . . . . . . . 46 | 10.7. Padding and Traffic Analysis . . . . . . . . . . . . . . 46 | |||
| 10.8. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 47 | 10.8. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.9. Early Data . . . . . . . . . . . . . . . . . . . . . . . 47 | 10.9. Early Data . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.10. Migration . . . . . . . . . . . . . . . . . . . . . . . 47 | 10.10. Migration . . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 10.11. Privacy Considerations . . . . . . . . . . . . . . . . . 47 | 10.11. Privacy Considerations . . . . . . . . . . . . . . . . . 48 | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 48 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 11.1. Registration of HTTP/3 Identification String . . . . . . 48 | 11.1. Registration of HTTP/3 Identification String . . . . . . 48 | |||
| 11.2. New Registries . . . . . . . . . . . . . . . . . . . . . 48 | 11.2. New Registries . . . . . . . . . . . . . . . . . . . . . 49 | |||
| 11.2.1. Frame Types . . . . . . . . . . . . . . . . . . . . 48 | 11.2.1. Frame Types . . . . . . . . . . . . . . . . . . . . 49 | |||
| 11.2.2. Settings Parameters . . . . . . . . . . . . . . . . 50 | 11.2.2. Settings Parameters . . . . . . . . . . . . . . . . 50 | |||
| 11.2.3. Error Codes . . . . . . . . . . . . . . . . . . . . 51 | 11.2.3. Error Codes . . . . . . . . . . . . . . . . . . . . 51 | |||
| 11.2.4. Stream Types . . . . . . . . . . . . . . . . . . . . 53 | 11.2.4. Stream Types . . . . . . . . . . . . . . . . . . . . 54 | |||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 54 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 54 | |||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . 54 | 12.1. Normative References . . . . . . . . . . . . . . . . . . 54 | |||
| 12.2. Informative References . . . . . . . . . . . . . . . . . 55 | 12.2. Informative References . . . . . . . . . . . . . . . . . 56 | |||
| Appendix A. Considerations for Transitioning from HTTP/2 . . . . 56 | Appendix A. Considerations for Transitioning from HTTP/2 . . . . 57 | |||
| A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 57 | A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
| A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 57 | A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 58 | |||
| A.2.1. Prioritization Differences . . . . . . . . . . . . . 58 | A.2.1. Prioritization Differences . . . . . . . . . . . . . 59 | |||
| A.2.2. Field Compression Differences . . . . . . . . . . . . 58 | A.2.2. Field Compression Differences . . . . . . . . . . . . 59 | |||
| A.2.3. Flow Control Differences . . . . . . . . . . . . . . 59 | A.2.3. Flow Control Differences . . . . . . . . . . . . . . 59 | |||
| A.2.4. Guidance for New Frame Type Definitions . . . . . . . 59 | A.2.4. Guidance for New Frame Type Definitions . . . . . . . 59 | |||
| A.2.5. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 59 | A.2.5. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 60 | |||
| A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 60 | A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 61 | |||
| A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 61 | A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 62 | |||
| A.4.1. Mapping Between HTTP/2 and HTTP/3 Errors . . . . . . 62 | A.4.1. Mapping Between HTTP/2 and HTTP/3 Errors . . . . . . 63 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 63 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 64 | |||
| B.1. Since draft-ietf-quic-http-31 . . . . . . . . . . . . . . 63 | B.1. Since draft-ietf-quic-http-32 . . . . . . . . . . . . . . 64 | |||
| B.2. Since draft-ietf-quic-http-30 . . . . . . . . . . . . . . 63 | B.2. Since draft-ietf-quic-http-31 . . . . . . . . . . . . . . 64 | |||
| B.3. Since draft-ietf-quic-http-29 . . . . . . . . . . . . . . 63 | B.3. Since draft-ietf-quic-http-30 . . . . . . . . . . . . . . 64 | |||
| B.4. Since draft-ietf-quic-http-28 . . . . . . . . . . . . . . 63 | B.4. Since draft-ietf-quic-http-29 . . . . . . . . . . . . . . 64 | |||
| B.5. Since draft-ietf-quic-http-27 . . . . . . . . . . . . . . 64 | B.5. Since draft-ietf-quic-http-28 . . . . . . . . . . . . . . 64 | |||
| B.6. Since draft-ietf-quic-http-26 . . . . . . . . . . . . . . 64 | B.6. Since draft-ietf-quic-http-27 . . . . . . . . . . . . . . 64 | |||
| B.7. Since draft-ietf-quic-http-25 . . . . . . . . . . . . . . 64 | B.7. Since draft-ietf-quic-http-26 . . . . . . . . . . . . . . 65 | |||
| B.8. Since draft-ietf-quic-http-24 . . . . . . . . . . . . . . 64 | B.8. Since draft-ietf-quic-http-25 . . . . . . . . . . . . . . 65 | |||
| B.9. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 64 | B.9. Since draft-ietf-quic-http-24 . . . . . . . . . . . . . . 65 | |||
| B.10. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 65 | B.10. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 65 | |||
| B.11. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 65 | B.11. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 65 | |||
| B.12. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 65 | B.12. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 66 | |||
| B.13. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 66 | B.13. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 66 | |||
| B.14. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 67 | B.14. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 67 | |||
| B.15. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 67 | B.15. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 67 | |||
| B.16. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 67 | B.16. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 68 | |||
| B.17. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 68 | B.17. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 68 | |||
| B.18. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 68 | B.18. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 69 | |||
| B.19. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 68 | B.19. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 69 | |||
| B.20. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 68 | B.20. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 69 | |||
| B.21. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 69 | B.21. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 69 | |||
| B.22. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 69 | B.22. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 70 | |||
| B.23. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 69 | B.23. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 70 | |||
| B.24. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 69 | B.24. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 70 | |||
| B.25. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 69 | B.25. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 70 | |||
| B.26. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 69 | B.26. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 70 | |||
| B.27. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 69 | B.27. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 70 | |||
| B.28. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 70 | B.28. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 70 | |||
| B.29. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 70 | B.29. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 70 | |||
| B.30. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 70 | B.30. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 71 | |||
| B.31. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 70 | B.31. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 71 | |||
| B.32. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 71 | B.32. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 71 | |||
| B.33. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 71 | B.33. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 72 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 71 | B.34. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 72 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 72 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 72 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 73 | ||||
| 1. Introduction | 1. Introduction | |||
| HTTP semantics ([SEMANTICS]) are used for a broad range of services | HTTP semantics ([SEMANTICS]) are used for a broad range of services | |||
| on the Internet. These semantics have most commonly been used with | on the Internet. These semantics have most commonly been used with | |||
| HTTP/1.1, over a variety of transport and session layers, and with | HTTP/1.1, over a variety of transport and session layers, and with | |||
| HTTP/2 over TLS. HTTP/3 supports the same semantics over a new | HTTP/2 over TLS. HTTP/3 supports the same semantics over a new | |||
| transport protocol, QUIC. | transport protocol, QUIC. | |||
| 1.1. Prior versions of HTTP | 1.1. Prior versions of HTTP | |||
| skipping to change at page 5, line 31 ¶ | skipping to change at page 5, line 31 ¶ | |||
| that transaction was directly impacted by the lost packet. | that transaction was directly impacted by the lost packet. | |||
| 1.2. Delegation to QUIC | 1.2. Delegation to QUIC | |||
| The QUIC transport protocol incorporates stream multiplexing and per- | The QUIC transport protocol incorporates stream multiplexing and per- | |||
| stream flow control, similar to that provided by the HTTP/2 framing | stream flow control, similar to that provided by the HTTP/2 framing | |||
| layer. By providing reliability at the stream level and congestion | layer. By providing reliability at the stream level and congestion | |||
| control across the entire connection, QUIC has the capability to | control across the entire connection, QUIC has the capability to | |||
| improve the performance of HTTP compared to a TCP mapping. QUIC also | improve the performance of HTTP compared to a TCP mapping. QUIC also | |||
| incorporates TLS 1.3 ([TLS13]) at the transport layer, offering | incorporates TLS 1.3 ([TLS13]) at the transport layer, offering | |||
| comparable security to running TLS over TCP, with the improved | comparable confidentiality and integrity to running TLS over TCP, | |||
| connection setup latency of TCP Fast Open ([TFO]). | with the improved connection setup latency of TCP Fast Open ([TFO]). | |||
| This document defines a mapping of HTTP semantics over the QUIC | This document defines a mapping of HTTP semantics over the QUIC | |||
| transport protocol, drawing heavily on the design of HTTP/2. While | transport protocol, drawing heavily on the design of HTTP/2. While | |||
| delegating stream lifetime and flow control issues to QUIC, a similar | delegating stream lifetime and flow control issues to QUIC, a similar | |||
| binary framing is used on each stream. Some HTTP/2 features are | binary framing is used on each stream. Some HTTP/2 features are | |||
| subsumed by QUIC, while other features are implemented atop QUIC. | subsumed by QUIC, while other features are implemented atop QUIC. | |||
| QUIC is described in [QUIC-TRANSPORT]. For a full description of | QUIC is described in [QUIC-TRANSPORT]. For a full description of | |||
| HTTP/2, see [HTTP2]. | HTTP/2, see [HTTP2]. | |||
| 2. HTTP/3 Protocol Overview | 2. HTTP/3 Protocol Overview | |||
| HTTP/3 provides a transport for HTTP semantics using the QUIC | HTTP/3 provides a transport for HTTP semantics using the QUIC | |||
| transport protocol and an internal framing layer similar to HTTP/2. | transport protocol and an internal framing layer similar to HTTP/2. | |||
| Once a client knows that an HTTP/3 server exists at a certain | Once a client knows that an HTTP/3 server exists at a certain | |||
| endpoint, it opens a QUIC connection. QUIC provides protocol | endpoint, it opens a QUIC connection. QUIC provides protocol | |||
| negotiation, stream-based multiplexing, and flow control. Discovery | negotiation, stream-based multiplexing, and flow control. Discovery | |||
| of an HTTP/3 endpoint is described in Section 3.2. | of an HTTP/3 endpoint is described in Section 3.1. | |||
| Within each stream, the basic unit of HTTP/3 communication is a frame | Within each stream, the basic unit of HTTP/3 communication is a frame | |||
| (Section 7.2). Each frame type serves a different purpose. For | (Section 7.2). Each frame type serves a different purpose. For | |||
| example, HEADERS and DATA frames form the basis of HTTP requests and | example, HEADERS and DATA frames form the basis of HTTP requests and | |||
| responses (Section 4.1). | responses (Section 4.1). | |||
| Multiplexing of requests is performed using the QUIC stream | Multiplexing of requests is performed using the QUIC stream | |||
| abstraction, described in Section 2 of [QUIC-TRANSPORT]. Each | abstraction, described in Section 2 of [QUIC-TRANSPORT]. Each | |||
| request-response pair consumes a single QUIC stream. Streams are | request-response pair consumes a single QUIC stream. Streams are | |||
| independent of each other, so one stream that is blocked or suffers | independent of each other, so one stream that is blocked or suffers | |||
| skipping to change at page 8, line 20 ¶ | skipping to change at page 8, line 20 ¶ | |||
| discussion. | discussion. | |||
| receiver: An endpoint that is receiving frames. | receiver: An endpoint that is receiving frames. | |||
| sender: An endpoint that is transmitting frames. | sender: An endpoint that is transmitting frames. | |||
| server: The endpoint that accepts an HTTP/3 connection. Servers | server: The endpoint that accepts an HTTP/3 connection. Servers | |||
| receive HTTP requests and send HTTP responses. | receive HTTP requests and send HTTP responses. | |||
| stream: A bidirectional or unidirectional bytestream provided by the | stream: A bidirectional or unidirectional bytestream provided by the | |||
| QUIC transport. | QUIC transport. All streams within an HTTP/3 connection can be | |||
| considered "HTTP/3 streams," but multiple stream types are defined | ||||
| within HTTP/3. | ||||
| stream error: An error on the individual HTTP/3 stream. | stream error: An application-level error on the individual stream. | |||
| The term "payload body" is defined in Section 5.5.4 of [SEMANTICS]. | The term "payload data" is defined in Section 6.4 of [SEMANTICS]. | |||
| Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" | Finally, the terms "resource", "message", "user agent", "origin | |||
| are defined in Section 3.7 of [SEMANTICS]. Intermediaries act as | server", "gateway", "intermediary", "proxy", and "tunnel" are defined | |||
| both client and server at different times. | in Section 3 of [SEMANTICS]. | |||
| Packet diagrams in this document use the format defined in | Packet diagrams in this document use the format defined in | |||
| Section 1.3 of [QUIC-TRANSPORT] to illustrate the order and size of | Section 1.3 of [QUIC-TRANSPORT] to illustrate the order and size of | |||
| fields. | fields. | |||
| 3. Connection Setup and Management | 3. Connection Setup and Management | |||
| 3.1. Draft Version Identification | 3.1. Discovering an HTTP/3 Endpoint | |||
| *RFC Editor's Note:* Please remove this section prior to | ||||
| publication of a final version of this document. | ||||
| HTTP/3 uses the token "h3" to identify itself in ALPN and Alt-Svc. | ||||
| Only implementations of the final, published RFC can identify | ||||
| themselves as "h3". Until such an RFC exists, implementations MUST | ||||
| NOT identify themselves using this string. | ||||
| Implementations of draft versions of the protocol MUST add the string | ||||
| "-" and the corresponding draft number to the identifier. For | ||||
| example, draft-ietf-quic-http-01 is identified using the string | ||||
| "h3-01". | ||||
| Draft versions MUST use the corresponding draft transport version as | ||||
| their transport. For example, the application protocol defined in | ||||
| draft-ietf-quic-http-25 uses the transport defined in draft-ietf- | ||||
| quic-transport-25. | ||||
| Non-compatible experiments that are based on these draft versions | ||||
| MUST append the string "-" and an experiment name to the identifier. | ||||
| For example, an experimental implementation based on draft-ietf-quic- | ||||
| http-09 that reserves an extra stream for unsolicited transmission of | ||||
| 1980s pop music might identify itself as "h3-09-rickroll". Note that | ||||
| any label MUST conform to the "token" syntax defined in Section 5.7.2 | ||||
| of [SEMANTICS]. Experimenters are encouraged to coordinate their | ||||
| experiments on the quic@ietf.org mailing list. | ||||
| 3.2. Discovering an HTTP/3 Endpoint | ||||
| HTTP relies on the notion of an authoritative response: a response | HTTP relies on the notion of an authoritative response: a response | |||
| that has been determined to be the most appropriate response for that | that has been determined to be the most appropriate response for that | |||
| request given the state of the target resource at the time of | request given the state of the target resource at the time of | |||
| response message origination by (or at the direction of) the origin | response message origination by (or at the direction of) the origin | |||
| server identified within the target URI. Locating an authoritative | server identified within the target URI. Locating an authoritative | |||
| server for an HTTP URL is discussed in Section 4.3 of [SEMANTICS]. | server for an HTTP URL is discussed in Section 4.3 of [SEMANTICS]. | |||
| The "https" scheme associates authority with possession of a | The "https" scheme associates authority with possession of a | |||
| certificate that the client considers to be trustworthy for the host | certificate that the client considers to be trustworthy for the host | |||
| identified by the authority component of the URL. If a server | identified by the authority component of the URL. | |||
| presents a certificate and proof that it controls the corresponding | ||||
| private key, then a client will accept a secured TLS session with | If a server presents a valid certificate and proof that it controls | |||
| that server as being authoritative for all origins with the "https" | the corresponding private key, then a client will accept a secured | |||
| scheme and a host identified in the certificate. | TLS session with that server as being authoritative for all origins | |||
| with the "https" scheme and a host identified in the certificate. | ||||
| The host must be listed either as the CN field of the certificate | ||||
| subject or as a dNSName in the subjectAltName field of the | ||||
| certificate; see [RFC6125]. For a host that is an IP address, the | ||||
| client MUST verify that the address appears as an iPAddress in the | ||||
| subjectAltName field of the certificate. | ||||
| If the hostname or address is not present in the certificate, the | ||||
| client MUST NOT consider the server authoritative for origins | ||||
| containing that hostname or address. See Section 4.3 of [SEMANTICS] | ||||
| for more detail on authoritative access. | ||||
| A client MAY attempt access to a resource with an "https" URI by | A client MAY attempt access to a resource with an "https" URI by | |||
| resolving the host identifier to an IP address, establishing a QUIC | resolving the host identifier to an IP address, establishing a QUIC | |||
| connection to that address on the indicated port, and sending an | connection to that address on the indicated port, and sending an | |||
| HTTP/3 request message targeting the URI to the server over that | HTTP/3 request message targeting the URI to the server over that | |||
| secured connection. Unless some other mechanism is used to select | secured connection. Unless some other mechanism is used to select | |||
| HTTP/3, the token "h3" is used in the Application Layer Protocol | HTTP/3, the token "h3" is used in the Application Layer Protocol | |||
| Negotiation (ALPN; see [RFC7301]) extension during the TLS handshake. | Negotiation (ALPN; see [RFC7301]) extension during the TLS handshake. | |||
| Connectivity problems (e.g., blocking UDP) can result in QUIC | Connectivity problems (e.g., blocking UDP) can result in QUIC | |||
| connection establishment failure; clients SHOULD attempt to use TCP- | connection establishment failure; clients SHOULD attempt to use TCP- | |||
| based versions of HTTP in this case. | based versions of HTTP in this case. | |||
| Servers MAY serve HTTP/3 on any UDP port; an alternative service | Servers MAY serve HTTP/3 on any UDP port; an alternative service | |||
| advertisement always includes an explicit port, and URLs contain | advertisement always includes an explicit port, and URLs contain | |||
| either an explicit port or a default port associated with the scheme. | either an explicit port or a default port associated with the scheme. | |||
| 3.2.1. HTTP Alternative Services | 3.1.1. HTTP Alternative Services | |||
| An HTTP origin advertises the availability of an equivalent HTTP/3 | An HTTP origin advertises the availability of an equivalent HTTP/3 | |||
| endpoint via the Alt-Svc HTTP response header field or the HTTP/2 | endpoint via the Alt-Svc HTTP response header field or the HTTP/2 | |||
| ALTSVC frame ([ALTSVC]), using the "h3" ALPN token. | ALTSVC frame ([ALTSVC]), using the "h3" ALPN token. | |||
| For example, an origin could indicate in an HTTP response that HTTP/3 | For example, an origin could indicate in an HTTP response that HTTP/3 | |||
| was available on UDP port 50781 at the same hostname by including the | was available on UDP port 50781 at the same hostname by including the | |||
| following header field: | following header field: | |||
| Alt-Svc: h3=":50781" | Alt-Svc: h3=":50781" | |||
| On receipt of an Alt-Svc record indicating HTTP/3 support, a client | On receipt of an Alt-Svc record indicating HTTP/3 support, a client | |||
| MAY attempt to establish a QUIC connection to the indicated host and | MAY attempt to establish a QUIC connection to the indicated host and | |||
| port; if this connection is successful, the client can send HTTP | port; if this connection is successful, the client can send HTTP | |||
| requests using the mapping described in this document. | requests using the mapping described in this document. | |||
| 3.2.2. Other Schemes | 3.1.2. Other Schemes | |||
| Although HTTP is independent of the transport protocol, the "http" | Although HTTP is independent of the transport protocol, the "http" | |||
| scheme associates authority with the ability to receive TCP | scheme associates authority with the ability to receive TCP | |||
| connections on the indicated port of whatever host is identified | connections on the indicated port of whatever host is identified | |||
| within the authority component. Because HTTP/3 does not use TCP, | within the authority component. Because HTTP/3 does not use TCP, | |||
| HTTP/3 cannot be used for direct access to the authoritative server | HTTP/3 cannot be used for direct access to the authoritative server | |||
| for a resource identified by an "http" URI. However, protocol | for a resource identified by an "http" URI. However, protocol | |||
| extensions such as [ALTSVC] permit the authoritative server to | extensions such as [ALTSVC] permit the authoritative server to | |||
| identify other services that are also authoritative and that might be | identify other services that are also authoritative and that might be | |||
| reachable over HTTP/3. | reachable over HTTP/3. | |||
| Prior to making requests for an origin whose scheme is not "https", | Prior to making requests for an origin whose scheme is not "https", | |||
| the client MUST ensure the server is willing to serve that scheme. | the client MUST ensure the server is willing to serve that scheme. | |||
| For origins whose scheme is "http", an experimental method to | For origins whose scheme is "http", an experimental method to | |||
| accomplish this is described in [RFC8164]. Other mechanisms might be | accomplish this is described in [RFC8164]. Other mechanisms might be | |||
| defined for various schemes in the future. | defined for various schemes in the future. | |||
| 3.3. Connection Establishment | 3.2. Connection Establishment | |||
| HTTP/3 relies on QUIC version 1 as the underlying transport. The use | HTTP/3 relies on QUIC version 1 as the underlying transport. The use | |||
| of other QUIC transport versions with HTTP/3 MAY be defined by future | of other QUIC transport versions with HTTP/3 MAY be defined by future | |||
| specifications. | specifications. | |||
| QUIC version 1 uses TLS version 1.3 or greater as its handshake | QUIC version 1 uses TLS version 1.3 or greater as its handshake | |||
| protocol. HTTP/3 clients MUST support a mechanism to indicate the | protocol. HTTP/3 clients MUST support a mechanism to indicate the | |||
| target host to the server during the TLS handshake. If the server is | target host to the server during the TLS handshake. If the server is | |||
| identified by a DNS name, clients MUST send the Server Name | identified by a DNS name, clients MUST send the Server Name | |||
| Indication (SNI; [RFC6066]) TLS extension unless an alternative | Indication (SNI; [RFC6066]) TLS extension unless an alternative | |||
| skipping to change at page 11, line 18 ¶ | skipping to change at page 11, line 5 ¶ | |||
| other application-layer protocols MAY be offered in the same | other application-layer protocols MAY be offered in the same | |||
| handshake. | handshake. | |||
| While connection-level options pertaining to the core QUIC protocol | While connection-level options pertaining to the core QUIC protocol | |||
| are set in the initial crypto handshake, HTTP/3-specific settings are | are set in the initial crypto handshake, HTTP/3-specific settings are | |||
| conveyed in the SETTINGS frame. After the QUIC connection is | conveyed in the SETTINGS frame. After the QUIC connection is | |||
| established, a SETTINGS frame (Section 7.2.4) MUST be sent by each | established, a SETTINGS frame (Section 7.2.4) MUST be sent by each | |||
| endpoint as the initial frame of their respective HTTP control | endpoint as the initial frame of their respective HTTP control | |||
| stream; see Section 6.2.1. | stream; see Section 6.2.1. | |||
| 3.4. Connection Reuse | 3.3. Connection Reuse | |||
| HTTP/3 connections are persistent across multiple requests. For best | HTTP/3 connections are persistent across multiple requests. For best | |||
| performance, it is expected that clients will not close connections | performance, it is expected that clients will not close connections | |||
| until it is determined that no further communication with a server is | until it is determined that no further communication with a server is | |||
| necessary (for example, when a user navigates away from a particular | necessary (for example, when a user navigates away from a particular | |||
| web page) or until the server closes the connection. | web page) or until the server closes the connection. | |||
| Once a connection exists to a server endpoint, this connection MAY be | Once a connection exists to a server endpoint, this connection MAY be | |||
| reused for requests with multiple different URI authority components. | reused for requests with multiple different URI authority components. | |||
| In general, a server is considered authoritative for all URIs with | ||||
| the "https" scheme for which the hostname in the URI is present in | ||||
| the authenticated certificate provided by the server, either as the | ||||
| CN field of the certificate subject or as a dNSName in the | ||||
| subjectAltName field of the certificate; see [RFC6125]. For a host | ||||
| that is an IP address, the client MUST verify that the address | ||||
| appears as an iPAddress in the subjectAltName field of the | ||||
| certificate. If the hostname or address is not present in the | ||||
| certificate, the client MUST NOT consider the server authoritative | ||||
| for origins containing that hostname or address. See Section 4.3 of | ||||
| [SEMANTICS] for more detail on authoritative access. | ||||
| Clients SHOULD NOT open more than one HTTP/3 connection to a given | Clients SHOULD NOT open more than one HTTP/3 connection to a given | |||
| host and port pair, where the host is derived from a URI, a selected | host and port pair, where the host is derived from a URI, a selected | |||
| alternative service ([ALTSVC]), or a configured proxy. A client MAY | alternative service ([ALTSVC]), or a configured proxy. A client MAY | |||
| open multiple HTTP/3 connections to the same IP address and UDP port | open multiple HTTP/3 connections to the same IP address and UDP port | |||
| using different transport or TLS configurations but SHOULD avoid | using different transport or TLS configurations but SHOULD avoid | |||
| creating multiple connections with the same configuration. | creating multiple connections with the same configuration. | |||
| Servers are encouraged to maintain open HTTP/3 connections for as | Servers are encouraged to maintain open HTTP/3 connections for as | |||
| long as possible but are permitted to terminate idle connections if | long as possible but are permitted to terminate idle connections if | |||
| necessary. When either endpoint chooses to close the HTTP/3 | necessary. When either endpoint chooses to close the HTTP/3 | |||
| skipping to change at page 12, line 22 ¶ | skipping to change at page 11, line 39 ¶ | |||
| A server that does not wish clients to reuse HTTP/3 connections for a | A server that does not wish clients to reuse HTTP/3 connections for a | |||
| particular origin can indicate that it is not authoritative for a | particular origin can indicate that it is not authoritative for a | |||
| request by sending a 421 (Misdirected Request) status code in | request by sending a 421 (Misdirected Request) status code in | |||
| response to the request; see Section 9.1.2 of [HTTP2]. | response to the request; see Section 9.1.2 of [HTTP2]. | |||
| 4. HTTP Request Lifecycle | 4. HTTP Request Lifecycle | |||
| 4.1. HTTP Message Exchanges | 4.1. HTTP Message Exchanges | |||
| A client sends an HTTP request on a client-initiated bidirectional | A client sends an HTTP request on a request stream, which is a | |||
| QUIC stream. A client MUST send only a single request on a given | client-initiated bidirectional QUIC stream; see Section 6.1. A | |||
| stream. A server sends zero or more interim HTTP responses on the | client MUST send only a single request on a given stream. A server | |||
| same stream as the request, followed by a single final HTTP response, | sends zero or more interim HTTP responses on the same stream as the | |||
| as detailed below. See Section 14 of [SEMANTICS] for a description | request, followed by a single final HTTP response, as detailed below. | |||
| of interim and final HTTP responses. | See Section 15 of [SEMANTICS] for a description of interim and final | |||
| HTTP responses. | ||||
| Pushed responses are sent on a server-initiated unidirectional QUIC | Pushed responses are sent on a server-initiated unidirectional QUIC | |||
| stream; see Section 6.2.2. A server sends zero or more interim HTTP | stream; see Section 6.2.2. A server sends zero or more interim HTTP | |||
| responses, followed by a single final HTTP response, in the same | responses, followed by a single final HTTP response, in the same | |||
| manner as a standard response. Push is described in more detail in | manner as a standard response. Push is described in more detail in | |||
| Section 4.4. | Section 4.4. | |||
| On a given stream, receipt of multiple requests or receipt of an | On a given stream, receipt of multiple requests or receipt of an | |||
| additional HTTP response following a final HTTP response MUST be | additional HTTP response following a final HTTP response MUST be | |||
| treated as malformed (Section 4.1.3). | treated as malformed (Section 4.1.3). | |||
| An HTTP message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
| 1. the header field section, sent as a single HEADERS frame (see | 1. the header field section, sent as a single HEADERS frame (see | |||
| Section 7.2.2), | Section 7.2.2), | |||
| 2. optionally, the payload body, if present, sent as a series of | 2. optionally, the payload data, if present, sent as a series of | |||
| DATA frames (see Section 7.2.1), and | DATA frames (see Section 7.2.1), and | |||
| 3. optionally, the trailer field section, if present, sent as a | 3. optionally, the trailer field section, if present, sent as a | |||
| single HEADERS frame. | single HEADERS frame. | |||
| Header and trailer field sections are described in Sections 5.4 and | Header and trailer field sections are described in Sections 6.3 and | |||
| 5.6 of [SEMANTICS]; the payload body is described in Section 5.5.4 of | 6.5 of [SEMANTICS]; the payload data is described in Section 6.4 of | |||
| [SEMANTICS]. | [SEMANTICS]. | |||
| Receipt of an invalid sequence of frames MUST be treated as a | Receipt of an invalid sequence of frames MUST be treated as a | |||
| connection error of type H3_FRAME_UNEXPECTED (Section 8). In | connection error of type H3_FRAME_UNEXPECTED; see Section 8. In | |||
| particular, a DATA frame before any HEADERS frame, or a HEADERS or | particular, a DATA frame before any HEADERS frame, or a HEADERS or | |||
| DATA frame after the trailing HEADERS frame is considered invalid. | DATA frame after the trailing HEADERS frame is considered invalid. | |||
| Other frame types, especially unknown frame types, might be permitted | Other frame types, especially unknown frame types, might be permitted | |||
| subject to their own rules; see Section 9. | subject to their own rules; see Section 9. | |||
| A server MAY send one or more PUSH_PROMISE frames (Section 7.2.5) | A server MAY send one or more PUSH_PROMISE frames (Section 7.2.5) | |||
| before, after, or interleaved with the frames of a response message. | before, after, or interleaved with the frames of a response message. | |||
| These PUSH_PROMISE frames are not part of the response; see | These PUSH_PROMISE frames are not part of the response; see | |||
| Section 4.4 for more details. PUSH_PROMISE frames are not permitted | Section 4.4 for more details. PUSH_PROMISE frames are not permitted | |||
| on push streams; a pushed response that includes PUSH_PROMISE frames | on push streams; a pushed response that includes PUSH_PROMISE frames | |||
| MUST be treated as a connection error of type H3_FRAME_UNEXPECTED. | MUST be treated as a connection error of type H3_FRAME_UNEXPECTED; | |||
| see Section 8. | ||||
| Frames of unknown types (Section 9), including reserved frames | Frames of unknown types (Section 9), including reserved frames | |||
| (Section 7.2.8) MAY be sent on a request or push stream before, | (Section 7.2.8) MAY be sent on a request or push stream before, | |||
| after, or interleaved with other frames described in this section. | after, or interleaved with other frames described in this section. | |||
| The HEADERS and PUSH_PROMISE frames might reference updates to the | The HEADERS and PUSH_PROMISE frames might reference updates to the | |||
| QPACK dynamic table. While these updates are not directly part of | QPACK dynamic table. While these updates are not directly part of | |||
| the message exchange, they must be received and processed before the | the message exchange, they must be received and processed before the | |||
| message can be consumed. See Section 4.1.1 for more details. | message can be consumed. See Section 4.1.1 for more details. | |||
| The "chunked" transfer encoding defined in Section 7.1 of [HTTP11] | The "chunked" transfer encoding defined in Section 7.1 of [HTTP11] | |||
| 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 interim responses (1xx; see Section 14.2 of [SEMANTICS]) precede | more interim responses (1xx; see Section 15.2 of [SEMANTICS]) precede | |||
| a final response to the same request. Interim responses do not | a final response to the same request. Interim responses do not | |||
| contain a payload body or trailers. | contain payload data or trailers. | |||
| An HTTP request/response exchange fully consumes a client-initiated | An HTTP request/response exchange fully consumes a client-initiated | |||
| bidirectional QUIC stream. After sending a request, a client MUST | bidirectional QUIC stream. After sending a request, a client MUST | |||
| close the stream for sending. Unless using the CONNECT method (see | close the stream for sending. Unless using the CONNECT method (see | |||
| Section 4.2), clients MUST NOT make stream closure dependent on | Section 4.2), clients MUST NOT make stream closure dependent on | |||
| receiving a response to their request. After sending a final | receiving a response to their request. After sending a final | |||
| response, the server MUST close the stream for sending. At this | response, the server MUST close the stream for sending. At this | |||
| point, the QUIC stream is fully closed. | point, the QUIC stream is fully closed. | |||
| When a stream is closed, this indicates the end of the final HTTP | When a stream is closed, this indicates the end of the final HTTP | |||
| message. Because some messages are large or unbounded, endpoints | message. Because some messages are large or unbounded, endpoints | |||
| SHOULD begin processing partial HTTP messages once enough of the | SHOULD begin processing partial HTTP messages once enough of the | |||
| message has been received to make progress. If a client-initiated | message has been received to make progress. If a client-initiated | |||
| stream terminates without enough of the HTTP message to provide a | stream terminates without enough of the HTTP message to provide a | |||
| complete response, the server SHOULD abort its response with the | complete response, the server SHOULD abort its response with the | |||
| error code H3_REQUEST_INCOMPLETE. | error code H3_REQUEST_INCOMPLETE; see Section 8. | |||
| 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 the server does | request that has not been sent and received. When the server does | |||
| not need to receive the remainder of the request, it MAY abort | not need to receive the remainder of the request, it MAY abort | |||
| reading the request stream, send a complete response, and cleanly | reading the request stream, send a complete response, and cleanly | |||
| close the sending part of the stream. The error code H3_NO_ERROR | close the sending part of the stream. The error code H3_NO_ERROR | |||
| SHOULD be used when requesting that the client stop sending on the | SHOULD be used when requesting that the client stop sending on the | |||
| request stream. Clients MUST NOT discard complete responses as a | request stream. Clients MUST NOT discard complete responses as a | |||
| result of having their request terminated abruptly, though clients | result of having their request terminated abruptly, though clients | |||
| can always discard responses at their discretion for other reasons. | can always discard responses at their discretion for other reasons. | |||
| If the server sends a partial or complete response but does not abort | If the server sends a partial or complete response but does not abort | |||
| reading the request, clients SHOULD continue sending the body of the | reading the request, clients SHOULD continue sending the body of the | |||
| request and close the stream normally. | request and close the stream normally. | |||
| 4.1.1. Field Formatting and Compression | 4.1.1. Field Formatting and Compression | |||
| HTTP messages carry metadata as a series of key-value pairs, called | HTTP messages carry metadata as a series of key-value pairs called | |||
| HTTP fields. For a listing of registered HTTP fields, see the | HTTP fields; see Sections 6.3 and 6.5 of [SEMANTICS]. For a listing | |||
| "Hypertext Transfer Protocol (HTTP) Field Name Registry" maintained | of registered HTTP fields, see the "Hypertext Transfer Protocol | |||
| at https://www.iana.org/assignments/http-fields/. | (HTTP) Field Name Registry" maintained at | |||
| https://www.iana.org/assignments/http-fields/. | ||||
| *Note:* This registry will not exist until [SEMANTICS] is | *Note:* This registry will not exist until [SEMANTICS] is | |||
| approved. *RFC Editor*, please remove this note prior to | approved. *RFC Editor*, please remove this note prior to | |||
| publication. | publication. | |||
| As in previous versions of HTTP, field names are strings containing a | As in previous versions of HTTP, field names are strings containing a | |||
| subset of ASCII characters that are compared in a case-insensitive | subset of ASCII characters that are compared in a case-insensitive | |||
| fashion. Properties of HTTP field names and values are discussed in | fashion. Properties of HTTP field names and values are discussed in | |||
| more detail in Section 5.4.3 of [SEMANTICS]. As in HTTP/2, | more detail in Section 5.1 of [SEMANTICS]. As in HTTP/2, characters | |||
| characters in field names MUST be converted to lowercase prior to | in field names MUST be converted to lowercase prior to their | |||
| their encoding. A request or response containing uppercase | encoding. A request or response containing uppercase characters in | |||
| characters in field names MUST be treated as malformed | field names MUST be treated as malformed (Section 4.1.3). | |||
| (Section 4.1.3). | ||||
| Like HTTP/2, HTTP/3 does not use the Connection header field to | Like HTTP/2, HTTP/3 does not use the Connection header field to | |||
| indicate connection-specific fields; in this protocol, connection- | indicate connection-specific fields; in this protocol, connection- | |||
| specific metadata is conveyed by other means. An endpoint MUST NOT | specific metadata is conveyed by other means. An endpoint MUST NOT | |||
| generate an HTTP/3 field section containing connection-specific | generate an HTTP/3 field section containing connection-specific | |||
| fields; any message containing connection-specific fields MUST be | fields; any message containing connection-specific fields MUST be | |||
| treated as malformed (Section 4.1.3). | treated as malformed (Section 4.1.3). | |||
| The only exception to this is the TE header field, which MAY be | The only exception to this is the TE header field, which MAY be | |||
| present in an HTTP/3 request header; when it is, it MUST NOT contain | present in an HTTP/3 request header; when it is, it MUST NOT contain | |||
| skipping to change at page 15, line 35 ¶ | skipping to change at page 15, line 12 ¶ | |||
| undefined or invalid pseudo-header fields as malformed | undefined or invalid pseudo-header fields as malformed | |||
| (Section 4.1.3). | (Section 4.1.3). | |||
| All pseudo-header fields MUST appear in the header field section | All pseudo-header fields MUST appear in the header field section | |||
| before regular header fields. Any request or response that contains | before regular header fields. Any request or response that contains | |||
| a pseudo-header field that appears in a header field section after a | a pseudo-header field that appears in a header field section after a | |||
| regular header field MUST be treated as malformed (Section 4.1.3). | regular header field MUST be treated as malformed (Section 4.1.3). | |||
| The following pseudo-header fields are defined for requests: | The following pseudo-header fields are defined for requests: | |||
| ":method": Contains the HTTP method (Section 8 of [SEMANTICS]) | ":method": Contains the HTTP method (Section 9 of [SEMANTICS]) | |||
| ":scheme": Contains the scheme portion of the target URI | ":scheme": Contains the scheme portion of the target URI | |||
| (Section 3.1 of [URI]) | (Section 3.1 of [URI]) | |||
| ":scheme" is not restricted to "http" and "https" schemed URIs. A | ":scheme" is not restricted to "http" and "https" schemed URIs. A | |||
| proxy or gateway can translate requests for non-HTTP schemes, | proxy or gateway can translate requests for non-HTTP schemes, | |||
| enabling the use of HTTP to interact with non-HTTP services. | enabling the use of HTTP to interact with non-HTTP services. | |||
| ":authority": Contains the authority portion of the target URI | ":authority": Contains the authority portion of the target URI | |||
| (Section 3.2 of [URI]). The authority MUST NOT include the | (Section 3.2 of [URI]). The authority MUST NOT include the | |||
| skipping to change at page 16, line 47 ¶ | skipping to change at page 16, line 22 ¶ | |||
| ":authority" pseudo-header or "Host" header fields. | ":authority" pseudo-header or "Host" header fields. | |||
| An HTTP request that omits mandatory pseudo-header fields or contains | An HTTP request that omits mandatory pseudo-header fields or contains | |||
| invalid values for those pseudo-header fields is malformed | invalid values for those pseudo-header fields is malformed | |||
| (Section 4.1.3). | (Section 4.1.3). | |||
| HTTP/3 does not define a way to carry the version identifier that is | HTTP/3 does not define a way to carry the version identifier that is | |||
| included in the HTTP/1.1 request line. | included in the HTTP/1.1 request line. | |||
| For responses, a single ":status" pseudo-header field is defined that | For responses, a single ":status" pseudo-header field is defined that | |||
| carries the HTTP status code; see Section 14 of [SEMANTICS]. This | carries the HTTP status code; see Section 15 of [SEMANTICS]. This | |||
| pseudo-header field MUST be included in all responses; otherwise, the | pseudo-header field MUST be included in all responses; otherwise, the | |||
| response is malformed (Section 4.1.3). | response is malformed (Section 4.1.3). | |||
| HTTP/3 does not define a way to carry the version or reason phrase | HTTP/3 does not define a way to carry the version or reason phrase | |||
| that is included in an HTTP/1.1 status line. | that is included in an HTTP/1.1 status line. | |||
| 4.1.1.2. Field Compression | 4.1.1.2. Field Compression | |||
| HTTP/3 uses QPACK field compression as described in [QPACK], a | HTTP/3 uses QPACK field compression as described in [QPACK], a | |||
| variation of HPACK that allows the flexibility to avoid compression- | variation of HPACK that allows the flexibility to avoid compression- | |||
| skipping to change at page 17, line 40 ¶ | skipping to change at page 17, line 12 ¶ | |||
| code ([RFC6585]). A client can discard responses that it cannot | code ([RFC6585]). A client can discard responses that it cannot | |||
| process. The size of a field list is calculated based on the | process. The size of a field list is calculated based on the | |||
| uncompressed size of fields, including the length of the name and | uncompressed size of fields, including the length of the name and | |||
| value in bytes plus an overhead of 32 bytes for each field. | value in bytes plus an overhead of 32 bytes for each field. | |||
| If an implementation wishes to advise its peer of this limit, it can | If an implementation wishes to advise its peer of this limit, it can | |||
| be conveyed as a number of bytes in the | be conveyed as a number of bytes in the | |||
| SETTINGS_MAX_FIELD_SECTION_SIZE parameter. An implementation that | SETTINGS_MAX_FIELD_SECTION_SIZE parameter. An implementation that | |||
| has received this parameter SHOULD NOT send an HTTP message header | has received this parameter SHOULD NOT send an HTTP message header | |||
| that exceeds the indicated size, as the peer will likely refuse to | that 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, an HTTP message can traverse one or more | |||
| messages below this limit are not guaranteed to be accepted. | intermediaries before reaching the origin server; see Section 3.6 of | |||
| [SEMANTICS]. Because this limit is applied separately by each | ||||
| implementation which processes the message, messages below this limit | ||||
| are not guaranteed to be accepted. | ||||
| 4.1.2. Request Cancellation and Rejection | 4.1.2. Request Cancellation and Rejection | |||
| Once a request stream has been opened, the request MAY be cancelled | Once a request stream has been opened, the request MAY be cancelled | |||
| by either endpoint. Clients cancel requests if the response is no | by either endpoint. Clients cancel requests if the response is no | |||
| longer of interest; servers cancel requests if they are unable to or | longer of interest; servers cancel requests if they are unable to or | |||
| choose not to respond. When possible, it is RECOMMENDED that servers | choose not to respond. When possible, it is RECOMMENDED that servers | |||
| send an HTTP response with an appropriate status code rather than | send an HTTP response with an appropriate status code rather than | |||
| canceling a request it has already begun processing. | canceling a request it has already begun processing. | |||
| skipping to change at page 18, line 34 ¶ | skipping to change at page 18, line 8 ¶ | |||
| Client SHOULD use the error code H3_REQUEST_CANCELLED to cancel | Client SHOULD use the error code H3_REQUEST_CANCELLED to cancel | |||
| requests. Upon receipt of this error code, a server MAY abruptly | requests. Upon receipt of this error code, a server MAY abruptly | |||
| terminate the response using the error code H3_REQUEST_REJECTED if no | terminate the response using the error code H3_REQUEST_REJECTED if no | |||
| processing was performed. Clients MUST NOT use the | processing was performed. Clients MUST NOT use the | |||
| H3_REQUEST_REJECTED error code, except when a server has requested | H3_REQUEST_REJECTED error code, except when a server has requested | |||
| closure of the request stream with this error code. | closure of the request stream with this error code. | |||
| If a stream is canceled after receiving a complete response, the | If a stream is canceled 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. Only idempotent actions such as GET, | |||
| not possible, unless this is otherwise permitted (e.g., idempotent | PUT, or DELETE can be safely retried; a client SHOULD NOT | |||
| actions like GET, PUT, or DELETE). | automatically retry a request with a non-idempotent method unless it | |||
| has some means to know that the request semantics are idempotent | ||||
| independent of the method or some means to detect that the original | ||||
| request was never applied. See Section 9.2.2 of [SEMANTICS] for more | ||||
| details. | ||||
| 4.1.3. Malformed Requests and Responses | 4.1.3. Malformed Requests and Responses | |||
| A malformed request or response is one that is an otherwise valid | A malformed request or response is one that is an otherwise valid | |||
| sequence of frames but is invalid due to: | sequence of frames but is invalid due to: | |||
| * the presence of prohibited fields or pseudo-header fields, | * the presence of prohibited fields or pseudo-header fields, | |||
| * the absence of mandatory pseudo-header fields, | * the absence of mandatory pseudo-header fields, | |||
| skipping to change at page 19, line 4 ¶ | skipping to change at page 18, line 30 ¶ | |||
| * the presence of prohibited fields or pseudo-header fields, | * the presence of prohibited fields or pseudo-header fields, | |||
| * the absence of mandatory pseudo-header fields, | * the absence of mandatory pseudo-header fields, | |||
| * invalid values for pseudo-header fields, | * invalid values for pseudo-header fields, | |||
| * pseudo-header fields after fields, | * pseudo-header fields after fields, | |||
| * an invalid sequence of HTTP messages, | * an invalid sequence of HTTP messages, | |||
| * the inclusion of uppercase field names, or | * the inclusion of uppercase field names, or | |||
| * the inclusion of invalid characters in field names or values | * the inclusion of invalid characters in field names or values. | |||
| A request or response that includes a payload body can include a | A request or response that includes payload data can include a | |||
| Content-Length header field. A request or response is also malformed | Content-Length header field. A request or response is also malformed | |||
| if the value of a content-length header field does not equal the sum | if the value of a Content-Length header field does not equal the sum | |||
| of the DATA frame payload lengths that form the body. A response | of the DATA frame lengths that form the payload data. A response | |||
| that is defined to have no payload, as described in Section 5.5.4 of | that is defined to have no payload, as described in Section 6.4 of | |||
| [SEMANTICS], can have a non-zero content-length field, even though no | [SEMANTICS], can have a non-zero Content-Length field, even though no | |||
| content is included in DATA frames. | 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 | |||
| H3_GENERAL_PROTOCOL_ERROR. | H3_MESSAGE_ERROR. | |||
| For malformed requests, a server MAY send an HTTP response indicating | For malformed requests, a server MAY send an HTTP response indicating | |||
| the error prior to closing or resetting the stream. Clients MUST NOT | the error prior to closing or resetting the stream. Clients MUST NOT | |||
| accept a malformed response. Note that these requirements are | accept a malformed response. Note that these requirements are | |||
| intended to protect against several types of common attacks against | intended to protect against several types of common attacks against | |||
| HTTP; they are deliberately strict because being permissive can | HTTP; they are deliberately strict because being permissive can | |||
| expose implementations to these vulnerabilities. | expose implementations to these vulnerabilities. | |||
| 4.2. The CONNECT Method | 4.2. The CONNECT Method | |||
| The CONNECT method requests that the recipient establish a tunnel to | The CONNECT method requests that the recipient establish a tunnel to | |||
| the destination origin server identified by the request-target | the destination origin server identified by the request-target; see | |||
| (Section 3.2 of [HTTP11]). It is primarily used with HTTP proxies to | Section 9.3.6 of [SEMANTICS]. It is primarily used with HTTP proxies | |||
| establish a TLS session with an origin server for the purposes of | to establish a TLS session with an origin server for the purposes of | |||
| interacting with "https" resources. | interacting with "https" resources. | |||
| In HTTP/1.x, CONNECT is used to convert an entire HTTP connection | In HTTP/1.x, CONNECT is used to convert an entire HTTP connection | |||
| into a tunnel to a remote host. In HTTP/2 and HTTP/3, the CONNECT | into a tunnel to a remote host. In HTTP/2 and HTTP/3, the CONNECT | |||
| method is used to establish a tunnel over a single stream. | method is used to establish a tunnel over a single stream. | |||
| A CONNECT request MUST be constructed as follows: | A CONNECT request MUST be constructed as follows: | |||
| * The ":method" pseudo-header field is set to "CONNECT" | * The ":method" pseudo-header field is set to "CONNECT" | |||
| skipping to change at page 20, line 13 ¶ | skipping to change at page 19, line 42 ¶ | |||
| of CONNECT requests; see Section 3.2.3 of [HTTP11]) | of CONNECT requests; see Section 3.2.3 of [HTTP11]) | |||
| The request stream remains open at the end of the request to carry | The request stream remains open at the end of the request to carry | |||
| the data to be transferred. A CONNECT request that does not conform | the data to be transferred. A CONNECT request that does not conform | |||
| to these restrictions is malformed; see Section 4.1.3. | to these restrictions is malformed; see Section 4.1.3. | |||
| A proxy that supports CONNECT establishes a TCP connection | A proxy that supports CONNECT establishes a TCP connection | |||
| ([RFC0793]) to the server identified in the ":authority" pseudo- | ([RFC0793]) to the server identified in the ":authority" pseudo- | |||
| header field. Once this connection is successfully established, the | header field. Once this connection is successfully established, the | |||
| proxy sends a HEADERS frame containing a 2xx series status code to | proxy sends a HEADERS frame containing a 2xx series status code to | |||
| the client, as defined in Section 14.3 of [SEMANTICS]. | the client, as defined in Section 15.3 of [SEMANTICS]. | |||
| All DATA frames on the stream correspond to data sent or received on | All DATA frames on the stream correspond to data sent or received on | |||
| the TCP connection. The payload of any DATA frame sent by the client | the TCP connection. The payload of any DATA frame sent by the client | |||
| is transmitted by the proxy to the TCP server; data received from the | is transmitted by the proxy to the TCP server; data received from the | |||
| TCP server is packaged into DATA frames by the proxy. Note that the | TCP server is packaged into DATA frames by the proxy. Note that the | |||
| size and number of TCP segments is not guaranteed to map predictably | size and number of TCP segments is not guaranteed to map predictably | |||
| to the size and number of HTTP DATA or QUIC STREAM frames. | to the 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 known frame type MUST be treated as a connection error | of any other known frame type MUST be treated as a connection error | |||
| of type H3_FRAME_UNEXPECTED. | of type H3_FRAME_UNEXPECTED; see Section 8. | |||
| 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 close the send stream that it sends to the | the FIN bit set, it will close the send stream that it sends to the | |||
| client. TCP connections that remain half-closed in a single | client. TCP connections that 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 H3_CONNECT_ERROR (Section 8.1). Correspondingly, if a | error of type H3_CONNECT_ERROR; see Section 8. Correspondingly, if 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 (Section 6.6 of | HTTP/3 does not support the HTTP Upgrade mechanism (Section 7.8 of | |||
| [SEMANTICS]) or 101 (Switching Protocols) informational status code | [SEMANTICS]) or 101 (Switching Protocols) informational status code | |||
| (Section 14.2.2 of [SEMANTICS]). | (Section 15.2.2 of [SEMANTICS]). | |||
| 4.4. Server Push | 4.4. Server Push | |||
| Server push is an interaction mode that permits a server to push a | Server push is an interaction mode that permits a server to push a | |||
| request-response exchange to a client in anticipation of the client | request-response exchange to a client in anticipation of the client | |||
| making the indicated request. This trades off network usage against | making the indicated request. This trades off network usage against | |||
| a potential latency gain. HTTP/3 server push is similar to what is | a potential latency gain. HTTP/3 server push is similar to what is | |||
| described in Section 8.2 of [HTTP2], but uses different mechanisms. | described in Section 8.2 of [HTTP2], but uses different mechanisms. | |||
| Each server push is assigned a unique Push ID by the server. The | Each server push is assigned a unique Push ID by the server. The | |||
| Push ID is used to refer to the push in various contexts throughout | Push ID is used to refer to the push in various contexts throughout | |||
| the lifetime of the HTTP/3 connection. | the lifetime of the HTTP/3 connection. | |||
| The Push ID space begins at zero, and ends at a maximum value set by | The Push ID space begins at zero, and ends at a maximum value set by | |||
| the MAX_PUSH_ID frame; see Section 7.2.7. In particular, a server is | the MAX_PUSH_ID frame; see Section 7.2.7. In particular, a server is | |||
| not able to push until after the client sends a MAX_PUSH_ID frame. A | not able to push until after the client sends a MAX_PUSH_ID frame. A | |||
| client sends MAX_PUSH_ID frames to control the number of pushes that | client sends MAX_PUSH_ID frames to control the number of pushes that | |||
| a server can promise. A server SHOULD use Push IDs sequentially, | a server can promise. A server SHOULD use Push IDs sequentially, | |||
| beginning from zero. A client MUST treat receipt of a push stream as | beginning from zero. A client MUST treat receipt of a push stream as | |||
| a connection error of type H3_ID_ERROR when no MAX_PUSH_ID frame has | a connection error of type H3_ID_ERROR (Section 8) when no | |||
| been sent or when the stream references a Push ID that is greater | MAX_PUSH_ID frame has been sent or when the stream references a Push | |||
| than the maximum Push ID. | ID that is greater than the maximum Push ID. | |||
| The Push ID is used in one or more PUSH_PROMISE frames | The Push ID is used in one or more PUSH_PROMISE frames | |||
| (Section 7.2.5) that carry the header section of the request message. | (Section 7.2.5) that carry the header section of the request message. | |||
| These frames are sent on the request stream that generated the push. | These frames are sent on the request stream that 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. | |||
| When the same Push ID is promised on multiple request streams, the | When the same Push ID is promised on multiple request streams, the | |||
| decompressed request field sections MUST contain the same fields in | decompressed request field sections MUST contain the same fields in | |||
| the same order, and both the name and the value in each field MUST be | the same order, and both the name and the value in each field MUST be | |||
| identical. | identical. | |||
| skipping to change at page 21, line 49 ¶ | skipping to change at page 21, line 30 ¶ | |||
| a response to the promised request as described in Section 4.1. | a response to the promised request as described in Section 4.1. | |||
| Finally, the Push ID can be used in CANCEL_PUSH frames; see | Finally, the Push ID can be used in CANCEL_PUSH frames; see | |||
| Section 7.2.3. Clients use this frame to indicate they do not wish | Section 7.2.3. Clients use this frame to indicate they do not wish | |||
| to receive a promised resource. Servers use this frame to indicate | to receive a promised resource. Servers use this frame to indicate | |||
| they will not be fulfilling a previous promise. | they will not be fulfilling a previous promise. | |||
| Not all requests can be pushed. A server MAY push requests that have | Not all requests can be pushed. A server MAY push requests that have | |||
| the following properties: | the following properties: | |||
| * cacheable; see Section 8.2.3 of [SEMANTICS] | * cacheable; see Section 9.2.3 of [SEMANTICS] | |||
| * safe; see Section 9.2.1 of [SEMANTICS] | ||||
| * safe; see Section 8.2.1 of [SEMANTICS] | ||||
| * does not include a request body or trailer section | * does not include a request body or trailer section | |||
| The server MUST include a value in the ":authority" pseudo-header | The server MUST include a value in the ":authority" pseudo-header | |||
| field for which the server is authoritative; see Section 3.4. | field for which the server is authoritative; see Section 3.3. | |||
| Clients SHOULD send a CANCEL_PUSH frame upon receipt of a | Clients SHOULD send a CANCEL_PUSH frame upon receipt of a | |||
| PUSH_PROMISE frame carrying a request that is not cacheable, is not | PUSH_PROMISE frame carrying a request that is not cacheable, is not | |||
| known to be safe, that indicates the presence of a request body, or | known to be safe, that indicates the presence of a request body, or | |||
| for which it does not consider the server authoritative. Any | for which it does not consider the server authoritative. Any | |||
| corresponding responses MUST NOT be used or cached. | corresponding responses MUST NOT be used or cached. | |||
| Each pushed response is associated with one or more client requests. | Each pushed response is associated with one or more client requests. | |||
| The push is associated with the request stream on which the | The push is associated with the request stream on which the | |||
| PUSH_PROMISE frame was received. The same server push can be | PUSH_PROMISE frame was received. The same server push can be | |||
| skipping to change at page 23, line 22 ¶ | skipping to change at page 22, line 49 ¶ | |||
| 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 | |||
| the QUIC connection remains idle (no packets received) for longer | the QUIC connection remains idle (no packets received) for longer | |||
| than this duration, the peer will assume that the connection has been | than this duration, the peer will assume that the connection has been | |||
| closed. HTTP/3 implementations will need to open a new HTTP/3 | closed. HTTP/3 implementations will need to open a new HTTP/3 | |||
| connection for new requests if the existing connection has been idle | connection for new requests if the existing connection has been idle | |||
| for longer than the server's advertised idle timeout, and SHOULD do | for longer than the idle timeout negotiated during the QUIC | |||
| so if approaching the idle timeout. | handshake, and SHOULD do so if approaching the idle timeout; see | |||
| Section 10.1 of [QUIC-TRANSPORT]. | ||||
| HTTP clients are expected to request that the transport keep | HTTP clients are expected to request that the transport keep | |||
| connections open while there are responses outstanding for requests | connections open while there are responses outstanding for requests | |||
| or server pushes, as described in Section 10.1.2 of [QUIC-TRANSPORT]. | or server pushes, as described in Section 10.1.2 of [QUIC-TRANSPORT]. | |||
| If the client is not expecting a response from the server, allowing | If the client is not expecting a response from the server, allowing | |||
| an idle connection to time out is preferred over expending effort | an idle connection to time out is preferred over expending effort | |||
| maintaining a connection that might not be needed. A gateway MAY | maintaining a connection that might not be needed. A gateway MAY | |||
| maintain connections in anticipation of need rather than incur the | maintain connections in anticipation of need rather than incur the | |||
| latency cost of connection establishment to servers. Servers SHOULD | latency cost of connection establishment to servers. Servers SHOULD | |||
| NOT actively keep connections open. | NOT actively keep connections open. | |||
| skipping to change at page 24, line 49 ¶ | skipping to change at page 24, line 31 ¶ | |||
| or not. For example, if an HTTP client sends a POST at the same time | or not. For example, if an HTTP client sends a POST at the same time | |||
| that a server closes a QUIC connection, the client cannot know if the | that a server closes a QUIC connection, the client cannot know if the | |||
| server started to process that POST request if the server does not | server started to process that POST request if the server does not | |||
| send a GOAWAY frame to indicate what streams it might have acted on. | send a GOAWAY frame to indicate what streams it might have acted on. | |||
| An endpoint MAY send multiple GOAWAY frames indicating different | An endpoint MAY send multiple GOAWAY frames indicating different | |||
| identifiers, but the identifier in each frame MUST NOT be greater | identifiers, but the identifier in each frame MUST NOT be greater | |||
| than the identifier in any previous frame, since clients might | than the identifier in any previous frame, since clients might | |||
| already have retried unprocessed requests on another HTTP connection. | already have retried unprocessed requests on another HTTP connection. | |||
| Receiving a GOAWAY containing a larger identifier than previously | Receiving a GOAWAY containing a larger identifier than previously | |||
| received MUST be treated as a connection error of type H3_ID_ERROR. | received MUST be treated as a connection error of type H3_ID_ERROR; | |||
| see Section 8. | ||||
| An endpoint that is attempting to gracefully shut down a connection | An endpoint that is attempting to gracefully shut down a connection | |||
| can send a GOAWAY frame with a value set to the maximum possible | can send a GOAWAY frame with a value set to the maximum possible | |||
| value (2^62-4 for servers, 2^62-1 for clients). This ensures that | value (2^62-4 for servers, 2^62-1 for clients). This ensures that | |||
| the peer stops creating new requests or pushes. After allowing time | the peer stops creating new requests or pushes. After allowing time | |||
| for any in-flight requests or pushes to arrive, the endpoint can send | for any in-flight requests or pushes to arrive, the endpoint can send | |||
| another GOAWAY frame indicating which requests or pushes it might | another GOAWAY frame indicating which requests or pushes it might | |||
| accept before the end of the connection. This ensures that a | accept before the end of the connection. This ensures that a | |||
| connection can be cleanly shut down without losing requests. | connection can be cleanly shut down without losing requests. | |||
| skipping to change at page 26, line 24 ¶ | skipping to change at page 26, line 4 ¶ | |||
| might have been processed. | might have been processed. | |||
| 6. Stream Mapping and Usage | 6. Stream Mapping and Usage | |||
| A QUIC stream provides reliable in-order delivery of bytes, but makes | A QUIC stream provides reliable in-order delivery of bytes, but makes | |||
| no guarantees about order of delivery with regard to bytes on other | no guarantees about order of delivery with regard to bytes on other | |||
| streams. On the wire, data is framed into QUIC STREAM frames, but | streams. On the wire, data is framed into QUIC STREAM frames, but | |||
| this framing is invisible to the HTTP framing layer. The transport | this framing is invisible to the HTTP framing layer. The transport | |||
| layer buffers and orders received QUIC STREAM frames, exposing the | layer buffers and orders received QUIC STREAM frames, exposing the | |||
| data contained within as a reliable byte stream to the application. | data contained within as a reliable byte stream to the application. | |||
| Although QUIC permits out-of-order delivery within a stream, HTTP/3 | Although QUIC permits out-of-order delivery within a stream, HTTP/3 | |||
| does not make use of this feature. | does not make use of this feature. | |||
| QUIC streams can be either unidirectional, carrying data only from | QUIC streams can be either unidirectional, carrying data only from | |||
| initiator to receiver, or bidirectional. Streams can be initiated by | initiator to receiver, or bidirectional. Streams can be initiated by | |||
| either the client or the server. For more detail on QUIC streams, | either the client or the server. For more detail on QUIC streams, | |||
| see Section 2 of [QUIC-TRANSPORT]. | see Section 2 of [QUIC-TRANSPORT]. | |||
| When HTTP fields and data are sent over QUIC, the QUIC layer handles | When HTTP fields and data are sent over QUIC, the QUIC layer handles | |||
| most of the stream management. HTTP does not need to do any separate | most of the stream management. HTTP does not need to do any separate | |||
| multiplexing when using QUIC - data sent over a QUIC stream always | multiplexing when using QUIC - data sent over a QUIC stream always | |||
| maps to a particular HTTP transaction or to the entire HTTP/3 | maps to a particular HTTP transaction or to the entire HTTP/3 | |||
| connection context. | 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. These streams are referred | |||
| first request occurs on QUIC stream 0, with subsequent requests on | to as request streams. | |||
| 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 | This means that the client's first request occurs on QUIC stream 0, | |||
| of permitted streams and the initial stream flow control window. So | with subsequent requests on stream 4, 8, and so on. In order to | |||
| as to not unnecessarily limit parallelism, at least 100 requests | permit these streams to open, an HTTP/3 server SHOULD configure non- | |||
| SHOULD be permitted at a time. | zero minimum values for the number of permitted streams and the | |||
| initial stream flow control window. So as to not unnecessarily limit | ||||
| parallelism, at least 100 requests 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 H3_STREAM_CREATION_ERROR unless such an extension has | error of type H3_STREAM_CREATION_ERROR (Section 8) unless such an | |||
| been negotiated. | extension has 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. | |||
| Unidirectional Stream Header { | Unidirectional Stream Header { | |||
| skipping to change at page 28, line 45 ¶ | skipping to change at page 28, line 20 ¶ | |||
| 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 | |||
| H3_MISSING_SETTINGS. Only one control stream per peer is permitted; | H3_MISSING_SETTINGS. Only one control stream per peer is permitted; | |||
| receipt of a second stream claiming to be a control stream MUST be | receipt of a second stream claiming to be a control stream MUST be | |||
| treated as a connection error of type H3_STREAM_CREATION_ERROR. The | treated as a connection error of type H3_STREAM_CREATION_ERROR. The | |||
| sender MUST NOT close the control stream, and the receiver MUST NOT | sender MUST NOT close the control stream, and the receiver MUST NOT | |||
| request that the sender close the control stream. If either control | request that the sender close the control stream. If either control | |||
| stream is closed at any point, this MUST be treated as a connection | stream is closed at any point, this MUST be treated as a connection | |||
| error of type H3_CLOSED_CRITICAL_STREAM. | error of type H3_CLOSED_CRITICAL_STREAM. Connection errors are | |||
| described in Section 8. | ||||
| 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 QUIC | as it is able. Depending on whether 0-RTT is enabled on the QUIC | |||
| 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 29, line 21 ¶ | skipping to change at page 28, line 45 ¶ | |||
| A push stream is indicated by a stream type of 0x01, followed by the | 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-length | Push ID of the promise that it fulfills, encoded as a variable-length | |||
| integer. The remaining data on this stream consists of HTTP/3 | 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 interim HTTP responses followed by a single | push by zero or more interim 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 | |||
| H3_STREAM_CREATION_ERROR. | H3_STREAM_CREATION_ERROR; see Section 8. | |||
| Push Stream Header { | Push Stream Header { | |||
| Stream Type (i) = 0x01, | Stream Type (i) = 0x01, | |||
| 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 H3_ID_ERROR. | type H3_ID_ERROR; see Section 8. | |||
| 6.2.3. Reserved Stream Types | 6.2.3. Reserved Stream Types | |||
| Stream types of the format "0x1f * N + 0x21" for non-negative integer | Stream types of the format "0x1f * N + 0x21" for non-negative integer | |||
| values of N are reserved to exercise the requirement that unknown | values of N are reserved to exercise the requirement that unknown | |||
| types be ignored. These streams have no semantics, and can be sent | types be ignored. These streams have no semantics, and can be sent | |||
| when application-layer padding is desired. They MAY also be sent on | when 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 31, line 14 ¶ | skipping to change at page 31, line 4 ¶ | |||
| 7.1. Frame Layout | 7.1. Frame Layout | |||
| All frames have the following format: | All frames have the following format: | |||
| HTTP/3 Frame Format { | HTTP/3 Frame Format { | |||
| Type (i), | Type (i), | |||
| Length (i), | Length (i), | |||
| 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 in bytes | Length: A variable-length integer that describes the length in bytes | |||
| of the 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 (Section 8) of type H3_FRAME_ERROR. | error of type H3_FRAME_ERROR; see Section 8. | |||
| 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 of type | |||
| type H3_FRAME_ERROR. Streams that terminate abruptly may be reset at | H3_FRAME_ERROR; see Section 8. Streams that terminate abruptly may | |||
| any point in a frame. | be reset 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 body. | bytes associated with HTTP request or response payload data. | |||
| 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 of type H3_FRAME_UNEXPECTED; see | |||
| H3_FRAME_UNEXPECTED. | Section 8. | |||
| DATA Frame { | DATA Frame { | |||
| Type (i) = 0x0, | Type (i) = 0x0, | |||
| Length (i), | Length (i), | |||
| Data (..), | Data (..), | |||
| } | } | |||
| Figure 4: DATA Frame | Figure 4: DATA Frame | |||
| 7.2.2. HEADERS | 7.2.2. HEADERS | |||
| skipping to change at page 38, line 14 ¶ | skipping to change at page 37, line 35 ¶ | |||
| 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 | |||
| consume server push responses and not retain them for reuse over | consume server push responses and not retain them for reuse over | |||
| time. Clients that see a PUSH_PROMISE frame that uses a Push ID that | time. Clients that see a PUSH_PROMISE frame that uses a Push ID that | |||
| they have already consumed and discarded are forced to ignore the | they have already consumed and discarded are forced to ignore the | |||
| promise. | promise. | |||
| 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 of type H3_FRAME_UNEXPECTED; see | |||
| H3_FRAME_UNEXPECTED. | Section 8. | |||
| 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 | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED; see Section 8. | |||
| 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 | |||
| an HTTP/3 connection by either endpoint. GOAWAY allows an endpoint | an HTTP/3 connection by either endpoint. GOAWAY allows an endpoint | |||
| to stop accepting new requests or pushes while still finishing | to stop accepting new requests or pushes while still finishing | |||
| processing of previously received requests and pushes. This enables | processing of previously received requests and pushes. This enables | |||
| skipping to change at page 39, line 7 ¶ | skipping to change at page 38, line 33 ¶ | |||
| to client direction, it carries a QUIC Stream ID for a client- | to client direction, it carries a QUIC Stream ID for a client- | |||
| initiated bidirectional stream encoded as a variable-length integer. | initiated bidirectional stream encoded as a variable-length integer. | |||
| A client MUST treat receipt of a GOAWAY frame containing a Stream ID | A client MUST treat receipt of a GOAWAY frame containing a Stream ID | |||
| of any other type as a connection error of type H3_ID_ERROR. | of any other type as a connection error of type H3_ID_ERROR. | |||
| In the client to server direction, the GOAWAY frame carries a Push ID | In the client to server direction, the GOAWAY frame carries a Push ID | |||
| encoded as a variable-length integer. | encoded as a variable-length integer. | |||
| The GOAWAY frame applies to the entire connection, not a specific | The GOAWAY frame applies to the entire connection, not a specific | |||
| stream. A client MUST treat a GOAWAY frame on a stream other than | stream. A client MUST treat a GOAWAY frame on a stream other than | |||
| the control stream as a connection error (Section 8) of type | the control stream as a connection error of type H3_FRAME_UNEXPECTED; | |||
| H3_FRAME_UNEXPECTED. | see Section 8. | |||
| 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 PUSH_PROMISE | maximum value for a Push ID that the server can use in PUSH_PROMISE | |||
| and CANCEL_PUSH frames. Consequently, this also limits the number of | and CANCEL_PUSH frames. Consequently, this also limits the number of | |||
| push streams that the server can initiate in addition to the limit | push streams that the server can initiate in addition to the limit | |||
| skipping to change at page 40, line 24 ¶ | skipping to change at page 40, line 7 ¶ | |||
| 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 that were used in HTTP/2 where there is no corresponding | Frame types that were used in HTTP/2 where there is no corresponding | |||
| HTTP/3 frame have also been reserved (Section 11.2.1). These frame | HTTP/3 frame have also been reserved (Section 11.2.1). These frame | |||
| types MUST NOT be sent, and their receipt MUST be treated as a | types MUST NOT be sent, and their receipt MUST be treated as a | |||
| connection error of type H3_FRAME_UNEXPECTED. | connection error of type H3_FRAME_UNEXPECTED. | |||
| 8. Error Handling | 8. Error Handling | |||
| QUIC allows the application to abruptly terminate (reset) individual | When a stream cannot be completed successfully, QUIC allows the | |||
| streams or the entire connection; see Sections 2.4 and 5.3 of | application to abruptly terminate (reset) that stream and communicate | |||
| [QUIC-TRANSPORT]. These are referred to as "stream errors" or | a reason; see Section 2.4 of [QUIC-TRANSPORT]. This is referred to | |||
| "connection errors" (see Section 11 of [QUIC-TRANSPORT]) and have | as a "stream error." An HTTP/3 implementation can decide to close a | |||
| associated error codes, but do not necessarily indicate a problem | QUIC stream and communicate the type of error. Wire encodings of | |||
| with the connection or either implementation. For example, a stream | error codes are defined in Section 8.1. Stream errors are distinct | |||
| can be reset if the requested resource is no longer needed. | from HTTP status codes which indicate error conditions. Stream | |||
| errors indicate that the sender did not transfer or consume the full | ||||
| request or response, while HTTP status codes indicate the result of a | ||||
| request that was successfully received. | ||||
| If an entire connection needs to be terminated, QUIC similarly | ||||
| provides mechanisms to communicate a reason; see Section 5.3 of | ||||
| [QUIC-TRANSPORT]. This is referred to as a "connection error." | ||||
| Similar to stream errors, an HTTP/3 implementation can terminate a | ||||
| QUIC connection and communicate the reason using an error code from | ||||
| Section 8.1. | ||||
| Although the reasons for closing streams and connections are called | ||||
| "errors," these actions do not necessarily indicate a problem with | ||||
| the connection or either implementation. For example, a stream can | ||||
| be reset if the requested resource is no longer needed. | ||||
| An endpoint MAY choose to treat a stream error as a connection error | An endpoint MAY choose to treat a stream error as a connection error | |||
| under certain circumstances. Implementations need to consider the | under certain circumstances, closing the entire connection in | |||
| impact on outstanding requests before making this choice. | response to a condition on a single stream. Implementations need to | |||
| consider the impact on outstanding requests before making this | ||||
| choice. | ||||
| Because new error codes can be defined without negotiation (see | Because new error codes can be defined without negotiation (see | |||
| Section 9), use of an error code in an unexpected context or receipt | Section 9), use of an error code in an unexpected context or receipt | |||
| of an unknown error code MUST be treated as equivalent to | of an unknown error code MUST be treated as equivalent to | |||
| H3_NO_ERROR. However, closing a stream can have other effects | H3_NO_ERROR. However, closing a stream can have other effects | |||
| regardless of the error code; for example, see Section 4.1. | regardless of the error code; for example, see Section 4.1. | |||
| This section describes HTTP/3-specific error codes that can be used | ||||
| 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 HTTP/3 connections. | closing HTTP/3 connections. | |||
| H3_NO_ERROR (0x100): No error. This is used when the connection or | H3_NO_ERROR (0x100): No error. This is used when the connection 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. | |||
| H3_GENERAL_PROTOCOL_ERROR (0x101): Peer violated protocol | H3_GENERAL_PROTOCOL_ERROR (0x101): Peer violated protocol | |||
| skipping to change at page 41, line 45 ¶ | skipping to change at page 41, line 43 ¶ | |||
| H3_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. | |||
| H3_REQUEST_CANCELLED (0x10c): The request or its response (including | H3_REQUEST_CANCELLED (0x10c): The request or its response (including | |||
| pushed response) is cancelled. | pushed response) is cancelled. | |||
| H3_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. | |||
| H3_MESSAGE_ERROR (0x10e): An HTTP message was malformed and cannot | ||||
| be processed. | ||||
| H3_CONNECT_ERROR (0x10f): The TCP connection established in response | H3_CONNECT_ERROR (0x10f): The TCP connection established in response | |||
| to a CONNECT request was reset or abnormally closed. | to a CONNECT request was reset or abnormally closed. | |||
| H3_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. | |||
| Error codes of the format "0x1f * N + 0x21" for non-negative integer | Error codes of the format "0x1f * N + 0x21" for non-negative integer | |||
| values of N are reserved to exercise the requirement that unknown | values of N are reserved to exercise the requirement that unknown | |||
| error codes be treated as equivalent to H3_NO_ERROR (Section 9). | error codes be treated as equivalent to H3_NO_ERROR (Section 9). | |||
| Implementations SHOULD select an error code from this space with some | Implementations SHOULD select an error code from this space with some | |||
| skipping to change at page 43, line 24 ¶ | skipping to change at page 43, line 24 ¶ | |||
| The security considerations of HTTP/3 should be comparable to those | The security considerations of HTTP/3 should be comparable to those | |||
| of HTTP/2 with TLS. However, many of the considerations from | of HTTP/2 with TLS. However, many of the considerations from | |||
| Section 10 of [HTTP2] apply to [QUIC-TRANSPORT] and are discussed in | Section 10 of [HTTP2] apply to [QUIC-TRANSPORT] and are discussed in | |||
| that document. | that document. | |||
| 10.1. Server Authority | 10.1. Server Authority | |||
| HTTP/3 relies on the HTTP definition of authority. The security | HTTP/3 relies on the HTTP definition of authority. The security | |||
| considerations of establishing authority are discussed in | considerations of establishing authority are discussed in | |||
| Section 16.1 of [SEMANTICS]. | Section 17.1 of [SEMANTICS]. | |||
| 10.2. Cross-Protocol Attacks | 10.2. Cross-Protocol Attacks | |||
| The use of ALPN in the TLS and QUIC handshakes establishes the target | The use of ALPN in the TLS and QUIC handshakes establishes the target | |||
| application protocol before application-layer bytes are processed. | application protocol before application-layer bytes are processed. | |||
| Because all QUIC packets are encrypted, it is difficult for an | This ensures that endpoints have strong assurances that peers are | |||
| attacker to control the plaintext bytes of an HTTP/3 connection, | using the same protocol. | |||
| which could be used in a cross-protocol attack on a plaintext | ||||
| protocol. | This does not guarantee protection from all cross-protocol attacks. | |||
| Section 21.5 of [QUIC-TRANSPORT] describes some ways in which the | ||||
| plaintext of QUIC packets can be used to perform request forgery | ||||
| against endpoints that don't use authenticated transports. | ||||
| 10.3. Intermediary Encapsulation Attacks | 10.3. Intermediary Encapsulation Attacks | |||
| The HTTP/3 field encoding allows the expression of names that are not | The HTTP/3 field encoding allows the expression of names that are not | |||
| valid field names in the syntax used by HTTP (Section 5.4.3 of | valid field names in the syntax used by HTTP (Section 5.1 of | |||
| [SEMANTICS]). Requests or responses containing invalid field names | [SEMANTICS]). Requests or responses containing invalid field names | |||
| MUST be treated as malformed (Section 4.1.3). An intermediary | MUST be treated as malformed (Section 4.1.3). An intermediary | |||
| therefore cannot translate an HTTP/3 request or response containing | therefore cannot translate an HTTP/3 request or response containing | |||
| an invalid field name into an HTTP/1.1 message. | an invalid field name into an HTTP/1.1 message. | |||
| Similarly, HTTP/3 can transport field values that are not valid. | Similarly, HTTP/3 can transport field values that are not valid. | |||
| While most values that can be encoded will not alter field parsing, | While most values that can be encoded will not alter field parsing, | |||
| carriage return (CR, ASCII 0xd), line feed (LF, ASCII 0xa), and the | carriage return (CR, ASCII 0xd), line feed (LF, ASCII 0xa), and the | |||
| zero character (NUL, ASCII 0x0) might be exploited by an attacker if | zero character (NUL, ASCII 0x0) might be exploited by an attacker if | |||
| they are translated verbatim. Any request or response that contains | they are translated verbatim. Any request or response that contains | |||
| a character not permitted in a field value MUST be treated as | a character not permitted in a field value MUST be treated as | |||
| malformed (Section 4.1.3). Valid characters are defined by the | malformed (Section 4.1.3). Valid characters are defined by the | |||
| "field-content" ABNF rule in Section 5.4.4 of [SEMANTICS]. | "field-content" ABNF rule in Section 5.5 of [SEMANTICS]. | |||
| 10.4. Cacheability of Pushed Responses | 10.4. Cacheability of Pushed Responses | |||
| Pushed responses do not have an explicit request from the client; the | Pushed responses do not have an explicit request from the client; the | |||
| request is provided by the server in the PUSH_PROMISE frame. | request is provided by the server in the PUSH_PROMISE frame. | |||
| Caching responses that are pushed is possible based on the guidance | Caching responses that are pushed is possible based on the guidance | |||
| provided by the origin server in the Cache-Control header field. | provided by the origin server in the Cache-Control header field. | |||
| However, this can cause issues if a single server hosts more than one | However, this can cause issues if a single server hosts more than one | |||
| tenant. For example, a server might offer multiple users each a | tenant. For example, a server might offer multiple users each a | |||
| skipping to change at page 45, line 12 ¶ | skipping to change at page 45, line 24 ¶ | |||
| processing resources; see Section 7 of [QPACK] for more details on | processing resources; see Section 7 of [QPACK] for more details on | |||
| potential abuses. | potential abuses. | |||
| All these features - i.e., server push, unknown protocol elements, | All these features - i.e., server push, unknown protocol elements, | |||
| field compression - have legitimate uses. These features become a | field compression - have legitimate uses. These features become a | |||
| burden only when they are used unnecessarily or to excess. | burden only when they are used unnecessarily or to excess. | |||
| An endpoint that does not monitor this behavior exposes itself to a | An endpoint that does not monitor this behavior exposes itself to a | |||
| risk of denial-of-service attack. Implementations SHOULD track the | risk of denial-of-service attack. Implementations SHOULD track the | |||
| use of these features and set limits on their use. An endpoint MAY | use of these features and set limits on their use. An endpoint MAY | |||
| treat activity that is suspicious as a connection error (Section 8) | treat activity that is suspicious as a connection error of type | |||
| of type H3_EXCESSIVE_LOAD, but false positives will result in | H3_EXCESSIVE_LOAD (Section 8), but false positives will result in | |||
| disrupting valid connections and requests. | disrupting valid connections and requests. | |||
| 10.5.1. Limits on Field Section Size | 10.5.1. Limits on Field Section Size | |||
| A large field section (Section 4.1) can cause an implementation to | A large field section (Section 4.1) can cause an implementation to | |||
| commit a large amount of state. Header fields that are critical for | commit a large amount of state. Header fields that are critical for | |||
| routing can appear toward the end of a header field section, which | routing can appear toward the end of a header field section, which | |||
| prevents streaming of the header field section to its ultimate | prevents streaming of the header field section to its ultimate | |||
| destination. This ordering and other reasons, such as ensuring cache | destination. This ordering and other reasons, such as ensuring cache | |||
| correctness, mean that an endpoint likely needs to buffer the entire | correctness, mean that an endpoint likely needs to buffer the entire | |||
| skipping to change at page 46, line 11 ¶ | skipping to change at page 46, line 27 ¶ | |||
| TCP connection remains in the TIME_WAIT state. Therefore, a proxy | TCP connection remains in the TIME_WAIT state. Therefore, a proxy | |||
| cannot rely on QUIC stream limits alone to control the resources | cannot rely on QUIC stream limits alone to control the resources | |||
| consumed by CONNECT requests. | consumed by CONNECT requests. | |||
| 10.6. Use of Compression | 10.6. Use of Compression | |||
| Compression can allow an attacker to recover secret data when it is | Compression can allow an attacker to recover secret data when it is | |||
| compressed in the same context as data under attacker control. | compressed in the same context as data under attacker control. | |||
| HTTP/3 enables compression of fields (Section 4.1.1); the following | HTTP/3 enables compression of fields (Section 4.1.1); the following | |||
| concerns also apply to the use of HTTP compressed content-codings; | concerns also apply to the use of HTTP compressed content-codings; | |||
| see Section 7.5.1 of [SEMANTICS]. | see Section 8.5.1 of [SEMANTICS]. | |||
| There are demonstrable attacks on compression that exploit the | There are demonstrable attacks on compression that exploit the | |||
| characteristics of the web (e.g., [BREACH]). The attacker induces | characteristics of the web (e.g., [BREACH]). The attacker induces | |||
| multiple requests containing varying plaintext, observing the length | multiple requests containing varying plaintext, observing the length | |||
| of the resulting ciphertext in each, which reveals a shorter length | of the resulting ciphertext in each, which reveals a shorter length | |||
| when a guess about the secret is correct. | when a guess about the secret is correct. | |||
| Implementations communicating on a secure channel MUST NOT compress | Implementations communicating on a secure channel MUST NOT compress | |||
| content that includes both confidential and attacker-controlled data | content that includes both confidential and attacker-controlled data | |||
| unless separate compression contexts are used for each source of | unless separate compression contexts are used for each source of | |||
| skipping to change at page 48, line 39 ¶ | skipping to change at page 49, line 10 ¶ | |||
| Identification Sequence: 0x68 0x33 ("h3") | Identification Sequence: 0x68 0x33 ("h3") | |||
| Specification: This document | Specification: This document | |||
| 11.2. New Registries | 11.2. New Registries | |||
| New registries created in this document operate under the QUIC | New registries created in this document operate under the QUIC | |||
| registration policy documented in Section 22.1 of [QUIC-TRANSPORT]. | registration policy documented in Section 22.1 of [QUIC-TRANSPORT]. | |||
| These registries all include the common set of fields listed in | These registries all include the common set of fields listed in | |||
| Section 22.1.1 of [QUIC-TRANSPORT]. | Section 22.1.1 of [QUIC-TRANSPORT]. These registries [SHALL be/are] | |||
| collected under a "Hypertext Transfer Protocol version 3 (HTTP/3) | ||||
| Parameters" heading. | ||||
| The initial allocations in these registries created in this document | The initial allocations in these registries created in this document | |||
| are all assigned permanent status and list a change controller of the | are all assigned permanent status and list a change controller of the | |||
| IETF and a contact of the HTTP working group (ietf-http-wg@w3.org). | IETF and a contact of the HTTP working group (ietf-http-wg@w3.org). | |||
| 11.2.1. Frame Types | 11.2.1. 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 | The "HTTP/3 Frame Type" registry governs a 62-bit space. This | |||
| registry follows the QUIC registry policy; see Section 11.2. | registry follows the QUIC registry policy; see Section 11.2. | |||
| skipping to change at page 50, line 5 ¶ | skipping to change at page 50, line 33 ¶ | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| | Reserved | 0x8 | N/A | | | Reserved | 0x8 | N/A | | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| | Reserved | 0x9 | N/A | | | Reserved | 0x9 | N/A | | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| | MAX_PUSH_ID | 0xd | Section 7.2.7 | | | MAX_PUSH_ID | 0xd | Section 7.2.7 | | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| Table 2: Initial HTTP/3 Frame Types | Table 2: Initial HTTP/3 Frame Types | |||
| Additionally, each code of the format "0x1f * N + 0x21" for non- | Each code of the format "0x1f * N + 0x21" for non-negative integer | |||
| negative integer values of N (that is, 0x21, 0x40, ..., through | values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | |||
| 0x3FFFFFFFFFFFFFFE) MUST NOT be assigned by IANA. | MUST NOT be assigned by IANA and MUST NOT appear in the listing of | |||
| assigned values. | ||||
| 11.2.2. Settings Parameters | 11.2.2. 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 registry | "HTTP/3 Settings" registry governs a 62-bit space. This registry | |||
| follows the QUIC registry policy; see Section 11.2. Permanent | follows the QUIC registry policy; see Section 11.2. Permanent | |||
| registrations in this registry are assigned using the Specification | registrations in this registry are assigned using the Specification | |||
| Required policy ([RFC8126]), except for values between 0x00 and 0x3f | Required policy ([RFC8126]), except for values between 0x00 and 0x3f | |||
| (in hexadecimal; inclusive), which are assigned using Standards | (in hexadecimal; inclusive), which are assigned using Standards | |||
| Action or IESG Approval as defined in Section 4.9 and 4.10 of | Action or IESG Approval as defined in Section 4.9 and 4.10 of | |||
| skipping to change at page 51, line 5 ¶ | skipping to change at page 51, line 38 ¶ | |||
| +------------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| | Reserved | 0x4 | N/A | N/A | | | Reserved | 0x4 | N/A | N/A | | |||
| +------------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| | Reserved | 0x5 | N/A | N/A | | | Reserved | 0x5 | N/A | N/A | | |||
| +------------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| | MAX_FIELD_SECTION_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | | MAX_FIELD_SECTION_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | |||
| +------------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| Table 3: Initial HTTP/3 Settings | Table 3: Initial HTTP/3 Settings | |||
| Additionally, each code of the format "0x1f * N + 0x21" for non- | Each code of the format "0x1f * N + 0x21" for non-negative integer | |||
| negative integer values of N (that is, 0x21, 0x40, ..., through | values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | |||
| 0x3ffffffffffffffe) MUST NOT be assigned by IANA. | MUST NOT be assigned by IANA and MUST NOT appear in the listing of | |||
| assigned values. | ||||
| 11.2.3. Error Codes | 11.2.3. 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. This registry | "HTTP/3 Error Code" registry manages a 62-bit space. This registry | |||
| follows the QUIC registry policy; see Section 11.2. Permanent | follows the QUIC registry policy; see Section 11.2. Permanent | |||
| registrations in this registry are assigned using the Specification | registrations in this registry are assigned using the Specification | |||
| Required policy ([RFC8126]), except for values between 0x00 and 0x3f | Required policy ([RFC8126]), except for values between 0x00 and 0x3f | |||
| (in hexadecimal; inclusive), which are assigned using Standards | (in hexadecimal; inclusive), which are assigned using Standards | |||
| Action or IESG Approval as defined in Section 4.9 and 4.10 of | Action or IESG Approval as defined in Section 4.9 and 4.10 of | |||
| skipping to change at page 53, line 4 ¶ | skipping to change at page 53, line 37 ¶ | |||
| | | | processed | | | | | | processed | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | H3_REQUEST_CANCELLED | 0x010c | Data no | Section 8.1 | | | H3_REQUEST_CANCELLED | 0x010c | Data no | Section 8.1 | | |||
| | | | longer | | | | | | longer | | | |||
| | | | needed | | | | | | needed | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | H3_REQUEST_INCOMPLETE | 0x010d | Stream | Section 8.1 | | | H3_REQUEST_INCOMPLETE | 0x010d | Stream | Section 8.1 | | |||
| | | | terminated | | | | | | terminated | | | |||
| | | | early | | | | | | early | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | H3_MESSAGE_ERROR | 0x010e | Malformed | Section 8.1 | | ||||
| | | | message | | | ||||
| +---------------------------+--------+--------------+---------------+ | ||||
| | H3_CONNECT_ERROR | 0x010f | TCP reset | Section 8.1 | | | H3_CONNECT_ERROR | 0x010f | TCP reset | Section 8.1 | | |||
| | | | or error on | | | | | | or error on | | | |||
| | | | CONNECT | | | | | | CONNECT | | | |||
| | | | request | | | | | | request | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | H3_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 | | | H3_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 | | |||
| | | | HTTP/1.1 | | | | | | HTTP/1.1 | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| Table 4: Initial HTTP/3 Error Codes | Table 4: Initial HTTP/3 Error Codes | |||
| Additionally, each code of the format "0x1f * N + 0x21" for non- | Each code of the format "0x1f * N + 0x21" for non-negative integer | |||
| negative integer values of N (that is, 0x21, 0x40, ..., through | values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | |||
| 0x3ffffffffffffffe) MUST NOT be assigned by IANA. | MUST NOT be assigned by IANA and MUST NOT appear in the listing of | |||
| assigned values. | ||||
| 11.2.4. Stream Types | 11.2.4. 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 registry follows the QUIC registry policy; see Section 11.2. | This registry follows the QUIC registry policy; see Section 11.2. | |||
| Permanent registrations in this registry are assigned using the | Permanent registrations in this registry are assigned using the | |||
| Specification Required policy ([RFC8126]), except for values between | Specification Required policy ([RFC8126]), except for values between | |||
| 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using | 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using | |||
| Standards Action or IESG Approval as defined in Section 4.9 and 4.10 | Standards Action or IESG Approval as defined in Section 4.9 and 4.10 | |||
| skipping to change at page 54, line 15 ¶ | skipping to change at page 54, line 45 ¶ | |||
| +================+=======+===============+========+ | +================+=======+===============+========+ | |||
| | Stream Type | Value | Specification | Sender | | | Stream Type | Value | Specification | Sender | | |||
| +================+=======+===============+========+ | +================+=======+===============+========+ | |||
| | Control Stream | 0x00 | Section 6.2.1 | Both | | | Control Stream | 0x00 | Section 6.2.1 | Both | | |||
| +----------------+-------+---------------+--------+ | +----------------+-------+---------------+--------+ | |||
| | Push Stream | 0x01 | Section 4.4 | Server | | | Push Stream | 0x01 | Section 4.4 | Server | | |||
| +----------------+-------+---------------+--------+ | +----------------+-------+---------------+--------+ | |||
| Table 5 | Table 5 | |||
| Additionally, each code of the format "0x1f * N + 0x21" for non- | Each code of the format "0x1f * N + 0x21" for non-negative integer | |||
| negative integer values of N (that is, 0x21, 0x40, ..., through | values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | |||
| 0x3ffffffffffffffe) MUST NOT be assigned by IANA. | MUST NOT be assigned by IANA and MUST NOT appear in the listing of | |||
| assigned values. | ||||
| 12. References | 12. References | |||
| 12.1. Normative References | 12.1. Normative References | |||
| [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| April 2016, <https://www.rfc-editor.org/info/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| [CACHING] Fielding, R., Nottingham, M., and J. Reschke, "HTTP | [CACHING] Fielding, R., Nottingham, M., and J. Reschke, "HTTP | |||
| Caching", Work in Progress, Internet-Draft, draft-ietf- | Caching", Work in Progress, Internet-Draft, draft-ietf- | |||
| httpbis-cache-12, 2 October 2020, <http://www.ietf.org/ | httpbis-cache-13, 14 December 2020, <http://www.ietf.org/ | |||
| internet-drafts/draft-ietf-httpbis-cache-12.txt>. | internet-drafts/draft-ietf-httpbis-cache-13.txt>. | |||
| [HTTP-REPLAY] | [HTTP-REPLAY] | |||
| Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | |||
| 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>. | |||
| [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", Work in Progress, | Header Compression for HTTP over QUIC", Work in Progress, | |||
| Internet-Draft, draft-ietf-quic-qpack-19, 20 October 2020, | Internet-Draft, draft-ietf-quic-qpack-20, 15 December | |||
| <https://tools.ietf.org/html/draft-ietf-quic-qpack-19>. | 2020, | |||
| <https://tools.ietf.org/html/draft-ietf-quic-qpack-20>. | ||||
| [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", Work in Progress, | Multiplexed and Secure Transport", Work in Progress, | |||
| Internet-Draft, draft-ietf-quic-transport-31, 20 October | Internet-Draft, draft-ietf-quic-transport-34, 15 December | |||
| 2020, <https://tools.ietf.org/html/draft-ietf-quic- | 2020, <https://tools.ietf.org/html/draft-ietf-quic- | |||
| transport-31>. | transport-34>. | |||
| [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 55, line 43 ¶ | skipping to change at page 56, line 26 ¶ | |||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [SEMANTICS] | [SEMANTICS] | |||
| Fielding, R., Nottingham, M., and J. Reschke, "HTTP | Fielding, R., Nottingham, M., and J. Reschke, "HTTP | |||
| Semantics", Work in Progress, Internet-Draft, draft-ietf- | Semantics", Work in Progress, Internet-Draft, draft-ietf- | |||
| httpbis-semantics-12, 2 October 2020, | httpbis-semantics-13, 14 December 2020, | |||
| <http://www.ietf.org/internet-drafts/draft-ietf-httpbis- | <http://www.ietf.org/internet-drafts/draft-ietf-httpbis- | |||
| semantics-12.txt>. | semantics-13.txt>. | |||
| [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
| <https://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
| 12.2. Informative References | 12.2. Informative References | |||
| [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | |||
| CRIME Attack", July 2013, | CRIME Attack", July 2013, | |||
| <http://breachattack.com/resources/ | <http://breachattack.com/resources/ | |||
| BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | |||
| [HPACK] Peon, R. and H. Ruellan, "HPACK: Header Compression for | [HPACK] Peon, R. and H. Ruellan, "HPACK: Header Compression for | |||
| HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7541>. | <https://www.rfc-editor.org/info/rfc7541>. | |||
| [HTTP11] Fielding, R., Nottingham, M., and J. Reschke, "HTTP/1.1 | [HTTP11] Fielding, R., Nottingham, M., and J. Reschke, "HTTP/1.1", | |||
| Messaging", Work in Progress, Internet-Draft, draft-ietf- | Work in Progress, Internet-Draft, draft-ietf-httpbis- | |||
| httpbis-messaging-12, 2 October 2020, | messaging-13, 14 December 2020, <http://www.ietf.org/ | |||
| <http://www.ietf.org/internet-drafts/draft-ietf-httpbis- | internet-drafts/draft-ietf-httpbis-messaging-13.txt>. | |||
| messaging-12.txt>. | ||||
| [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>. | |||
| [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | |||
| Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012, | Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012, | |||
| <https://www.rfc-editor.org/info/rfc6585>. | <https://www.rfc-editor.org/info/rfc6585>. | |||
| skipping to change at page 62, line 7 ¶ | skipping to change at page 62, line 39 ¶ | |||
| HTTP/2 provides. However, the differences between HTTP/2 and HTTP/3 | HTTP/2 provides. However, the differences between HTTP/2 and HTTP/3 | |||
| mean that error codes are not directly portable between versions. | mean that error codes are not directly portable between versions. | |||
| 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): H3_NO_ERROR in Section 8.1. | NO_ERROR (0x0): H3_NO_ERROR in Section 8.1. | |||
| PROTOCOL_ERROR (0x1): This is mapped to H3_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. | |||
| Such cases include H3_FRAME_UNEXPECTED and | Such cases include H3_FRAME_UNEXPECTED, H3_MESSAGE_ERROR, and | |||
| H3_CLOSED_CRITICAL_STREAM defined in Section 8.1. | H3_CLOSED_CRITICAL_STREAM defined in Section 8.1. | |||
| INTERNAL_ERROR (0x2): H3_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. | |||
| skipping to change at page 63, line 34 ¶ | skipping to change at page 64, line 18 ¶ | |||
| inappropriate or unknown error codes for the target version. An | inappropriate or unknown error codes for the target version. An | |||
| intermediary is permitted to promote stream errors to connection | intermediary is permitted to promote stream errors to connection | |||
| errors but they should be aware of the cost to the HTTP/3 connection | errors but they should be aware of the cost to the HTTP/3 connection | |||
| for what might be a temporary or intermittent error. | for what might be a temporary or intermittent error. | |||
| 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-31 | B.1. Since draft-ietf-quic-http-32 | |||
| * Removed draft version guidance; added final version string | ||||
| * Added H3_MESSAGE_ERROR for malformed messages | ||||
| B.2. Since draft-ietf-quic-http-31 | ||||
| Editorial changes only. | Editorial changes only. | |||
| B.2. Since draft-ietf-quic-http-30 | B.3. Since draft-ietf-quic-http-30 | |||
| Editorial changes only. | Editorial changes only. | |||
| B.3. Since draft-ietf-quic-http-29 | B.4. Since draft-ietf-quic-http-29 | |||
| * Require a connection error if a reserved frame type that | * Require a connection error if a reserved frame type that | |||
| corresponds to a frame in HTTP/2 is received (#3991, #3993) | corresponds to a frame in HTTP/2 is received (#3991, #3993) | |||
| * Require a connection error if a reserved setting that corresponds | * Require a connection error if a reserved setting that corresponds | |||
| to a setting in HTTP/2 is received (#3954, #3955) | to a setting in HTTP/2 is received (#3954, #3955) | |||
| B.4. Since draft-ietf-quic-http-28 | B.5. Since draft-ietf-quic-http-28 | |||
| * CANCEL_PUSH is recommended even when the stream is reset (#3698, | * CANCEL_PUSH is recommended even when the stream is reset (#3698, | |||
| #3700) | #3700) | |||
| * Use H3_ID_ERROR when GOAWAY contains a larger identifier (#3631, | * Use H3_ID_ERROR when GOAWAY contains a larger identifier (#3631, | |||
| #3634) | #3634) | |||
| B.5. Since draft-ietf-quic-http-27 | B.6. Since draft-ietf-quic-http-27 | |||
| * Updated text to refer to latest HTTP revisions | * Updated text to refer to latest HTTP revisions | |||
| * Use the HTTP definition of authority for establishing and | * Use the HTTP definition of authority for establishing and | |||
| coalescing connections (#253, #2223, #3558) | coalescing connections (#253, #2223, #3558) | |||
| * Define use of GOAWAY from both endpoints (#2632, #3129) | * Define use of GOAWAY from both endpoints (#2632, #3129) | |||
| * Require either :authority or Host if the URI scheme has a | * Require either :authority or Host if the URI scheme has a | |||
| mandatory authority component (#3408, #3475) | mandatory authority component (#3408, #3475) | |||
| B.6. Since draft-ietf-quic-http-26 | B.7. Since draft-ietf-quic-http-26 | |||
| * No changes | * No changes | |||
| B.7. Since draft-ietf-quic-http-25 | B.8. Since draft-ietf-quic-http-25 | |||
| * Require QUICv1 for HTTP/3 (#3117, #3323) | * Require QUICv1 for HTTP/3 (#3117, #3323) | |||
| * Remove DUPLICATE_PUSH and allow duplicate PUSH_PROMISE (#3275, | * Remove DUPLICATE_PUSH and allow duplicate PUSH_PROMISE (#3275, | |||
| #3309) | #3309) | |||
| * Clarify the definition of "malformed" (#3352, #3345) | * Clarify the definition of "malformed" (#3352, #3345) | |||
| B.8. Since draft-ietf-quic-http-24 | B.9. Since draft-ietf-quic-http-24 | |||
| * Removed H3_EARLY_RESPONSE error code; H3_NO_ERROR is recommended | * Removed H3_EARLY_RESPONSE error code; H3_NO_ERROR is recommended | |||
| instead (#3130,#3208) | instead (#3130,#3208) | |||
| * Unknown error codes are equivalent to H3_NO_ERROR (#3276,#3331) | * Unknown error codes are equivalent to H3_NO_ERROR (#3276,#3331) | |||
| * Some error codes are reserved for greasing (#3325,#3360) | * Some error codes are reserved for greasing (#3325,#3360) | |||
| B.9. Since draft-ietf-quic-http-23 | B.10. Since draft-ietf-quic-http-23 | |||
| * Removed "quic" Alt-Svc parameter (#3061,#3118) | * Removed "quic" Alt-Svc parameter (#3061,#3118) | |||
| * Clients need not persist unknown settings for use in 0-RTT | * Clients need not persist unknown settings for use in 0-RTT | |||
| (#3110,#3113) | (#3110,#3113) | |||
| * Clarify error cases around CANCEL_PUSH (#2819,#3083) | * Clarify error cases around CANCEL_PUSH (#2819,#3083) | |||
| B.10. Since draft-ietf-quic-http-22 | B.11. Since draft-ietf-quic-http-22 | |||
| * Removed priority signaling (#2922,#2924) | * Removed priority signaling (#2922,#2924) | |||
| * Further changes to error codes (#2662,#2551): | * 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 | |||
| * Clarify how unknown frame types interact with required frame | * Clarify how unknown frame types interact with required frame | |||
| sequence (#2867,#2858) | sequence (#2867,#2858) | |||
| * Describe interactions with the transport in terms of defined | * Describe interactions with the transport in terms of defined | |||
| interface terms (#2857,#2805) | interface terms (#2857,#2805) | |||
| * Require the use of the "http-opportunistic" resource (RFC 8164) | * Require the use of the "http-opportunistic" resource (RFC 8164) | |||
| skipping to change at page 65, line 47 ¶ | skipping to change at page 66, line 38 ¶ | |||
| * Clarify that Upgrade and the 101 status code are prohibited | * Clarify that Upgrade and the 101 status code are prohibited | |||
| (#2898,#2889) | (#2898,#2889) | |||
| * Clarify that frame types reserved for greasing can occur on any | * 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) | |||
| * Unknown error codes cannot be treated as errors (#2998,#2816) | * Unknown error codes cannot be treated as errors (#2998,#2816) | |||
| B.11. Since draft-ietf-quic-http-21 | B.12. Since draft-ietf-quic-http-21 | |||
| No changes | No changes | |||
| B.12. Since draft-ietf-quic-http-20 | B.13. Since draft-ietf-quic-http-20 | |||
| * Prohibit closing the control stream (#2509, #2666) | * Prohibit closing the control stream (#2509, #2666) | |||
| * Change default priority to use an orphan node (#2502, #2690) | * Change default priority to use an orphan node (#2502, #2690) | |||
| * Exclusive priorities are restored (#2754, #2781) | * Exclusive priorities are restored (#2754, #2781) | |||
| * Restrict use of frames when using CONNECT (#2229, #2702) | * Restrict use of frames when using CONNECT (#2229, #2702) | |||
| * Close and maybe reset streams if a connection error occurs for | * Close and maybe reset streams if a connection error occurs for | |||
| CONNECT (#2228, #2703) | CONNECT (#2228, #2703) | |||
| * Encourage provision of sufficient unidirectional streams for QPACK | * Encourage provision of sufficient unidirectional streams for QPACK | |||
| (#2100, #2529, #2762) | (#2100, #2529, #2762) | |||
| * Allow extensions to use server-initiated bidirectional streams | * Allow extensions to use server-initiated bidirectional streams | |||
| (#2711, #2773) | (#2711, #2773) | |||
| * Clarify use of maximum header list size setting (#2516, #2774) | * Clarify use of maximum header list size setting (#2516, #2774) | |||
| skipping to change at page 66, line 45 ¶ | skipping to change at page 67, line 37 ¶ | |||
| - 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.13. Since draft-ietf-quic-http-19 | B.14. Since draft-ietf-quic-http-19 | |||
| * SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | * SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | |||
| * Non-zero bits in the Empty field of the PRIORITY frame MAY be | * Non-zero bits in the Empty field of the PRIORITY frame MAY be | |||
| treated as an error (#2501) | treated as an error (#2501) | |||
| B.14. Since draft-ietf-quic-http-18 | B.15. Since draft-ietf-quic-http-18 | |||
| * Resetting streams following a GOAWAY is recommended, but not | * Resetting streams following a GOAWAY is recommended, but not | |||
| required (#2256,#2457) | required (#2256,#2457) | |||
| * Use variable-length integers throughout (#2437,#2233,#2253,#2275) | * 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 | |||
| * Frame layout switched from Length-Type-Value to Type-Length-Value | * Frame layout switched from Length-Type-Value to Type-Length-Value | |||
| (#2395,#2235) | (#2395,#2235) | |||
| * Specified error code for servers receiving DUPLICATE_PUSH (#2497) | * Specified error code for servers receiving DUPLICATE_PUSH (#2497) | |||
| * Use connection error for invalid PRIORITY (#2507, #2508) | * Use connection error for invalid PRIORITY (#2507, #2508) | |||
| B.15. Since draft-ietf-quic-http-17 | B.16. Since draft-ietf-quic-http-17 | |||
| * HTTP_REQUEST_REJECTED is used to indicate a request can be retried | * HTTP_REQUEST_REJECTED is used to indicate a request can be retried | |||
| (#2106, #2325) | (#2106, #2325) | |||
| * Changed error code for GOAWAY on the wrong stream (#2231, #2343) | * Changed error code for GOAWAY on the wrong stream (#2231, #2343) | |||
| B.16. Since draft-ietf-quic-http-16 | B.17. Since draft-ietf-quic-http-16 | |||
| * Rename "HTTP/QUIC" to "HTTP/3" (#1973) | * Rename "HTTP/QUIC" to "HTTP/3" (#1973) | |||
| * Changes to PRIORITY frame (#1865, #2075) | * 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 68, line 10 ¶ | skipping to change at page 69, line 5 ¶ | |||
| (#1809, #1846, #2038) | (#1809, #1846, #2038) | |||
| * Clarify message processing rules for streams that aren't closed | * Clarify message processing rules for streams that aren't closed | |||
| (#1972, #2003) | (#1972, #2003) | |||
| * Removed reservation of error code 0 and moved HTTP_NO_ERROR to | * Removed reservation of error code 0 and moved HTTP_NO_ERROR to | |||
| this value (#1922) | this value (#1922) | |||
| * Removed prohibition of zero-length DATA frames (#2098) | * Removed prohibition of zero-length DATA frames (#2098) | |||
| B.17. Since draft-ietf-quic-http-15 | B.18. Since draft-ietf-quic-http-15 | |||
| Substantial editorial reorganization; no technical changes. | Substantial editorial reorganization; no technical changes. | |||
| B.18. Since draft-ietf-quic-http-14 | B.19. Since draft-ietf-quic-http-14 | |||
| * Recommend sensible values for QUIC transport parameters | * Recommend sensible values for QUIC transport parameters | |||
| (#1720,#1806) | (#1720,#1806) | |||
| * Define error for missing SETTINGS frame (#1697,#1808) | * Define error for missing SETTINGS frame (#1697,#1808) | |||
| * Setting values are variable-length integers (#1556,#1807) and do | * Setting values are variable-length integers (#1556,#1807) and do | |||
| not have separate maximum values (#1820) | not have separate maximum values (#1820) | |||
| * Expanded discussion of connection closure (#1599,#1717,#1712) | * Expanded discussion of connection closure (#1599,#1717,#1712) | |||
| * HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | * HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | |||
| B.19. Since draft-ietf-quic-http-13 | B.20. Since draft-ietf-quic-http-13 | |||
| * Reserved some frame types for grease (#1333, #1446) | * Reserved some frame types for grease (#1333, #1446) | |||
| * Unknown unidirectional stream types are tolerated, not errors; | * Unknown unidirectional stream types are tolerated, not errors; | |||
| some reserved for grease (#1490, #1525) | some reserved for grease (#1490, #1525) | |||
| * Require settings to be remembered for 0-RTT, prohibit reductions | * Require settings to be remembered for 0-RTT, prohibit reductions | |||
| (#1541, #1641) | (#1541, #1641) | |||
| * Specify behavior for truncated requests (#1596, #1643) | * Specify behavior for truncated requests (#1596, #1643) | |||
| B.20. Since draft-ietf-quic-http-12 | B.21. Since draft-ietf-quic-http-12 | |||
| * TLS SNI extension isn't mandatory if an alternative method is used | * TLS SNI extension isn't mandatory if an alternative method is used | |||
| (#1459, #1462, #1466) | (#1459, #1462, #1466) | |||
| * Removed flags from HTTP/3 frames (#1388, #1398) | * Removed flags from HTTP/3 frames (#1388, #1398) | |||
| * Reserved frame types and settings for use in preserving | * Reserved frame types and settings for use in preserving | |||
| extensibility (#1333, #1446) | extensibility (#1333, #1446) | |||
| * Added general error code (#1391, #1397) | * Added general error code (#1391, #1397) | |||
| skipping to change at page 69, line 4 ¶ | skipping to change at page 69, line 46 ¶ | |||
| * TLS SNI extension isn't mandatory if an alternative method is used | * TLS SNI extension isn't mandatory if an alternative method is used | |||
| (#1459, #1462, #1466) | (#1459, #1462, #1466) | |||
| * Removed flags from HTTP/3 frames (#1388, #1398) | * Removed flags from HTTP/3 frames (#1388, #1398) | |||
| * Reserved frame types and settings for use in preserving | * Reserved frame types and settings for use in preserving | |||
| extensibility (#1333, #1446) | extensibility (#1333, #1446) | |||
| * Added general error code (#1391, #1397) | * Added general error code (#1391, #1397) | |||
| * Unidirectional streams carry a type byte and are extensible | * Unidirectional streams carry a type byte and are extensible | |||
| (#910,#1359) | (#910,#1359) | |||
| * Priority mechanism now uses explicit placeholders to enable | * 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.21. Since draft-ietf-quic-http-11 | B.22. Since draft-ietf-quic-http-11 | |||
| * Moved QPACK table updates and acknowledgments to dedicated streams | * Moved QPACK table updates and acknowledgments to dedicated streams | |||
| (#1121, #1122, #1238) | (#1121, #1122, #1238) | |||
| B.22. Since draft-ietf-quic-http-10 | B.23. Since draft-ietf-quic-http-10 | |||
| * Settings need to be remembered when attempting and accepting 0-RTT | * Settings need to be remembered when attempting and accepting 0-RTT | |||
| (#1157, #1207) | (#1157, #1207) | |||
| B.23. Since draft-ietf-quic-http-09 | B.24. Since draft-ietf-quic-http-09 | |||
| * Selected QCRAM for header compression (#228, #1117) | * Selected QCRAM for header compression (#228, #1117) | |||
| * The server_name TLS extension is now mandatory (#296, #495) | * The server_name TLS extension is now mandatory (#296, #495) | |||
| * Specified handling of unsupported versions in Alt-Svc (#1093, | * Specified handling of unsupported versions in Alt-Svc (#1093, | |||
| #1097) | #1097) | |||
| B.24. Since draft-ietf-quic-http-08 | B.25. Since draft-ietf-quic-http-08 | |||
| * Clarified connection coalescing rules (#940, #1024) | * Clarified connection coalescing rules (#940, #1024) | |||
| B.25. Since draft-ietf-quic-http-07 | B.26. Since draft-ietf-quic-http-07 | |||
| * Changes for integer encodings in QUIC (#595,#905) | * Changes for integer encodings in QUIC (#595,#905) | |||
| * Use unidirectional streams as appropriate (#515, #240, #281, #886) | * Use unidirectional streams as appropriate (#515, #240, #281, #886) | |||
| * Improvement to the description of GOAWAY (#604, #898) | * Improvement to the description of GOAWAY (#604, #898) | |||
| * Improve description of server push usage (#947, #950, #957) | * Improve description of server push usage (#947, #950, #957) | |||
| B.26. Since draft-ietf-quic-http-06 | B.27. Since draft-ietf-quic-http-06 | |||
| * Track changes in QUIC error code usage (#485) | * Track changes in QUIC error code usage (#485) | |||
| B.27. Since draft-ietf-quic-http-05 | B.28. Since draft-ietf-quic-http-05 | |||
| * Made push ID sequential, add MAX_PUSH_ID, remove | * Made push ID sequential, add MAX_PUSH_ID, remove | |||
| SETTINGS_ENABLE_PUSH (#709) | SETTINGS_ENABLE_PUSH (#709) | |||
| * Guidance about keep-alive and QUIC PINGs (#729) | * Guidance about keep-alive and QUIC PINGs (#729) | |||
| * Expanded text on GOAWAY and cancellation (#757) | * Expanded text on GOAWAY and cancellation (#757) | |||
| B.28. Since draft-ietf-quic-http-04 | B.29. Since draft-ietf-quic-http-04 | |||
| * Cite RFC 5234 (#404) | * Cite RFC 5234 (#404) | |||
| * Return to a single stream per request (#245,#557) | * Return to a single stream per request (#245,#557) | |||
| * Use separate frame type and settings registries from HTTP/2 (#81) | * Use separate frame type and settings registries from HTTP/2 (#81) | |||
| * SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | * SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| * Restored GOAWAY (#696) | * Restored GOAWAY (#696) | |||
| * Identify server push using Push ID rather than a stream ID | * Identify server push using Push ID rather than a stream ID | |||
| (#702,#281) | (#702,#281) | |||
| * DATA frames cannot be empty (#700) | * DATA frames cannot be empty (#700) | |||
| B.29. Since draft-ietf-quic-http-03 | B.30. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.30. Since draft-ietf-quic-http-02 | B.31. Since draft-ietf-quic-http-02 | |||
| * Track changes in transport draft | * Track changes in transport draft | |||
| B.31. Since draft-ietf-quic-http-01 | B.32. Since draft-ietf-quic-http-01 | |||
| * SETTINGS changes (#181): | * 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 71, line 12 ¶ | skipping to change at page 72, line 5 ¶ | |||
| * Closing the connection control stream or any message control | * Closing the connection control stream or any message control | |||
| stream is a fatal error (#176) | stream is a fatal error (#176) | |||
| * HPACK Sequence counter can wrap (#173) | * HPACK Sequence counter can wrap (#173) | |||
| * 0-RTT guidance added | * 0-RTT guidance added | |||
| * Guide to differences from HTTP/2 and porting HTTP/2 extensions | * Guide to differences from HTTP/2 and porting HTTP/2 extensions | |||
| added (#127,#242) | added (#127,#242) | |||
| B.32. Since draft-ietf-quic-http-00 | B.33. Since draft-ietf-quic-http-00 | |||
| * Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | * Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | |||
| * Changed from using HTTP/2 framing within Stream 3 to new framing | * 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) | |||
| * Adopted SETTINGS format from draft-bishop-httpbis-extended- | * Adopted SETTINGS format from draft-bishop-httpbis-extended- | |||
| settings-01 | settings-01 | |||
| * Reworked SETTINGS_ACK to account for indeterminate inter-stream | * Reworked SETTINGS_ACK to account for indeterminate inter-stream | |||
| order (#75) | order (#75) | |||
| * Described CONNECT pseudo-method (#95) | * Described CONNECT pseudo-method (#95) | |||
| * Updated ALPN token and Alt-Svc guidance (#13,#87) | * Updated ALPN token and Alt-Svc guidance (#13,#87) | |||
| * Application-layer-defined error codes (#19,#74) | * Application-layer-defined error codes (#19,#74) | |||
| B.33. Since draft-shade-quic-http2-mapping-00 | B.34. Since draft-shade-quic-http2-mapping-00 | |||
| * Adopted as base for draft-ietf-quic-http | * Adopted as base for draft-ietf-quic-http | |||
| * Updated authors/editors list | * 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. 140 change blocks. | ||||
| 306 lines changed or deleted | 331 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||