| draft-ietf-quic-http-27.txt | draft-ietf-quic-http-28.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track 21 February 2020 | Intended status: Standards Track 20 May 2020 | |||
| Expires: 24 August 2020 | Expires: 21 November 2020 | |||
| Hypertext Transfer Protocol Version 3 (HTTP/3) | Hypertext Transfer Protocol Version 3 (HTTP/3) | |||
| draft-ietf-quic-http-27 | draft-ietf-quic-http-28 | |||
| 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. | |||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org (mailto:quic@ietf.org)), which is | |||
| https://mailarchive.ietf.org/arch/search/?email_list=quic | archived at https://mailarchive.ietf.org/arch/ | |||
| (https://mailarchive.ietf.org/arch/search/?email_list=quic). | search/?email_list=quic. | |||
| Working Group information can be found at https://github.com/quicwg | Working Group information can be found at https://github.com/quicwg; | |||
| (https://github.com/quicwg); source code and issues list for this | source code and issues list for this draft can be found at | |||
| draft can be found at https://github.com/quicwg/base-drafts/labels/- | https://github.com/quicwg/base-drafts/labels/-http. | |||
| http (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 24 August 2020. | This Internet-Draft will expire on 21 November 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| skipping to change at page 2, line 30 ¶ | skipping to change at page 2, line 30 ¶ | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4 | 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4 | |||
| 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 5 | 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 5 | |||
| 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 5 | 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 5 | |||
| 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | |||
| 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 7 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 7 | |||
| 3. Connection Setup and Management . . . . . . . . . . . . . . . 8 | 3. Connection Setup and Management . . . . . . . . . . . . . . . 8 | |||
| 3.1. Draft Version Identification . . . . . . . . . . . . . . 8 | 3.1. Draft Version Identification . . . . . . . . . . . . . . 8 | |||
| 3.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 9 | 3.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 9 | |||
| 3.3. Connection Establishment . . . . . . . . . . . . . . . . 9 | 3.2.1. HTTP Alternative Services . . . . . . . . . . . . . . 9 | |||
| 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 10 | 3.2.2. Other Schemes . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 10 | 3.3. Connection Establishment . . . . . . . . . . . . . . . . 10 | |||
| 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 10 | 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.1.1. Header Formatting and Compression . . . . . . . . . . 12 | 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.1.2. Request Cancellation and Rejection . . . . . . . . . 15 | 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 12 | |||
| 4.1.3. Malformed Requests and Responses . . . . . . . . . . 16 | 4.1.1. Field Formatting and Compression . . . . . . . . . . 13 | |||
| 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 17 | 4.1.2. Request Cancellation and Rejection . . . . . . . . . 17 | |||
| 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 18 | 4.1.3. Malformed Requests and Responses . . . . . . . . . . 18 | |||
| 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 18 | 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 18 | |||
| 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 20 | 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 20 | 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 20 | 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.3. Immediate Application Closure . . . . . . . . . . . . . . 22 | 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 22 | 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 23 | |||
| 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 22 | 5.3. Immediate Application Closure . . . . . . . . . . . . . . 25 | |||
| 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 23 | 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 25 | |||
| 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 23 | 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 25 | |||
| 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 24 | 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 26 | |||
| 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 25 | 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 26 | |||
| 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 26 | 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 27 | |||
| 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 26 | 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 28 | |||
| 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 27 | 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 28 | |||
| 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 28 | ||||
| 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 28 | 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 29 | 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 29 | 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 30 | 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 33 | 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 34 | 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 35 | 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 7.2.8. Reserved Frame Types . . . . . . . . . . . . . . . . 36 | 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 35 | |||
| 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 36 | 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 36 | 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 38 | 7.2.8. Reserved Frame Types . . . . . . . . . . . . . . . . 38 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 39 | 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 10.1. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 39 | 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 39 | |||
| 10.2. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 39 | 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 40 | |||
| 10.3. Early Data . . . . . . . . . . . . . . . . . . . . . . . 39 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 41 | |||
| 10.4. Migration . . . . . . . . . . . . . . . . . . . . . . . 39 | 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 41 | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 40 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 41 | |||
| 11.1. Registration of HTTP/3 Identification String . . . . . . 40 | 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 42 | |||
| 11.2. New Registries . . . . . . . . . . . . . . . . . . . . . 40 | 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 42 | |||
| 11.2.1. Frame Types . . . . . . . . . . . . . . . . . . . . 40 | 10.5. Denial-of-Service Considerations . . . . . . . . . . . . 42 | |||
| 11.2.2. Settings Parameters . . . . . . . . . . . . . . . . 42 | 10.5.1. Limits on Field Section Size . . . . . . . . . . . . 43 | |||
| 11.2.3. Error Codes . . . . . . . . . . . . . . . . . . . . 43 | 10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . 44 | |||
| 11.2.4. Stream Types . . . . . . . . . . . . . . . . . . . . 45 | 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 44 | |||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 45 | 10.7. Padding and Traffic Analysis . . . . . . . . . . . . . . 45 | |||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . 45 | 10.8. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 12.2. Informative References . . . . . . . . . . . . . . . . . 47 | 10.9. Early Data . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
| Appendix A. Considerations for Transitioning from HTTP/2 . . . . 48 | 10.10. Migration . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 48 | 10.11. Privacy Considerations . . . . . . . . . . . . . . . . . 46 | |||
| A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 49 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 46 | |||
| A.2.1. Prioritization Differences . . . . . . . . . . . . . 49 | 11.1. Registration of HTTP/3 Identification String . . . . . . 46 | |||
| A.2.2. Header Compression Differences . . . . . . . . . . . 49 | 11.2. New Registries . . . . . . . . . . . . . . . . . . . . . 47 | |||
| A.2.3. Guidance for New Frame Type Definitions . . . . . . . 50 | 11.2.1. Frame Types . . . . . . . . . . . . . . . . . . . . 47 | |||
| A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 50 | 11.2.2. Settings Parameters . . . . . . . . . . . . . . . . 48 | |||
| A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 51 | 11.2.3. Error Codes . . . . . . . . . . . . . . . . . . . . 49 | |||
| A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 52 | 11.2.4. Stream Types . . . . . . . . . . . . . . . . . . . . 52 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 53 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| B.1. Since draft-ietf-quic-http-26 . . . . . . . . . . . . . . 53 | 12.1. Normative References . . . . . . . . . . . . . . . . . . 52 | |||
| B.2. Since draft-ietf-quic-http-25 . . . . . . . . . . . . . . 53 | 12.2. Informative References . . . . . . . . . . . . . . . . . 54 | |||
| B.3. Since draft-ietf-quic-http-24 . . . . . . . . . . . . . . 54 | Appendix A. Considerations for Transitioning from HTTP/2 . . . . 55 | |||
| B.4. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 54 | A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| B.5. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 54 | A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 56 | |||
| B.6. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 55 | A.2.1. Prioritization Differences . . . . . . . . . . . . . 57 | |||
| B.7. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 55 | A.2.2. Field Compression Differences . . . . . . . . . . . . 57 | |||
| B.8. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 56 | A.2.3. Guidance for New Frame Type Definitions . . . . . . . 57 | |||
| B.9. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 56 | A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 58 | |||
| B.10. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 56 | A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 59 | |||
| B.11. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 57 | A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 60 | |||
| B.12. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 57 | A.4.1. Mapping Between HTTP/2 and HTTP/3 Errors . . . . . . 61 | |||
| B.13. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 57 | ||||
| B.14. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 57 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 61 | |||
| B.15. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 58 | B.1. Since draft-ietf-quic-http-27 . . . . . . . . . . . . . . 62 | |||
| B.16. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 58 | B.2. Since draft-ietf-quic-http-26 . . . . . . . . . . . . . . 62 | |||
| B.17. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 58 | B.3. Since draft-ietf-quic-http-25 . . . . . . . . . . . . . . 62 | |||
| B.18. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 58 | B.4. Since draft-ietf-quic-http-24 . . . . . . . . . . . . . . 62 | |||
| B.19. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 59 | B.5. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 62 | |||
| B.20. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 59 | B.6. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 62 | |||
| B.21. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 59 | B.7. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 63 | |||
| B.22. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 59 | B.8. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 63 | |||
| B.23. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 59 | B.9. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 64 | |||
| B.24. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 59 | B.10. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 64 | |||
| B.25. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 60 | B.11. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 65 | |||
| B.26. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 60 | B.12. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 65 | |||
| B.27. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 60 | B.13. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 66 | |||
| B.28. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 61 | B.14. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 66 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 61 | B.15. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 66 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 61 | B.16. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 66 | |||
| B.17. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 67 | ||||
| B.18. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 67 | ||||
| B.19. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 67 | ||||
| B.20. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 67 | ||||
| B.21. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 67 | ||||
| B.22. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 67 | ||||
| B.23. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 67 | ||||
| B.24. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 67 | ||||
| B.25. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 68 | ||||
| B.26. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 68 | ||||
| B.27. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 68 | ||||
| B.28. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 69 | ||||
| B.29. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 69 | ||||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 69 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 70 | ||||
| 1. Introduction | 1. Introduction | |||
| HTTP semantics are used for a broad range of services on the | HTTP semantics [SEMANTICS] are used for a broad range of services on | |||
| Internet. These semantics have commonly been used with two different | the Internet. These semantics have most commonly been used with two | |||
| TCP mappings, HTTP/1.1 and HTTP/2. HTTP/3 supports the same | different TCP mappings, HTTP/1.1 and HTTP/2. HTTP/3 supports the | |||
| semantics over a new transport protocol, QUIC. | same semantics over a new transport protocol, QUIC. | |||
| 1.1. Prior versions of HTTP | 1.1. Prior versions of HTTP | |||
| HTTP/1.1 is a TCP mapping which uses whitespace-delimited text fields | HTTP/1.1 [HTTP11] is a TCP mapping which uses whitespace-delimited | |||
| to convey HTTP messages. While these exchanges are human-readable, | text fields to convey HTTP messages. While these exchanges are | |||
| using whitespace for message formatting leads to parsing difficulties | human-readable, using whitespace for message formatting leads to | |||
| and workarounds to be tolerant of variant behavior. Because each | parsing complexity and motivates tolerance of variant behavior. | |||
| connection can transfer only a single HTTP request or response at a | Because each connection can transfer only a single HTTP request or | |||
| time in each direction, multiple parallel TCP connections are often | response at a time in each direction, multiple parallel TCP | |||
| used, reducing the ability of the congestion controller to accurately | connections are often used, reducing the ability of the congestion | |||
| manage traffic between endpoints. | controller to effectively manage traffic between endpoints. | |||
| HTTP/2 introduced a binary framing and multiplexing layer to improve | HTTP/2 [HTTP2] introduced a binary framing and multiplexing layer to | |||
| latency without modifying the transport layer. However, because the | improve latency without modifying the transport layer. However, | |||
| parallel nature of HTTP/2's multiplexing is not visible to TCP's loss | because the parallel nature of HTTP/2's multiplexing is not visible | |||
| recovery mechanisms, a lost or reordered packet causes all active | to TCP's loss recovery mechanisms, a lost or reordered packet causes | |||
| transactions to experience a stall regardless of whether that | all active transactions to experience a stall regardless of whether | |||
| transaction was impacted by the lost packet. | that transaction was directly impacted by the lost packet. | |||
| 1.2. Delegation to QUIC | 1.2. Delegation to QUIC | |||
| The QUIC transport protocol incorporates stream multiplexing and per- | The QUIC transport protocol incorporates stream multiplexing and per- | |||
| stream flow control, similar to that provided by the HTTP/2 framing | stream flow control, similar to that provided by the HTTP/2 framing | |||
| layer. By providing reliability at the stream level and congestion | layer. By providing reliability at the stream level and congestion | |||
| control across the entire connection, it has the capability to | control across the entire connection, it has the capability to | |||
| improve the performance of HTTP compared to a TCP mapping. QUIC also | improve the performance of HTTP compared to a TCP mapping. QUIC also | |||
| incorporates TLS 1.3 at the transport layer, offering comparable | incorporates TLS 1.3 [TLS13] at the transport layer, offering | |||
| security to running TLS over TCP, with the improved connection setup | comparable security to running TLS over TCP, with the improved | |||
| latency of TCP Fast Open [RFC7413]. | connection setup latency of TCP Fast Open [TFO]. | |||
| This document defines a mapping of HTTP semantics over the QUIC | This document defines a mapping of HTTP semantics over the QUIC | |||
| transport protocol, drawing heavily on the design of HTTP/2. While | transport protocol, drawing heavily on the design of HTTP/2. While | |||
| delegating stream lifetime and flow control issues to QUIC, a similar | delegating stream lifetime and flow control issues to QUIC, a similar | |||
| binary framing is used on each stream. Some HTTP/2 features are | binary framing is used on each stream. Some HTTP/2 features are | |||
| subsumed by QUIC, while other features are implemented atop QUIC. | subsumed by QUIC, while other features are implemented atop QUIC. | |||
| QUIC is described in [QUIC-TRANSPORT]. For a full description of | QUIC is described in [QUIC-TRANSPORT]. For a full description of | |||
| HTTP/2, see [HTTP2]. | HTTP/2, see [HTTP2]. | |||
| 2. HTTP/3 Protocol Overview | 2. HTTP/3 Protocol Overview | |||
| HTTP/3 provides a transport for HTTP semantics using the QUIC | HTTP/3 provides a transport for HTTP semantics using the QUIC | |||
| transport protocol and an internal framing layer similar to HTTP/2. | transport protocol and an internal framing layer similar to HTTP/2. | |||
| Once a client knows that an HTTP/3 server exists at a certain | Once a client knows that an HTTP/3 server exists at a certain | |||
| endpoint, it opens a QUIC connection. QUIC provides protocol | endpoint, it opens a QUIC connection. QUIC provides protocol | |||
| negotiation, stream-based multiplexing, and flow control. An HTTP/3 | negotiation, stream-based multiplexing, and flow control. Discovery | |||
| endpoint can be discovered using HTTP Alternative Services; this | of an HTTP/3 endpoint is described in Section 3.2. | |||
| process is described in greater detail in Section 3.2. | ||||
| Within each stream, the basic unit of HTTP/3 communication is a frame | Within each stream, the basic unit of HTTP/3 communication is a frame | |||
| (Section 7.2). Each frame type serves a different purpose. For | (Section 7.2). Each frame type serves a different purpose. For | |||
| example, HEADERS and DATA frames form the basis of HTTP requests and | example, HEADERS and DATA frames form the basis of HTTP requests and | |||
| responses (Section 4.1). | responses (Section 4.1). | |||
| Multiplexing of requests is performed using the QUIC stream | Multiplexing of requests is performed using the QUIC stream | |||
| abstraction, described in Section 2 of [QUIC-TRANSPORT]. Each | abstraction, described in Section 2 of [QUIC-TRANSPORT]. Each | |||
| request-response pair consumes a single QUIC stream. Streams are | request-response pair consumes a single QUIC stream. Streams are | |||
| independent of each other, so one stream that is blocked or suffers | independent of each other, so one stream that is blocked or suffers | |||
| packet loss does not prevent progress on other streams. | packet loss does not prevent progress on other streams. | |||
| Server push is an interaction mode introduced in HTTP/2 [HTTP2] which | Server push is an interaction mode introduced in HTTP/2 [HTTP2] which | |||
| permits a server to push a request-response exchange to a client in | permits a server to push a request-response exchange to a client in | |||
| anticipation of the client making the indicated request. This trades | anticipation of the client making the indicated request. This trades | |||
| off network usage against a potential latency gain. Several HTTP/3 | off network usage against a potential latency gain. Several HTTP/3 | |||
| frames are used to manage server push, such as PUSH_PROMISE, | frames are used to manage server push, such as PUSH_PROMISE, | |||
| MAX_PUSH_ID, and CANCEL_PUSH. | MAX_PUSH_ID, and CANCEL_PUSH. | |||
| As in HTTP/2, request and response headers are compressed for | As in HTTP/2, request and response fields are compressed for | |||
| transmission. Because HPACK [HPACK] relies on in-order transmission | transmission. Because HPACK [HPACK] relies on in-order transmission | |||
| of compressed header blocks (a guarantee not provided by QUIC), | of compressed field sections (a guarantee not provided by QUIC), | |||
| HTTP/3 replaces HPACK with QPACK [QPACK]. QPACK uses separate | HTTP/3 replaces HPACK with QPACK [QPACK]. QPACK uses separate | |||
| unidirectional streams to modify and track header table state, while | unidirectional streams to modify and track field table state, while | |||
| header blocks refer to the state of the table without modifying it. | encoded field sections refer to the state of the table without | |||
| modifying it. | ||||
| 2.1. Document Organization | 2.1. Document Organization | |||
| The following sections provide a detailed overview of the connection | The following sections provide a detailed overview of the connection | |||
| lifecycle and key concepts: | lifecycle and key concepts: | |||
| * Connection Setup and Management (Section 3) covers how an HTTP/3 | * Connection Setup and Management (Section 3) covers how an HTTP/3 | |||
| endpoint is discovered and a connection is established. | endpoint is discovered and a connection is established. | |||
| * HTTP Request Lifecycle (Section 4) describes how HTTP semantics | * HTTP Request Lifecycle (Section 4) describes how HTTP semantics | |||
| skipping to change at page 7, line 9 ¶ | skipping to change at page 7, line 17 ¶ | |||
| * Extensions to HTTP/3 (Section 9) describes how new capabilities | * Extensions to HTTP/3 (Section 9) describes how new capabilities | |||
| can be added in future documents. | can be added in future documents. | |||
| * A more detailed comparison between HTTP/2 and HTTP/3 can be found | * 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 BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| Field definitions are given in Augmented Backus-Naur Form (ABNF), as | Field definitions are given in Augmented Backus-Naur Form (ABNF), as | |||
| defined in [RFC5234]. | defined in [RFC5234]. | |||
| 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: | |||
| skipping to change at page 8, line 13 ¶ | skipping to change at page 8, line 21 ¶ | |||
| sender: An endpoint that is transmitting frames. | sender: An endpoint that is transmitting frames. | |||
| server: The endpoint that accepts an HTTP/3 connection. Servers | server: The endpoint that accepts an HTTP/3 connection. Servers | |||
| receive HTTP requests and send HTTP responses. | receive HTTP requests and send HTTP responses. | |||
| stream: A bidirectional or unidirectional bytestream provided by the | stream: A bidirectional or unidirectional bytestream provided by the | |||
| QUIC transport. | QUIC transport. | |||
| stream error: An error on the individual HTTP/3 stream. | stream error: An error on the individual HTTP/3 stream. | |||
| The term "payload body" is defined in Section 3.3 of [RFC7230]. | The term "payload body" is defined in Section 6.3.3 of [SEMANTICS]. | |||
| Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" | Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" | |||
| are defined in Section 2.3 of [RFC7230]. Intermediaries act as both | are defined in Section 2.2 of [SEMANTICS]. Intermediaries act as | |||
| client and server at different times. | both client and server at different times. | |||
| 3. Connection Setup and Management | 3. Connection Setup and Management | |||
| 3.1. Draft Version Identification | 3.1. Draft Version Identification | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| HTTP/3 uses the token "h3" to identify itself in ALPN and Alt-Svc. | HTTP/3 uses the token "h3" to identify itself in ALPN and Alt-Svc. | |||
| Only implementations of the final, published RFC can identify | Only implementations of the final, published RFC can identify | |||
| skipping to change at page 8, line 47 ¶ | skipping to change at page 9, line 6 ¶ | |||
| their transport. For example, the application protocol defined in | their transport. For example, the application protocol defined in | |||
| draft-ietf-quic-http-25 uses the transport defined in draft-ietf- | draft-ietf-quic-http-25 uses the transport defined in draft-ietf- | |||
| quic-transport-25. | quic-transport-25. | |||
| Non-compatible experiments that are based on these draft versions | Non-compatible experiments that are based on these draft versions | |||
| MUST append the string "-" and an experiment name to the identifier. | MUST append the string "-" and an experiment name to the identifier. | |||
| For example, an experimental implementation based on draft-ietf-quic- | For example, an experimental implementation based on draft-ietf-quic- | |||
| http-09 which reserves an extra stream for unsolicited transmission | http-09 which reserves an extra stream for unsolicited transmission | |||
| of 1980s pop music might identify itself as "h3-09-rickroll". Note | of 1980s pop music might identify itself as "h3-09-rickroll". Note | |||
| that any label MUST conform to the "token" syntax defined in | that any label MUST conform to the "token" syntax defined in | |||
| Section 3.2.6 of [RFC7230]. Experimenters are encouraged to | Section 4.4.1.1 of [SEMANTICS]. Experimenters are encouraged to | |||
| coordinate their experiments on the quic@ietf.org mailing list. | coordinate their experiments on the quic@ietf.org | |||
| (mailto:quic@ietf.org) mailing list. | ||||
| 3.2. Discovering an HTTP/3 Endpoint | 3.2. Discovering an HTTP/3 Endpoint | |||
| HTTP relies on the notion of an authoritative response: a response | ||||
| that has been determined to be the most appropriate response for that | ||||
| request given the state of the target resource at the time of | ||||
| response message origination by (or at the direction of) the origin | ||||
| server identified within the target URI. Locating an authoritative | ||||
| server for an HTTP URL is discussed in Section 5.4 of [SEMANTICS]. | ||||
| The "https" scheme associates authority with possession of a | ||||
| certificate that the client considers to be trustworthy for the host | ||||
| identified by the authority component of the URL. If a server | ||||
| presents a certificate and proof that it controls the corresponding | ||||
| private key, then a client will accept a secured connection to that | ||||
| server as being authoritative for all origins with the "https" scheme | ||||
| and a host identified in the certificate. | ||||
| A client MAY attempt access to a resource with an "https" URI by | ||||
| resolving the host identifier to an IP address, establishing a QUIC | ||||
| connection to that address on the indicated port, and sending an | ||||
| HTTP/3 request message targeting the URI to the server over that | ||||
| secured connection. | ||||
| Connectivity problems (e.g., blocking UDP) can result in QUIC | ||||
| connection establishment failure; clients SHOULD attempt to use TCP- | ||||
| based versions of HTTP in this case. | ||||
| Servers MAY serve HTTP/3 on any UDP port; an alternative service | ||||
| advertisement always includes an explicit port, and URLs contain | ||||
| either an explicit port or a default port associated with the scheme. | ||||
| 3.2.1. HTTP Alternative Services | ||||
| An HTTP origin advertises the availability of an equivalent HTTP/3 | An HTTP origin advertises the availability of an equivalent HTTP/3 | |||
| endpoint via the Alt-Svc HTTP response header field or the HTTP/2 | endpoint via the Alt-Svc HTTP response header field or the HTTP/2 | |||
| ALTSVC frame ([ALTSVC]), using the ALPN token defined in Section 3.3. | ALTSVC frame ([ALTSVC]), using the ALPN token defined in Section 3.3. | |||
| For example, an origin could indicate in an HTTP response that HTTP/3 | For example, an origin could indicate in an HTTP response that HTTP/3 | |||
| was available on UDP port 50781 at the same hostname by including the | was available on UDP port 50781 at the same hostname by including the | |||
| following header field: | following header field: | |||
| Alt-Svc: h3=":50781" | Alt-Svc: h3=":50781" | |||
| On receipt of an Alt-Svc record indicating HTTP/3 support, a client | On receipt of an Alt-Svc record indicating HTTP/3 support, a client | |||
| MAY attempt to establish a QUIC connection to the indicated host and | MAY attempt to establish a QUIC connection to the indicated host and | |||
| port and, if successful, send HTTP requests using the mapping | port and, if successful, send HTTP requests using the mapping | |||
| described in this document. | described in this document. | |||
| Connectivity problems (e.g. firewall blocking UDP) can result in QUIC | 3.2.2. Other Schemes | |||
| connection establishment failure, in which case the client SHOULD | ||||
| continue using the existing connection or try another alternative | ||||
| endpoint offered by the origin. | ||||
| Servers MAY serve HTTP/3 on any UDP port, since an alternative always | Although HTTP is independent of the transport protocol, the "http" | |||
| includes an explicit port. | scheme associates authority with the ability to receive TCP | |||
| connections on the indicated port of whatever host is identified | ||||
| within the authority component. Because HTTP/3 does not use TCP, | ||||
| HTTP/3 cannot be used for direct access to the authoritative server | ||||
| for a resource identified by an "http" URI. However, protocol | ||||
| extensions such as [ALTSVC] permit the authoritative server to | ||||
| identify other services which are also authoritative and which might | ||||
| be reachable over HTTP/3. | ||||
| Prior to making requests for an origin whose scheme is not "https", | ||||
| the client MUST ensure the server is willing to serve that scheme. | ||||
| If the client intends to make requests for an origin whose scheme is | ||||
| "http", this means that it MUST obtain a valid "http-opportunistic" | ||||
| response for the origin as described in [RFC8164] prior to making any | ||||
| such requests. Other schemes might define other mechanisms. | ||||
| 3.3. Connection Establishment | 3.3. Connection Establishment | |||
| HTTP/3 relies on QUIC version 1 as the underlying transport. The use | HTTP/3 relies on QUIC version 1 as the underlying transport. The use | |||
| of other QUIC transport versions with HTTP/3 MAY be defined by future | of other QUIC transport versions with HTTP/3 MAY be defined by future | |||
| specifications. | specifications. | |||
| QUIC version 1 uses TLS version 1.3 or greater as its handshake | QUIC version 1 uses TLS version 1.3 or greater as its handshake | |||
| protocol. HTTP/3 clients MUST support a mechanism to indicate the | protocol. HTTP/3 clients MUST support a mechanism to indicate the | |||
| target host to the server during the TLS handshake. If the server is | target host to the server during the TLS handshake. If the server is | |||
| skipping to change at page 10, line 4 ¶ | skipping to change at page 11, line 9 ¶ | |||
| QUIC connections are established as described in [QUIC-TRANSPORT]. | QUIC connections are established as described in [QUIC-TRANSPORT]. | |||
| During connection establishment, HTTP/3 support is indicated by | During connection establishment, HTTP/3 support is indicated by | |||
| selecting the ALPN token "h3" in the TLS handshake. Support for | selecting the ALPN token "h3" in the TLS handshake. Support for | |||
| other application-layer protocols MAY be offered in the same | other application-layer protocols MAY be offered in the same | |||
| handshake. | handshake. | |||
| While connection-level options pertaining to the core QUIC protocol | While connection-level options pertaining to the core QUIC protocol | |||
| are set in the initial crypto handshake, HTTP/3-specific settings are | are set in the initial crypto handshake, HTTP/3-specific settings are | |||
| conveyed in the SETTINGS frame. After the QUIC connection is | conveyed in the SETTINGS frame. After the QUIC connection is | |||
| established, a SETTINGS frame (Section 7.2.4) MUST be sent by each | established, a SETTINGS frame (Section 7.2.4) MUST be sent by each | |||
| endpoint as the initial frame of their respective HTTP control stream | endpoint as the initial frame of their respective HTTP control | |||
| (see Section 6.2.1). | stream; see Section 6.2.1. | |||
| 3.4. Connection Reuse | 3.4. Connection Reuse | |||
| HTTP/3 connections are persistent across multiple requests. For best | ||||
| performance, it is expected that clients will not close connections | ||||
| until it is determined that no further communication with a server is | ||||
| necessary (for example, when a user navigates away from a particular | ||||
| web page) or until the server closes the connection. | ||||
| Once a connection exists to a server endpoint, this connection MAY be | Once a connection exists to a server endpoint, this connection MAY be | |||
| reused for requests with multiple different URI authority components. | reused for requests with multiple different URI authority components. | |||
| The client MAY send any requests for which the client considers the | In general, a server is considered authoritative for all URIs with | |||
| server authoritative. | the "https" scheme for which the hostname in the URI is present in | |||
| the authenticated certificate provided by the server, either as the | ||||
| CN field of the certificate subject or as a dNSName in the | ||||
| subjectAltName field of the certificate; see [RFC6125]. For a host | ||||
| that is an IP address, the client MUST verify that the address | ||||
| appears as an iPAddress in the subjectAltName field of the | ||||
| certificate. If the hostname or address is not present in the | ||||
| certificate, the client MUST NOT consider the server authoritative | ||||
| for origins containing that hostname or address. See Section 5.4 of | ||||
| [SEMANTICS] for more detail on authoritative access. | ||||
| An authoritative HTTP/3 endpoint is typically discovered because the | Clients SHOULD NOT open more than one HTTP/3 connection to a given | |||
| client has received an Alt-Svc record from the request's origin which | host and port pair, where the host is derived from a URI, a selected | |||
| nominates the endpoint as a valid HTTP Alternative Service for that | alternative service [ALTSVC], or a configured proxy. A client MAY | |||
| origin. As required by [RFC7838], clients MUST check that the | open multiple connections to the same IP address and UDP port using | |||
| nominated server can present a valid certificate for the origin | different transport or TLS configurations but SHOULD avoid creating | |||
| before considering it authoritative. Clients MUST NOT assume that an | multiple connections with the same configuration. | |||
| HTTP/3 endpoint is authoritative for other origins without an | ||||
| explicit signal. | ||||
| Prior to making requests for an origin whose scheme is not "https," | Servers are encouraged to maintain open connections for as long as | |||
| the client MUST ensure the server is willing to serve that scheme. | possible but are permitted to terminate idle connections if | |||
| If the client intends to make requests for an origin whose scheme is | necessary. When either endpoint chooses to close the HTTP/3 session, | |||
| "http", this means that it MUST obtain a valid "http-opportunistic" | the terminating endpoint SHOULD first send a GOAWAY frame | |||
| response for the origin as described in [RFC8164] prior to making any | (Section 5.2) so that both endpoints can reliably determine whether | |||
| such requests. Other schemes might define other mechanisms. | previously sent frames have been processed and gracefully complete or | |||
| terminate any necessary remaining tasks. | ||||
| A server that does not wish clients to reuse connections for a | A server that does not wish clients to reuse connections for a | |||
| particular origin can indicate that it is not authoritative for a | particular origin can indicate that it is not authoritative for a | |||
| request by sending a 421 (Misdirected Request) status code in | request by sending a 421 (Misdirected Request) status code in | |||
| response to the request (see Section 9.1.2 of [HTTP2]). | response to the request; see Section 9.1.2 of [HTTP2]. | |||
| The considerations discussed in Section 9.1 of [HTTP2] also apply to | ||||
| the management of HTTP/3 connections. | ||||
| 4. HTTP Request Lifecycle | 4. HTTP Request Lifecycle | |||
| 4.1. HTTP Message Exchanges | 4.1. HTTP Message Exchanges | |||
| A client sends an HTTP request on a client-initiated bidirectional | A client sends an HTTP request on a client-initiated bidirectional | |||
| QUIC stream. A client MUST send only a single request on a given | QUIC stream. A client MUST send only a single request on a given | |||
| stream. A server sends zero or more non-final HTTP responses on the | stream. A server sends zero or more interim HTTP responses on the | |||
| same stream as the request, followed by a single final HTTP response, | same stream as the request, followed by a single final HTTP response, | |||
| as detailed below. | as detailed below. | |||
| Pushed responses are sent on a server-initiated unidirectional QUIC | Pushed responses are sent on a server-initiated unidirectional QUIC | |||
| stream (see Section 6.2.2). A server sends zero or more non-final | stream; see Section 6.2.2. A server sends zero or more interim HTTP | |||
| HTTP responses, followed by a single final HTTP response, in the same | responses, followed by a single final HTTP response, in the same | |||
| manner as a standard response. Push is described in more detail in | manner as a standard response. Push is described in more detail in | |||
| Section 4.4. | Section 4.4. | |||
| On a given stream, receipt of multiple requests or receipt of an | On a given stream, receipt of multiple requests or receipt of an | |||
| additional HTTP response following a final HTTP response MUST be | additional HTTP response following a final HTTP response MUST be | |||
| treated as malformed (Section 4.1.3). | treated as malformed (Section 4.1.3). | |||
| An HTTP message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
| 1. the message header (see Section 3.2 of [RFC7230]), sent as a | 1. the header field section (see Section 4 of [SEMANTICS]), sent as | |||
| single HEADERS frame (see Section 7.2.2), | a single HEADERS frame (see Section 7.2.2), | |||
| 2. optionally, the payload body, if present (see Section 3.3 of | 2. optionally, the payload body, if present (see Section 6.3.3 of | |||
| [RFC7230]), sent as a series of DATA frames (see Section 7.2.1), | [SEMANTICS]), sent as a series of DATA frames (see | |||
| Section 7.2.1), | ||||
| 3. optionally, trailing headers, if present (see Section 4.1.2 of | 3. optionally, the trailer field section, if present (see | |||
| [RFC7230]), sent as a single HEADERS frame. | Section 4.6 of [SEMANTICS]), sent as a single HEADERS frame. | |||
| Receipt of DATA and HEADERS frames in any other sequence MUST be | Receipt of an invalid sequence of frames MUST be treated as a | |||
| treated as a connection error of type H3_FRAME_UNEXPECTED | connection error of type H3_FRAME_UNEXPECTED (Section 8). In | |||
| (Section 8). | particular, a DATA frame before any HEADERS frame, or a HEADERS or | |||
| DATA frame after the trailing HEADERS frame is considered invalid. | ||||
| A server MAY send one or more PUSH_PROMISE frames (see Section 7.2.5) | A server MAY send one or more PUSH_PROMISE frames (see Section 7.2.5) | |||
| before, after, or interleaved with the frames of a response message. | before, after, or interleaved with the frames of a response message. | |||
| These PUSH_PROMISE frames are not part of the response; see | These PUSH_PROMISE frames are not part of the response; see | |||
| Section 4.4 for more details. These frames are not permitted in | Section 4.4 for more details. These frames are not permitted in | |||
| pushed responses; a pushed response which includes PUSH_PROMISE | pushed responses; a pushed response which includes PUSH_PROMISE | |||
| frames MUST be treated as a connection error of type | frames MUST be treated as a connection error of type | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| Frames of unknown types (Section 9), including reserved frames | Frames of unknown types (Section 9), including reserved frames | |||
| (Section 7.2.8) MAY be sent on a request or push stream before, | (Section 7.2.8) MAY be sent on a request or push stream before, | |||
| after, or interleaved with other frames described in this section. | after, or interleaved with other frames described in this section. | |||
| The HEADERS and PUSH_PROMISE frames might reference updates to the | The HEADERS and PUSH_PROMISE frames might reference updates to the | |||
| QPACK dynamic table. While these updates are not directly part of | QPACK dynamic table. While these updates are not directly part of | |||
| the message exchange, they must be received and processed before the | the message exchange, they must be received and processed before the | |||
| message can be consumed. See Section 4.1.1 for more details. | message can be consumed. See Section 4.1.1 for more details. | |||
| The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | The "chunked" transfer encoding defined in Section 7.1 of [HTTP11] | |||
| MUST NOT be used. | MUST NOT be used. | |||
| A response MAY consist of multiple messages when and only when one or | A response MAY consist of multiple messages when and only when one or | |||
| more informational responses (1xx; see Section 6.2 of [RFC7231]) | more informational responses (1xx; see Section 9.2 of [SEMANTICS]) | |||
| precede a final response to the same request. Non-final responses do | precede a final response to the same request. Interim responses do | |||
| not contain a payload body or trailers. | not contain a payload body or trailers. | |||
| If an endpoint receives an invalid sequence of frames on either a | ||||
| request or a push stream, it MUST respond with a connection error of | ||||
| type H3_FRAME_UNEXPECTED (Section 8). In particular, a DATA frame | ||||
| before any HEADERS frame, or a HEADERS or DATA frame after the | ||||
| trailing HEADERS frame is considered invalid. | ||||
| An HTTP request/response exchange fully consumes a client-initiated | An HTTP request/response exchange fully consumes a client-initiated | |||
| bidirectional QUIC stream. After sending a request, a client MUST | bidirectional QUIC stream. After sending a request, a client MUST | |||
| close the stream for sending. Unless using the CONNECT method (see | close the stream for sending. Unless using the CONNECT method (see | |||
| Section 4.2), clients MUST NOT make stream closure dependent on | Section 4.2), clients MUST NOT make stream closure dependent on | |||
| receiving a response to their request. After sending a final | receiving a response to their request. After sending a final | |||
| response, the server MUST close the stream for sending. At this | response, the server MUST close the stream for sending. At this | |||
| point, the QUIC stream is fully closed. | point, the QUIC stream is fully closed. | |||
| When a stream is closed, this indicates the end of an HTTP message. | When a stream is closed, this indicates the end of an HTTP message. | |||
| Because some messages are large or unbounded, endpoints SHOULD begin | Because some messages are large or unbounded, endpoints SHOULD begin | |||
| skipping to change at page 12, line 40 ¶ | skipping to change at page 13, line 47 ¶ | |||
| reading the request stream, send a complete response, and cleanly | reading the request stream, send a complete response, and cleanly | |||
| close the sending part of the stream. The error code H3_NO_ERROR | close the sending part of the stream. The error code H3_NO_ERROR | |||
| SHOULD be used when requesting that the client stop sending on the | SHOULD be used when requesting that the client stop sending on the | |||
| request stream. Clients MUST NOT discard complete responses as a | request stream. Clients MUST NOT discard complete responses as a | |||
| result of having their request terminated abruptly, though clients | result of having their request terminated abruptly, though clients | |||
| can always discard responses at their discretion for other reasons. | can always discard responses at their discretion for other reasons. | |||
| If the server sends a partial or complete response but does not abort | If the server sends a partial or complete response but does not abort | |||
| reading, clients SHOULD continue sending the body of the request and | reading, clients SHOULD continue sending the body of the request and | |||
| close the stream normally. | close the stream normally. | |||
| 4.1.1. Header Formatting and Compression | 4.1.1. Field Formatting and Compression | |||
| HTTP message headers carry information as a series of key-value | HTTP messages carry metadata as a series of key-value pairs, called | |||
| pairs, called header fields. For a listing of registered HTTP header | HTTP fields. For a listing of registered HTTP fields, see the | |||
| fields, see the "Message Header Field" registry maintained at | "Hypertext Transfer Protocol (HTTP) Field Name Registry" maintained | |||
| https://www.iana.org/assignments/message-headers | at https://www.iana.org/assignments/http-fields/. | |||
| (https://www.iana.org/assignments/message-headers). | ||||
| Just as in previous versions of HTTP, header field names are strings | As in previous versions of HTTP, field names are strings containing a | |||
| of ASCII characters that are compared in a case-insensitive fashion. | subset of ASCII characters that are compared in a case-insensitive | |||
| Properties of HTTP header field names and values are discussed in | fashion. Properties of HTTP field names and values are discussed in | |||
| more detail in Section 3.2 of [RFC7230], though the wire rendering in | more detail in Section 4.3 of [SEMANTICS]. As in HTTP/2, characters | |||
| HTTP/3 differs. As in HTTP/2, header field names MUST be converted | in field names MUST be converted to lowercase prior to their | |||
| to lowercase prior to their encoding. A request or response | encoding. A request or response containing uppercase characters in | |||
| containing uppercase header field names MUST be treated as malformed | field names MUST be treated as malformed (Section 4.1.3). | |||
| (Section 4.1.3). | ||||
| Like HTTP/2, HTTP/3 does not use the Connection header field to | Like HTTP/2, HTTP/3 does not use the Connection header field to | |||
| indicate connection-specific header fields; in this protocol, | indicate connection-specific fields; in this protocol, connection- | |||
| connection-specific metadata is conveyed by other means. An endpoint | specific metadata is conveyed by other means. An endpoint MUST NOT | |||
| MUST NOT generate an HTTP/3 message containing connection-specific | generate an HTTP/3 field section containing connection-specific | |||
| header fields; any message containing connection-specific header | fields; any message containing connection-specific fields MUST be | |||
| fields MUST be treated as malformed (Section 4.1.3). | treated as malformed (Section 4.1.3). | |||
| The only exception to this is the TE header field, which MAY be | The only exception to this is the TE header field, which MAY be | |||
| present in an HTTP/3 request; when it is, it MUST NOT contain any | present in an HTTP/3 request header; when it is, it MUST NOT contain | |||
| value other than "trailers". | any value other than "trailers". | |||
| This means that an intermediary transforming an HTTP/1.x message to | This means that an intermediary transforming an HTTP/1.x message to | |||
| HTTP/3 will need to remove any header fields nominated by the | HTTP/3 will need to remove any fields nominated by the Connection | |||
| Connection header field, along with the Connection header field | field, along with the Connection field itself. Such intermediaries | |||
| itself. Such intermediaries SHOULD also remove other connection- | SHOULD also remove other connection-specific fields, such as Keep- | |||
| specific header fields, such as Keep-Alive, Proxy-Connection, | Alive, Proxy-Connection, Transfer-Encoding, and Upgrade, even if they | |||
| Transfer-Encoding, and Upgrade, even if they are not nominated by the | are not nominated by the Connection field. | |||
| Connection header field. | ||||
| 4.1.1.1. Pseudo-Header Fields | 4.1.1.1. Pseudo-Header Fields | |||
| As in HTTP/2, HTTP/3 uses special pseudo-header fields beginning with | Like HTTP/2, HTTP/3 employs a series of pseudo-header fields where | |||
| the ':' character (ASCII 0x3a) to convey the target URI, the method | the field name begins with the ':' character (ASCII 0x3a). These | |||
| of the request, and the status code for the response. | pseudo-header fields convey the target URI, the method of the | |||
| request, and the status code for the response. | ||||
| Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT | Pseudo-header fields are not HTTP fields. Endpoints MUST NOT | |||
| generate pseudo-header fields other than those defined in this | generate pseudo-header fields other than those defined in this | |||
| document, except as negotiated via an extension; see Section 9. | document, except as negotiated via an extension; see Section 9. | |||
| Pseudo-header fields are only valid in the context in which they are | Pseudo-header fields are only valid in the context in which they are | |||
| defined. Pseudo-header fields defined for requests MUST NOT appear | defined. Pseudo-header fields defined for requests MUST NOT appear | |||
| in responses; pseudo-header fields defined for responses MUST NOT | in responses; pseudo-header fields defined for responses MUST NOT | |||
| appear in requests. Pseudo-header fields MUST NOT appear in | appear in requests. Pseudo-header fields MUST NOT appear in | |||
| trailers. Endpoints MUST treat a request or response that contains | trailers. Endpoints MUST treat a request or response that contains | |||
| undefined or invalid pseudo-header fields as malformed | undefined or invalid pseudo-header fields as malformed | |||
| (Section 4.1.3). | (Section 4.1.3). | |||
| All pseudo-header fields MUST appear in the header block before | All pseudo-header fields MUST appear in the header field section | |||
| regular header fields. Any request or response that contains a | before regular header fields. Any request or response that contains | |||
| pseudo-header field that appears in a header block after a regular | a pseudo-header field that appears in a header field section after a | |||
| header field MUST be treated as malformed (Section 4.1.3). | regular header field MUST be treated as malformed (Section 4.1.3). | |||
| The following pseudo-header fields are defined for requests: | The following pseudo-header fields are defined for requests: | |||
| ":method": Contains the HTTP method ([RFC7231], Section 4) | ":method": Contains the HTTP method (Section 7 of [SEMANTICS]) | |||
| ":scheme": Contains the scheme portion of the target URI ([RFC3986], | ":scheme": Contains the scheme portion of the target URI | |||
| Section 3.1) | (Section 3.1 of [RFC3986]) | |||
| ":scheme" is not restricted to "http" and "https" schemed URIs. A | ":scheme" is not restricted to "http" and "https" schemed URIs. A | |||
| proxy or gateway can translate requests for non-HTTP schemes, | proxy or gateway can translate requests for non-HTTP schemes, | |||
| enabling the use of HTTP to interact with non-HTTP services. | enabling the use of HTTP to interact with non-HTTP services. | |||
| ":authority": Contains the authority portion of the target URI | ":authority": Contains the authority portion of the target URI | |||
| (Section 3.2 of [RFC3986]). The authority MUST NOT include the | (Section 3.2 of [RFC3986]). The authority MUST NOT include the | |||
| deprecated "userinfo" subcomponent for "http" or "https" schemed | deprecated "userinfo" subcomponent for "http" or "https" schemed | |||
| URIs. | URIs. | |||
| To ensure that the HTTP/1.1 request line can be reproduced | To ensure that the HTTP/1.1 request line can be reproduced | |||
| accurately, this pseudo-header field MUST be omitted when | accurately, this pseudo-header field MUST be omitted when | |||
| translating from an HTTP/1.1 request that has a request target in | translating from an HTTP/1.1 request that has a request target in | |||
| origin or asterisk form (see Section 5.3 of [RFC7230]). Clients | origin or asterisk form; see Section 3.2 of [HTTP11]. Clients | |||
| that generate HTTP/3 requests directly SHOULD use the ":authority" | that generate HTTP/3 requests directly SHOULD use the ":authority" | |||
| pseudo-header field instead of the Host header field. An | pseudo-header field instead of the Host field. An intermediary | |||
| intermediary that converts an HTTP/3 request to HTTP/1.1 MUST | that converts an HTTP/3 request to HTTP/1.1 MUST create a Host | |||
| create a Host header field if one is not present in a request by | field if one is not present in a request by copying the value of | |||
| copying the value of the ":authority" pseudo-header field. | the ":authority" pseudo-header field. | |||
| ":path": Contains the path and query parts of the target URI (the | ":path": Contains the path and query parts of the target URI (the | |||
| "path-absolute" production and optionally a '?' character followed | "path-absolute" production and optionally a '?' character followed | |||
| by the "query" production (see Sections 3.3 and 3.4 of [RFC3986]). | by the "query" production; see Sections 3.3 and 3.4 of [URI]. A | |||
| A request in asterisk form includes the value '*' for the ":path" | request in asterisk form includes the value '*' for the ":path" | |||
| pseudo-header field. | pseudo-header field. | |||
| This pseudo-header field MUST NOT be empty for "http" or "https" | This pseudo-header field MUST NOT be empty for "http" or "https" | |||
| URIs; "http" or "https" URIs that do not contain a path component | URIs; "http" or "https" URIs that do not contain a path component | |||
| MUST include a value of '/'. The exception to this rule is an | MUST include a value of '/'. The exception to this rule is an | |||
| OPTIONS request for an "http" or "https" URI that does not include | OPTIONS request for an "http" or "https" URI that does not include | |||
| a path component; these MUST include a ":path" pseudo-header field | a path component; these MUST include a ":path" pseudo-header field | |||
| with a value of '*' (see Section 5.3.4 of [RFC7230]). | with a value of '*'; see Section 3.2.4 of [HTTP11]. | |||
| All HTTP/3 requests MUST include exactly one value for the ":method", | All HTTP/3 requests MUST include exactly one value for the ":method", | |||
| ":scheme", and ":path" pseudo-header fields, unless it is a CONNECT | ":scheme", and ":path" pseudo-header fields, unless it is a CONNECT | |||
| request (Section 4.2). An HTTP request that omits mandatory pseudo- | request; see Section 4.2. | |||
| header fields or contains invalid values for those fields is | ||||
| malformed (Section 4.1.3). | If the ":scheme" pseudo-header field identifies a scheme which has a | |||
| mandatory authority component (including "http" and "https"), the | ||||
| request MUST contain either an ":authority" pseudo-header field or a | ||||
| "Host" header field. If these fields are present, they MUST NOT be | ||||
| empty. If both fields are present, they MUST contain the same value. | ||||
| If the scheme does not have a mandatory authority component and none | ||||
| is provided in the request target, the request MUST NOT contain the | ||||
| ":authority" pseudo-header and "Host" header fields. | ||||
| An HTTP request that omits mandatory pseudo-header fields or contains | ||||
| invalid values for those pseudo-header fields is malformed | ||||
| (Section 4.1.3). | ||||
| HTTP/3 does not define a way to carry the version identifier that is | HTTP/3 does not define a way to carry the version identifier that is | |||
| included in the HTTP/1.1 request line. | included in the HTTP/1.1 request line. | |||
| For responses, a single ":status" pseudo-header field is defined that | For responses, a single ":status" pseudo-header field is defined that | |||
| carries the HTTP status code field (see Section 6 of [RFC7231]). | carries the HTTP status code; see Section 9 of [SEMANTICS]. This | |||
| pseudo-header field MUST be included in all responses; otherwise, the | ||||
| This pseudo-header field MUST be included in all responses; | response is malformed (Section 4.1.3). | |||
| otherwise, the response is malformed (Section 4.1.3). | ||||
| HTTP/3 does not define a way to carry the version or reason phrase | HTTP/3 does not define a way to carry the version or reason phrase | |||
| that is included in an HTTP/1.1 status line. | that is included in an HTTP/1.1 status line. | |||
| 4.1.1.2. Header Compression | 4.1.1.2. Field Compression | |||
| HTTP/3 uses QPACK header compression as described in [QPACK], a | HTTP/3 uses QPACK field compression as described in [QPACK], a | |||
| variation of HPACK which allows the flexibility to avoid header- | variation of HPACK which allows the flexibility to avoid compression- | |||
| compression-induced head-of-line blocking. See that document for | induced head-of-line blocking. See that document for additional | |||
| additional details. | details. | |||
| To allow for better compression efficiency, the cookie header field | To allow for better compression efficiency, the "Cookie" field | |||
| [RFC6265] MAY be split into separate header fields, each with one or | [RFC6265] MAY be split into separate field lines, each with one or | |||
| more cookie-pairs, before compression. If a decompressed header list | more cookie-pairs, before compression. If a decompressed field | |||
| contains multiple cookie header fields, these MUST be concatenated | section contains multiple cookie field lines, these MUST be | |||
| before being passed into a non-HTTP/2, non-HTTP/3 context, as | concatenated into a single octet string using the two-octet delimiter | |||
| described in Section 8.1.2.5 of [HTTP2]. | of 0x3B, 0x20 (the ASCII string "; ") before being passed into a | |||
| context other than HTTP/2 or HTTP/3, such as an HTTP/1.1 connection, | ||||
| or a generic HTTP server application. | ||||
| 4.1.1.3. Header Size Constraints | 4.1.1.3. Header Size Constraints | |||
| An HTTP/3 implementation MAY impose a limit on the maximum size of | An HTTP/3 implementation MAY impose a limit on the maximum size of | |||
| the message header it will accept on an individual HTTP message. A | the message header it will accept on an individual HTTP message. A | |||
| server that receives a larger header field list than it is willing to | server that receives a larger header section than it is willing to | |||
| handle can send an HTTP 431 (Request Header Fields Too Large) status | handle can send an HTTP 431 (Request Header Fields Too Large) status | |||
| code [RFC6585]. A client can discard responses that it cannot | code ([RFC6585]). A client can discard responses that it cannot | |||
| process. The size of a header field list is calculated based on the | process. The size of a field list is calculated based on the | |||
| uncompressed size of header fields, including the length of the name | uncompressed size of fields, including the length of the name and | |||
| and value in bytes plus an overhead of 32 bytes for each header | value in bytes plus an overhead of 32 bytes for each field. | |||
| field. | ||||
| If an implementation wishes to advise its peer of this limit, it can | If an implementation wishes to advise its peer of this limit, it can | |||
| be conveyed as a number of bytes in the | be conveyed as a number of bytes in the | |||
| "SETTINGS_MAX_HEADER_LIST_SIZE" parameter. An implementation which | SETTINGS_MAX_FIELD_SECTION_SIZE parameter. An implementation which | |||
| has received this parameter SHOULD NOT send an HTTP message header | has received this parameter SHOULD NOT send an HTTP message header | |||
| which exceeds the indicated size, as the peer will likely refuse to | which exceeds the indicated size, as the peer will likely refuse to | |||
| process it. However, because this limit is applied at each hop, | process it. However, because this limit is applied at each hop, | |||
| messages below this limit are not guaranteed to be accepted. | messages below this limit are not guaranteed to be accepted. | |||
| 4.1.2. Request Cancellation and Rejection | 4.1.2. Request Cancellation and Rejection | |||
| Clients can cancel requests by resetting and aborting the request | Clients can cancel requests by resetting and aborting the request | |||
| stream with an error code of H3_REQUEST_CANCELLED (Section 8.1). | stream with an error code of H3_REQUEST_CANCELLED (Section 8.1). | |||
| When the client aborts reading a response, it indicates that this | When the client aborts reading a response, it indicates that this | |||
| skipping to change at page 16, line 36 ¶ | skipping to change at page 18, line 10 ¶ | |||
| a stream is cancelled after receiving a partial response, the | a stream is cancelled after receiving a partial response, the | |||
| response SHOULD NOT be used. Automatically retrying such requests is | response SHOULD NOT be used. Automatically retrying such requests is | |||
| not possible, unless this is otherwise permitted (e.g., idempotent | not possible, unless this is otherwise permitted (e.g., idempotent | |||
| actions like GET, PUT, or DELETE). | actions like GET, PUT, or DELETE). | |||
| 4.1.3. Malformed Requests and Responses | 4.1.3. Malformed Requests and Responses | |||
| A malformed request or response is one that is an otherwise valid | A malformed request or response is one that is an otherwise valid | |||
| sequence of frames but is invalid due to: | sequence of frames but is invalid due to: | |||
| * the presence of prohibited header fields or pseudo-header fields, | * the presence of prohibited fields or pseudo-header fields, | |||
| * the absence of mandatory pseudo-header fields, | * the absence of mandatory pseudo-header fields, | |||
| * invalid values for pseudo-header fields, | * invalid values for pseudo-header fields, | |||
| * pseudo-header fields after header fields, | * pseudo-header fields after fields, | |||
| * an invalid sequence of HTTP messages, or | * an invalid sequence of HTTP messages, | |||
| * the inclusion of uppercase header field names. | * the inclusion of uppercase field names, or | |||
| * the inclusion of invalid characters in field names or values | ||||
| A request or response that includes a payload body can include a | A request or response that includes a payload body can include a | |||
| "content-length" header field. A request or response is also | Content-Length header field. A request or response is also malformed | |||
| malformed if the value of a content-length header field does not | if the value of a content-length header field does not equal the sum | |||
| equal the sum of the DATA frame payload lengths that form the body. | of the DATA frame payload lengths that form the body. A response | |||
| A response that is defined to have no payload, as described in | that is defined to have no payload, as described in Section 6.3.3 of | |||
| Section 3.3.2 of [RFC7230] can have a non-zero content-length header | [SEMANTICS] can have a non-zero content-length field, even though no | |||
| field, even though no content is included in DATA frames. | content is included in DATA frames. | |||
| Intermediaries that process HTTP requests or responses (i.e., any | Intermediaries that process HTTP requests or responses (i.e., any | |||
| intermediary not acting as a tunnel) MUST NOT forward a malformed | intermediary not acting as a tunnel) MUST NOT forward a malformed | |||
| request or response. Malformed requests or responses that are | request or response. Malformed requests or responses that are | |||
| detected MUST be treated as a stream error (Section 8) of type | detected MUST be treated as a stream error (Section 8) of type | |||
| H3_GENERAL_PROTOCOL_ERROR. | H3_GENERAL_PROTOCOL_ERROR. | |||
| For malformed requests, a server MAY send an HTTP response prior to | For malformed requests, a server MAY send an HTTP response prior to | |||
| closing or resetting the stream. Clients MUST NOT accept a malformed | closing or resetting the stream. Clients MUST NOT accept a malformed | |||
| response. Note that these requirements are intended to protect | response. Note that these requirements are intended to protect | |||
| against several types of common attacks against HTTP; they are | against several types of common attacks against HTTP; they are | |||
| deliberately strict because being permissive can expose | deliberately strict because being permissive can expose | |||
| implementations to these vulnerabilities. | implementations to these vulnerabilities. | |||
| 4.2. The CONNECT Method | 4.2. The CONNECT Method | |||
| The pseudo-method CONNECT (Section 4.3.6 of [RFC7231]) is primarily | The CONNECT method requests that the recipient establish a tunnel to | |||
| used with HTTP proxies to establish a TLS session with an origin | the destination origin server identified by the request-target | |||
| server for the purposes of interacting with "https" resources. In | (Section 3.2 of [HTTP11]). It is primarily used with HTTP proxies to | |||
| HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a | establish a TLS session with an origin server for the purposes of | |||
| tunnel to a remote host. In HTTP/2, the CONNECT method is used to | interacting with "https" resources. | |||
| establish a tunnel over a single HTTP/2 stream to a remote host for | ||||
| similar purposes. | ||||
| A CONNECT request in HTTP/3 functions in the same manner as in | In HTTP/1.x, CONNECT is used to convert an entire HTTP connection | |||
| HTTP/2. The request MUST be formatted as described in Section 8.3 of | into a tunnel to a remote host. In HTTP/2 and HTTP/3, the CONNECT | |||
| [HTTP2]. A CONNECT request that does not conform to these | method is used to establish a tunnel over a single stream. | |||
| restrictions is malformed (see Section 4.1.3). The request stream | ||||
| MUST NOT be closed at the end of the request. | A CONNECT request MUST be constructed as follows: | |||
| * The ":method" pseudo-header field is set to "CONNECT" | ||||
| * The ":scheme" and ":path" pseudo-header fields are omitted | ||||
| * The ":authority" pseudo-header field contains the host and port to | ||||
| connect to (equivalent to the authority-form of the request-target | ||||
| of CONNECT requests; see Section 5.3 of [HTTP11]) | ||||
| The request stream remains open at the end of the request to carry | ||||
| the data to be transferred. A CONNECT request that does not conform | ||||
| to these restrictions is malformed; see Section 4.1.3. | ||||
| A proxy that supports CONNECT establishes a TCP connection | A proxy that supports CONNECT establishes a TCP connection | |||
| ([RFC0793]) to the server identified in the ":authority" pseudo- | ([RFC0793]) to the server identified in the ":authority" pseudo- | |||
| header field. Once this connection is successfully established, the | header field. Once this connection is successfully established, the | |||
| proxy sends a HEADERS frame containing a 2xx series status code to | proxy sends a HEADERS frame containing a 2xx series status code to | |||
| the client, as defined in Section 4.3.6 of [RFC7231]. | the client, as defined in Section 9.3 of [SEMANTICS]. | |||
| All DATA frames on the stream correspond to data sent or received on | All DATA frames on the stream correspond to data sent or received on | |||
| the TCP connection. Any DATA frame sent by the client is transmitted | the TCP connection. Any DATA frame sent by the client is transmitted | |||
| by the proxy to the TCP server; data received from the TCP server is | by the proxy to the TCP server; data received from the TCP server is | |||
| packaged into DATA frames by the proxy. Note that the size and | packaged into DATA frames by the proxy. Note that the size and | |||
| number of TCP segments is not guaranteed to map predictably to the | number of TCP segments is not guaranteed to map predictably to the | |||
| size and number of HTTP DATA or QUIC STREAM frames. | size and number of HTTP DATA or QUIC STREAM frames. | |||
| Once the CONNECT method has completed, only DATA frames are permitted | Once the CONNECT method has completed, only DATA frames are permitted | |||
| to be sent on the stream. Extension frames MAY be used if | to be sent on the stream. Extension frames MAY be used if | |||
| skipping to change at page 18, line 27 ¶ | skipping to change at page 20, line 15 ¶ | |||
| A TCP connection error is signaled by abruptly terminating the | A TCP connection error is signaled by abruptly terminating the | |||
| stream. A proxy treats any error in the TCP connection, which | stream. A proxy treats any error in the TCP connection, which | |||
| includes receiving a TCP segment with the RST bit set, as a stream | includes receiving a TCP segment with the RST bit set, as a stream | |||
| error of type H3_CONNECT_ERROR (Section 8.1). Correspondingly, if a | error of type H3_CONNECT_ERROR (Section 8.1). Correspondingly, if a | |||
| proxy detects an error with the stream or the QUIC connection, it | proxy detects an error with the stream or the QUIC connection, it | |||
| MUST close the TCP connection. If the underlying TCP implementation | MUST close the TCP connection. If the underlying TCP implementation | |||
| permits it, the proxy SHOULD send a TCP segment with the RST bit set. | permits it, the proxy SHOULD send a TCP segment with the RST bit set. | |||
| 4.3. HTTP Upgrade | 4.3. HTTP Upgrade | |||
| HTTP/3 does not support the HTTP Upgrade mechanism (Section 6.7 of | HTTP/3 does not support the HTTP Upgrade mechanism (Section 9.9 of | |||
| [RFC7230]) or 101 (Switching Protocols) informational status code | [HTTP11]) or 101 (Switching Protocols) informational status code | |||
| (Section 6.2.2 of [RFC7231]). | (Section 9.2.2 of [SEMANTICS]). | |||
| 4.4. Server Push | 4.4. Server Push | |||
| Server push is an interaction mode introduced in HTTP/2 [HTTP2] which | Server push is an interaction mode which permits a server to push a | |||
| permits a server to push a request-response exchange to a client in | request-response exchange to a client in anticipation of the client | |||
| anticipation of the client making the indicated request. This trades | making the indicated request. This trades off network usage against | |||
| off network usage against a potential latency gain. HTTP/3 server | a potential latency gain. HTTP/3 server push is similar to what is | |||
| push is similar to what is described in HTTP/2 [HTTP2], but uses | described in HTTP/2 [HTTP2], but uses different mechanisms. | |||
| different mechanisms. | ||||
| Each server push is identified by a unique Push ID. This Push ID is | Each server push is identified by a unique Push ID. This Push ID is | |||
| used in one or more PUSH_PROMISE frames (see Section 7.2.5) that | used in one or more PUSH_PROMISE frames (see Section 7.2.5) that | |||
| carry the request headers, then included with the push stream which | carry the request fields, then included with the push stream which | |||
| ultimately fulfills those promises. When the same Push ID is | ultimately fulfills those promises. When the same Push ID is | |||
| promised on multiple request streams, the decompressed request header | promised on multiple request streams, the decompressed request field | |||
| sets MUST contain the same fields in the same order, and both the | sections MUST contain the same fields in the same order, and both the | |||
| name and the value in each field MUST be exact matches. | name and the value in each field MUST be exact matches. | |||
| Server push is only enabled on a connection when a client sends a | Server push is only enabled on a connection when a client sends a | |||
| MAX_PUSH_ID frame (see Section 7.2.7). A server cannot use server | MAX_PUSH_ID frame; see Section 7.2.7. A server cannot use server | |||
| push until it receives a MAX_PUSH_ID frame. A client sends | push until it receives a MAX_PUSH_ID frame. A client sends | |||
| additional MAX_PUSH_ID frames to control the number of pushes that a | additional MAX_PUSH_ID frames to control the number of pushes that a | |||
| server can promise. A server SHOULD use Push IDs sequentially, | server can promise. A server SHOULD use Push IDs sequentially, | |||
| starting at 0. A client MUST treat receipt of a push stream with a | starting at 0. A client MUST treat receipt of a push stream with a | |||
| Push ID that is greater than the maximum Push ID as a connection | Push ID that is greater than the maximum Push ID as a connection | |||
| error of type H3_ID_ERROR. | error of type H3_ID_ERROR. | |||
| The header of the request message is carried by a PUSH_PROMISE frame | The header section of the request message is carried by a | |||
| (see Section 7.2.5) on the request stream which generated the push. | PUSH_PROMISE frame (see Section 7.2.5) on the request stream which | |||
| Promised requests MUST conform to the requirements in Section 8.2 of | generated the push. This allows the server push to be associated | |||
| [HTTP2]. | with a client request. | |||
| Not all requests can be pushed. A server MAY push requests which | ||||
| have the following properties: | ||||
| * cacheable; see Section 7.2.3 of [SEMANTICS] | ||||
| * safe; see Section 7.2.1 of [SEMANTICS] | ||||
| * does not include a request body or trailer section | ||||
| The server MUST include a value in the ":authority" pseudo-header | ||||
| field for which the server is authoritative; see Section 3.4. | ||||
| Clients SHOULD send a CANCEL_PUSH frame upon receipt of a | ||||
| PUSH_PROMISE frame carrying a request which is not cacheable, is not | ||||
| known to be safe, that indicates the presence of a request body, or | ||||
| for which it does not consider the server authoritative. | ||||
| Each pushed response is associated with one or more client requests. | Each pushed response is associated with one or more client requests. | |||
| The push is associated with the request stream on which the | The push is associated with the request stream on which the | |||
| PUSH_PROMISE frame was received. The same server push can be | PUSH_PROMISE frame was received. The same server push can be | |||
| associated with additional client requests using a PUSH_PROMISE frame | associated with additional client requests using a PUSH_PROMISE frame | |||
| with the same Push ID on multiple request streams. These | with the same Push ID on multiple request streams. These | |||
| associations do not affect the operation of the protocol, but MAY be | associations do not affect the operation of the protocol, but MAY be | |||
| considered by user agents when deciding how to use pushed resources. | considered by user agents when deciding how to use pushed resources. | |||
| Ordering of a PUSH_PROMISE in relation to certain parts of the | Ordering of a PUSH_PROMISE in relation to certain parts of the | |||
| response is important. The server SHOULD send PUSH_PROMISE frames | response is important. The server SHOULD send PUSH_PROMISE frames | |||
| prior to sending HEADERS or DATA frames that reference the promised | prior to sending HEADERS or DATA frames that reference the promised | |||
| responses. This reduces the chance that a client requests a resource | responses. This reduces the chance that a client requests a resource | |||
| that will be pushed by the server. | that will be pushed by the server. | |||
| When a server later fulfills a promise, the server push response is | When a server later fulfills a promise, the server push response is | |||
| conveyed on a push stream (see Section 6.2.2). The push stream | conveyed on a push stream; see Section 6.2.2. The push stream | |||
| identifies the Push ID of the promise that it fulfills, then contains | identifies the Push ID of the promise that it fulfills, then contains | |||
| a response to the promised request using the same format described | a response to the promised request using the same format described | |||
| for responses in Section 4.1. | for responses in Section 4.1. | |||
| Due to reordering, push stream data can arrive before the | Due to reordering, push stream data can arrive before the | |||
| corresponding PUSH_PROMISE frame. When a client receives a new push | corresponding PUSH_PROMISE frame. When a client receives a new push | |||
| stream with an as-yet-unknown Push ID, both the associated client | stream with an as-yet-unknown Push ID, both the associated client | |||
| request and the pushed request headers are unknown. The client can | request and the pushed request header fields are unknown. The client | |||
| buffer the stream data in expectation of the matching PUSH_PROMISE. | can buffer the stream data in expectation of the matching | |||
| The client can use stream flow control (see section 4.1 of | PUSH_PROMISE. The client can use stream flow control (see section | |||
| [QUIC-TRANSPORT]) to limit the amount of data a server may commit to | 4.1 of [QUIC-TRANSPORT]) to limit the amount of data a server may | |||
| the pushed stream. | commit to the pushed stream. | |||
| If a promised server push is not needed by the client, the client | If a promised server push is not needed by the client, the client | |||
| SHOULD send a CANCEL_PUSH frame. If the push stream is already open | SHOULD send a CANCEL_PUSH frame. If the push stream is already open | |||
| or opens after sending the CANCEL_PUSH frame, the client can abort | or opens after sending the CANCEL_PUSH frame, the client can abort | |||
| reading the stream with an error code of H3_REQUEST_CANCELLED. This | reading the stream with an error code of H3_REQUEST_CANCELLED. This | |||
| asks the server not to transfer additional data and indicates that it | asks the server not to transfer additional data and indicates that it | |||
| will be discarded upon receipt. | will be discarded upon receipt. | |||
| Pushed responses that are cacheable (see Section 3 of [CACHING]) can | ||||
| be stored by the client, if it implements an HTTP cache. Pushed | ||||
| responses are considered successfully validated on the origin server | ||||
| (e.g., if the "no-cache" cache response directive is present | ||||
| (Section 5.2.2.3 of [CACHING])) at the time the pushed response is | ||||
| received. | ||||
| Pushed responses that are not cacheable MUST NOT be stored by any | ||||
| HTTP cache. They MAY be made available to the application | ||||
| separately. | ||||
| 5. Connection Closure | 5. Connection Closure | |||
| Once established, an HTTP/3 connection can be used for many requests | Once established, an HTTP/3 connection can be used for many requests | |||
| and responses over time until the connection is closed. Connection | and responses over time until the connection is closed. Connection | |||
| closure can happen in any of several different ways. | closure can happen in any of several different ways. | |||
| 5.1. Idle Connections | 5.1. Idle Connections | |||
| Each QUIC endpoint declares an idle timeout during the handshake. If | Each QUIC endpoint declares an idle timeout during the handshake. If | |||
| the connection remains idle (no packets received) for longer than | the connection remains idle (no packets received) for longer than | |||
| skipping to change at page 20, line 34 ¶ | skipping to change at page 23, line 8 ¶ | |||
| If the client is not expecting a response from the server, allowing | If the client is not expecting a response from the server, allowing | |||
| an idle connection to time out is preferred over expending effort | an idle connection to time out is preferred over expending effort | |||
| maintaining a connection that might not be needed. A gateway MAY | maintaining a connection that might not be needed. A gateway MAY | |||
| maintain connections in anticipation of need rather than incur the | maintain connections in anticipation of need rather than incur the | |||
| latency cost of connection establishment to servers. Servers SHOULD | latency cost of connection establishment to servers. Servers SHOULD | |||
| NOT actively keep connections open. | NOT actively keep connections open. | |||
| 5.2. Connection Shutdown | 5.2. Connection Shutdown | |||
| Even when a connection is not idle, either endpoint can decide to | Even when a connection is not idle, either endpoint can decide to | |||
| stop using the connection and let the connection close gracefully. | stop using the connection and initiate a graceful connection close. | |||
| Since clients drive request generation, clients perform a connection | Endpoints initiate the graceful shutdown of a connection by sending a | |||
| shutdown by not sending additional requests on the connection; | GOAWAY frame (Section 7.2.6). The GOAWAY frame contains an | |||
| responses and pushed responses associated to previous requests will | identifier that indicates to the receiver the range of requests or | |||
| continue to completion. Servers perform the same function by | pushes that were or might be processed in this connection. The | |||
| communicating with clients. | server sends a client-initiated bidirectional Stream ID; the client | |||
| sends a Push ID. Requests or pushes with the indicated identifier or | ||||
| greater are rejected by the sender of the GOAWAY. This identifier | ||||
| MAY be zero if no requests or pushes were processed. | ||||
| Servers initiate the shutdown of a connection by sending a GOAWAY | The information in the GOAWAY frame enables a client and server to | |||
| frame (Section 7.2.6). The GOAWAY frame indicates that client- | agree on which requests or pushes were accepted prior to the | |||
| initiated requests on lower stream IDs were or might be processed in | connection shutdown. Upon sending a GOAWAY frame, the endpoint | |||
| this connection, while requests on the indicated stream ID and | SHOULD explicitly cancel (see Section 4.1.2 and Section 7.2.3) any | |||
| greater were rejected. This enables client and server to agree on | requests or pushes that have identifiers greater than or equal to | |||
| which requests were accepted prior to the connection shutdown. This | that indicated, in order to clean up transport state for the affected | |||
| identifier MAY be zero if no requests were processed. Servers SHOULD | streams. The endpoint SHOULD continue to do so as more requests or | |||
| NOT permit additional QUIC streams after sending a GOAWAY frame. | pushes arrive. | |||
| Clients MUST NOT send new requests on the connection after receiving | Endpoints MUST NOT initiate new requests or promise new pushes on the | |||
| GOAWAY; a new connection MAY be established to send additional | connection after receipt of a GOAWAY frame from the peer. Clients | |||
| requests. | MAY establish a new connection to send additional requests. | |||
| Some requests might already be in transit. If the client has already | Some requests or pushes might already be in transit: | |||
| sent requests on streams with a Stream ID greater than or equal to | ||||
| that indicated in the GOAWAY frame, those requests will not be | ||||
| processed and MAY be retried by the client on a different connection. | ||||
| The client MAY cancel these requests. It is RECOMMENDED that the | ||||
| server explicitly reject such requests (see Section 4.1.2) in order | ||||
| to clean up transport state for the affected streams. | ||||
| Requests on Stream IDs less than the Stream ID in the GOAWAY frame | * Upon receipt of a GOAWAY frame, if the client has already sent | |||
| might have been processed; their status cannot be known until a | requests with a Stream ID greater than or equal to the identifier | |||
| response is received, the stream is reset individually, or the | received in a GOAWAY frame, those requests will not be processed. | |||
| connection terminates. Servers MAY reject individual requests on | Clients can safely retry unprocessed requests on a different | |||
| streams below the indicated ID if these requests were not processed. | connection. | |||
| Requests on Stream IDs less than the Stream ID in a GOAWAY frame | ||||
| from the server might have been processed; their status cannot be | ||||
| known until a response is received, the stream is reset | ||||
| individually, another GOAWAY is received, or the connection | ||||
| terminates. | ||||
| Servers MAY reject individual requests on streams below the | ||||
| indicated ID if these requests were not processed. | ||||
| * If a server receives a GOAWAY frame after having promised pushes | ||||
| with a Push ID greater than or equal to the identifier received in | ||||
| a GOAWAY frame, those pushes will not be accepted. | ||||
| Servers SHOULD send a GOAWAY frame when the closing of a connection | Servers SHOULD send a GOAWAY frame when the closing of a connection | |||
| is known in advance, even if the advance notice is small, so that the | is known in advance, even if the advance notice is small, so that the | |||
| remote peer can know whether a request has been partially processed | remote peer can know whether a request has been partially processed | |||
| or not. For example, if an HTTP client sends a POST at the same time | or not. For example, if an HTTP client sends a POST at the same time | |||
| that a server closes a QUIC connection, the client cannot know if the | that a server closes a QUIC connection, the client cannot know if the | |||
| server started to process that POST request if the server does not | server started to process that POST request if the server does not | |||
| send a GOAWAY frame to indicate what streams it might have acted on. | send a GOAWAY frame to indicate what streams it might have acted on. | |||
| A client that is unable to retry requests loses all requests that are | A client that is unable to retry requests loses all requests that are | |||
| in flight when the server closes the connection. A server MAY send | in flight when the server closes the connection. An endpoint MAY | |||
| multiple GOAWAY frames indicating different stream IDs, but MUST NOT | send multiple GOAWAY frames indicating different identifiers, but | |||
| increase the value they send in the last Stream ID, since clients | MUST NOT increase the identifier value they send, since clients might | |||
| might already have retried unprocessed requests on another | already have retried unprocessed requests on another connection. | |||
| connection. | ||||
| A server that is attempting to gracefully shut down a connection can | An endpoint that is attempting to gracefully shut down a connection | |||
| send an initial GOAWAY frame with the last Stream ID set to the | can send a GOAWAY frame with a value set to the maximum possible | |||
| maximum possible value for a client-initiated, bidirectional stream | value (2^62-4 for servers, 2^62-1 for clients). This ensures that | |||
| (i.e. 2^62-4 in case of QUIC version 1). This GOAWAY frame signals | the peer stops creating new requests or pushes. After allowing time | |||
| to the client that shutdown is imminent and that initiating further | for any in-flight requests or pushes to arrive, the endpoint can send | |||
| requests is prohibited. After allowing time for any in-flight | another GOAWAY frame indicating which requests or pushes it might | |||
| requests to reach the server, the server can send another GOAWAY | accept before the end of the connection. This ensures that a | |||
| frame indicating which requests it will accept before the end of the | connection can be cleanly shut down without losing requests. | |||
| connection. This ensures that a connection can be cleanly shut down | ||||
| without causing requests to fail. | ||||
| Once all accepted requests have been processed, the server can permit | A client has more flexibility in the value it chooses for the Push ID | |||
| the connection to become idle, or MAY initiate an immediate closure | in a GOAWAY that it sends. A value of 2^62 - 1 indicates that the | |||
| of the connection. An endpoint that completes a graceful shutdown | server can continue fulfilling pushes which have already been | |||
| SHOULD use the H3_NO_ERROR code when closing the connection. | promised, and the client can continue granting push credit as needed; | |||
| see Section 7.2.7. A smaller value indicates the client will reject | ||||
| pushes with Push IDs greater than or equal to this value. Like the | ||||
| server, the client MAY send subsequent GOAWAY frames so long as the | ||||
| specified Push ID is strictly smaller than all previously sent | ||||
| values. | ||||
| Even when a GOAWAY indicates that a given request or push will not be | ||||
| processed or accepted upon receipt, the underlying transport | ||||
| resources still exist. The endpoint that initiated these requests | ||||
| can cancel them to clean up transport state. | ||||
| Once all accepted requests and pushes have been processed, the | ||||
| endpoint can permit the connection to become idle, or MAY initiate an | ||||
| immediate closure of the connection. An endpoint that completes a | ||||
| graceful shutdown SHOULD use the H3_NO_ERROR code when closing the | ||||
| connection. | ||||
| If a client has consumed all available bidirectional stream IDs with | If a client has consumed all available bidirectional stream IDs with | |||
| requests, the server need not send a GOAWAY frame, since the client | requests, the server need not send a GOAWAY frame, since the client | |||
| is unable to make further requests. | is unable to make further requests. | |||
| 5.3. Immediate Application Closure | 5.3. Immediate Application Closure | |||
| An HTTP/3 implementation can immediately close the QUIC connection at | An HTTP/3 implementation can immediately close the QUIC connection at | |||
| any time. This results in sending a QUIC CONNECTION_CLOSE frame to | any time. This results in sending a QUIC CONNECTION_CLOSE frame to | |||
| the peer indicating that the application layer has terminated the | the peer indicating that the application layer has terminated the | |||
| connection. The application error code in this frame indicates to | connection. The application error code in this frame indicates to | |||
| the peer why the connection is being closed. See Section 8 for error | the peer why the connection is being closed. See Section 8 for error | |||
| codes which can be used when closing a connection in HTTP/3. | codes which can be used when closing a connection in HTTP/3. | |||
| Before closing the connection, a GOAWAY MAY be sent to allow the | Before closing the connection, a GOAWAY frame MAY be sent to allow | |||
| client to retry some requests. Including the GOAWAY frame in the | the client to retry some requests. Including the GOAWAY frame in the | |||
| same packet as the QUIC CONNECTION_CLOSE frame improves the chances | same packet as the QUIC CONNECTION_CLOSE frame improves the chances | |||
| of the frame being received by clients. | of the frame being received by clients. | |||
| 5.4. Transport Closure | 5.4. Transport Closure | |||
| For various reasons, the QUIC transport could indicate to the | For various reasons, the QUIC transport could indicate to the | |||
| application layer that the connection has terminated. This might be | application layer that the connection has terminated. This might be | |||
| due to an explicit closure by the peer, a transport-level error, or a | due to an explicit closure by the peer, a transport-level error, or a | |||
| change in network topology which interrupts connectivity. | change in network topology which interrupts connectivity. | |||
| skipping to change at page 22, line 46 ¶ | skipping to change at page 25, line 46 ¶ | |||
| layer buffers and orders received QUIC STREAM frames, exposing the | layer buffers and orders received QUIC STREAM frames, exposing the | |||
| data contained within as a reliable byte stream to the application. | data contained within as a reliable byte stream to the application. | |||
| Although QUIC permits out-of-order delivery within a stream, HTTP/3 | Although QUIC permits out-of-order delivery within a stream, HTTP/3 | |||
| does not make use of this feature. | does not make use of this feature. | |||
| QUIC streams can be either unidirectional, carrying data only from | QUIC streams can be either unidirectional, carrying data only from | |||
| initiator to receiver, or bidirectional. Streams can be initiated by | initiator to receiver, or bidirectional. Streams can be initiated by | |||
| either the client or the server. For more detail on QUIC streams, | either the client or the server. For more detail on QUIC streams, | |||
| see Section 2 of [QUIC-TRANSPORT]. | see Section 2 of [QUIC-TRANSPORT]. | |||
| When HTTP headers and data are sent over QUIC, the QUIC layer handles | When HTTP fields and data are sent over QUIC, the QUIC layer handles | |||
| most of the stream management. HTTP does not need to do any separate | most of the stream management. HTTP does not need to do any separate | |||
| multiplexing when using QUIC - data sent over a QUIC stream always | multiplexing when using QUIC - data sent over a QUIC stream always | |||
| maps to a particular HTTP transaction or connection context. | maps to a particular HTTP transaction or connection context. | |||
| 6.1. Bidirectional Streams | 6.1. Bidirectional Streams | |||
| All client-initiated bidirectional streams are used for HTTP requests | All client-initiated bidirectional streams are used for HTTP requests | |||
| and responses. A bidirectional stream ensures that the response can | and responses. A bidirectional stream ensures that the response can | |||
| be readily correlated with the request. This means that the client's | be readily correlated with the request. This means that the client's | |||
| first request occurs on QUIC stream 0, with subsequent requests on | first request occurs on QUIC stream 0, with subsequent requests on | |||
| skipping to change at page 23, line 31 ¶ | skipping to change at page 26, line 31 ¶ | |||
| been negotiated. | been negotiated. | |||
| 6.2. Unidirectional Streams | 6.2. Unidirectional Streams | |||
| Unidirectional streams, in either direction, are used for a range of | Unidirectional streams, in either direction, are used for a range of | |||
| purposes. The purpose is indicated by a stream type, which is sent | purposes. The purpose is indicated by a stream type, which is sent | |||
| as a variable-length integer at the start of the stream. The format | as a variable-length integer at the start of the stream. The format | |||
| and structure of data that follows this integer is determined by the | and structure of data that follows this integer is determined by the | |||
| stream type. | stream type. | |||
| 0 1 2 3 | Unidirectional Stream Header { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Stream Type (i), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | } | |||
| | Stream Type (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 1: Unidirectional Stream Header | Figure 1: Unidirectional Stream Header | |||
| Some stream types are reserved (Section 6.2.3). Two stream types are | Some stream types are reserved (Section 6.2.3). Two stream types are | |||
| defined in this document: control streams (Section 6.2.1) and push | defined in this document: control streams (Section 6.2.1) and push | |||
| streams (Section 6.2.2). [QPACK] defines two additional stream | streams (Section 6.2.2). [QPACK] defines two additional stream | |||
| types. Other stream types can be defined by extensions to HTTP/3; | types. Other stream types can be defined by extensions to HTTP/3; | |||
| see Section 9 for more details. | see Section 9 for more details. | |||
| The performance of HTTP/3 connections in the early phase of their | The performance of HTTP/3 connections in the early phase of their | |||
| skipping to change at page 24, line 39 ¶ | skipping to change at page 27, line 37 ¶ | |||
| semantics of existing protocol components, including QPACK or other | semantics of existing protocol components, including QPACK or other | |||
| extensions, MUST NOT be sent until the peer is known to support them. | extensions, MUST NOT be sent until the peer is known to support them. | |||
| A sender can close or reset a unidirectional stream unless otherwise | A sender can close or reset a unidirectional stream unless otherwise | |||
| specified. A receiver MUST tolerate unidirectional streams being | specified. A receiver MUST tolerate unidirectional streams being | |||
| closed or reset prior to the reception of the unidirectional stream | closed or reset prior to the reception of the unidirectional stream | |||
| header. | header. | |||
| 6.2.1. Control Streams | 6.2.1. Control Streams | |||
| A control stream is indicated by a stream type of "0x00". Data on | A control stream is indicated by a stream type of 0x00. Data on this | |||
| this stream consists of HTTP/3 frames, as defined in Section 7.2. | stream consists of HTTP/3 frames, as defined in Section 7.2. | |||
| Each side MUST initiate a single control stream at the beginning of | Each side MUST initiate a single control stream at the beginning of | |||
| the connection and send its SETTINGS frame as the first frame on this | the connection and send its SETTINGS frame as the first frame on this | |||
| stream. If the first frame of the control stream is any other frame | stream. If the first frame of the control stream is any other frame | |||
| type, this MUST be treated as a connection error of type | type, this MUST be treated as a connection error of type | |||
| H3_MISSING_SETTINGS. Only one control stream per peer is permitted; | H3_MISSING_SETTINGS. Only one control stream per peer is permitted; | |||
| receipt of a second stream which claims to be a control stream MUST | receipt of a second stream which claims to be a control stream MUST | |||
| be treated as a connection error of type H3_STREAM_CREATION_ERROR. | be treated as a connection error of type H3_STREAM_CREATION_ERROR. | |||
| The sender MUST NOT close the control stream, and the receiver MUST | The sender MUST NOT close the control stream, and the receiver MUST | |||
| NOT request that the sender close the control stream. If either | NOT request that the sender close the control stream. If either | |||
| skipping to change at page 25, line 19 ¶ | skipping to change at page 28, line 17 ¶ | |||
| as it is able. Depending on whether 0-RTT is enabled on the | as it is able. Depending on whether 0-RTT is enabled on the | |||
| connection, either client or server might be able to send stream data | connection, either client or server might be able to send stream data | |||
| first after the cryptographic handshake completes. | first after the cryptographic handshake completes. | |||
| 6.2.2. Push Streams | 6.2.2. Push Streams | |||
| Server push is an optional feature introduced in HTTP/2 that allows a | Server push is an optional feature introduced in HTTP/2 that allows a | |||
| server to initiate a response before a request has been made. See | server to initiate a response before a request has been made. See | |||
| Section 4.4 for more details. | Section 4.4 for more details. | |||
| A push stream is indicated by a stream type of "0x01", followed by | A push stream is indicated by a stream type of 0x01, followed by the | |||
| the Push ID of the promise that it fulfills, encoded as a variable- | Push ID of the promise that it fulfills, encoded as a variable-length | |||
| length integer. The remaining data on this stream consists of HTTP/3 | integer. The remaining data on this stream consists of HTTP/3 | |||
| frames, as defined in Section 7.2, and fulfills a promised server | frames, as defined in Section 7.2, and fulfills a promised server | |||
| push by zero or more non-final HTTP responses followed by a single | push by zero or more interim HTTP responses followed by a single | |||
| final HTTP response, as defined in Section 4.1. Server push and Push | final HTTP response, as defined in Section 4.1. Server push and Push | |||
| IDs are described in Section 4.4. | IDs are described in Section 4.4. | |||
| Only servers can push; if a server receives a client-initiated push | Only servers can push; if a server receives a client-initiated push | |||
| stream, this MUST be treated as a connection error of type | stream, this MUST be treated as a connection error of type | |||
| H3_STREAM_CREATION_ERROR. | H3_STREAM_CREATION_ERROR. | |||
| 0 1 2 3 | Push Stream Header { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Stream Type (i) = 0x01, | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Push ID (i), | |||
| | 0x01 (i) ... | } | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Push ID (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 2: Push Stream Header | Figure 2: Push Stream Header | |||
| Each Push ID MUST only be used once in a push stream header. If a | Each Push ID MUST only be used once in a push stream header. If a | |||
| push stream header includes a Push ID that was used in another push | push stream header includes a Push ID that was used in another push | |||
| stream header, the client MUST treat this as a connection error of | stream header, the client MUST treat this as a connection error of | |||
| type H3_ID_ERROR. | type H3_ID_ERROR. | |||
| 6.2.3. Reserved Stream Types | 6.2.3. Reserved Stream Types | |||
| Stream types of the format "0x1f * N + 0x21" for integer values of N | Stream types of the format "0x1f * N + 0x21" for non-negative integer | |||
| are reserved to exercise the requirement that unknown types be | values of N are reserved to exercise the requirement that unknown | |||
| ignored. These streams have no semantics, and can be sent when | types be ignored. These streams have no semantics, and can be sent | |||
| 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. | |||
| The payload and length of the stream are selected in any manner the | The payload and length of the stream are selected in any manner the | |||
| implementation chooses. Implementations MAY terminate these streams | implementation chooses. Implementations MAY terminate these streams | |||
| cleanly, or MAY abruptly terminate them. When terminating abruptly, | cleanly, or MAY abruptly terminate them. When terminating abruptly, | |||
| the error code H3_NO_ERROR or a reserved error code (Section 8.1) | the error code H3_NO_ERROR or a reserved error code (Section 8.1) | |||
| SHOULD be used. | SHOULD be used. | |||
| 7. HTTP Framing Layer | 7. HTTP Framing Layer | |||
| skipping to change at page 28, line 5 ¶ | skipping to change at page 30, line 16 ¶ | |||
| stream type; these are indicated in Table 1 with a (1). Specific | stream type; these are indicated in Table 1 with a (1). Specific | |||
| guidance is provided in the relevant section. | guidance is provided in the relevant section. | |||
| Note that, unlike QUIC frames, HTTP/3 frames can span multiple | Note that, unlike QUIC frames, HTTP/3 frames can span multiple | |||
| packets. | packets. | |||
| 7.1. Frame Layout | 7.1. Frame Layout | |||
| All frames have the following format: | All frames have the following format: | |||
| 0 1 2 3 | HTTP/3 Frame Format { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Type (i), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i), | |||
| | Type (i) ... | Frame Payload (..), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | } | |||
| | Length (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Frame Payload (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 3: HTTP/3 Frame Format | Figure 3: HTTP/3 Frame Format | |||
| A frame includes the following fields: | A frame includes the following fields: | |||
| Type: A variable-length integer that identifies the frame type. | Type: A variable-length integer that identifies the frame type. | |||
| Length: A variable-length integer that describes the length in bytes | Length: A variable-length integer that describes the length in bytes | |||
| of the Frame Payload. | of the Frame Payload. | |||
| skipping to change at page 29, line 5 ¶ | skipping to change at page 31, line 10 ¶ | |||
| 7.2.1. DATA | 7.2.1. DATA | |||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
| bytes associated with an HTTP request or response payload. | bytes associated with an HTTP request or response payload. | |||
| DATA frames MUST be associated with an HTTP request or response. If | DATA frames MUST be associated with an HTTP request or response. If | |||
| a DATA frame is received on a control stream, the recipient MUST | a DATA frame is received on a control stream, the recipient MUST | |||
| respond with a connection error (Section 8) of type | respond with a connection error (Section 8) of type | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| 0 1 2 3 | DATA Frame { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Type (i) = 0x0, | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i), | |||
| | Payload (*) ... | Data (..), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | } | |||
| Figure 4: DATA Frame Payload | Figure 4: DATA Frame | |||
| 7.2.2. HEADERS | 7.2.2. HEADERS | |||
| The HEADERS frame (type=0x1) is used to carry a header block, | The HEADERS frame (type=0x1) is used to carry an HTTP field section, | |||
| compressed using QPACK. See [QPACK] for more details. | encoded using QPACK. See [QPACK] for more details. | |||
| 0 1 2 3 | HEADERS Frame { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Type (i) = 0x1, | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i), | |||
| | Header Block (*) ... | Encoded Field Section (..), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | } | |||
| Figure 5: HEADERS Frame Payload | Figure 5: HEADERS Frame | |||
| HEADERS frames can only be sent on request / push streams. If a | HEADERS frames can only be sent on request / push streams. If a | |||
| HEADERS frame is received on a control stream, the recipient MUST | HEADERS frame is received on a control stream, the recipient MUST | |||
| respond with a connection error (Section 8) of type | respond with a connection error (Section 8) of type | |||
| 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=0x3) is used to request cancellation of a | |||
| server push prior to the push stream being received. The CANCEL_PUSH | server push prior to the push stream being received. The CANCEL_PUSH | |||
| skipping to change at page 30, line 6 ¶ | skipping to change at page 32, line 13 ¶ | |||
| or MAY take no action. | or MAY take no action. | |||
| When a server sends CANCEL_PUSH, it is indicating that it will not be | When a server sends CANCEL_PUSH, it is indicating that it will not be | |||
| fulfilling a promise and has not created a push stream. The client | fulfilling a promise and has not created a push stream. The client | |||
| should not expect the corresponding promise to be fulfilled. | should not expect the corresponding promise to be fulfilled. | |||
| Sending CANCEL_PUSH has no direct effect on the state of existing | Sending CANCEL_PUSH has no direct effect on the state of existing | |||
| push streams. A server SHOULD NOT send a CANCEL_PUSH when it has | push streams. A server SHOULD NOT send a CANCEL_PUSH when it has | |||
| already created a corresponding push stream, and a client SHOULD NOT | already created a corresponding push stream, and a client SHOULD NOT | |||
| send a CANCEL_PUSH when it has already received a corresponding push | send a CANCEL_PUSH when it has already received a corresponding push | |||
| stream. | stream. If a push stream arrives after a client has sent | |||
| CANCEL_PUSH, this MAY be treated as a stream error of type | ||||
| H3_STREAM_CREATION_ERROR. | ||||
| 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. | |||
| 0 1 2 3 | CANCEL_PUSH Frame { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Type (i) = 0x3, | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i), | |||
| | Push ID (i) ... | Push ID (..), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | } | |||
| Figure 6: CANCEL_PUSH Frame Payload | 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 7.2.5). If a CANCEL_PUSH frame is received | cancelled; see Section 7.2.5. If a CANCEL_PUSH frame is received | |||
| which references a Push ID greater than currently allowed on the | which references a Push ID greater than currently allowed on the | |||
| connection, this MUST be treated as a connection error of type | connection, this MUST be treated as a connection error of type | |||
| 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. | |||
| skipping to change at page 31, line 17 ¶ | skipping to change at page 33, line 27 ¶ | |||
| SETTINGS parameters are not negotiated; they describe characteristics | SETTINGS parameters are not negotiated; they describe characteristics | |||
| of the sending peer, which can be used by the receiving peer. | of the sending peer, which can be used by the receiving peer. | |||
| However, a negotiation can be implied by the use of SETTINGS - each | However, a negotiation can be implied by the use of SETTINGS - each | |||
| peer uses SETTINGS to advertise a set of supported values. The | peer uses SETTINGS to advertise a set of supported values. The | |||
| definition of the setting would describe how each peer combines the | definition of the setting would describe how each peer combines the | |||
| two sets to conclude which choice will be used. SETTINGS does not | two sets to conclude which choice will be used. SETTINGS does not | |||
| provide a mechanism to identify when the choice takes effect. | provide a mechanism to identify when the choice takes effect. | |||
| Different values for the same parameter can be advertised by each | Different values for the same parameter can be advertised by each | |||
| peer. For example, a client might be willing to consume a very large | peer. For example, a client might be willing to consume a very large | |||
| response header, while servers are more cautious about request size. | response field section, while servers are more cautious about request | |||
| size. | ||||
| The same setting identifier MUST NOT occur more than once in the | The same setting identifier MUST NOT occur more than once in the | |||
| SETTINGS frame. A receiver MAY treat the presence of duplicate | SETTINGS frame. A receiver MAY treat the presence of duplicate | |||
| setting identifiers as a connection error of type H3_SETTINGS_ERROR. | setting identifiers as a connection error of type H3_SETTINGS_ERROR. | |||
| The payload of a SETTINGS frame consists of zero or more parameters. | The payload of a SETTINGS frame consists of zero or more parameters. | |||
| Each parameter consists of a setting identifier and a value, both | Each parameter consists of a setting identifier and a value, both | |||
| encoded as QUIC variable-length integers. | encoded as QUIC variable-length integers. | |||
| 0 1 2 3 | Setting { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Identifier (i), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Value (i), | |||
| | Identifier (i) ... | } | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Value (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 7: SETTINGS Parameter Format | SETTINGS Frame { | |||
| Type (i) = 0x4, | ||||
| Length (i), | ||||
| Setting (..) ..., | ||||
| } | ||||
| Figure 7: SETTINGS Frame | ||||
| An implementation MUST ignore the contents for any SETTINGS | An implementation MUST ignore the contents for any SETTINGS | |||
| identifier it does not understand. | identifier it 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_HEADER_LIST_SIZE (0x6): The default value is unlimited. | SETTINGS_MAX_FIELD_SECTION_SIZE (0x6): The default value is | |||
| See Section 4.1.1 for usage. | unlimited. See Section 4.1.1 for usage. | |||
| Setting identifiers of the format "0x1f * N + 0x21" for integer | Setting identifiers of the format "0x1f * N + 0x21" for non-negative | |||
| values of N are reserved to exercise the requirement that unknown | integer values of N are reserved to exercise the requirement that | |||
| identifiers be ignored. Such settings have no defined meaning. | unknown identifiers be ignored. Such settings have no defined | |||
| Endpoints SHOULD include at least one such setting in their SETTINGS | meaning. Endpoints SHOULD include at least one such setting in their | |||
| frame. Endpoints MUST NOT consider such settings to have any meaning | SETTINGS frame. Endpoints MUST NOT consider such settings to have | |||
| 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 | |||
| can be any value the implementation selects. | can be any value the implementation selects. | |||
| Additional settings can be defined by extensions to HTTP/3; see | Additional settings can be defined by extensions to HTTP/3; see | |||
| Section 9 for more details. | Section 9 for more details. | |||
| 7.2.4.2. Initialization | 7.2.4.2. Initialization | |||
| An HTTP implementation MUST NOT send frames or requests which would | An HTTP implementation MUST NOT send frames or requests which would | |||
| skipping to change at page 33, line 27 ¶ | skipping to change at page 35, line 40 ¶ | |||
| 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=0x5) is used to carry a promised request | |||
| header set from server to client on a request stream, as in HTTP/2. | header field section from server to client on a request stream, as in | |||
| HTTP/2. | ||||
| 0 1 2 3 | PUSH_PROMISE Frame { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Type (i) = 0x5, | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i), | |||
| | Push ID (i) ... | Push ID (i), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Encoded Field Section (..), | |||
| | Header Block (*) ... | } | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 8: PUSH_PROMISE Frame Payload | 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 | |||
| operation. A Push ID is used in push stream headers | operation. A Push ID is used in push stream headers | |||
| (Section 4.4), CANCEL_PUSH frames (Section 7.2.3). | (Section 4.4), CANCEL_PUSH frames (Section 7.2.3). | |||
| Header Block: QPACK-compressed request header fields for the | Encoded Field Section: QPACK-encoded request header fields for the | |||
| promised response. See [QPACK] for more details. | promised response. See [QPACK] for more details. | |||
| A server MUST NOT use a Push ID that is larger than the client has | A server MUST NOT use a Push ID that is larger than the client has | |||
| provided in a MAX_PUSH_ID frame (Section 7.2.7). A client MUST treat | provided in a MAX_PUSH_ID frame (Section 7.2.7). A client MUST treat | |||
| receipt of a PUSH_PROMISE frame that contains a larger Push ID than | receipt of a PUSH_PROMISE frame that contains a larger Push ID than | |||
| the client has advertised as a connection error of H3_ID_ERROR. | the client has advertised as a connection error of H3_ID_ERROR. | |||
| A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | |||
| If so, the decompressed request header sets MUST contain the same | If so, the decompressed request header sets MUST contain the same | |||
| fields in the same order, and both the name and and value in each | fields in the same order, and both the name and the value in each | |||
| field MUST be exact matches. Clients SHOULD compare the request | field MUST be exact matches. Clients SHOULD compare the request | |||
| header sets for resources promised multiple times. If a client | header sections for resources promised multiple times. If a client | |||
| receives a Push ID that has already been promised and detects a | receives a Push ID that has already been promised and detects a | |||
| mismatch, it MUST respond with a connection error of type | mismatch, it MUST respond with a connection error of type | |||
| H3_GENERAL_PROTOCOL_ERROR. If the decompressed header sets match | H3_GENERAL_PROTOCOL_ERROR. If the decompressed field sections match | |||
| exactly, the client SHOULD associate the pushed content with each | exactly, the client SHOULD associate the pushed content with each | |||
| stream on which a PUSH_PROMISE was received. | stream on which a PUSH_PROMISE was received. | |||
| Allowing duplicate references to the same Push ID is primarily to | Allowing duplicate references to the same Push ID is primarily to | |||
| reduce duplication caused by concurrent requests. A server SHOULD | reduce duplication caused by concurrent requests. A server SHOULD | |||
| avoid reusing a Push ID over a long period. Clients are likely to | avoid reusing a Push ID over a long period. Clients are likely to | |||
| consume server push responses and not retain them for reuse over | consume server push responses and not retain them for reuse over | |||
| time. Clients that see a PUSH_PROMISE that uses a Push ID that they | time. Clients that see a PUSH_PROMISE that uses a Push ID that they | |||
| have already consumed and discarded are forced to ignore the | have already consumed and discarded are forced to ignore the | |||
| PUSH_PROMISE. | PUSH_PROMISE. | |||
| skipping to change at page 34, line 38 ¶ | skipping to change at page 37, line 8 ¶ | |||
| A client MUST NOT send a PUSH_PROMISE frame. A server MUST treat the | A client MUST NOT send a PUSH_PROMISE frame. A server MUST treat the | |||
| receipt of a PUSH_PROMISE frame as a connection error of type | receipt of a PUSH_PROMISE frame as a connection error of type | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| See Section 4.4 for a description of the overall server push | See Section 4.4 for a description of the overall server push | |||
| mechanism. | mechanism. | |||
| 7.2.6. GOAWAY | 7.2.6. GOAWAY | |||
| The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | |||
| a connection by a server. GOAWAY allows a server to stop accepting | a connection by either endpoint. GOAWAY allows an endpoint to stop | |||
| new requests while still finishing processing of previously received | accepting new requests or pushes while still finishing processing of | |||
| requests. This enables administrative actions, like server | previously received requests and pushes. This enables administrative | |||
| maintenance. GOAWAY by itself does not close a connection. | actions, like server maintenance. GOAWAY by itself does not close a | |||
| connection. | ||||
| 0 1 2 3 | GOAWAY Frame { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Type (i) = 0x7, | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i), | |||
| | Stream ID (i) ... | Stream ID/Push ID (..), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | } | |||
| Figure 9: GOAWAY Frame Payload | Figure 9: GOAWAY Frame | |||
| The GOAWAY frame is always sent on the control stream. It carries a | The GOAWAY frame is always sent on the control stream. In the server | |||
| QUIC Stream ID for a client-initiated bidirectional stream encoded as | to client direction, it carries a QUIC Stream ID for a client- | |||
| a variable-length integer. A client MUST treat receipt of a GOAWAY | initiated bidirectional stream encoded as a variable-length integer. | |||
| frame containing a Stream ID of any other type as a connection error | A client MUST treat receipt of a GOAWAY frame containing a Stream ID | |||
| of type H3_ID_ERROR. | of any other type as a connection error of type H3_ID_ERROR. | |||
| Clients do not need to send GOAWAY to initiate a graceful shutdown; | In the client to server direction, the GOAWAY frame carries a Push ID | |||
| they simply stop making new requests. A server MUST treat receipt of | encoded as a variable-length integer. | |||
| a GOAWAY frame on any stream as a connection error (Section 8) of | ||||
| type H3_FRAME_UNEXPECTED. | ||||
| The GOAWAY frame applies to the connection, not a specific stream. A | The GOAWAY frame applies to the connection, not a specific stream. A | |||
| client MUST treat a GOAWAY frame on a stream other than the control | client MUST treat a GOAWAY frame on a stream other than the control | |||
| stream as a connection error (Section 8) of type H3_FRAME_UNEXPECTED. | stream as a connection error (Section 8) of type H3_FRAME_UNEXPECTED. | |||
| See Section 5.2 for more information on the use of the GOAWAY frame. | See Section 5.2 for more information on the use of the GOAWAY frame. | |||
| 7.2.7. MAX_PUSH_ID | 7.2.7. MAX_PUSH_ID | |||
| The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | |||
| skipping to change at page 35, line 42 ¶ | skipping to change at page 38, line 11 ¶ | |||
| A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the | A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the | |||
| receipt of a MAX_PUSH_ID frame as a connection error of type | receipt of a MAX_PUSH_ID frame as a connection error of type | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| The maximum Push ID is unset when a connection is created, meaning | The maximum Push ID is unset when a connection is created, meaning | |||
| that a server cannot push until it receives a MAX_PUSH_ID frame. A | that a server cannot push until it receives a MAX_PUSH_ID frame. A | |||
| client that wishes to manage the number of promised server pushes can | client that wishes to manage the number of promised server pushes can | |||
| increase the maximum Push ID by sending MAX_PUSH_ID frames as the | increase the maximum Push ID by sending MAX_PUSH_ID frames as the | |||
| server fulfills or cancels server pushes. | server fulfills or cancels server pushes. | |||
| 0 1 2 3 | MAX_PUSH_ID Frame { | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | Type (i) = 0x1, | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i), | |||
| | Push ID (i) ... | Push ID (..), | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | } | |||
| Figure 10: MAX_PUSH_ID Frame Payload | Figure 10: MAX_PUSH_ID Frame Payload | |||
| The MAX_PUSH_ID frame carries a single variable-length integer that | The MAX_PUSH_ID frame carries a single variable-length integer that | |||
| identifies the maximum value for a Push ID that the server can use | identifies the maximum value for a Push ID that the server can use; | |||
| (see Section 7.2.5). A MAX_PUSH_ID frame cannot reduce the maximum | see Section 7.2.5. A MAX_PUSH_ID frame cannot reduce the maximum | |||
| Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | |||
| previously received MUST be treated as a connection error of type | previously received MUST be treated as a connection error of type | |||
| H3_ID_ERROR. | H3_ID_ERROR. | |||
| 7.2.8. Reserved Frame Types | 7.2.8. Reserved Frame Types | |||
| Frame types of the format "0x1f * N + 0x21" for integer values of N | Frame types of the format "0x1f * N + 0x21" for non-negative integer | |||
| are reserved to exercise the requirement that unknown types be | values of N are reserved to exercise the requirement that unknown | |||
| ignored (Section 9). These frames have no semantics, and can be sent | types be ignored (Section 9). These frames have no semantics, and | |||
| on any open stream when application-layer padding is desired. They | can be sent on any open stream when application-layer padding is | |||
| MAY also be sent on connections where no data is currently being | desired. They MAY also be sent on connections where no data is | |||
| transferred. Endpoints MUST NOT consider these frames to have any | currently being transferred. Endpoints MUST NOT consider these | |||
| meaning upon receipt. | frames to have any meaning upon receipt. | |||
| The payload and length of the frames are selected in any manner the | The payload and length of the frames are selected in any manner the | |||
| implementation chooses. | implementation chooses. | |||
| Frame types which were used in HTTP/2 where there is no corresponding | Frame types which were used in HTTP/2 where there is no corresponding | |||
| HTTP/3 frame have also been reserved (Section 11.2.1). These frame | HTTP/3 frame have also been reserved (Section 11.2.1). These frame | |||
| types MUST NOT be sent, and receipt MAY be treated as an error of | types MUST NOT be sent, and receipt MAY be treated as an error of | |||
| type H3_FRAME_UNEXPECTED. | type H3_FRAME_UNEXPECTED. | |||
| 8. Error Handling | 8. Error Handling | |||
| skipping to change at page 36, line 42 ¶ | skipping to change at page 39, line 13 ¶ | |||
| described in more detail in [QUIC-TRANSPORT]. | described in more detail in [QUIC-TRANSPORT]. | |||
| An endpoint MAY choose to treat a stream error as a connection error | An endpoint MAY choose to treat a stream error as a connection error | |||
| under certain circumstances. Implementations need to consider the | under certain circumstances. Implementations need to consider the | |||
| impact on outstanding requests before making this choice. | impact on outstanding requests before making this choice. | |||
| Because new error codes can be defined without negotiation (see | Because new error codes can be defined without negotiation (see | |||
| Section 9), use of an error code in an unexpected context or receipt | Section 9), use of an error code in an unexpected context or receipt | |||
| of an unknown error code MUST be treated as equivalent to | of an unknown error code MUST be treated as equivalent to | |||
| H3_NO_ERROR. However, closing a stream can have other effects | H3_NO_ERROR. However, closing a stream can have other effects | |||
| regardless of the error code (see Section 4.1). | regardless of the error code; see Section 4.1. | |||
| This section describes HTTP/3-specific error codes which can be used | This section describes HTTP/3-specific error codes which can be used | |||
| to express the cause of a connection or stream error. | to express the cause of a connection or stream error. | |||
| 8.1. HTTP/3 Error Codes | 8.1. HTTP/3 Error Codes | |||
| The following error codes are defined for use when abruptly | The following error codes are defined for use when abruptly | |||
| terminating streams, aborting reading of streams, or immediately | terminating streams, aborting reading of streams, or immediately | |||
| closing connections. | closing connections. | |||
| skipping to change at page 38, line 5 ¶ | skipping to change at page 40, line 26 ¶ | |||
| H3_REQUEST_INCOMPLETE (0x10D): The client's stream terminated | H3_REQUEST_INCOMPLETE (0x10D): The client's stream terminated | |||
| without containing a fully-formed request. | without containing a fully-formed request. | |||
| H3_CONNECT_ERROR (0x10F): The connection established in response to | H3_CONNECT_ERROR (0x10F): The connection established in response to | |||
| a CONNECT request was reset or abnormally closed. | a CONNECT request was reset or abnormally closed. | |||
| H3_VERSION_FALLBACK (0x110): The requested operation cannot be | H3_VERSION_FALLBACK (0x110): The requested operation cannot be | |||
| served over HTTP/3. The peer should retry over HTTP/1.1. | served over HTTP/3. The peer should retry over HTTP/1.1. | |||
| Error codes of the format "0x1f * N + 0x21" for integer values of N | Error codes of the format "0x1f * N + 0x21" for non-negative integer | |||
| are reserved to exercise the requirement that unknown error codes be | values of N are reserved to exercise the requirement that unknown | |||
| treated as equivalent to H3_NO_ERROR (Section 9). Implementations | error codes be treated as equivalent to H3_NO_ERROR (Section 9). | |||
| SHOULD select an error code from this space with some probability | Implementations SHOULD select an error code from this space with some | |||
| 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 | |||
| HTTP/3 permits extension of the protocol. Within the limitations | HTTP/3 permits extension of the protocol. Within the limitations | |||
| described in this section, protocol extensions can be used to provide | described in this section, protocol extensions can be used to provide | |||
| additional services or alter any aspect of the protocol. Extensions | additional services or alter any aspect of the protocol. Extensions | |||
| are effective only within the scope of a single HTTP/3 connection. | are effective only within the scope of a single HTTP/3 connection. | |||
| This applies to the protocol elements defined in this document. This | This applies to the protocol elements defined in this document. This | |||
| does not affect the existing options for extending HTTP, such as | does not affect the existing options for extending HTTP, such as | |||
| defining new methods, status codes, or header fields. | defining new methods, status codes, or fields. | |||
| Extensions are permitted to use new frame types (Section 7.2), new | Extensions are permitted to use new frame types (Section 7.2), new | |||
| settings (Section 7.2.4.1), new error codes (Section 8), or new | settings (Section 7.2.4.1), new error codes (Section 8), or new | |||
| unidirectional stream types (Section 6.2). Registries are | unidirectional stream types (Section 6.2). Registries are | |||
| established for managing these extension points: frame types | established for managing these extension points: frame types | |||
| (Section 11.2.1), settings (Section 11.2.2), error codes | (Section 11.2.1), settings (Section 11.2.2), error codes | |||
| (Section 11.2.3), and stream types (Section 11.2.4). | (Section 11.2.3), and stream types (Section 11.2.4). | |||
| Implementations MUST ignore unknown or unsupported values in all | Implementations MUST ignore unknown or unsupported values in all | |||
| extensible protocol elements. Implementations MUST discard frames | extensible protocol elements. Implementations MUST discard frames | |||
| skipping to change at page 39, line 10 ¶ | skipping to change at page 41, line 31 ¶ | |||
| use of an extension but notes that a setting (Section 7.2.4.1) could | use of an extension but notes that a setting (Section 7.2.4.1) could | |||
| be used for that purpose. If both peers set a value that indicates | be used for that purpose. If both peers set a value that indicates | |||
| willingness to use the extension, then the extension can be used. If | willingness to use the extension, then the extension can be used. If | |||
| a setting is used for extension negotiation, the default value MUST | a setting is used for extension negotiation, the default value MUST | |||
| be defined in such a fashion that the extension is disabled if the | be defined in such a fashion that the extension is disabled if the | |||
| setting is omitted. | setting is omitted. | |||
| 10. Security Considerations | 10. Security Considerations | |||
| The security considerations of HTTP/3 should be comparable to those | The security considerations of HTTP/3 should be comparable to those | |||
| of HTTP/2 with TLS; the considerations from Section 10 of [HTTP2] | of HTTP/2 with TLS. However, many of the considerations from | |||
| apply in addition to those listed here. | Section 10 of [HTTP2] apply to [QUIC-TRANSPORT] and are discussed in | |||
| that document. | ||||
| When HTTP Alternative Services is used for discovery for HTTP/3 | 10.1. Server Authority | |||
| endpoints, the security considerations of [ALTSVC] also apply. | ||||
| 10.1. Traffic Analysis | HTTP/3 relies on the HTTP definition of authority. The security | |||
| considerations of establishing authority are discussed in | ||||
| Section 11.1 of [SEMANTICS]. | ||||
| 10.2. Cross-Protocol Attacks | ||||
| The use of ALPN in the TLS and QUIC handshakes establishes the target | ||||
| application protocol before application-layer bytes are processed. | ||||
| Because all QUIC packets are encrypted, it is difficult for an | ||||
| attacker to control the plaintext bytes of an HTTP/3 connection which | ||||
| could be used in a cross-protocol attack on a plaintext protocol. | ||||
| 10.3. Intermediary Encapsulation Attacks | ||||
| The HTTP/3 field encoding allows the expression of names that are not | ||||
| valid field names in the syntax used by HTTP (Section 4.3 of | ||||
| [SEMANTICS]). Requests or responses containing invalid field names | ||||
| MUST be treated as malformed (Section 4.1.3). An intermediary | ||||
| therefore cannot translate an HTTP/3 request or response containing | ||||
| an invalid field name into an HTTP/1.1 message. | ||||
| Similarly, HTTP/3 allows field values that are not valid. While most | ||||
| of the values that can be encoded will not alter field parsing, | ||||
| carriage return (CR, ASCII 0xd), line feed (LF, ASCII 0xa), and the | ||||
| zero character (NUL, ASCII 0x0) might be exploited by an attacker if | ||||
| they are translated verbatim. Any request or response that contains | ||||
| a character not permitted in a field value MUST be treated as | ||||
| malformed (Section 4.1.3). Valid characters are defined by the | ||||
| "field-content" ABNF rule in Section 4.4 of [SEMANTICS]. | ||||
| 10.4. Cacheability of Pushed Responses | ||||
| Pushed responses do not have an explicit request from the client; the | ||||
| request is provided by the server in the PUSH_PROMISE frame. | ||||
| Caching responses that are pushed is possible based on the guidance | ||||
| provided by the origin server in the Cache-Control header field. | ||||
| However, this can cause issues if a single server hosts more than one | ||||
| tenant. For example, a server might offer multiple users each a | ||||
| small portion of its URI space. | ||||
| Where multiple tenants share space on the same server, that server | ||||
| MUST ensure that tenants are not able to push representations of | ||||
| resources that they do not have authority over. Failure to enforce | ||||
| this would allow a tenant to provide a representation that would be | ||||
| served out of cache, overriding the actual representation that the | ||||
| authoritative tenant provides. | ||||
| Pushed responses for which an origin server is not authoritative (see | ||||
| Section 3.4) MUST NOT be used or cached. | ||||
| 10.5. Denial-of-Service Considerations | ||||
| An HTTP/3 connection can demand a greater commitment of resources to | ||||
| operate than an HTTP/1.1 or HTTP/2 connection. The use of field | ||||
| compression and flow control depend on a commitment of resources for | ||||
| storing a greater amount of state. Settings for these features | ||||
| ensure that memory commitments for these features are strictly | ||||
| bounded. | ||||
| The number of PUSH_PROMISE frames is constrained in a similar | ||||
| fashion. A client that accepts server push SHOULD limit the number | ||||
| of Push IDs it issues at a time. | ||||
| Processing capacity cannot be guarded as effectively as state | ||||
| capacity. | ||||
| The ability to send undefined protocol elements which the peer is | ||||
| required to ignore can be abused to cause a peer to expend additional | ||||
| processing time. This might be done by setting multiple undefined | ||||
| SETTINGS parameters, unknown frame types, or unknown stream types. | ||||
| Note, however, that some uses are entirely legitimate, such as | ||||
| optional-to-understand extensions and padding to increase resistance | ||||
| to traffic analysis. | ||||
| Compression of field sections also offers some opportunities to waste | ||||
| processing resources; see Section 7 of [QPACK] for more details on | ||||
| potential abuses. | ||||
| All these features - i.e., server push, unknown protocol elements, | ||||
| field compression - have legitimate uses. These features become a | ||||
| burden only when they are used unnecessarily or to excess. | ||||
| An endpoint that doesn't monitor this behavior exposes itself to a | ||||
| risk of denial-of-service attack. Implementations SHOULD track the | ||||
| use of these features and set limits on their use. An endpoint MAY | ||||
| treat activity that is suspicious as a connection error (Section 8) | ||||
| of type H3_EXCESSIVE_LOAD, but false positives will result in | ||||
| disrupting valid connections and requests. | ||||
| 10.5.1. Limits on Field Section Size | ||||
| A large field section (Section 4.1) can cause an implementation to | ||||
| commit a large amount of state. Header fields that are critical for | ||||
| routing can appear toward the end of a header field section, which | ||||
| prevents streaming of the header field section to its ultimate | ||||
| destination. This ordering and other reasons, such as ensuring cache | ||||
| correctness, mean that an endpoint likely needs to buffer the entire | ||||
| header field section. Since there is no hard limit to the size of a | ||||
| field section, some endpoints could be forced to commit a large | ||||
| amount of available memory for header fields. | ||||
| An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE | ||||
| (Section 7.2.4.1) setting to advise peers of limits that might apply | ||||
| on the size of field sections. This setting is only advisory, so | ||||
| endpoints MAY choose to send field sections that exceed this limit | ||||
| and risk having the request or response being treated as malformed. | ||||
| This setting is specific to a connection, so any request or response | ||||
| could encounter a hop with a lower, unknown limit. An intermediary | ||||
| can attempt to avoid this problem by passing on values presented by | ||||
| different peers, but they are not obligated to do so. | ||||
| A server that receives a larger field section than it is willing to | ||||
| handle can send an HTTP 431 (Request Header Fields Too Large) status | ||||
| code [RFC6585]. A client can discard responses that it cannot | ||||
| process. | ||||
| 10.5.2. CONNECT Issues | ||||
| The CONNECT method can be used to create disproportionate load on an | ||||
| proxy, since stream creation is relatively inexpensive when compared | ||||
| to the creation and maintenance of a TCP connection. A proxy might | ||||
| also maintain some resources for a TCP connection beyond the closing | ||||
| of the stream that carries the CONNECT request, since the outgoing | ||||
| TCP connection remains in the TIME_WAIT state. Therefore, a proxy | ||||
| cannot rely on QUIC stream limits alone to control the resources | ||||
| consumed by CONNECT requests. | ||||
| 10.6. Use of Compression | ||||
| Compression can allow an attacker to recover secret data when it is | ||||
| compressed in the same context as data under attacker control. | ||||
| HTTP/3 enables compression of fields (Section 4.1.1); the following | ||||
| concerns also apply to the use of HTTP compressed content-codings; | ||||
| see Section 6.1.2 of [SEMANTICS]. | ||||
| There are demonstrable attacks on compression that exploit the | ||||
| characteristics of the web (e.g., [BREACH]). The attacker induces | ||||
| multiple requests containing varying plaintext, observing the length | ||||
| of the resulting ciphertext in each, which reveals a shorter length | ||||
| when a guess about the secret is correct. | ||||
| Implementations communicating on a secure channel MUST NOT compress | ||||
| content that includes both confidential and attacker-controlled data | ||||
| unless separate compression dictionaries are used for each source of | ||||
| data. Compression MUST NOT be used if the source of data cannot be | ||||
| reliably determined. | ||||
| Further considerations regarding the compression of fields sections | ||||
| are described in [QPACK]. | ||||
| 10.7. Padding and Traffic Analysis | ||||
| Padding can be used to obscure the exact size of frame content and is | ||||
| provided to mitigate specific attacks within HTTP, for example, | ||||
| attacks where compressed content includes both attacker-controlled | ||||
| plaintext and secret data (e.g., [BREACH]). | ||||
| Where HTTP/2 employs PADDING frames and Padding fields in other | Where HTTP/2 employs PADDING frames and Padding fields in other | |||
| frames to make a connection more resistant to traffic analysis, | frames to make a connection more resistant to traffic analysis, | |||
| HTTP/3 can either rely on transport-layer padding or employ the | HTTP/3 can either rely on transport-layer padding or employ the | |||
| reserved frame and stream types discussed in Section 7.2.8 and | reserved frame and stream types discussed in Section 7.2.8 and | |||
| Section 6.2.3. These methods of padding produce different results in | Section 6.2.3. These methods of padding produce different results in | |||
| terms of the granularity of padding, how padding is arranged in | terms of the granularity of padding, how padding is arranged in | |||
| relation to the information that is being protected, whether padding | relation to the information that is being protected, whether padding | |||
| is applied in the case of packet loss, and how an implementation | is applied in the case of packet loss, and how an implementation | |||
| might control padding. | might control padding. Redundant padding could even be | |||
| counterproductive. | ||||
| 10.2. Frame Parsing | To mitigate attacks that rely on compression, disabling or limiting | |||
| compression might be preferable to padding as a countermeasure. | ||||
| Use of padding can result in less protection than might seem | ||||
| immediately obvious. At best, padding only makes it more difficult | ||||
| for an attacker to infer length information by increasing the number | ||||
| of frames an attacker has to observe. Incorrectly implemented | ||||
| padding schemes can be easily defeated. In particular, randomized | ||||
| padding with a predictable distribution provides very little | ||||
| protection; similarly, padding payloads to a fixed size exposes | ||||
| information as payload sizes cross the fixed-sized boundary, which | ||||
| could be possible if an attacker can control plaintext. | ||||
| 10.8. Frame Parsing | ||||
| Several protocol elements contain nested length elements, typically | Several protocol elements contain nested length elements, typically | |||
| in the form of frames with an explicit length containing variable- | in the form of frames with an explicit length containing variable- | |||
| length integers. This could pose a security risk to an incautious | length integers. This could pose a security risk to an incautious | |||
| implementer. An implementation MUST ensure that the length of a | implementer. An implementation MUST ensure that the length of a | |||
| frame exactly matches the length of the fields it contains. | frame exactly matches the length of the fields it contains. | |||
| 10.3. Early Data | 10.9. Early Data | |||
| The use of 0-RTT with HTTP/3 creates an exposure to replay attack. | The use of 0-RTT with HTTP/3 creates an exposure to replay attack. | |||
| The anti-replay mitigations in [HTTP-REPLAY] MUST be applied when | The anti-replay mitigations in [HTTP-REPLAY] MUST be applied when | |||
| using HTTP/3 with 0-RTT. | using HTTP/3 with 0-RTT. | |||
| 10.4. Migration | 10.10. Migration | |||
| Certain HTTP implementations use the client address for logging or | Certain HTTP implementations use the client address for logging or | |||
| access-control purposes. Since a QUIC client's address might change | access-control purposes. Since a QUIC client's address might change | |||
| during a connection (and future versions might support simultaneous | during a connection (and future versions might support simultaneous | |||
| use of multiple addresses), such implementations will need to either | use of multiple addresses), such implementations will need to either | |||
| actively retrieve the client's current address or addresses when they | actively retrieve the client's current address or addresses when they | |||
| are relevant or explicitly accept that the original address might | are relevant or explicitly accept that the original address might | |||
| change. | change. | |||
| 10.11. Privacy Considerations | ||||
| Several characteristics of HTTP/3 provide an observer an opportunity | ||||
| to correlate actions of a single client or server over time. These | ||||
| include the value of settings, the timing of reactions to stimulus, | ||||
| and the handling of any features that are controlled by settings. | ||||
| As far as these create observable differences in behavior, they could | ||||
| be used as a basis for fingerprinting a specific client. | ||||
| HTTP/3's preference for using a single QUIC connection allows | ||||
| correlation of a user's activity on a site. Reusing connections for | ||||
| different origins allows for correlation of activity across those | ||||
| origins. | ||||
| Several features of QUIC solicit immediate responses and can be used | ||||
| by an endpoint to measure latency to their peer; this might have | ||||
| privacy implications in certain scenarios. | ||||
| 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 | |||
| skipping to change at page 41, line 44 ¶ | skipping to change at page 48, line 33 ¶ | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| | Reserved | 0x8 | N/A | | | Reserved | 0x8 | N/A | | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| | Reserved | 0x9 | N/A | | | Reserved | 0x9 | N/A | | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| | MAX_PUSH_ID | 0xD | Section 7.2.7 | | | MAX_PUSH_ID | 0xD | Section 7.2.7 | | |||
| +--------------+-------+---------------+ | +--------------+-------+---------------+ | |||
| Table 2: Initial HTTP/3 Frame Types | Table 2: Initial HTTP/3 Frame Types | |||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for non- | |||
| values of N (that is, "0x21", "0x40", ..., through | negative integer values of N (that is, 0x21, 0x40, ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | 0x3FFFFFFFFFFFFFFE) MUST NOT be assigned by IANA. | |||
| 11.2.2. Settings Parameters | 11.2.2. Settings Parameters | |||
| This document establishes a registry for HTTP/3 settings. The | This document establishes a registry for HTTP/3 settings. The | |||
| "HTTP/3 Settings" registry governs a 62-bit space. This registry | "HTTP/3 Settings" registry governs a 62-bit space. This registry | |||
| follows the QUIC registry policy; see Section 11.2. Permanent | follows the QUIC registry policy; see Section 11.2. Permanent | |||
| registrations in this registry are assigned using the Specification | registrations in this registry are assigned using the Specification | |||
| Required policy [RFC8126], except for values between 0x00 and 0x3f | Required policy [RFC8126], except for values between 0x00 and 0x3f | |||
| (in hexadecimal; inclusive), which are assigned using Standards | (in hexadecimal; inclusive), which are assigned using Standards | |||
| Action or IESG Approval as defined in Section 4.9 and 4.10 of | Action or IESG Approval as defined in Section 4.9 and 4.10 of | |||
| skipping to change at page 42, line 33 ¶ | skipping to change at page 49, line 16 ¶ | |||
| registrations in this registry MUST include the following fields: | registrations in this registry MUST include the following fields: | |||
| Setting Name: A symbolic name for the setting. Specifying a setting | Setting Name: A symbolic name for the setting. Specifying a setting | |||
| 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 | 0x2 | N/A | N/A | | | Reserved | 0x2 | N/A | N/A | | |||
| +----------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| | Reserved | 0x3 | N/A | N/A | | | Reserved | 0x3 | N/A | N/A | | |||
| +----------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| | Reserved | 0x4 | N/A | N/A | | | Reserved | 0x4 | N/A | N/A | | |||
| +----------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| | Reserved | 0x5 | N/A | N/A | | | Reserved | 0x5 | N/A | N/A | | |||
| +----------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| | MAX_HEADER_LIST_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | | MAX_FIELD_SECTION_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | |||
| +----------------------+-------+-----------------+-----------+ | +------------------------+-------+-----------------+-----------+ | |||
| Table 3: Initial HTTP/3 Settings | Table 3: Initial HTTP/3 Settings | |||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for non- | |||
| values of N (that is, "0x21", "0x40", ..., through | negative integer values of N (that is, 0x21, 0x40, ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | 0x3FFFFFFFFFFFFFFE) MUST NOT be assigned by IANA. | |||
| 11.2.3. Error Codes | 11.2.3. Error Codes | |||
| This document establishes a registry for HTTP/3 error codes. The | This document establishes a registry for HTTP/3 error codes. The | |||
| "HTTP/3 Error Code" registry manages a 62-bit space. This registry | "HTTP/3 Error Code" registry manages a 62-bit space. This registry | |||
| follows the QUIC registry policy; see Section 11.2. Permanent | follows the QUIC registry policy; see Section 11.2. Permanent | |||
| registrations in this registry are assigned using the Specification | registrations in this registry are assigned using the Specification | |||
| Required policy [RFC8126], except for values between 0x00 and 0x3f | Required policy [RFC8126], except for values between 0x00 and 0x3f | |||
| (in hexadecimal; inclusive), which are assigned using Standards | (in hexadecimal; inclusive), which are assigned using Standards | |||
| Action or IESG Approval as defined in Section 4.9 and 4.10 of | Action or IESG Approval as defined in Section 4.9 and 4.10 of | |||
| skipping to change at page 45, line 4 ¶ | skipping to change at page 51, line 36 ¶ | |||
| | | | early | | | | | | early | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | H3_CONNECT_ERROR | 0x010F | TCP reset | Section 8.1 | | | H3_CONNECT_ERROR | 0x010F | TCP reset | Section 8.1 | | |||
| | | | or error on | | | | | | or error on | | | |||
| | | | CONNECT | | | | | | CONNECT | | | |||
| | | | request | | | | | | request | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | H3_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 | | | H3_VERSION_FALLBACK | 0x0110 | Retry over | Section 8.1 | | |||
| | | | HTTP/1.1 | | | | | | HTTP/1.1 | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| Table 4: Initial HTTP/3 Error Codes | Table 4: Initial HTTP/3 Error Codes | |||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for non- | |||
| values of N (that is, "0x21", "0x40", ..., through | negative integer values of N (that is, 0x21, 0x40, ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | 0x3FFFFFFFFFFFFFFE) MUST NOT be assigned by IANA. | |||
| 11.2.4. Stream Types | 11.2.4. Stream Types | |||
| This document establishes a registry for HTTP/3 unidirectional stream | This document establishes a registry for HTTP/3 unidirectional stream | |||
| types. The "HTTP/3 Stream Type" registry governs a 62-bit space. | types. The "HTTP/3 Stream Type" registry governs a 62-bit space. | |||
| This registry follows the QUIC registry policy; see Section 11.2. | This registry follows the QUIC registry policy; see Section 11.2. | |||
| Permanent registrations in this registry are assigned using the | Permanent registrations in this registry are assigned using the | |||
| Specification Required policy [RFC8126], except for values between | Specification Required policy [RFC8126], except for values between | |||
| 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using | 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using | |||
| Standards Action or IESG Approval as defined in Section 4.9 and 4.10 | Standards Action or IESG Approval as defined in Section 4.9 and 4.10 | |||
| skipping to change at page 45, line 45 ¶ | skipping to change at page 52, line 40 ¶ | |||
| +----------------+-------+---------------+--------+ | +----------------+-------+---------------+--------+ | |||
| | Stream Type | Value | Specification | Sender | | | Stream Type | Value | Specification | Sender | | |||
| +================+=======+===============+========+ | +================+=======+===============+========+ | |||
| | Control Stream | 0x00 | Section 6.2.1 | Both | | | Control Stream | 0x00 | Section 6.2.1 | Both | | |||
| +----------------+-------+---------------+--------+ | +----------------+-------+---------------+--------+ | |||
| | Push Stream | 0x01 | Section 4.4 | Server | | | Push Stream | 0x01 | Section 4.4 | Server | | |||
| +----------------+-------+---------------+--------+ | +----------------+-------+---------------+--------+ | |||
| Table 5 | Table 5 | |||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for non- | |||
| values of N (that is, "0x21", "0x40", ..., through | negative integer values of N (that is, 0x21, 0x40, ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | 0x3FFFFFFFFFFFFFFE) MUST NOT be assigned by IANA. | |||
| 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", Work in Progress, Internet-Draft, draft-ietf- | ||||
| httpbis-cache-07, 7 March 2020, <http://www.ietf.org/ | ||||
| internet-drafts/draft-ietf-httpbis-cache-07.txt>. | ||||
| [HTTP-REPLAY] | [HTTP-REPLAY] | |||
| Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | |||
| Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | |||
| 2018, <https://www.rfc-editor.org/info/rfc8470>. | 2018, <https://www.rfc-editor.org/info/rfc8470>. | |||
| [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | ||||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | ||||
| DOI 10.17487/RFC7540, May 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7540>. | ||||
| [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | |||
| Header Compression for HTTP over QUIC", Work in Progress, | Header Compression for HTTP over QUIC", Work in Progress, | |||
| Internet-Draft, draft-ietf-quic-qpack-14, 21 February | Internet-Draft, draft-ietf-quic-qpack-15, 20 May 2020, | |||
| 2020, | <https://tools.ietf.org/html/draft-ietf-quic-qpack-15>. | |||
| <https://tools.ietf.org/html/draft-ietf-quic-qpack-14>. | ||||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", Work in Progress, | Multiplexed and Secure Transport", Work in Progress, | |||
| Internet-Draft, draft-ietf-quic-transport-27, 21 February | Internet-Draft, draft-ietf-quic-transport-28, 20 May 2020, | |||
| 2020, <https://tools.ietf.org/html/draft-ietf-quic- | <https://tools.ietf.org/html/draft-ietf-quic-transport- | |||
| transport-27>. | 28>. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 47, line 7 ¶ | skipping to change at page 54, line 5 ¶ | |||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
| DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, | |||
| <https://www.rfc-editor.org/info/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
| [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, | |||
| <https://www.rfc-editor.org/info/rfc6066>. | <https://www.rfc-editor.org/info/rfc6066>. | |||
| [RFC6125] Saint-Andre, P. and J. Hodges, "Representation and | ||||
| Verification of Domain-Based Application Service Identity | ||||
| within Internet Public Key Infrastructure Using X.509 | ||||
| (PKIX) Certificates in the Context of Transport Layer | ||||
| Security (TLS)", RFC 6125, DOI 10.17487/RFC6125, March | ||||
| 2011, <https://www.rfc-editor.org/info/rfc6125>. | ||||
| [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
| DOI 10.17487/RFC6265, April 2011, | DOI 10.17487/RFC6265, April 2011, | |||
| <https://www.rfc-editor.org/info/rfc6265>. | <https://www.rfc-editor.org/info/rfc6265>. | |||
| [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
| Protocol (HTTP/1.1): Message Syntax and Routing", | ||||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7230>. | ||||
| [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
| Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | ||||
| DOI 10.17487/RFC7231, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7231>. | ||||
| [RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP | ||||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | ||||
| April 2016, <https://www.rfc-editor.org/info/rfc7838>. | ||||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
| 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>. | |||
| [RFC8164] Nottingham, M. and M. Thomson, "Opportunistic Security for | [RFC8164] Nottingham, M. and M. Thomson, "Opportunistic Security for | |||
| HTTP/2", RFC 8164, DOI 10.17487/RFC8164, May 2017, | HTTP/2", RFC 8164, DOI 10.17487/RFC8164, May 2017, | |||
| <https://www.rfc-editor.org/info/rfc8164>. | <https://www.rfc-editor.org/info/rfc8164>. | |||
| [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] | ||||
| Fielding, R., Nottingham, M., and J. Reschke, "HTTP | ||||
| Semantics", Work in Progress, Internet-Draft, draft-ietf- | ||||
| httpbis-semantics-07, 7 March 2020, <http://www.ietf.org/ | ||||
| internet-drafts/draft-ietf-httpbis-semantics-07.txt>. | ||||
| 12.2. Informative References | 12.2. Informative References | |||
| [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | ||||
| CRIME Attack", July 2013, | ||||
| <http://breachattack.com/resources/ | ||||
| BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | ||||
| [HPACK] Peon, R. and H. Ruellan, "HPACK: Header Compression for | [HPACK] Peon, R. and H. Ruellan, "HPACK: Header Compression for | |||
| HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7541>. | <https://www.rfc-editor.org/info/rfc7541>. | |||
| [HTTP11] Fielding, R., Nottingham, M., and J. Reschke, "HTTP/1.1 | ||||
| Messaging", Work in Progress, Internet-Draft, draft-ietf- | ||||
| httpbis-messaging-07, 7 March 2020, <http://www.ietf.org/ | ||||
| internet-drafts/draft-ietf-httpbis-messaging-07.txt>. | ||||
| [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | ||||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | ||||
| DOI 10.17487/RFC7540, May 2015, | ||||
| <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>. | |||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | [TFO] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | |||
| Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | |||
| <https://www.rfc-editor.org/info/rfc7413>. | <https://www.rfc-editor.org/info/rfc7413>. | |||
| [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | ||||
| <https://www.rfc-editor.org/info/rfc8446>. | ||||
| [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
| Resource Identifier (URI): Generic Syntax", STD 66, | ||||
| RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
| <https://www.rfc-editor.org/info/rfc3986>. | ||||
| Appendix A. Considerations for Transitioning from HTTP/2 | Appendix A. Considerations for Transitioning from HTTP/2 | |||
| HTTP/3 is strongly informed by HTTP/2, and bears many similarities. | HTTP/3 is strongly informed by HTTP/2, and bears many similarities. | |||
| This section describes the approach taken to design HTTP/3, points | This section describes the approach taken to design HTTP/3, points | |||
| out important differences from HTTP/2, and describes how to map | out important differences from HTTP/2, and describes how to map | |||
| HTTP/2 extensions into HTTP/3. | HTTP/2 extensions into HTTP/3. | |||
| HTTP/3 begins from the premise that similarity to HTTP/2 is | HTTP/3 begins from the premise that similarity to HTTP/2 is | |||
| preferable, but not a hard requirement. HTTP/3 departs from HTTP/2 | preferable, but not a hard requirement. HTTP/3 departs from HTTP/2 | |||
| where QUIC differs from TCP, either to take advantage of QUIC | where QUIC differs from TCP, either to take advantage of QUIC | |||
| skipping to change at page 49, line 45 ¶ | skipping to change at page 57, line 25 ¶ | |||
| A.2.1. Prioritization Differences | A.2.1. Prioritization Differences | |||
| HTTP/2 specifies priority assignments in PRIORITY frames and | HTTP/2 specifies priority assignments in PRIORITY frames and | |||
| (optionally) in HEADERS frames. HTTP/3 does not provide a means of | (optionally) in HEADERS frames. HTTP/3 does not provide a means of | |||
| signaling priority. | signaling priority. | |||
| Note that while there is no explicit signaling for priority, this | Note that while there is no explicit signaling for priority, this | |||
| does not mean that prioritization is not important for achieving good | does not mean that prioritization is not important for achieving good | |||
| performance. | performance. | |||
| A.2.2. Header Compression Differences | A.2.2. Field Compression Differences | |||
| HPACK was designed with the assumption of in-order delivery. A | HPACK was designed with the assumption of in-order delivery. A | |||
| sequence of encoded header blocks must arrive (and be decoded) at an | sequence of encoded field sections must arrive (and be decoded) at an | |||
| endpoint in the same order in which they were encoded. This ensures | endpoint in the same order in which they were encoded. This ensures | |||
| that the dynamic state at the two endpoints remains in sync. | that the dynamic state at the two endpoints remains in sync. | |||
| Because this total ordering is not provided by QUIC, HTTP/3 uses a | Because this total ordering is not provided by QUIC, HTTP/3 uses a | |||
| modified version of HPACK, called QPACK. QPACK uses a single | modified version of HPACK, called QPACK. QPACK uses a single | |||
| unidirectional stream to make all modifications to the dynamic table, | unidirectional stream to make all modifications to the dynamic table, | |||
| ensuring a total order of updates. All frames which contain encoded | ensuring a total order of updates. All frames which contain encoded | |||
| headers merely reference the table state at a given time without | fields merely reference the table state at a given time without | |||
| modifying it. | modifying it. | |||
| [QPACK] provides additional details. | [QPACK] provides additional details. | |||
| A.2.3. Guidance for New Frame Type Definitions | A.2.3. Guidance for New Frame Type Definitions | |||
| Frame type definitions in HTTP/3 often use the QUIC variable-length | Frame type definitions in HTTP/3 often use the QUIC variable-length | |||
| integer encoding. In particular, Stream IDs use this encoding, which | integer encoding. In particular, Stream IDs use this encoding, which | |||
| allows for a larger range of possible values than the encoding used | allows for a larger range of possible values than the encoding used | |||
| in HTTP/2. Some frames in HTTP/3 use an identifier rather than a | in HTTP/2. Some frames in HTTP/3 use an identifier rather than a | |||
| skipping to change at page 51, line 12 ¶ | skipping to change at page 58, line 41 ¶ | |||
| SETTINGS (0x4): SETTINGS frames are sent only at the beginning of | SETTINGS (0x4): 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 does not reference a stream; | PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; | |||
| instead the push stream references the PUSH_PROMISE frame using a | instead the push stream references the PUSH_PROMISE frame using a | |||
| Push ID. See Section 7.2.5. | Push ID. See Section 7.2.5. | |||
| PING (0x6): PING frames do not exist, since QUIC provides equivalent | PING (0x6): PING frames do not exist, since QUIC provides equivalent | |||
| functionality. | functionality. | |||
| GOAWAY (0x7): GOAWAY is sent only from server to client and does not | GOAWAY (0x7): GOAWAY does not contain an error code. In the client | |||
| contain an error code. See Section 7.2.6. | to server direction, it carries a Push ID instead of a server | |||
| initiated stream ID. See Section 7.2.6. | ||||
| WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | |||
| provides flow control. | provides flow control. | |||
| CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | |||
| larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted. | larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted. | |||
| Frame types defined by extensions to HTTP/2 need to be separately | Frame types defined by extensions to HTTP/2 need to be separately | |||
| registered for HTTP/3 if still applicable. The IDs of frames defined | registered for HTTP/3 if still applicable. The IDs of frames defined | |||
| in [HTTP2] have been reserved for simplicity. Note that the frame | in [HTTP2] have been reserved for simplicity. Note that the frame | |||
| skipping to change at page 52, line 10 ¶ | skipping to change at page 59, line 43 ¶ | |||
| SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error. | SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error. | |||
| SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and | SETTINGS_INITIAL_WINDOW_SIZE: 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 | initial transport handshake. Specifying | |||
| SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. | SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. | |||
| SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/3. | SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/3. | |||
| Specifying it in the SETTINGS frame is an error. | Specifying it in the SETTINGS frame is an error. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE: See Section 7.2.4.1. | SETTINGS_MAX_FIELD_SECTION_SIZE: See Section 7.2.4.1. | |||
| 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 which use the full 32-bit space. Settings | encoding for settings which use the full 32-bit space. Settings | |||
| ported from HTTP/2 might choose to redefine 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. | |||
| Settings need to be defined separately for HTTP/2 and HTTP/3. The | Settings need to be defined separately for HTTP/2 and HTTP/3. The | |||
| skipping to change at page 52, line 33 ¶ | skipping to change at page 60, line 18 ¶ | |||
| larger (62 bits versus 16 bits), so many HTTP/3 settings have no | larger (62 bits versus 16 bits), so many HTTP/3 settings have no | |||
| equivalent HTTP/2 code point. See Section 11.2.2. | equivalent HTTP/2 code point. See Section 11.2.2. | |||
| As QUIC streams might arrive out-of-order, endpoints are advised to | As QUIC streams might arrive out-of-order, endpoints are advised to | |||
| not wait for the peers' settings to arrive before responding to other | not wait for the peers' settings to arrive before responding to other | |||
| streams. See Section 7.2.4.2. | streams. See Section 7.2.4.2. | |||
| A.4. HTTP/2 Error Codes | A.4. HTTP/2 Error Codes | |||
| QUIC has the same concepts of "stream" and "connection" errors that | QUIC has the same concepts of "stream" and "connection" errors that | |||
| HTTP/2 provides. However, there is no direct portability of HTTP/2 | HTTP/2 provides. However, the differences between HTTP/2 and HTTP/3 | |||
| error codes to HTTP/3 error codes; the values are shifted in order to | mean that error codes are not directly portable between versions. | |||
| prevent accidental or implicit conversion. | ||||
| The HTTP/2 error codes defined in Section 7 of [HTTP2] logically map | The HTTP/2 error codes defined in Section 7 of [HTTP2] logically map | |||
| to the HTTP/3 error codes as follows: | to the HTTP/3 error codes as follows: | |||
| NO_ERROR (0x0): H3_NO_ERROR in Section 8.1. | NO_ERROR (0x0): H3_NO_ERROR in Section 8.1. | |||
| PROTOCOL_ERROR (0x1): This is mapped to H3_GENERAL_PROTOCOL_ERROR | PROTOCOL_ERROR (0x1): This is mapped to H3_GENERAL_PROTOCOL_ERROR | |||
| except in cases where more specific error codes have been defined. | except in cases where more specific error codes have been defined. | |||
| This includes H3_FRAME_UNEXPECTED and H3_CLOSED_CRITICAL_STREAM | This includes H3_FRAME_UNEXPECTED and H3_CLOSED_CRITICAL_STREAM | |||
| defined in Section 8.1. | defined in Section 8.1. | |||
| skipping to change at page 53, line 35 ¶ | skipping to change at page 61, line 17 ¶ | |||
| ENHANCE_YOUR_CALM (0xb): H3_EXCESSIVE_LOAD in Section 8.1. | ENHANCE_YOUR_CALM (0xb): H3_EXCESSIVE_LOAD in Section 8.1. | |||
| INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to | INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to | |||
| provide sufficient security on all connections. | provide sufficient security on all connections. | |||
| H3_1_1_REQUIRED (0xd): H3_VERSION_FALLBACK in Section 8.1. | H3_1_1_REQUIRED (0xd): H3_VERSION_FALLBACK in Section 8.1. | |||
| Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | |||
| Section 11.2.3. | Section 11.2.3. | |||
| A.4.1. Mapping Between HTTP/2 and HTTP/3 Errors | ||||
| An intermediary that converts between HTTP/2 and HTTP/3 may encounter | ||||
| error conditions from either upstream. It is useful to communicate | ||||
| the occurrence of error to the downstream but error codes largely | ||||
| reflect connection-local problems that generally do not make sense to | ||||
| propagate. | ||||
| An intermediary that encounters an error from an upstream origin can | ||||
| indicate this by sending an HTTP status code such as 502, which is | ||||
| suitable for a broad class of errors. | ||||
| There are some rare cases where it is beneficial to propagate the | ||||
| error by mapping it to the closest matching error type to the | ||||
| receiver. For example, an intermediary that receives an HTTP/2 | ||||
| stream error of type REFUSED_STREAM from the origin has a clear | ||||
| signal that the request was not processed and that the request is | ||||
| safe to retry. Propagating this error condition to the client as an | ||||
| HTTP/3 stream error of type H3_REQUEST_REJECTED allows the client to | ||||
| take the action it deems most appropriate. In the reverse direction | ||||
| the intermediary might deem it beneficial to pass on client request | ||||
| cancellations that are indicated by terminating a stream with | ||||
| H3_REQUEST_CANCELLED. | ||||
| Conversion between errors is described in the logical mapping. The | ||||
| error codes are defined in non-overlapping spaces in order to protect | ||||
| against accidental conversion that could result in the use of | ||||
| inappropriate or unknown error codes for the target version. An | ||||
| intermediary is permitted to promote stream errors to connection | ||||
| errors but they should be aware of the cost to the connection for | ||||
| what might be a temporary or intermittent error. | ||||
| Appendix B. Change Log | Appendix B. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| B.1. Since draft-ietf-quic-http-26 | B.1. Since draft-ietf-quic-http-27 | |||
| * Updated text to refer to latest HTTP revisions | ||||
| * Use the HTTP definition of authority for establishing and | ||||
| coalescing connections (#253, #2223, #3558) | ||||
| * Define use of GOAWAY from both endpoints (#2632, #3129) | ||||
| * Require either :authority or Host if the URI scheme has a | ||||
| mandatory authority component (#3408, #3475) | ||||
| B.2. Since draft-ietf-quic-http-26 | ||||
| * No changes | * No changes | |||
| B.2. Since draft-ietf-quic-http-25 | B.3. Since draft-ietf-quic-http-25 | |||
| * Require QUICv1 for HTTP/3 (#3117, #3323) | * Require QUICv1 for HTTP/3 (#3117, #3323) | |||
| * Remove DUPLICATE_PUSH and allow duplicate PUSH_PROMISE (#3275, | * Remove DUPLICATE_PUSH and allow duplicate PUSH_PROMISE (#3275, | |||
| #3309) | #3309) | |||
| * Clarify the definition of "malformed" (#3352, #3345) | * Clarify the definition of "malformed" (#3352, #3345) | |||
| B.3. Since draft-ietf-quic-http-24 | B.4. Since draft-ietf-quic-http-24 | |||
| * Removed H3_EARLY_RESPONSE error code; H3_NO_ERROR is recommended | * Removed H3_EARLY_RESPONSE error code; H3_NO_ERROR is recommended | |||
| instead (#3130,#3208) | instead (#3130,#3208) | |||
| * Unknown error codes are equivalent to H3_NO_ERROR (#3276,#3331) | * Unknown error codes are equivalent to H3_NO_ERROR (#3276,#3331) | |||
| * Some error codes are reserved for greasing (#3325,#3360) | * Some error codes are reserved for greasing (#3325,#3360) | |||
| B.4. Since draft-ietf-quic-http-23 | B.5. Since draft-ietf-quic-http-23 | |||
| * Removed "quic" Alt-Svc parameter (#3061,#3118) | * Removed "quic" Alt-Svc parameter (#3061,#3118) | |||
| * Clients need not persist unknown settings for use in 0-RTT | * Clients need not persist unknown settings for use in 0-RTT | |||
| (#3110,#3113) | (#3110,#3113) | |||
| * Clarify error cases around CANCEL_PUSH (#2819,#3083) | * Clarify error cases around CANCEL_PUSH (#2819,#3083) | |||
| B.5. Since draft-ietf-quic-http-22 | B.6. Since draft-ietf-quic-http-22 | |||
| * Removed priority signaling (#2922,#2924) | * Removed priority signaling (#2922,#2924) | |||
| * Further changes to error codes (#2662,#2551): | * Further changes to error codes (#2662,#2551): | |||
| - Error codes renumbered | - Error codes renumbered | |||
| - HTTP_MALFORMED_FRAME replaced by HTTP_FRAME_ERROR, | - HTTP_MALFORMED_FRAME replaced by HTTP_FRAME_ERROR, | |||
| HTTP_ID_ERROR, and others | HTTP_ID_ERROR, and others | |||
| skipping to change at page 55, line 17 ¶ | skipping to change at page 63, line 41 ¶ | |||
| * Clarify that Upgrade and the 101 status code are prohibited | * Clarify that Upgrade and the 101 status code are prohibited | |||
| (#2898,#2889) | (#2898,#2889) | |||
| * Clarify that frame types reserved for greasing can occur on any | * Clarify that frame types reserved for greasing can occur on any | |||
| stream, but frame types reserved due to HTTP/2 correspondence are | stream, but frame types reserved due to HTTP/2 correspondence are | |||
| prohibited (#2997,#2692,#2693) | prohibited (#2997,#2692,#2693) | |||
| * Unknown error codes cannot be treated as errors (#2998,#2816) | * Unknown error codes cannot be treated as errors (#2998,#2816) | |||
| B.6. Since draft-ietf-quic-http-21 | B.7. Since draft-ietf-quic-http-21 | |||
| No changes | No changes | |||
| B.7. Since draft-ietf-quic-http-20 | B.8. Since draft-ietf-quic-http-20 | |||
| * Prohibit closing the control stream (#2509, #2666) | * Prohibit closing the control stream (#2509, #2666) | |||
| * Change default priority to use an orphan node (#2502, #2690) | * Change default priority to use an orphan node (#2502, #2690) | |||
| * Exclusive priorities are restored (#2754, #2781) | * Exclusive priorities are restored (#2754, #2781) | |||
| * Restrict use of frames when using CONNECT (#2229, #2702) | * Restrict use of frames when using CONNECT (#2229, #2702) | |||
| * Close and maybe reset streams if a connection error occurs for | * Close and maybe reset streams if a connection error occurs for | |||
| CONNECT (#2228, #2703) | CONNECT (#2228, #2703) | |||
| * Encourage provision of sufficient unidirectional streams for QPACK | * Encourage provision of sufficient unidirectional streams for QPACK | |||
| (#2100, #2529, #2762) | (#2100, #2529, #2762) | |||
| * Allow extensions to use server-initiated bidirectional streams | * Allow extensions to use server-initiated bidirectional streams | |||
| (#2711, #2773) | (#2711, #2773) | |||
| skipping to change at page 56, line 4 ¶ | skipping to change at page 64, line 28 ¶ | |||
| - Require connection errors for more error conditions (#2511, | - Require connection errors for more error conditions (#2511, | |||
| #2510) | #2510) | |||
| - Updated the error codes for illegal GOAWAY frames (#2714, | - Updated the error codes for illegal GOAWAY frames (#2714, | |||
| #2707) | #2707) | |||
| - Specified error code for HEADERS on control stream (#2708) | - Specified error code for HEADERS on control stream (#2708) | |||
| - Specified error code for servers receiving PUSH_PROMISE (#2709) | - Specified error code for servers receiving PUSH_PROMISE (#2709) | |||
| - Specified error code for receiving DATA before HEADERS (#2715) | - Specified error code for receiving DATA before HEADERS (#2715) | |||
| - Describe malformed messages and their handling (#2410, #2764) | - Describe malformed messages and their handling (#2410, #2764) | |||
| - Remove HTTP_PUSH_ALREADY_IN_CACHE error (#2812, #2813) | - Remove HTTP_PUSH_ALREADY_IN_CACHE error (#2812, #2813) | |||
| - Refactor Push ID related errors (#2818, #2820) | - Refactor Push ID related errors (#2818, #2820) | |||
| - Rationalize HTTP/3 stream creation errors (#2821, #2822) | - Rationalize HTTP/3 stream creation errors (#2821, #2822) | |||
| B.8. Since draft-ietf-quic-http-19 | B.9. Since draft-ietf-quic-http-19 | |||
| * SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | * SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | |||
| * Non-zero bits in the Empty field of the PRIORITY frame MAY be | * Non-zero bits in the Empty field of the PRIORITY frame MAY be | |||
| treated as an error (#2501) | treated as an error (#2501) | |||
| B.9. Since draft-ietf-quic-http-18 | B.10. Since draft-ietf-quic-http-18 | |||
| * Resetting streams following a GOAWAY is recommended, but not | * Resetting streams following a GOAWAY is recommended, but not | |||
| required (#2256,#2457) | required (#2256,#2457) | |||
| * Use variable-length integers throughout (#2437,#2233,#2253,#2275) | * Use variable-length integers throughout (#2437,#2233,#2253,#2275) | |||
| - Variable-length frame types, stream types, and settings | - Variable-length frame types, stream types, and settings | |||
| identifiers | identifiers | |||
| - Renumbered stream type assignments | - Renumbered stream type assignments | |||
| - Modified associated reserved values | - Modified associated reserved values | |||
| * Frame layout switched from Length-Type-Value to Type-Length-Value | * Frame layout switched from Length-Type-Value to Type-Length-Value | |||
| (#2395,#2235) | (#2395,#2235) | |||
| * Specified error code for servers receiving DUPLICATE_PUSH (#2497) | * Specified error code for servers receiving DUPLICATE_PUSH (#2497) | |||
| * Use connection error for invalid PRIORITY (#2507, #2508) | * Use connection error for invalid PRIORITY (#2507, #2508) | |||
| B.10. Since draft-ietf-quic-http-17 | B.11. Since draft-ietf-quic-http-17 | |||
| * HTTP_REQUEST_REJECTED is used to indicate a request can be retried | * HTTP_REQUEST_REJECTED is used to indicate a request can be retried | |||
| (#2106, #2325) | (#2106, #2325) | |||
| * Changed error code for GOAWAY on the wrong stream (#2231, #2343) | * Changed error code for GOAWAY on the wrong stream (#2231, #2343) | |||
| B.11. Since draft-ietf-quic-http-16 | B.12. Since draft-ietf-quic-http-16 | |||
| * Rename "HTTP/QUIC" to "HTTP/3" (#1973) | * Rename "HTTP/QUIC" to "HTTP/3" (#1973) | |||
| * Changes to PRIORITY frame (#1865, #2075) | * Changes to PRIORITY frame (#1865, #2075) | |||
| - Permitted as first frame of request streams | - Permitted as first frame of request streams | |||
| - Remove exclusive reprioritization | - Remove exclusive reprioritization | |||
| - Changes to Prioritized Element Type bits | - Changes to Prioritized Element Type bits | |||
| skipping to change at page 57, line 31 ¶ | skipping to change at page 66, line 5 ¶ | |||
| (#1809, #1846, #2038) | (#1809, #1846, #2038) | |||
| * Clarify message processing rules for streams that aren't closed | * Clarify message processing rules for streams that aren't closed | |||
| (#1972, #2003) | (#1972, #2003) | |||
| * Removed reservation of error code 0 and moved HTTP_NO_ERROR to | * Removed reservation of error code 0 and moved HTTP_NO_ERROR to | |||
| this value (#1922) | this value (#1922) | |||
| * Removed prohibition of zero-length DATA frames (#2098) | * Removed prohibition of zero-length DATA frames (#2098) | |||
| B.12. Since draft-ietf-quic-http-15 | B.13. Since draft-ietf-quic-http-15 | |||
| Substantial editorial reorganization; no technical changes. | Substantial editorial reorganization; no technical changes. | |||
| B.13. Since draft-ietf-quic-http-14 | B.14. Since draft-ietf-quic-http-14 | |||
| * Recommend sensible values for QUIC transport parameters | * Recommend sensible values for QUIC transport parameters | |||
| (#1720,#1806) | (#1720,#1806) | |||
| * Define error for missing SETTINGS frame (#1697,#1808) | * Define error for missing SETTINGS frame (#1697,#1808) | |||
| * Setting values are variable-length integers (#1556,#1807) and do | * Setting values are variable-length integers (#1556,#1807) and do | |||
| not have separate maximum values (#1820) | not have separate maximum values (#1820) | |||
| * Expanded discussion of connection closure (#1599,#1717,#1712) | * Expanded discussion of connection closure (#1599,#1717,#1712) | |||
| * HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | * HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | |||
| B.14. Since draft-ietf-quic-http-13 | B.15. Since draft-ietf-quic-http-13 | |||
| * Reserved some frame types for grease (#1333, #1446) | * Reserved some frame types for grease (#1333, #1446) | |||
| * Unknown unidirectional stream types are tolerated, not errors; | * Unknown unidirectional stream types are tolerated, not errors; | |||
| some reserved for grease (#1490, #1525) | some reserved for grease (#1490, #1525) | |||
| * Require settings to be remembered for 0-RTT, prohibit reductions | * Require settings to be remembered for 0-RTT, prohibit reductions | |||
| (#1541, #1641) | (#1541, #1641) | |||
| * Specify behavior for truncated requests (#1596, #1643) | * Specify behavior for truncated requests (#1596, #1643) | |||
| B.15. Since draft-ietf-quic-http-12 | B.16. Since draft-ietf-quic-http-12 | |||
| * TLS SNI extension isn't mandatory if an alternative method is used | * TLS SNI extension isn't mandatory if an alternative method is used | |||
| (#1459, #1462, #1466) | (#1459, #1462, #1466) | |||
| * Removed flags from HTTP/3 frames (#1388, #1398) | * Removed flags from HTTP/3 frames (#1388, #1398) | |||
| * Reserved frame types and settings for use in preserving | * Reserved frame types and settings for use in preserving | |||
| extensibility (#1333, #1446) | extensibility (#1333, #1446) | |||
| * Added general error code (#1391, #1397) | * Added general error code (#1391, #1397) | |||
| * Unidirectional streams carry a type byte and are extensible | * Unidirectional streams carry a type byte and are extensible | |||
| (#910,#1359) | (#910,#1359) | |||
| * Priority mechanism now uses explicit placeholders to enable | * Priority mechanism now uses explicit placeholders to enable | |||
| persistent structure in the tree (#441,#1421,#1422) | persistent structure in the tree (#441,#1421,#1422) | |||
| B.16. Since draft-ietf-quic-http-11 | B.17. Since draft-ietf-quic-http-11 | |||
| * Moved QPACK table updates and acknowledgments to dedicated streams | * Moved QPACK table updates and acknowledgments to dedicated streams | |||
| (#1121, #1122, #1238) | (#1121, #1122, #1238) | |||
| B.17. Since draft-ietf-quic-http-10 | B.18. Since draft-ietf-quic-http-10 | |||
| * Settings need to be remembered when attempting and accepting 0-RTT | * Settings need to be remembered when attempting and accepting 0-RTT | |||
| (#1157, #1207) | (#1157, #1207) | |||
| B.18. Since draft-ietf-quic-http-09 | B.19. Since draft-ietf-quic-http-09 | |||
| * Selected QCRAM for header compression (#228, #1117) | * Selected QCRAM for header compression (#228, #1117) | |||
| * The server_name TLS extension is now mandatory (#296, #495) | * The server_name TLS extension is now mandatory (#296, #495) | |||
| * Specified handling of unsupported versions in Alt-Svc (#1093, | * Specified handling of unsupported versions in Alt-Svc (#1093, | |||
| #1097) | #1097) | |||
| B.19. Since draft-ietf-quic-http-08 | B.20. Since draft-ietf-quic-http-08 | |||
| * Clarified connection coalescing rules (#940, #1024) | * Clarified connection coalescing rules (#940, #1024) | |||
| B.20. Since draft-ietf-quic-http-07 | B.21. Since draft-ietf-quic-http-07 | |||
| * Changes for integer encodings in QUIC (#595,#905) | * Changes for integer encodings in QUIC (#595,#905) | |||
| * Use unidirectional streams as appropriate (#515, #240, #281, #886) | * Use unidirectional streams as appropriate (#515, #240, #281, #886) | |||
| * Improvement to the description of GOAWAY (#604, #898) | * Improvement to the description of GOAWAY (#604, #898) | |||
| * Improve description of server push usage (#947, #950, #957) | * Improve description of server push usage (#947, #950, #957) | |||
| B.21. Since draft-ietf-quic-http-06 | B.22. Since draft-ietf-quic-http-06 | |||
| * Track changes in QUIC error code usage (#485) | * Track changes in QUIC error code usage (#485) | |||
| B.22. Since draft-ietf-quic-http-05 | B.23. Since draft-ietf-quic-http-05 | |||
| * Made push ID sequential, add MAX_PUSH_ID, remove | * Made push ID sequential, add MAX_PUSH_ID, remove | |||
| SETTINGS_ENABLE_PUSH (#709) | SETTINGS_ENABLE_PUSH (#709) | |||
| * Guidance about keep-alive and QUIC PINGs (#729) | * Guidance about keep-alive and QUIC PINGs (#729) | |||
| * Expanded text on GOAWAY and cancellation (#757) | * Expanded text on GOAWAY and cancellation (#757) | |||
| B.23. Since draft-ietf-quic-http-04 | B.24. Since draft-ietf-quic-http-04 | |||
| * Cite RFC 5234 (#404) | * Cite RFC 5234 (#404) | |||
| * Return to a single stream per request (#245,#557) | * Return to a single stream per request (#245,#557) | |||
| * Use separate frame type and settings registries from HTTP/2 (#81) | * Use separate frame type and settings registries from HTTP/2 (#81) | |||
| * SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | * SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| * Restored GOAWAY (#696) | * Restored GOAWAY (#696) | |||
| * Identify server push using Push ID rather than a stream ID | * Identify server push using Push ID rather than a stream ID | |||
| (#702,#281) | (#702,#281) | |||
| * DATA frames cannot be empty (#700) | * DATA frames cannot be empty (#700) | |||
| B.24. Since draft-ietf-quic-http-03 | B.25. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.25. Since draft-ietf-quic-http-02 | B.26. Since draft-ietf-quic-http-02 | |||
| * Track changes in transport draft | * Track changes in transport draft | |||
| B.26. Since draft-ietf-quic-http-01 | B.27. Since draft-ietf-quic-http-01 | |||
| * SETTINGS changes (#181): | * SETTINGS changes (#181): | |||
| - SETTINGS can be sent only once at the start of a connection; no | - SETTINGS can be sent only once at the start of a connection; no | |||
| changes thereafter | changes thereafter | |||
| - SETTINGS_ACK removed | - SETTINGS_ACK removed | |||
| - Settings can only occur in the SETTINGS frame a single time | - Settings can only occur in the SETTINGS frame a single time | |||
| skipping to change at page 60, line 35 ¶ | skipping to change at page 69, line 5 ¶ | |||
| * Closing the connection control stream or any message control | * Closing the connection control stream or any message control | |||
| stream is a fatal error (#176) | stream is a fatal error (#176) | |||
| * HPACK Sequence counter can wrap (#173) | * HPACK Sequence counter can wrap (#173) | |||
| * 0-RTT guidance added | * 0-RTT guidance added | |||
| * Guide to differences from HTTP/2 and porting HTTP/2 extensions | * Guide to differences from HTTP/2 and porting HTTP/2 extensions | |||
| added (#127,#242) | added (#127,#242) | |||
| B.27. Since draft-ietf-quic-http-00 | B.28. Since draft-ietf-quic-http-00 | |||
| * Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | * Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | |||
| * Changed from using HTTP/2 framing within Stream 3 to new framing | * Changed from using HTTP/2 framing within Stream 3 to new framing | |||
| format and two-stream-per-request model (#71,#72,#73) | format and two-stream-per-request model (#71,#72,#73) | |||
| * Adopted SETTINGS format from draft-bishop-httpbis-extended- | * Adopted SETTINGS format from draft-bishop-httpbis-extended- | |||
| settings-01 | settings-01 | |||
| * Reworked SETTINGS_ACK to account for indeterminate inter-stream | * Reworked SETTINGS_ACK to account for indeterminate inter-stream | |||
| order (#75) | order (#75) | |||
| * Described CONNECT pseudo-method (#95) | * Described CONNECT pseudo-method (#95) | |||
| * Updated ALPN token and Alt-Svc guidance (#13,#87) | * Updated ALPN token and Alt-Svc guidance (#13,#87) | |||
| * Application-layer-defined error codes (#19,#74) | * Application-layer-defined error codes (#19,#74) | |||
| B.28. Since draft-shade-quic-http2-mapping-00 | B.29. Since draft-shade-quic-http2-mapping-00 | |||
| * Adopted as base for draft-ietf-quic-http | * Adopted as base for draft-ietf-quic-http | |||
| * Updated authors/editors list | * Updated authors/editors list | |||
| Acknowledgements | Acknowledgements | |||
| The original authors of this specification were Robbie Shade and Mike | The original authors of this specification were Robbie Shade and Mike | |||
| Warres. | Warres. | |||
| A substantial portion of Mike's contribution was supported by | The IETF QUIC Working Group received an enormous amount of support | |||
| Microsoft during his employment there. | from many people. Among others, the following people provided | |||
| substantial contributions to this document: | ||||
| * Bence Beky | ||||
| * Daan De Meyer | ||||
| * Martin Duke | ||||
| * Roy Fielding | ||||
| * Alan Frindell | ||||
| * Alessandro Ghedini | ||||
| * Nick Harper | ||||
| * Ryan Hamilton | ||||
| * Christian Huitema | ||||
| * Subodh Iyengar | ||||
| * Robin Marx | ||||
| * Patrick McManus | ||||
| * Luca Nicco | ||||
| * 奥 一穂 (Kazuho Oku) | ||||
| * Lucas Pardue | ||||
| * Roberto Peon | ||||
| * Julian Reschke | ||||
| * Eric Rescorla | ||||
| * Martin Seemann | ||||
| * Ben Schwartz | ||||
| * Ian Swett | ||||
| * Willy Taureau | ||||
| * Martin Thomson | ||||
| * Dmitri Tikhonov | ||||
| * Tatsuhiro Tsujikawa | ||||
| A portion of Mike's contribution was supported by Microsoft during | ||||
| his employment there. | ||||
| Author's Address | Author's Address | |||
| Mike Bishop (editor) | Mike Bishop (editor) | |||
| Akamai | Akamai | |||
| Email: mbishop@evequefou.be | Email: mbishop@evequefou.be | |||
| End of changes. 191 change blocks. | ||||
| 579 lines changed or deleted | 1016 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||