| draft-ietf-quic-http-34.txt | draft-ietf-quic-http-latest.txt | |||
|---|---|---|---|---|
| QUIC Working Group M. Bishop, Ed. | QUIC Working Group M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track February 2, 2021 | Intended status: Standards Track May 20, 2025 | |||
| Expires: August 6, 2021 | Expires: November 21, 2025 | |||
| Hypertext Transfer Protocol Version 3 (HTTP/3) | Hypertext Transfer Protocol Version 3 (HTTP/3) | |||
| draft-ietf-quic-http-34 | draft-ietf-quic-http-latest | |||
| 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 | ||||
| Discussion of this draft takes place on the QUIC working group | ||||
| mailing list (quic@ietf.org), which is archived at | ||||
| <https://mailarchive.ietf.org/arch/search/?email_list=quic>. | ||||
| Working Group information can be found at <https://github.com/ | ||||
| quicwg>; source code and issues list for this draft can be found at | ||||
| <https://github.com/quicwg/base-drafts/labels/-http>. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| 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 August 6, 2021. | ||||
| This Internet-Draft will expire on November 21, 2025. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2025 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 5 | 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4 | |||
| 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 5 | 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 6 | 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | 2.1. Document Organization . . . . . . . . . . . . . . . . . . 5 | |||
| 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 7 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | |||
| 3. Connection Setup and Management . . . . . . . . . . . . . . . 8 | 3. Connection Setup and Management . . . . . . . . . . . . . . . 7 | |||
| 3.1. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 9 | 3.1. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 7 | |||
| 3.1.1. HTTP Alternative Services . . . . . . . . . . . . . . 9 | 3.1.1. HTTP Alternative Services . . . . . . . . . . . . . . 8 | |||
| 3.1.2. Other Schemes . . . . . . . . . . . . . . . . . . . . 10 | 3.1.2. Other Schemes . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.2. Connection Establishment . . . . . . . . . . . . . . . . 10 | 3.2. Connection Establishment . . . . . . . . . . . . . . . . 9 | |||
| 3.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 11 | 3.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 12 | 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 12 | 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 11 | |||
| 4.1.1. Field Formatting and Compression . . . . . . . . . . 14 | 4.1.1. Field Formatting and Compression . . . . . . . . . . 13 | |||
| 4.1.2. Request Cancellation and Rejection . . . . . . . . . 17 | 4.1.2. Request Cancellation and Rejection . . . . . . . . . 16 | |||
| 4.1.3. Malformed Requests and Responses . . . . . . . . . . 18 | 4.1.3. Malformed Requests and Responses . . . . . . . . . . 17 | |||
| 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 19 | 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 20 | 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 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 . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.3. Immediate Application Closure . . . . . . . . . . . . . . 25 | 5.3. Immediate Application Closure . . . . . . . . . . . . . . 24 | |||
| 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 . . . . . . . . . . . . . . . . . . 25 | |||
| 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 27 | 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 26 | |||
| 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 28 | 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 27 | |||
| 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 . . . . . . . . . . . . . . . . 28 | |||
| 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 30 | 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 31 | 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 31 | 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 32 | 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 . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 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 . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 39 | 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 7.2.8. Reserved Frame Types . . . . . . . . . . . . . . . . 39 | 7.2.8. Reserved Frame Types . . . . . . . . . . . . . . . . 38 | |||
| 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 40 | 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 41 | 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 40 | |||
| 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 42 | 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 41 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 43 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 42 | |||
| 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 43 | 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 42 | |||
| 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 43 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 42 | |||
| 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 43 | 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 42 | |||
| 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 44 | 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 43 | |||
| 10.5. Denial-of-Service Considerations . . . . . . . . . . . . 44 | 10.5. Denial-of-Service Considerations . . . . . . . . . . . . 43 | |||
| 10.5.1. Limits on Field Section Size . . . . . . . . . . . . 45 | 10.5.1. Limits on Field Section Size . . . . . . . . . . . . 44 | |||
| 10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . 46 | 10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . 45 | |||
| 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 46 | 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 45 | |||
| 10.7. Padding and Traffic Analysis . . . . . . . . . . . . . . 46 | 10.7. Padding and Traffic Analysis . . . . . . . . . . . . . . 45 | |||
| 10.8. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 47 | 10.8. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.9. Early Data . . . . . . . . . . . . . . . . . . . . . . . 47 | 10.9. Early Data . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.10. Migration . . . . . . . . . . . . . . . . . . . . . . . 48 | 10.10. Migration . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.11. Privacy Considerations . . . . . . . . . . . . . . . . . 48 | 10.11. Privacy Considerations . . . . . . . . . . . . . . . . . 47 | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 48 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 11.1. Registration of HTTP/3 Identification String . . . . . . 48 | 11.1. Registration of HTTP/3 Identification String . . . . . . 47 | |||
| 11.2. New Registries . . . . . . . . . . . . . . . . . . . . . 49 | 11.2. New Registries . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 11.2.1. Frame Types . . . . . . . . . . . . . . . . . . . . 49 | 11.2.1. Frame Types . . . . . . . . . . . . . . . . . . . . 48 | |||
| 11.2.2. Settings Parameters . . . . . . . . . . . . . . . . 50 | 11.2.2. Settings Parameters . . . . . . . . . . . . . . . . 49 | |||
| 11.2.3. Error Codes . . . . . . . . . . . . . . . . . . . . 51 | 11.2.3. Error Codes . . . . . . . . . . . . . . . . . . . . 50 | |||
| 11.2.4. Stream Types . . . . . . . . . . . . . . . . . . . . 54 | 11.2.4. Stream Types . . . . . . . . . . . . . . . . . . . . 53 | |||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 54 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 53 | |||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . 54 | 12.1. Normative References . . . . . . . . . . . . . . . . . . 53 | |||
| 12.2. Informative References . . . . . . . . . . . . . . . . . 56 | 12.2. Informative References . . . . . . . . . . . . . . . . . 55 | |||
| Appendix A. Considerations for Transitioning from HTTP/2 . . . . 57 | Appendix A. Considerations for Transitioning from HTTP/2 . . . . 56 | |||
| A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 57 | A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 58 | A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 57 | |||
| A.2.1. Prioritization Differences . . . . . . . . . . . . . 58 | A.2.1. Prioritization Differences . . . . . . . . . . . . . 57 | |||
| A.2.2. Field Compression Differences . . . . . . . . . . . . 59 | A.2.2. Field Compression Differences . . . . . . . . . . . . 58 | |||
| A.2.3. Flow Control Differences . . . . . . . . . . . . . . 59 | A.2.3. Flow Control Differences . . . . . . . . . . . . . . 58 | |||
| A.2.4. Guidance for New Frame Type Definitions . . . . . . . 59 | A.2.4. Guidance for New Frame Type Definitions . . . . . . . 58 | |||
| A.2.5. Comparison Between HTTP/2 and HTTP/3 Frame Types . . 60 | A.2.5. Comparison Between HTTP/2 and HTTP/3 Frame Types . . 59 | |||
| 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 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 64 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 64 | |||
| B.1. Since draft-ietf-quic-http-32 . . . . . . . . . . . . . . 64 | ||||
| B.2. Since draft-ietf-quic-http-31 . . . . . . . . . . . . . . 64 | ||||
| B.3. Since draft-ietf-quic-http-30 . . . . . . . . . . . . . . 64 | ||||
| B.4. Since draft-ietf-quic-http-29 . . . . . . . . . . . . . . 64 | ||||
| B.5. Since draft-ietf-quic-http-28 . . . . . . . . . . . . . . 64 | ||||
| B.6. Since draft-ietf-quic-http-27 . . . . . . . . . . . . . . 64 | ||||
| B.7. Since draft-ietf-quic-http-26 . . . . . . . . . . . . . . 65 | ||||
| B.8. Since draft-ietf-quic-http-25 . . . . . . . . . . . . . . 65 | ||||
| B.9. Since draft-ietf-quic-http-24 . . . . . . . . . . . . . . 65 | ||||
| B.10. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 65 | ||||
| B.11. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 65 | ||||
| B.12. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 66 | ||||
| B.13. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 66 | ||||
| B.14. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 67 | ||||
| B.15. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 67 | ||||
| B.16. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 68 | ||||
| B.17. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 68 | ||||
| B.18. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 68 | ||||
| B.19. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 68 | ||||
| B.20. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 69 | ||||
| B.21. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 69 | ||||
| B.22. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 69 | ||||
| B.23. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 69 | ||||
| B.24. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 70 | ||||
| B.25. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 70 | ||||
| B.26. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 70 | ||||
| B.27. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 70 | ||||
| B.28. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 70 | ||||
| B.29. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 70 | ||||
| B.30. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 71 | ||||
| B.31. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 71 | ||||
| B.32. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 71 | ||||
| B.33. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 71 | ||||
| B.34. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 72 | ||||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 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 and HTTP/2. HTTP/1.1 has been used over a variety of | HTTP/1.1 and HTTP/2. HTTP/1.1 has been used over a variety of | |||
| transport and session layers, while HTTP/2 has been used primarily | transport and session layers, while HTTP/2 has been used primarily | |||
| with TLS over TCP. HTTP/3 supports the same semantics over a new | with TLS over TCP. HTTP/3 supports the same semantics over a new | |||
| transport protocol, QUIC. | transport protocol, QUIC. | |||
| skipping to change at page 7, line 33 ¶ | skipping to change at page 6, line 27 ¶ | |||
| o Extensions to HTTP/3 (Section 9) describes how new capabilities | o Extensions to HTTP/3 (Section 9) describes how new capabilities | |||
| can be added in future documents. | can be added in future documents. | |||
| o A more detailed comparison between HTTP/2 and HTTP/3 can be found | o A more detailed comparison between HTTP/2 and HTTP/3 can be found | |||
| in Appendix A. | in Appendix A. | |||
| 2.2. Conventions and Terminology | 2.2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| This document uses the variable-length integer encoding from | This document uses the variable-length integer encoding from | |||
| [QUIC-TRANSPORT]. | [QUIC-TRANSPORT]. | |||
| The following terms are used: | The following terms are used: | |||
| abort: An abrupt termination of a connection or stream, possibly due | abort: An abrupt termination of a connection or stream, possibly due | |||
| to an error condition. | to an error condition. | |||
| skipping to change at page 9, line 29 ¶ | skipping to change at page 8, line 21 ¶ | |||
| certificate cannot be verified with respect to the URI's origin | certificate cannot be verified with respect to the URI's origin | |||
| server, the client MUST NOT consider the server authoritative for | server, the client MUST NOT consider the server authoritative for | |||
| that origin. | that origin. | |||
| 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 (including | connection to that address on the indicated port (including | |||
| validation of the server certificate as described above), and sending | validation of the server certificate as described above), and sending | |||
| an HTTP/3 request message targeting the URI to the server over that | an 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 URIs contain | advertisement always includes an explicit port, and URIs 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. | |||
| skipping to change at page 14, line 15 ¶ | skipping to change at page 13, line 15 ¶ | |||
| 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; see Sections 6.3 and 6.5 of [SEMANTICS]. For a listing | HTTP fields; see Sections 6.3 and 6.5 of [SEMANTICS]. For a listing | |||
| of registered HTTP fields, see the "Hypertext Transfer Protocol | of registered HTTP fields, see the "Hypertext Transfer Protocol | |||
| (HTTP) Field Name Registry" maintained at | (HTTP) Field Name Registry" maintained at | |||
| <https://www.iana.org/assignments/http-fields/>. | <https://www.iana.org/assignments/http-fields/>. | |||
| *Note:* This registry will not exist until [SEMANTICS] is | ||||
| approved. *RFC Editor*, please remove this note prior to | ||||
| publication. | ||||
| Field names are strings containing a subset of ASCII characters. | Field names are strings containing a subset of ASCII characters. | |||
| Properties of HTTP field names and values are discussed in more | Properties of HTTP field names and values are discussed in more | |||
| detail in Section 5.1 of [SEMANTICS]. As in HTTP/2, characters in | detail in Section 5.1 of [SEMANTICS]. As in HTTP/2, characters in | |||
| field names MUST be converted to lowercase prior to their encoding. | field names MUST be converted to lowercase prior to their encoding. | |||
| A request or response containing uppercase characters in field names | A request or response containing uppercase characters in field names | |||
| MUST be treated as malformed (Section 4.1.3). | MUST be treated as malformed (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 | |||
| skipping to change at page 29, line 39 ¶ | skipping to change at page 28, line 39 ¶ | |||
| H3_STREAM_CREATION_ERROR; see Section 8. | 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 | client detects that a push stream header includes a Push ID that was | |||
| stream header, the client MUST treat this as a connection error of | used in another push stream header, the client MUST treat this as a | |||
| type H3_ID_ERROR; see Section 8. | connection error of 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 32, line 6 ¶ | skipping to change at page 31, line 6 ¶ | |||
| see Section 10.8. | see Section 10.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 of type | truncated, this MUST be treated as a connection error of type | |||
| H3_FRAME_ERROR; see Section 8. Streams that terminate abruptly may | H3_FRAME_ERROR; see Section 8. Streams that terminate abruptly may | |||
| be reset at 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=0x00) convey arbitrary, variable-length sequences | |||
| bytes associated with HTTP request or response content. | of bytes associated with HTTP request or response content. | |||
| 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 of type H3_FRAME_UNEXPECTED; see | respond with a connection error of type H3_FRAME_UNEXPECTED; see | |||
| Section 8. | Section 8. | |||
| DATA Frame { | DATA Frame { | |||
| Type (i) = 0x0, | Type (i) = 0x00, | |||
| Length (i), | Length (i), | |||
| Data (..), | Data (..), | |||
| } | } | |||
| Figure 4: DATA Frame | Figure 4: DATA Frame | |||
| 7.2.2. HEADERS | 7.2.2. HEADERS | |||
| The HEADERS frame (type=0x1) is used to carry an HTTP field section, | The HEADERS frame (type=0x01) is used to carry an HTTP field section, | |||
| encoded using QPACK. See [QPACK] for more details. | encoded using QPACK. See [QPACK] for more details. | |||
| HEADERS Frame { | HEADERS Frame { | |||
| Type (i) = 0x1, | Type (i) = 0x01, | |||
| Length (i), | Length (i), | |||
| Encoded Field Section (..), | Encoded Field Section (..), | |||
| } | } | |||
| Figure 5: HEADERS Frame | Figure 5: HEADERS Frame | |||
| HEADERS frames can only be sent on request or push streams. If a | HEADERS frames can only be sent on request or push streams. If a | |||
| HEADERS frame is received on a control stream, the recipient MUST | HEADERS frame is received on a control stream, the recipient MUST | |||
| respond with a connection error (Section 8) of type | respond with a connection error (Section 8) of type | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| 7.2.3. CANCEL_PUSH | 7.2.3. CANCEL_PUSH | |||
| The CANCEL_PUSH frame (type=0x3) is used to request cancellation of a | The CANCEL_PUSH frame (type=0x03) is used to request cancellation of | |||
| server push prior to the push stream being received. The CANCEL_PUSH | a server push prior to the push stream being received. The | |||
| frame identifies a server push by Push ID (see Section 4.4), encoded | CANCEL_PUSH frame identifies a server push by Push ID (see | |||
| as a variable-length integer. | Section 4.4), encoded as a variable-length integer. | |||
| When a client sends CANCEL_PUSH, it is indicating that it does not | When a client sends CANCEL_PUSH, it is indicating that it does not | |||
| wish to receive the promised resource. The server SHOULD abort | wish to receive the promised resource. The server SHOULD abort | |||
| sending the resource, but the mechanism to do so depends on the state | sending the resource, but the mechanism to do so depends on the state | |||
| of the corresponding push stream. If the server has not yet created | of the corresponding push stream. If the server has not yet created | |||
| a push stream, it does not create one. If the push stream is open, | a push stream, it does not create one. If the push stream is open, | |||
| the server SHOULD abruptly terminate that stream. If the push stream | the server SHOULD abruptly terminate that stream. If the push stream | |||
| has already ended, the server MAY still abruptly terminate the stream | has already ended, the server MAY still abruptly terminate the stream | |||
| or MAY take no action. | or MAY take no action. | |||
| skipping to change at page 33, line 30 ¶ | skipping to change at page 32, line 30 ¶ | |||
| stream could arrive after a client has sent a CANCEL_PUSH frame, | stream could arrive after a client has sent a CANCEL_PUSH frame, | |||
| because a server might not have processed the CANCEL_PUSH. The | because a server might not have processed the CANCEL_PUSH. The | |||
| client SHOULD abort reading the stream with an error code of | client SHOULD abort reading the stream with an error code of | |||
| H3_REQUEST_CANCELLED. | H3_REQUEST_CANCELLED. | |||
| A CANCEL_PUSH frame is sent on the control stream. Receiving a | A CANCEL_PUSH frame is sent on the control stream. Receiving a | |||
| CANCEL_PUSH frame on a stream other than the control stream MUST be | CANCEL_PUSH frame on a stream other than the control stream MUST be | |||
| treated as a connection error of type H3_FRAME_UNEXPECTED. | treated as a connection error of type H3_FRAME_UNEXPECTED. | |||
| CANCEL_PUSH Frame { | CANCEL_PUSH Frame { | |||
| Type (i) = 0x3, | Type (i) = 0x03, | |||
| Length (i), | Length (i), | |||
| Push ID (i), | Push ID (i), | |||
| } | } | |||
| Figure 6: CANCEL_PUSH Frame | Figure 6: CANCEL_PUSH Frame | |||
| The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | |||
| integer. The Push ID identifies the server push that is being | integer. The Push ID identifies the server push that is being | |||
| cancelled; see Section 4.4. If a CANCEL_PUSH frame is received that | cancelled; see Section 4.4. If a CANCEL_PUSH frame is received that | |||
| references a Push ID greater than currently allowed on the | references a Push ID greater than currently allowed on the | |||
| skipping to change at page 34, line 7 ¶ | skipping to change at page 33, line 7 ¶ | |||
| H3_ID_ERROR. | H3_ID_ERROR. | |||
| If the client receives a CANCEL_PUSH frame, that frame might identify | If the client receives a CANCEL_PUSH frame, that frame might identify | |||
| a Push ID that has not yet been mentioned by a PUSH_PROMISE frame due | a Push ID that has not yet been mentioned by a PUSH_PROMISE frame due | |||
| to reordering. If a server receives a CANCEL_PUSH frame for a Push | to reordering. If a server receives a CANCEL_PUSH frame for a Push | |||
| ID that has not yet been mentioned by a PUSH_PROMISE frame, this MUST | ID that has not yet been mentioned by a PUSH_PROMISE frame, this MUST | |||
| be treated as a connection error of type H3_ID_ERROR. | be treated as a connection error of type H3_ID_ERROR. | |||
| 7.2.4. SETTINGS | 7.2.4. SETTINGS | |||
| The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x04) conveys configuration parameters that | |||
| affect how endpoints communicate, such as preferences and constraints | affect how endpoints communicate, such as preferences and constraints | |||
| on peer behavior. Individually, a SETTINGS parameter can also be | on peer behavior. Individually, a SETTINGS parameter can also be | |||
| referred to as a "setting"; the identifier and value of each setting | referred to as a "setting"; the identifier and value of each setting | |||
| parameter can be referred to as a "setting identifier" and a "setting | parameter can be referred to as a "setting identifier" and a "setting | |||
| value". | value". | |||
| SETTINGS frames always apply to an entire HTTP/3 connection, never a | SETTINGS frames always apply to an entire HTTP/3 connection, never a | |||
| single stream. A SETTINGS frame MUST be sent as the first frame of | single stream. A SETTINGS frame MUST be sent as the first frame of | |||
| each control stream (see Section 6.2.1) by each peer, and MUST NOT be | each control stream (see Section 6.2.1) by each peer, and MUST NOT be | |||
| sent subsequently. If an endpoint receives a second SETTINGS frame | sent subsequently. If an endpoint receives a second SETTINGS frame | |||
| skipping to change at page 35, line 11 ¶ | skipping to change at page 34, line 11 ¶ | |||
| The payload of a SETTINGS frame consists of zero or more parameters. | The payload of a SETTINGS frame consists of zero or more parameters. | |||
| Each parameter consists of a setting identifier and a value, both | Each parameter consists of a setting identifier and a value, both | |||
| encoded as QUIC variable-length integers. | encoded as QUIC variable-length integers. | |||
| Setting { | Setting { | |||
| Identifier (i), | Identifier (i), | |||
| Value (i), | Value (i), | |||
| } | } | |||
| SETTINGS Frame { | SETTINGS Frame { | |||
| Type (i) = 0x4, | Type (i) = 0x04, | |||
| Length (i), | Length (i), | |||
| Setting (..) ..., | Setting (..) ..., | |||
| } | } | |||
| Figure 7: SETTINGS Frame | Figure 7: SETTINGS Frame | |||
| An implementation MUST ignore any parameter with an identifier it | An implementation MUST ignore any parameter with an identifier it | |||
| does not understand. | does not understand. | |||
| 7.2.4.1. Defined SETTINGS Parameters | 7.2.4.1. Defined SETTINGS Parameters | |||
| The following settings are defined in HTTP/3: | The following settings are defined in HTTP/3: | |||
| SETTINGS_MAX_FIELD_SECTION_SIZE (0x6): The default value is | SETTINGS_MAX_FIELD_SECTION_SIZE (0x06): The default value is | |||
| unlimited. See Section 4.1.1.3 for usage. | unlimited. See Section 4.1.1.3 for usage. | |||
| Setting identifiers of the format "0x1f * N + 0x21" for non-negative | Setting identifiers of the format "0x1f * N + 0x21" for non-negative | |||
| integer values of N are reserved to exercise the requirement that | integer values of N are reserved to exercise the requirement that | |||
| unknown identifiers be ignored. Such settings have no defined | unknown identifiers be ignored. Such settings have no defined | |||
| meaning. Endpoints SHOULD include at least one such setting in their | meaning. Endpoints SHOULD include at least one such setting in their | |||
| SETTINGS frame. Endpoints MUST NOT consider such settings to have | SETTINGS frame. Endpoints MUST NOT consider such settings to have | |||
| any meaning upon receipt. | any meaning upon receipt. | |||
| Because the setting has no defined meaning, the value of the setting | Because the setting has no defined meaning, the value of the setting | |||
| skipping to change at page 37, line 12 ¶ | skipping to change at page 36, line 12 ¶ | |||
| server accepts 0-RTT but then sends settings that are not compatible | server accepts 0-RTT but then sends settings that are not compatible | |||
| with the previously specified settings, this MUST be treated as a | with the previously specified settings, this MUST be treated as a | |||
| connection error of type H3_SETTINGS_ERROR. If a server accepts | connection error of type H3_SETTINGS_ERROR. If a server accepts | |||
| 0-RTT but then sends a SETTINGS frame that omits a setting value that | 0-RTT but then sends a SETTINGS frame that omits a setting value that | |||
| the client understands (apart from reserved setting identifiers) that | the client understands (apart from reserved setting identifiers) that | |||
| was previously specified to have a non-default value, this MUST be | was previously specified to have a non-default value, this MUST be | |||
| treated as a connection error of type H3_SETTINGS_ERROR. | treated as a connection error of type H3_SETTINGS_ERROR. | |||
| 7.2.5. PUSH_PROMISE | 7.2.5. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x5) is used to carry a promised request | The PUSH_PROMISE frame (type=0x05) is used to carry a promised | |||
| header section from server to client on a request stream, as in | request header section from server to client on a request stream, as | |||
| HTTP/2. | in HTTP/2. | |||
| PUSH_PROMISE Frame { | PUSH_PROMISE Frame { | |||
| Type (i) = 0x5, | Type (i) = 0x05, | |||
| Length (i), | Length (i), | |||
| Push ID (i), | Push ID (i), | |||
| Encoded Field Section (..), | Encoded Field Section (..), | |||
| } | } | |||
| Figure 8: PUSH_PROMISE Frame | Figure 8: PUSH_PROMISE Frame | |||
| The payload consists of: | The payload consists of: | |||
| Push ID: A variable-length integer that identifies the server push | Push ID: A variable-length integer that identifies the server push | |||
| skipping to change at page 38, line 23 ¶ | skipping to change at page 37, line 23 ¶ | |||
| 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; see Section 8. | 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=0x07) 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 | |||
| administrative actions, like server maintenance. GOAWAY by itself | administrative actions, like server maintenance. GOAWAY by itself | |||
| does not close a connection. | does not close a connection. | |||
| GOAWAY Frame { | GOAWAY Frame { | |||
| Type (i) = 0x7, | Type (i) = 0x07, | |||
| Length (i), | Length (i), | |||
| Stream ID/Push ID (..), | Stream ID/Push ID (..), | |||
| } | } | |||
| Figure 9: GOAWAY Frame | Figure 9: GOAWAY Frame | |||
| The GOAWAY frame is always sent on the control stream. In the server | The GOAWAY frame is always sent on the control stream. In the server | |||
| 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 | |||
| skipping to change at page 39, line 9 ¶ | skipping to change at page 38, line 9 ¶ | |||
| 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 of type H3_FRAME_UNEXPECTED; | the control stream as a connection error of type H3_FRAME_UNEXPECTED; | |||
| see Section 8. | 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=0x0d) 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 | |||
| maintained by the QUIC transport. | maintained by the QUIC transport. | |||
| The MAX_PUSH_ID frame is always sent on the control stream. Receipt | The MAX_PUSH_ID frame is always sent on the control stream. Receipt | |||
| of a MAX_PUSH_ID frame on any other stream MUST be treated as a | of a MAX_PUSH_ID frame on any other stream MUST be treated as a | |||
| connection error of type H3_FRAME_UNEXPECTED. | connection error of type H3_FRAME_UNEXPECTED. | |||
| skipping to change at page 39, line 31 ¶ | skipping to change at page 38, line 31 ¶ | |||
| receipt of a MAX_PUSH_ID frame as a connection error of type | receipt of a MAX_PUSH_ID frame as a connection error of type | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| The maximum Push ID is unset when an HTTP/3 connection is created, | The maximum Push ID is unset when an HTTP/3 connection is created, | |||
| meaning that a server cannot push until it receives a MAX_PUSH_ID | meaning that a server cannot push until it receives a MAX_PUSH_ID | |||
| frame. A client that wishes to manage the number of promised server | frame. A client that wishes to manage the number of promised server | |||
| pushes can increase the maximum Push ID by sending MAX_PUSH_ID frames | pushes can increase the maximum Push ID by sending MAX_PUSH_ID frames | |||
| as the server fulfills or cancels server pushes. | as the server fulfills or cancels server pushes. | |||
| MAX_PUSH_ID Frame { | MAX_PUSH_ID Frame { | |||
| Type (i) = 0xd, | Type (i) = 0x0d, | |||
| Length (i), | Length (i), | |||
| Push ID (i), | Push ID (i), | |||
| } | } | |||
| Figure 10: MAX_PUSH_ID Frame | Figure 10: MAX_PUSH_ID Frame | |||
| The MAX_PUSH_ID frame carries a single variable-length integer that | The MAX_PUSH_ID frame carries a single variable-length integer that | |||
| identifies the maximum value for a Push ID that the server can use; | identifies the maximum value for a Push ID that the server can use; | |||
| see Section 4.4. A MAX_PUSH_ID frame cannot reduce the maximum Push | see Section 4.4. A MAX_PUSH_ID frame cannot reduce the maximum Push | |||
| ID; receipt of a MAX_PUSH_ID frame that contains a smaller value than | ID; receipt of a MAX_PUSH_ID frame that contains a smaller value than | |||
| skipping to change at page 41, line 11 ¶ | skipping to change at page 40, line 11 ¶ | |||
| 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. | |||
| 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 (0x0100): 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 (0x0101): Peer violated protocol | |||
| requirements in a way that does not match a more specific error | requirements in a way that does not match a more specific error | |||
| code, or endpoint declines to use the more specific error code. | code, or endpoint declines to use the more specific error code. | |||
| H3_INTERNAL_ERROR (0x102): An internal error has occurred in the | H3_INTERNAL_ERROR (0x0102): An internal error has occurred in the | |||
| HTTP stack. | HTTP stack. | |||
| H3_STREAM_CREATION_ERROR (0x103): The endpoint detected that its | H3_STREAM_CREATION_ERROR (0x0103): The endpoint detected that its | |||
| peer created a stream that it will not accept. | peer created a stream that it will not accept. | |||
| H3_CLOSED_CRITICAL_STREAM (0x104): A stream required by the HTTP/3 | H3_CLOSED_CRITICAL_STREAM (0x0104): A stream required by the HTTP/3 | |||
| connection was closed or reset. | connection was closed or reset. | |||
| H3_FRAME_UNEXPECTED (0x105): A frame was received that was not | H3_FRAME_UNEXPECTED (0x0105): A frame was received that was not | |||
| permitted in the current state or on the current stream. | permitted in the current state or on the current stream. | |||
| H3_FRAME_ERROR (0x106): A frame that fails to satisfy layout | H3_FRAME_ERROR (0x0106): A frame that fails to satisfy layout | |||
| requirements or with an invalid size was received. | requirements or with an invalid size was received. | |||
| H3_EXCESSIVE_LOAD (0x107): The endpoint detected that its peer is | H3_EXCESSIVE_LOAD (0x0107): The endpoint detected that its peer is | |||
| exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
| H3_ID_ERROR (0x108): A Stream ID or Push ID was used incorrectly, | H3_ID_ERROR (0x0108): A Stream ID or Push ID was used incorrectly, | |||
| such as exceeding a limit, reducing a limit, or being reused. | such as exceeding a limit, reducing a limit, or being reused. | |||
| H3_SETTINGS_ERROR (0x109): An endpoint detected an error in the | H3_SETTINGS_ERROR (0x0109): An endpoint detected an error in the | |||
| payload of a SETTINGS frame. | payload of a SETTINGS frame. | |||
| H3_MISSING_SETTINGS (0x10a): No SETTINGS frame was received at the | H3_MISSING_SETTINGS (0x010a): No SETTINGS frame was received at the | |||
| beginning of the control stream. | beginning of the control stream. | |||
| H3_REQUEST_REJECTED (0x10b): A server rejected a request without | H3_REQUEST_REJECTED (0x010b): 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 (0x010c): The request or its response | |||
| pushed response) is cancelled. | (including pushed response) is cancelled. | |||
| H3_REQUEST_INCOMPLETE (0x10d): The client's stream terminated | H3_REQUEST_INCOMPLETE (0x010d): 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 | H3_MESSAGE_ERROR (0x010e): An HTTP message was malformed and cannot | |||
| be processed. | be processed. | |||
| H3_CONNECT_ERROR (0x10f): The TCP connection established in response | H3_CONNECT_ERROR (0x010f): The TCP connection established in | |||
| to a CONNECT request was reset or abnormally closed. | response to a CONNECT request was reset or abnormally closed. | |||
| H3_VERSION_FALLBACK (0x110): The requested operation cannot be | H3_VERSION_FALLBACK (0x0110): 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 | |||
| probability when they would have sent H3_NO_ERROR. | probability when they would have sent H3_NO_ERROR. | |||
| 9. Extensions to HTTP/3 | 9. Extensions to HTTP/3 | |||
| skipping to change at page 43, line 51 ¶ | skipping to change at page 42, line 51 ¶ | |||
| 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.1 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 0x0d), line feed (LF, ASCII 0x0d), and the | |||
| zero character (NUL, ASCII 0x0) might be exploited by an attacker if | zero character (NUL, ASCII 0x0d) 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.5 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. | |||
| skipping to change at page 48, line 43 ¶ | skipping to change at page 47, line 43 ¶ | |||
| 11. IANA Considerations | 11. IANA Considerations | |||
| This document registers a new ALPN protocol ID (Section 11.1) and | This document registers a new ALPN protocol ID (Section 11.1) and | |||
| creates new registries that manage the assignment of codepoints in | creates new registries that manage the assignment of codepoints in | |||
| HTTP/3. | HTTP/3. | |||
| 11.1. Registration of HTTP/3 Identification String | 11.1. Registration of HTTP/3 Identification String | |||
| This document creates a new registration for the identification of | This document creates a new registration for the identification of | |||
| HTTP/3 in the "Application Layer Protocol Negotiation (ALPN) Protocol | HTTP/3 in the "Application-Layer Protocol Negotiation (ALPN) Protocol | |||
| IDs" registry established in [RFC7301]. | IDs" registry established in [RFC7301]. | |||
| The "h3" string identifies HTTP/3: | The "h3" string identifies HTTP/3: | |||
| Protocol: HTTP/3 | Protocol: HTTP/3 | |||
| Identification Sequence: 0x68 0x33 ("h3") | Identification Sequence: 0x68 0x33 ("h3") | |||
| Specification: This document | Specification: This document | |||
| skipping to change at page 50, line 8 ¶ | skipping to change at page 49, line 8 ¶ | |||
| Specifications of frame types MUST include a description of the frame | Specifications of frame types MUST include a description of the frame | |||
| layout and its semantics, including any parts of the frame that are | layout and its semantics, including any parts of the frame that are | |||
| conditionally present. | conditionally present. | |||
| The entries in Table 2 are registered by this document. | The entries in Table 2 are registered by this document. | |||
| +--------------+-------+----------------+ | +--------------+-------+----------------+ | |||
| | Frame Type | Value | Specification | | | Frame Type | Value | Specification | | |||
| +--------------+-------+----------------+ | +--------------+-------+----------------+ | |||
| | DATA | 0x0 | Section 7.2.1 | | | DATA | 0x00 | Section 7.2.1 | | |||
| | | | | | | | | | | |||
| | HEADERS | 0x1 | Section 7.2.2 | | | HEADERS | 0x01 | Section 7.2.2 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x2 | N/A | | | Reserved | 0x02 | N/A | | |||
| | | | | | | | | | | |||
| | CANCEL_PUSH | 0x3 | Section 7.2.3 | | | CANCEL_PUSH | 0x03 | Section 7.2.3 | | |||
| | | | | | | | | | | |||
| | SETTINGS | 0x4 | Section 7.2.4 | | | SETTINGS | 0x04 | Section 7.2.4 | | |||
| | | | | | | | | | | |||
| | PUSH_PROMISE | 0x5 | Section 7.2.5 | | | PUSH_PROMISE | 0x05 | Section 7.2.5 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x6 | N/A | | | Reserved | 0x06 | N/A | | |||
| | | | | | | | | | | |||
| | GOAWAY | 0x7 | Section 7.2.6 | | | GOAWAY | 0x07 | Section 7.2.6 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x8 | N/A | | | Reserved | 0x08 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x9 | N/A | | | Reserved | 0x09 | N/A | | |||
| | | | | | | | | | | |||
| | MAX_PUSH_ID | 0xd | Section 7.2.7 | | | MAX_PUSH_ID | 0x0d | Section 7.2.7 | | |||
| +--------------+-------+----------------+ | +--------------+-------+----------------+ | |||
| Table 2: Initial HTTP/3 Frame Types | Table 2: Initial HTTP/3 Frame Types | |||
| Each code of the format "0x1f * N + 0x21" for non-negative integer | Each code of the format "0x1f * N + 0x21" for non-negative integer | |||
| values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | |||
| MUST NOT be assigned by IANA and MUST NOT appear in the listing of | MUST NOT be assigned by IANA and MUST NOT appear in the listing of | |||
| assigned values. | assigned values. | |||
| 11.2.2. Settings Parameters | 11.2.2. Settings Parameters | |||
| skipping to change at page 51, line 22 ¶ | skipping to change at page 50, line 22 ¶ | |||
| name is optional. | name is optional. | |||
| Default: The value of the setting unless otherwise indicated. A | Default: The value of the setting unless otherwise indicated. A | |||
| default SHOULD be the most restrictive possible value. | default SHOULD be the most restrictive possible value. | |||
| The entries in Table 3 are registered by this document. | The entries in Table 3 are registered by this document. | |||
| +------------------------+-------+------------------+-----------+ | +------------------------+-------+------------------+-----------+ | |||
| | Setting Name | Value | Specification | Default | | | Setting Name | Value | Specification | Default | | |||
| +------------------------+-------+------------------+-----------+ | +------------------------+-------+------------------+-----------+ | |||
| | Reserved | 0x0 | N/A | N/A | | | Reserved | 0x00 | N/A | N/A | | |||
| | | | | | | | | | | | | |||
| | Reserved | 0x2 | N/A | N/A | | | Reserved | 0x02 | N/A | N/A | | |||
| | | | | | | | | | | | | |||
| | Reserved | 0x3 | N/A | N/A | | | Reserved | 0x03 | N/A | N/A | | |||
| | | | | | | | | | | | | |||
| | Reserved | 0x4 | N/A | N/A | | | Reserved | 0x04 | N/A | N/A | | |||
| | | | | | | | | | | | | |||
| | Reserved | 0x5 | N/A | N/A | | | Reserved | 0x05 | N/A | N/A | | |||
| | | | | | | | | | | | | |||
| | MAX_FIELD_SECTION_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | | MAX_FIELD_SECTION_SIZE | 0x06 | Section 7.2.4.1 | Unlimited | | |||
| +------------------------+-------+------------------+-----------+ | +------------------------+-------+------------------+-----------+ | |||
| Table 3: Initial HTTP/3 Settings | Table 3: Initial HTTP/3 Settings | |||
| Each code of the format "0x1f * N + 0x21" for non-negative integer | Each code of the format "0x1f * N + 0x21" for non-negative integer | |||
| values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | |||
| MUST NOT be assigned by IANA and MUST NOT appear in the listing of | MUST NOT be assigned by IANA and MUST NOT appear in the listing of | |||
| assigned values. | assigned values. | |||
| 11.2.3. Error Codes | 11.2.3. Error Codes | |||
| skipping to change at page 52, line 24 ¶ | skipping to change at page 51, line 24 ¶ | |||
| this registry MUST include the following field: | this registry MUST include the following field: | |||
| Name: A name for the error code. | Name: A name for the error code. | |||
| Description: A brief description of the error code semantics. | Description: A brief description of the error code semantics. | |||
| The entries in Table 4 are registered by this document. These error | The entries in Table 4 are registered by this document. These error | |||
| codes were selected from the range that operates on a Specification | codes were selected from the range that operates on a Specification | |||
| Required policy to avoid collisions with HTTP/2 error codes. | Required policy to avoid collisions with HTTP/2 error codes. | |||
| +---------------------------+-------+---------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | Name | Value | Description | Specification | | | Name | Value | Description | Specification | | |||
| +---------------------------+-------+---------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | H3_NO_ERROR | 0x100 | No error | Section 8.1 | | | H3_NO_ERROR | 0x0100 | No error | Section 8.1 | | |||
| | | | | | | | | | | | | |||
| | H3_GENERAL_PROTOCOL_ERROR | 0x101 | General | Section 8.1 | | | H3_GENERAL_PROTOCOL_ERROR | 0x0101 | General | Section 8.1 | | |||
| | | | protocol | | | | | | protocol | | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | H3_INTERNAL_ERROR | 0x102 | Internal | Section 8.1 | | | H3_INTERNAL_ERROR | 0x0102 | Internal | Section 8.1 | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | H3_STREAM_CREATION_ERROR | 0x103 | Stream | Section 8.1 | | | H3_STREAM_CREATION_ERROR | 0x0103 | Stream | Section 8.1 | | |||
| | | | creation | | | | | | creation | | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | H3_CLOSED_CRITICAL_STREAM | 0x104 | Critical | Section 8.1 | | | H3_CLOSED_CRITICAL_STREAM | 0x0104 | Critical | Section 8.1 | | |||
| | | | stream was | | | | | | stream was | | | |||
| | | | closed | | | | | | closed | | | |||
| | | | | | | | | | | | | |||
| | H3_FRAME_UNEXPECTED | 0x105 | Frame not | Section 8.1 | | | H3_FRAME_UNEXPECTED | 0x0105 | Frame not | Section 8.1 | | |||
| | | | permitted in | | | | | | permitted in | | | |||
| | | | the current | | | | | | the current | | | |||
| | | | state | | | | | | state | | | |||
| | | | | | | | | | | | | |||
| | H3_FRAME_ERROR | 0x106 | Frame | Section 8.1 | | | H3_FRAME_ERROR | 0x0106 | Frame | Section 8.1 | | |||
| | | | violated | | | | | | violated | | | |||
| | | | layout or | | | | | | layout or | | | |||
| | | | size rules | | | | | | size rules | | | |||
| | | | | | | | | | | | | |||
| | H3_EXCESSIVE_LOAD | 0x107 | Peer | Section 8.1 | | | H3_EXCESSIVE_LOAD | 0x0107 | Peer | Section 8.1 | | |||
| | | | generating | | | | | | generating | | | |||
| | | | excessive | | | | | | excessive | | | |||
| | | | load | | | | | | load | | | |||
| | | | | | | | | | | | | |||
| | H3_ID_ERROR | 0x108 | An identifier | Section 8.1 | | | H3_ID_ERROR | 0x0108 | An | Section 8.1 | | |||
| | | | was used | | | | | | identifier | | | |||
| | | | incorrectly | | | | | | was used | | | |||
| | | | | | | | | | incorrectly | | | |||
| | H3_SETTINGS_ERROR | 0x109 | SETTINGS | Section 8.1 | | | | | | | | |||
| | | | frame | | | | H3_SETTINGS_ERROR | 0x0109 | SETTINGS | Section 8.1 | | |||
| | | | contained | | | | | | frame | | | |||
| | | | invalid | | | | | | contained | | | |||
| | | | values | | | | | | invalid | | | |||
| | | | | | | | | | values | | | |||
| | H3_MISSING_SETTINGS | 0x10a | No SETTINGS | Section 8.1 | | | | | | | | |||
| | | | frame | | | | H3_MISSING_SETTINGS | 0x010a | No SETTINGS | Section 8.1 | | |||
| | | | received | | | | | | frame | | | |||
| | | | | | | | | | received | | | |||
| | H3_REQUEST_REJECTED | 0x10b | Request not | Section 8.1 | | | | | | | | |||
| | | | processed | | | | H3_REQUEST_REJECTED | 0x010b | Request not | Section 8.1 | | |||
| | | | | | | | | | processed | | | |||
| | H3_REQUEST_CANCELLED | 0x10c | Data no | Section 8.1 | | | | | | | | |||
| | | | longer needed | | | | H3_REQUEST_CANCELLED | 0x010c | Data no | Section 8.1 | | |||
| | | | | | | | | | longer | | | |||
| | H3_REQUEST_INCOMPLETE | 0x10d | Stream | Section 8.1 | | | | | needed | | | |||
| | | | terminated | | | | | | | | | |||
| | | | early | | | | H3_REQUEST_INCOMPLETE | 0x010d | Stream | Section 8.1 | | |||
| | | | | | | | | | terminated | | | |||
| | H3_MESSAGE_ERROR | 0x10e | Malformed | Section 8.1 | | | | | early | | | |||
| | | | message | | | | | | | | | |||
| | | | | | | | H3_MESSAGE_ERROR | 0x010e | Malformed | Section 8.1 | | |||
| | H3_CONNECT_ERROR | 0x10f | TCP reset or | Section 8.1 | | | | | message | | | |||
| | | | error on | | | | | | | | | |||
| | | | CONNECT | | | | H3_CONNECT_ERROR | 0x010f | TCP reset or | Section 8.1 | | |||
| | | | request | | | | | | error on | | | |||
| | | | | | | | | | CONNECT | | | |||
| | H3_VERSION_FALLBACK | 0x110 | Retry over | Section 8.1 | | | | | request | | | |||
| | | | HTTP/1.1 | | | | | | | | | |||
| +---------------------------+-------+---------------+---------------+ | | H3_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 | | |||
| | | | HTTP/1.1 | | | ||||
| +---------------------------+--------+--------------+---------------+ | ||||
| Table 4: Initial HTTP/3 Error Codes | Table 4: Initial HTTP/3 Error Codes | |||
| Each code of the format "0x1f * N + 0x21" for non-negative integer | Each code of the format "0x1f * N + 0x21" for non-negative integer | |||
| values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | values of N (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) | |||
| MUST NOT be assigned by IANA and MUST NOT appear in the listing of | MUST NOT be assigned by IANA and MUST NOT appear in the listing of | |||
| assigned values. | assigned values. | |||
| 11.2.4. Stream Types | 11.2.4. Stream Types | |||
| skipping to change at page 55, line 6 ¶ | skipping to change at page 54, line 6 ¶ | |||
| 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", draft-ietf-httpbis-cache-14 (work in progress), | Caching", draft-ietf-httpbis-cache-19 (work in progress), | |||
| January 2021. | September 2021. | |||
| [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", draft-ietf-quic- | Header Compression for HTTP over QUIC", draft-ietf-quic- | |||
| qpack-21 (work in progress). | qpack-latest (work in progress). | |||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", draft-ietf-quic- | Multiplexed and Secure Transport", RFC 9000, | |||
| transport-34 (work in progress). | DOI 10.17487/RFC9000, | |||
| <https://www.rfc-editor.org/info/rfc9000>. | ||||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", RFC 793, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | 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>. | |||
| [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | |||
| Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
| DOI 10.17487/RFC6066, January 2011, | DOI 10.17487/RFC6066, January 2011, | |||
| skipping to change at page 56, line 11 ¶ | skipping to change at page 55, line 11 ¶ | |||
| Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 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", draft-ietf-httpbis-semantics-14 (work in | Semantics", draft-ietf-httpbis-semantics-19 (work in | |||
| progress), January 2021. | progress), September 2021. | |||
| [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>. | |||
| [DNS-TERMS] | [DNS-TERMS] | |||
| Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | |||
| Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, | Terminology", RFC 8499, DOI 10.17487/RFC8499, January | |||
| January 2019, <https://www.rfc-editor.org/info/rfc8499>. | 2019, <https://www.rfc-editor.org/info/rfc8499>. | |||
| [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", | |||
| draft-ietf-httpbis-messaging-14 (work in progress), | draft-ietf-httpbis-messaging-19 (work in progress), | |||
| January 2021. | September 2021. | |||
| [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 60, line 7 ¶ | skipping to change at page 59, line 7 ¶ | |||
| space for flags as part of their frame payload. | space for flags as part of their frame payload. | |||
| Other than these issues, frame type HTTP/2 extensions are typically | Other than these issues, frame type HTTP/2 extensions are typically | |||
| portable to QUIC simply by replacing Stream 0 in HTTP/2 with a | portable to QUIC simply by replacing Stream 0 in HTTP/2 with a | |||
| control stream in HTTP/3. HTTP/3 extensions will not assume | control stream in HTTP/3. HTTP/3 extensions will not assume | |||
| ordering, but would not be harmed by ordering, and are expected to be | ordering, but would not be harmed by ordering, and are expected to be | |||
| portable to HTTP/2. | portable to HTTP/2. | |||
| A.2.5. Comparison Between HTTP/2 and HTTP/3 Frame Types | A.2.5. Comparison Between HTTP/2 and HTTP/3 Frame Types | |||
| DATA (0x0): Padding is not defined in HTTP/3 frames. See | DATA (0x00): Padding is not defined in HTTP/3 frames. See | |||
| Section 7.2.1. | Section 7.2.1. | |||
| HEADERS (0x1): The PRIORITY region of HEADERS is not defined in | HEADERS (0x01): The PRIORITY region of HEADERS is not defined in | |||
| HTTP/3 frames. Padding is not defined in HTTP/3 frames. See | HTTP/3 frames. Padding is not defined in HTTP/3 frames. See | |||
| Section 7.2.2. | Section 7.2.2. | |||
| PRIORITY (0x2): As described in Appendix A.2.1, HTTP/3 does not | PRIORITY (0x02): As described in Appendix A.2.1, HTTP/3 does not | |||
| provide a means of signaling priority. | provide a means of signaling priority. | |||
| RST_STREAM (0x3): RST_STREAM frames do not exist in HTTP/3, since | RST_STREAM (0x03): RST_STREAM frames do not exist in HTTP/3, since | |||
| QUIC provides stream lifecycle management. The same code point is | QUIC provides stream lifecycle management. The same code point is | |||
| used for the CANCEL_PUSH frame (Section 7.2.3). | used for the CANCEL_PUSH frame (Section 7.2.3). | |||
| SETTINGS (0x4): SETTINGS frames are sent only at the beginning of | SETTINGS (0x04): SETTINGS frames are sent only at the beginning of | |||
| the connection. See Section 7.2.4 and Appendix A.3. | the connection. See Section 7.2.4 and Appendix A.3. | |||
| PUSH_PROMISE (0x5): The PUSH_PROMISE frame does not reference a | PUSH_PROMISE (0x05): The PUSH_PROMISE frame does not reference a | |||
| stream; instead the push stream references the PUSH_PROMISE frame | stream; instead the push stream references the PUSH_PROMISE frame | |||
| using a Push ID. See Section 7.2.5. | using a Push ID. See Section 7.2.5. | |||
| PING (0x6): PING frames do not exist in HTTP/3, as QUIC provides | PING (0x06): PING frames do not exist in HTTP/3, as QUIC provides | |||
| equivalent functionality. | equivalent functionality. | |||
| GOAWAY (0x7): GOAWAY does not contain an error code. In the client | GOAWAY (0x07): GOAWAY does not contain an error code. In the client | |||
| to server direction, it carries a Push ID instead of a server | to server direction, it carries a Push ID instead of a server | |||
| initiated stream ID. See Section 7.2.6. | initiated stream ID. See Section 7.2.6. | |||
| WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist in HTTP/3, | WINDOW_UPDATE (0x08): WINDOW_UPDATE frames do not exist in HTTP/3, | |||
| since QUIC provides flow control. | since QUIC provides flow control. | |||
| CONTINUATION (0x9): CONTINUATION frames do not exist in HTTP/3; | CONTINUATION (0x09): CONTINUATION frames do not exist in HTTP/3; | |||
| instead, larger HEADERS/PUSH_PROMISE frames than HTTP/2 are | instead, larger HEADERS/PUSH_PROMISE frames than HTTP/2 are | |||
| permitted. | permitted. | |||
| Frame types defined by extensions to HTTP/2 need to be separately | Frame types defined by extensions to HTTP/2 need to be separately | |||
| registered for HTTP/3 if still applicable. The IDs of frames defined | registered for HTTP/3 if still applicable. The IDs of frames defined | |||
| in [HTTP2] have been reserved for simplicity. Note that the frame | in [HTTP2] have been reserved for simplicity. Note that the frame | |||
| type space in HTTP/3 is substantially larger (62 bits versus 8 bits), | type space in HTTP/3 is substantially larger (62 bits versus 8 bits), | |||
| so many HTTP/3 frame types have no equivalent HTTP/2 code points. | so many HTTP/3 frame types have no equivalent HTTP/2 code points. | |||
| See Section 11.2.1. | See Section 11.2.1. | |||
| skipping to change at page 61, line 21 ¶ | skipping to change at page 60, line 21 ¶ | |||
| Some transport-level options that HTTP/2 specifies via the SETTINGS | Some transport-level options that HTTP/2 specifies via the SETTINGS | |||
| frame are superseded by QUIC transport parameters in HTTP/3. The | frame are superseded by QUIC transport parameters in HTTP/3. The | |||
| HTTP-level setting that is retained in HTTP/3 has the same value as | HTTP-level setting that is retained in HTTP/3 has the same value as | |||
| in HTTP/2. The superseded settings are reserved, and their receipt | in HTTP/2. The superseded settings are reserved, and their receipt | |||
| is an error. See Section 7.2.4.1 for discussion of both the retained | is an error. See Section 7.2.4.1 for discussion of both the retained | |||
| and reserved values. | and reserved values. | |||
| Below is a listing of how each HTTP/2 SETTINGS parameter is mapped: | Below is a listing of how each HTTP/2 SETTINGS parameter is mapped: | |||
| SETTINGS_HEADER_TABLE_SIZE (0x1): See [QPACK]. | SETTINGS_HEADER_TABLE_SIZE (0x01): See [QPACK]. | |||
| SETTINGS_ENABLE_PUSH (0x2): This is removed in favor of the | SETTINGS_ENABLE_PUSH (0x02): This is removed in favor of the | |||
| MAX_PUSH_ID frame, which provides a more granular control over | MAX_PUSH_ID frame, which provides a more granular control over | |||
| server push. Specifying a setting with the identifier 0x2 | server push. Specifying a setting with the identifier 0x02 | |||
| (corresponding to the SETTINGS_ENABLE_PUSH parameter) in the | (corresponding to the SETTINGS_ENABLE_PUSH parameter) in the | |||
| HTTP/3 SETTINGS frame is an error. | HTTP/3 SETTINGS frame is an error. | |||
| SETTINGS_MAX_CONCURRENT_STREAMS (0x3): QUIC controls the largest | SETTINGS_MAX_CONCURRENT_STREAMS (0x03): QUIC controls the largest | |||
| open Stream ID as part of its flow control logic. Specifying a | open Stream ID as part of its flow control logic. Specifying a | |||
| setting with the identifier 0x3 (corresponding to the | setting with the identifier 0x03 (corresponding to the | |||
| SETTINGS_MAX_CONCURRENT_STREAMS parameter) in the HTTP/3 SETTINGS | SETTINGS_MAX_CONCURRENT_STREAMS parameter) in the HTTP/3 SETTINGS | |||
| frame is an error. | frame is an error. | |||
| SETTINGS_INITIAL_WINDOW_SIZE (0x4): QUIC requires both stream and | SETTINGS_INITIAL_WINDOW_SIZE (0x04): QUIC requires both stream and | |||
| connection flow control window sizes to be specified in the | connection flow control window sizes to be specified in the | |||
| initial transport handshake. Specifying a setting with the | initial transport handshake. Specifying a setting with the | |||
| identifier 0x4 (corresponding to the SETTINGS_INITIAL_WINDOW_SIZE | identifier 0x04 (corresponding to the SETTINGS_INITIAL_WINDOW_SIZE | |||
| parameter) in the HTTP/3 SETTINGS frame is an error. | parameter) in the HTTP/3 SETTINGS frame is an error. | |||
| SETTINGS_MAX_FRAME_SIZE (0x5): This setting has no equivalent in | SETTINGS_MAX_FRAME_SIZE (0x05): This setting has no equivalent in | |||
| HTTP/3. Specifying a setting with the identifier 0x5 | HTTP/3. Specifying a setting with the identifier 0x05 | |||
| (corresponding to the SETTINGS_MAX_FRAME_SIZE parameter) in the | (corresponding to the SETTINGS_MAX_FRAME_SIZE parameter) in the | |||
| HTTP/3 SETTINGS frame is an error. | HTTP/3 SETTINGS frame is an error. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE (0x6): This setting identifier has | SETTINGS_MAX_HEADER_LIST_SIZE (0x06): This setting identifier has | |||
| been renamed SETTINGS_MAX_FIELD_SECTION_SIZE. | been renamed SETTINGS_MAX_FIELD_SECTION_SIZE. | |||
| In HTTP/3, setting values are variable-length integers (6, 14, 30, or | In HTTP/3, setting values are variable-length integers (6, 14, 30, or | |||
| 62 bits long) rather than fixed-length 32-bit fields as in HTTP/2. | 62 bits long) rather than fixed-length 32-bit fields as in HTTP/2. | |||
| This will often produce a shorter encoding, but can produce a longer | This will often produce a shorter encoding, but can produce a longer | |||
| encoding for settings that use the full 32-bit space. Settings | encoding for settings that use the full 32-bit space. Settings | |||
| ported from HTTP/2 might choose to redefine their value to limit it | ported from HTTP/2 might choose to redefine their value to limit it | |||
| to 30 bits for more efficient encoding, or to make use of the 62-bit | to 30 bits for more efficient encoding, or to make use of the 62-bit | |||
| space if more than 30 bits are required. | space if more than 30 bits are required. | |||
| skipping to change at page 62, line 27 ¶ | skipping to change at page 61, line 27 ¶ | |||
| A.4. HTTP/2 Error Codes | A.4. HTTP/2 Error Codes | |||
| QUIC has the same concepts of "stream" and "connection" errors that | QUIC has the same concepts of "stream" and "connection" errors that | |||
| HTTP/2 provides. However, 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 (0x00): H3_NO_ERROR in Section 8.1. | |||
| PROTOCOL_ERROR (0x1): This is mapped to H3_GENERAL_PROTOCOL_ERROR | PROTOCOL_ERROR (0x01): 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, H3_MESSAGE_ERROR, 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 (0x02): H3_INTERNAL_ERROR in Section 8.1. | |||
| FLOW_CONTROL_ERROR (0x3): Not applicable, since QUIC handles flow | FLOW_CONTROL_ERROR (0x03): Not applicable, since QUIC handles flow | |||
| control. | control. | |||
| SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgment of | SETTINGS_TIMEOUT (0x04): Not applicable, since no acknowledgment of | |||
| SETTINGS is defined. | SETTINGS is defined. | |||
| STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream | STREAM_CLOSED (0x05): Not applicable, since QUIC handles stream | |||
| management. | management. | |||
| FRAME_SIZE_ERROR (0x6): H3_FRAME_ERROR error code defined in | FRAME_SIZE_ERROR (0x06): H3_FRAME_ERROR error code defined in | |||
| Section 8.1. | Section 8.1. | |||
| REFUSED_STREAM (0x7): H3_REQUEST_REJECTED (in Section 8.1) is used | REFUSED_STREAM (0x07): H3_REQUEST_REJECTED (in Section 8.1) is used | |||
| to indicate that a request was not processed. Otherwise, not | to indicate that a request was not processed. Otherwise, not | |||
| applicable because QUIC handles stream management. | applicable because QUIC handles stream management. | |||
| CANCEL (0x8): H3_REQUEST_CANCELLED in Section 8.1. | CANCEL (0x08): H3_REQUEST_CANCELLED in Section 8.1. | |||
| COMPRESSION_ERROR (0x9): Multiple error codes are defined in | COMPRESSION_ERROR (0x09): Multiple error codes are defined in | |||
| [QPACK]. | [QPACK]. | |||
| CONNECT_ERROR (0xa): H3_CONNECT_ERROR in Section 8.1. | CONNECT_ERROR (0x0a): H3_CONNECT_ERROR in Section 8.1. | |||
| ENHANCE_YOUR_CALM (0xb): H3_EXCESSIVE_LOAD in Section 8.1. | ENHANCE_YOUR_CALM (0x0b): H3_EXCESSIVE_LOAD in Section 8.1. | |||
| INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to | INADEQUATE_SECURITY (0x0c): Not applicable, since QUIC is assumed to | |||
| provide sufficient security on all connections. | provide sufficient security on all connections. | |||
| HTTP_1_1_REQUIRED (0xd): H3_VERSION_FALLBACK in Section 8.1. | HTTP_1_1_REQUIRED (0x0d): H3_VERSION_FALLBACK in Section 8.1. | |||
| Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | |||
| Section 11.2.3. | Section 11.2.3. | |||
| A.4.1. Mapping Between HTTP/2 and HTTP/3 Errors | A.4.1. Mapping Between HTTP/2 and HTTP/3 Errors | |||
| An intermediary that converts between HTTP/2 and HTTP/3 may encounter | An intermediary that converts between HTTP/2 and HTTP/3 may encounter | |||
| error conditions from either upstream. It is useful to communicate | error conditions from either upstream. It is useful to communicate | |||
| the occurrence of error to the downstream but error codes largely | the occurrence of error to the downstream but error codes largely | |||
| reflect connection-local problems that generally do not make sense to | reflect connection-local problems that generally do not make sense to | |||
| skipping to change at page 64, line 5 ¶ | skipping to change at page 63, line 5 ¶ | |||
| H3_REQUEST_CANCELLED; see Section 4.1.2. | H3_REQUEST_CANCELLED; see Section 4.1.2. | |||
| Conversion between errors is described in the logical mapping. The | Conversion between errors is described in the logical mapping. The | |||
| error codes are defined in non-overlapping spaces in order to protect | error codes are defined in non-overlapping spaces in order to protect | |||
| against accidental conversion that could result in the use of | against accidental conversion that could result in the use of | |||
| 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 | ||||
| *RFC Editor's Note:* Please remove this section prior to | ||||
| publication of a final version of this document. | ||||
| B.1. Since draft-ietf-quic-http-32 | ||||
| o Removed draft version guidance; added final version string | ||||
| o Added H3_MESSAGE_ERROR for malformed messages | ||||
| B.2. Since draft-ietf-quic-http-31 | ||||
| Editorial changes only. | ||||
| B.3. Since draft-ietf-quic-http-30 | ||||
| Editorial changes only. | ||||
| B.4. Since draft-ietf-quic-http-29 | ||||
| o Require a connection error if a reserved frame type that | ||||
| corresponds to a frame in HTTP/2 is received (#3991, #3993) | ||||
| o Require a connection error if a reserved setting that corresponds | ||||
| to a setting in HTTP/2 is received (#3954, #3955) | ||||
| B.5. Since draft-ietf-quic-http-28 | ||||
| o CANCEL_PUSH is recommended even when the stream is reset (#3698, | ||||
| #3700) | ||||
| o Use H3_ID_ERROR when GOAWAY contains a larger identifier (#3631, | ||||
| #3634) | ||||
| B.6. Since draft-ietf-quic-http-27 | ||||
| o Updated text to refer to latest HTTP revisions | ||||
| o Use the HTTP definition of authority for establishing and | ||||
| coalescing connections (#253, #2223, #3558) | ||||
| o Define use of GOAWAY from both endpoints (#2632, #3129) | ||||
| o Require either :authority or Host if the URI scheme has a | ||||
| mandatory authority component (#3408, #3475) | ||||
| B.7. Since draft-ietf-quic-http-26 | ||||
| o No changes | ||||
| B.8. Since draft-ietf-quic-http-25 | ||||
| o Require QUICv1 for HTTP/3 (#3117, #3323) | ||||
| o Remove DUPLICATE_PUSH and allow duplicate PUSH_PROMISE (#3275, | ||||
| #3309) | ||||
| o Clarify the definition of "malformed" (#3352, #3345) | ||||
| B.9. Since draft-ietf-quic-http-24 | ||||
| o Removed H3_EARLY_RESPONSE error code; H3_NO_ERROR is recommended | ||||
| instead (#3130,#3208) | ||||
| o Unknown error codes are equivalent to H3_NO_ERROR (#3276,#3331) | ||||
| o Some error codes are reserved for greasing (#3325,#3360) | ||||
| B.10. Since draft-ietf-quic-http-23 | ||||
| o Removed "quic" Alt-Svc parameter (#3061,#3118) | ||||
| o Clients need not persist unknown settings for use in 0-RTT | ||||
| (#3110,#3113) | ||||
| o Clarify error cases around CANCEL_PUSH (#2819,#3083) | ||||
| B.11. Since draft-ietf-quic-http-22 | ||||
| o Removed priority signaling (#2922,#2924) | ||||
| o Further changes to error codes (#2662,#2551): | ||||
| * Error codes renumbered | ||||
| * HTTP_MALFORMED_FRAME replaced by HTTP_FRAME_ERROR, | ||||
| HTTP_ID_ERROR, and others | ||||
| o Clarify how unknown frame types interact with required frame | ||||
| sequence (#2867,#2858) | ||||
| o Describe interactions with the transport in terms of defined | ||||
| interface terms (#2857,#2805) | ||||
| o Require the use of the "http-opportunistic" resource (RFC 8164) | ||||
| when scheme is "http" (#2439,#2973) | ||||
| o Settings identifiers cannot be duplicated (#2979) | ||||
| o Changes to SETTINGS frames in 0-RTT (#2972,#2790,#2945): | ||||
| * Servers must send all settings with non-default values in their | ||||
| SETTINGS frame, even when resuming | ||||
| * If a client doesn't have settings associated with a 0-RTT | ||||
| ticket, it uses the defaults | ||||
| * Servers can't accept early data if they cannot recover the | ||||
| settings the client will have remembered | ||||
| o Clarify that Upgrade and the 101 status code are prohibited | ||||
| (#2898,#2889) | ||||
| o Clarify that frame types reserved for greasing can occur on any | ||||
| stream, but frame types reserved due to HTTP/2 correspondence are | ||||
| prohibited (#2997,#2692,#2693) | ||||
| o Unknown error codes cannot be treated as errors (#2998,#2816) | ||||
| B.12. Since draft-ietf-quic-http-21 | ||||
| No changes | ||||
| B.13. Since draft-ietf-quic-http-20 | ||||
| o Prohibit closing the control stream (#2509, #2666) | ||||
| o Change default priority to use an orphan node (#2502, #2690) | ||||
| o Exclusive priorities are restored (#2754, #2781) | ||||
| o Restrict use of frames when using CONNECT (#2229, #2702) | ||||
| o Close and maybe reset streams if a connection error occurs for | ||||
| CONNECT (#2228, #2703) | ||||
| o Encourage provision of sufficient unidirectional streams for QPACK | ||||
| (#2100, #2529, #2762) | ||||
| o Allow extensions to use server-initiated bidirectional streams | ||||
| (#2711, #2773) | ||||
| o Clarify use of maximum header list size setting (#2516, #2774) | ||||
| o Extensive changes to error codes and conditions of their sending | ||||
| * Require connection errors for more error conditions (#2511, | ||||
| #2510) | ||||
| * Updated the error codes for illegal GOAWAY frames (#2714, | ||||
| #2707) | ||||
| * Specified error code for HEADERS on control stream (#2708) | ||||
| * Specified error code for servers receiving PUSH_PROMISE (#2709) | ||||
| * Specified error code for receiving DATA before HEADERS (#2715) | ||||
| * Describe malformed messages and their handling (#2410, #2764) | ||||
| * Remove HTTP_PUSH_ALREADY_IN_CACHE error (#2812, #2813) | ||||
| * Refactor Push ID related errors (#2818, #2820) | ||||
| * Rationalize HTTP/3 stream creation errors (#2821, #2822) | ||||
| B.14. Since draft-ietf-quic-http-19 | ||||
| o SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | ||||
| o Non-zero bits in the Empty field of the PRIORITY frame MAY be | ||||
| treated as an error (#2501) | ||||
| B.15. Since draft-ietf-quic-http-18 | ||||
| o Resetting streams following a GOAWAY is recommended, but not | ||||
| required (#2256,#2457) | ||||
| o Use variable-length integers throughout (#2437,#2233,#2253,#2275) | ||||
| * Variable-length frame types, stream types, and settings | ||||
| identifiers | ||||
| * Renumbered stream type assignments | ||||
| * Modified associated reserved values | ||||
| o Frame layout switched from Length-Type-Value to Type-Length-Value | ||||
| (#2395,#2235) | ||||
| o Specified error code for servers receiving DUPLICATE_PUSH (#2497) | ||||
| o Use connection error for invalid PRIORITY (#2507, #2508) | ||||
| B.16. Since draft-ietf-quic-http-17 | ||||
| o HTTP_REQUEST_REJECTED is used to indicate a request can be retried | ||||
| (#2106, #2325) | ||||
| o Changed error code for GOAWAY on the wrong stream (#2231, #2343) | ||||
| B.17. Since draft-ietf-quic-http-16 | ||||
| o Rename "HTTP/QUIC" to "HTTP/3" (#1973) | ||||
| o Changes to PRIORITY frame (#1865, #2075) | ||||
| * Permitted as first frame of request streams | ||||
| * Remove exclusive reprioritization | ||||
| * Changes to Prioritized Element Type bits | ||||
| o Define DUPLICATE_PUSH frame to refer to another PUSH_PROMISE | ||||
| (#2072) | ||||
| o Set defaults for settings, allow request before receiving SETTINGS | ||||
| (#1809, #1846, #2038) | ||||
| o Clarify message processing rules for streams that aren't closed | ||||
| (#1972, #2003) | ||||
| o Removed reservation of error code 0 and moved HTTP_NO_ERROR to | ||||
| this value (#1922) | ||||
| o Removed prohibition of zero-length DATA frames (#2098) | ||||
| B.18. Since draft-ietf-quic-http-15 | ||||
| Substantial editorial reorganization; no technical changes. | ||||
| B.19. Since draft-ietf-quic-http-14 | ||||
| o Recommend sensible values for QUIC transport parameters | ||||
| (#1720,#1806) | ||||
| o Define error for missing SETTINGS frame (#1697,#1808) | ||||
| o Setting values are variable-length integers (#1556,#1807) and do | ||||
| not have separate maximum values (#1820) | ||||
| o Expanded discussion of connection closure (#1599,#1717,#1712) | ||||
| o HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | ||||
| B.20. Since draft-ietf-quic-http-13 | ||||
| o Reserved some frame types for grease (#1333, #1446) | ||||
| o Unknown unidirectional stream types are tolerated, not errors; | ||||
| some reserved for grease (#1490, #1525) | ||||
| o Require settings to be remembered for 0-RTT, prohibit reductions | ||||
| (#1541, #1641) | ||||
| o Specify behavior for truncated requests (#1596, #1643) | ||||
| B.21. Since draft-ietf-quic-http-12 | ||||
| o TLS SNI extension isn't mandatory if an alternative method is used | ||||
| (#1459, #1462, #1466) | ||||
| o Removed flags from HTTP/3 frames (#1388, #1398) | ||||
| o Reserved frame types and settings for use in preserving | ||||
| extensibility (#1333, #1446) | ||||
| o Added general error code (#1391, #1397) | ||||
| o Unidirectional streams carry a type byte and are extensible | ||||
| (#910,#1359) | ||||
| o Priority mechanism now uses explicit placeholders to enable | ||||
| persistent structure in the tree (#441,#1421,#1422) | ||||
| B.22. Since draft-ietf-quic-http-11 | ||||
| o Moved QPACK table updates and acknowledgments to dedicated streams | ||||
| (#1121, #1122, #1238) | ||||
| B.23. Since draft-ietf-quic-http-10 | ||||
| o Settings need to be remembered when attempting and accepting 0-RTT | ||||
| (#1157, #1207) | ||||
| B.24. Since draft-ietf-quic-http-09 | ||||
| o Selected QCRAM for header compression (#228, #1117) | ||||
| o The server_name TLS extension is now mandatory (#296, #495) | ||||
| o Specified handling of unsupported versions in Alt-Svc (#1093, | ||||
| #1097) | ||||
| B.25. Since draft-ietf-quic-http-08 | ||||
| o Clarified connection coalescing rules (#940, #1024) | ||||
| B.26. Since draft-ietf-quic-http-07 | ||||
| o Changes for integer encodings in QUIC (#595,#905) | ||||
| o Use unidirectional streams as appropriate (#515, #240, #281, #886) | ||||
| o Improvement to the description of GOAWAY (#604, #898) | ||||
| o Improve description of server push usage (#947, #950, #957) | ||||
| B.27. Since draft-ietf-quic-http-06 | ||||
| o Track changes in QUIC error code usage (#485) | ||||
| B.28. Since draft-ietf-quic-http-05 | ||||
| o Made push ID sequential, add MAX_PUSH_ID, remove | ||||
| SETTINGS_ENABLE_PUSH (#709) | ||||
| o Guidance about keep-alive and QUIC PINGs (#729) | ||||
| o Expanded text on GOAWAY and cancellation (#757) | ||||
| B.29. Since draft-ietf-quic-http-04 | ||||
| o Cite RFC 5234 (#404) | ||||
| o Return to a single stream per request (#245,#557) | ||||
| o Use separate frame type and settings registries from HTTP/2 (#81) | ||||
| o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | ||||
| o Restored GOAWAY (#696) | ||||
| o Identify server push using Push ID rather than a stream ID | ||||
| (#702,#281) | ||||
| o DATA frames cannot be empty (#700) | ||||
| B.30. Since draft-ietf-quic-http-03 | ||||
| None. | ||||
| B.31. Since draft-ietf-quic-http-02 | ||||
| o Track changes in transport draft | ||||
| B.32. Since draft-ietf-quic-http-01 | ||||
| o SETTINGS changes (#181): | ||||
| * SETTINGS can be sent only once at the start of a connection; no | ||||
| changes thereafter | ||||
| * SETTINGS_ACK removed | ||||
| * Settings can only occur in the SETTINGS frame a single time | ||||
| * Boolean format updated | ||||
| o Alt-Svc parameter changed from "v" to "quic"; format updated | ||||
| (#229) | ||||
| o Closing the connection control stream or any message control | ||||
| stream is a fatal error (#176) | ||||
| o HPACK Sequence counter can wrap (#173) | ||||
| o 0-RTT guidance added | ||||
| o Guide to differences from HTTP/2 and porting HTTP/2 extensions | ||||
| added (#127,#242) | ||||
| B.33. Since draft-ietf-quic-http-00 | ||||
| o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | ||||
| o Changed from using HTTP/2 framing within Stream 3 to new framing | ||||
| format and two-stream-per-request model (#71,#72,#73) | ||||
| o Adopted SETTINGS format from draft-bishop-httpbis-extended- | ||||
| settings-01 | ||||
| o Reworked SETTINGS_ACK to account for indeterminate inter-stream | ||||
| order (#75) | ||||
| o Described CONNECT pseudo-method (#95) | ||||
| o Updated ALPN token and Alt-Svc guidance (#13,#87) | ||||
| o Application-layer-defined error codes (#19,#74) | ||||
| B.34. Since draft-shade-quic-http2-mapping-00 | ||||
| o Adopted as base for draft-ietf-quic-http | ||||
| o Updated authors/editors list | ||||
| Acknowledgments | Acknowledgments | |||
| The original authors of this specification were Robbie Shade and Mike | The original authors of this specification were Robbie Shade and Mike | |||
| Warres. | Warres. | |||
| The IETF QUIC Working Group received an enormous amount of support | The IETF QUIC Working Group received an enormous amount of support | |||
| from many people. Among others, the following people provided | from many people. Among others, the following people provided | |||
| substantial contributions to this document: | substantial contributions to this document: | |||
| o Bence Beky | o Bence Beky | |||
| End of changes. 103 change blocks. | ||||
| 722 lines changed or deleted | 274 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/ | ||||