| draft-ietf-quic-http-24.txt | draft-ietf-quic-http-25.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track November 04, 2019 | Intended status: Standards Track 22 January 2020 | |||
| Expires: May 7, 2020 | Expires: 25 July 2020 | |||
| Hypertext Transfer Protocol Version 3 (HTTP/3) | Hypertext Transfer Protocol Version 3 (HTTP/3) | |||
| draft-ietf-quic-http-24 | draft-ietf-quic-http-25 | |||
| 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), which is archived at | |||
| https://mailarchive.ietf.org/arch/search/?email_list=quic [1]. | https://mailarchive.ietf.org/arch/search/?email_list=quic | |||
| (https://mailarchive.ietf.org/arch/search/?email_list=quic). | ||||
| Working Group information can be found at https://github.com/quicwg | Working Group information can be found at https://github.com/quicwg | |||
| [2]; source code and issues list for this draft can be found at | (https://github.com/quicwg); source code and issues list for this | |||
| https://github.com/quicwg/base-drafts/labels/-http [3]. | draft can be found at https://github.com/quicwg/base-drafts/labels/- | |||
| 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 May 7, 2020. | This Internet-Draft will expire on 25 July 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2019 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 | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | license-info) in effect on the date of publication of this document. | |||
| publication of this document. Please review these documents | Please review these documents carefully, as they describe your rights | |||
| carefully, as they describe your rights and restrictions with respect | and restrictions with respect to this document. Code Components | |||
| to this document. Code Components extracted from this document must | extracted from this document must include Simplified BSD License text | |||
| include Simplified BSD License text as described in Section 4.e of | as described in Section 4.e of the Trust Legal Provisions and are | |||
| the Trust Legal Provisions and are provided without warranty as | provided without warranty as described in the Simplified BSD License. | |||
| described in the Simplified BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4 | 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4 | |||
| 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 5 | 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 5 | |||
| 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 5 | 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 5 | |||
| 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | |||
| 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . 8 | 3.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 8 | |||
| 3.3. Connection Establishment . . . . . . . . . . . . . . . . 9 | 3.3. Connection Establishment . . . . . . . . . . . . . . . . 9 | |||
| 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 9 | 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 10 | 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 10 | |||
| 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 10 | 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 10 | |||
| 4.1.1. Header Formatting and Compression . . . . . . . . . . 12 | 4.1.1. Header Formatting and Compression . . . . . . . . . . 12 | |||
| 4.1.2. Request Cancellation and Rejection . . . . . . . . . 13 | 4.1.2. Request Cancellation and Rejection . . . . . . . . . 13 | |||
| 4.1.3. Malformed Requests and Responses . . . . . . . . . . 13 | 4.1.3. Malformed Requests and Responses . . . . . . . . . . 14 | |||
| 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 14 | 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 15 | 4.3. HTTP Upgrade . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 15 | 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 17 | 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 17 | 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 17 | 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.3. Immediate Application Closure . . . . . . . . . . . . . . 19 | 5.3. Immediate Application Closure . . . . . . . . . . . . . . 19 | |||
| 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 19 | 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 19 | |||
| 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 19 | 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 19 | |||
| 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 20 | 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 20 | |||
| 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 20 | 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 20 | |||
| 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 21 | 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 22 | |||
| 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 22 | 6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 22 | |||
| 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 23 | 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 23 | |||
| 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 23 | 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 24 | 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 25 | 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 25 | 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 26 | 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 26 | 7.2.3. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 27 | 7.2.4. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 30 | 7.2.5. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 31 | 7.2.6. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 32 | 7.2.7. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 7.2.8. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 32 | 7.2.8. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 32 | |||
| 7.2.9. Reserved Frame Types . . . . . . . . . . . . . . . . 33 | 7.2.9. Reserved Frame Types . . . . . . . . . . . . . . . . 33 | |||
| 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 34 | 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 34 | 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 34 | |||
| 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 35 | 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 35 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 36 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 36 | |||
| 10.1. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 36 | 10.1. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 37 | |||
| 10.2. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 37 | 10.2. Frame Parsing . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 10.3. Early Data . . . . . . . . . . . . . . . . . . . . . . . 37 | 10.3. Early Data . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 10.4. Migration . . . . . . . . . . . . . . . . . . . . . . . 37 | 10.4. Migration . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 11.1. Registration of HTTP/3 Identification String . . . . . . 37 | 11.1. Registration of HTTP/3 Identification String . . . . . . 37 | |||
| 11.2. Frame Types . . . . . . . . . . . . . . . . . . . . . . 37 | 11.2. New Registries . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 11.3. Settings Parameters . . . . . . . . . . . . . . . . . . 39 | 11.2.1. Frame Types . . . . . . . . . . . . . . . . . . . . 38 | |||
| 11.4. Error Codes . . . . . . . . . . . . . . . . . . . . . . 40 | 11.2.2. Settings Parameters . . . . . . . . . . . . . . . . 39 | |||
| 11.5. Stream Types . . . . . . . . . . . . . . . . . . . . . . 42 | 11.2.3. Error Codes . . . . . . . . . . . . . . . . . . . . 40 | |||
| 11.2.4. Stream Types . . . . . . . . . . . . . . . . . . . . 43 | ||||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . 43 | 12.1. Normative References . . . . . . . . . . . . . . . . . . 43 | |||
| 12.2. Informative References . . . . . . . . . . . . . . . . . 45 | 12.2. Informative References . . . . . . . . . . . . . . . . . 45 | |||
| 12.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 45 | Appendix A. Considerations for Transitioning from HTTP/2 . . . . 46 | |||
| Appendix A. Considerations for Transitioning from HTTP/2 . . . . 45 | ||||
| A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 46 | A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 46 | A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 47 | |||
| A.2.1. Prioritization Differences . . . . . . . . . . . . . 47 | A.2.1. Prioritization Differences . . . . . . . . . . . . . 47 | |||
| A.2.2. Header Compression Differences . . . . . . . . . . . 47 | A.2.2. Header Compression Differences . . . . . . . . . . . 47 | |||
| A.2.3. Guidance for New Frame Type Definitions . . . . . . . 48 | A.2.3. Guidance for New Frame Type Definitions . . . . . . . 48 | |||
| A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 48 | A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 48 | |||
| A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 49 | A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 49 | |||
| A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 50 | A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 50 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 51 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 51 | |||
| B.1. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 51 | B.1. Since draft-ietf-quic-http-24 . . . . . . . . . . . . . . 51 | |||
| B.2. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 51 | B.2. Since draft-ietf-quic-http-23 . . . . . . . . . . . . . . 51 | |||
| B.3. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 52 | B.3. Since draft-ietf-quic-http-22 . . . . . . . . . . . . . . 52 | |||
| B.4. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 52 | B.4. Since draft-ietf-quic-http-21 . . . . . . . . . . . . . . 53 | |||
| B.5. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 53 | B.5. Since draft-ietf-quic-http-20 . . . . . . . . . . . . . . 53 | |||
| B.6. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 53 | B.6. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 54 | |||
| B.7. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 54 | B.7. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 54 | |||
| B.8. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 54 | B.8. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 54 | |||
| B.9. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 54 | B.9. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 54 | |||
| B.10. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 55 | B.10. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 55 | |||
| B.11. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 55 | B.11. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 55 | |||
| B.12. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 55 | B.12. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 55 | |||
| B.13. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 56 | B.13. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 55 | |||
| B.14. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 56 | B.14. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 56 | |||
| B.15. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 56 | B.15. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 56 | |||
| B.16. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 56 | B.16. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 56 | |||
| B.17. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 56 | B.17. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 56 | |||
| B.18. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 56 | B.18. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 56 | |||
| B.19. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 56 | B.19. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 56 | |||
| B.20. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 57 | B.20. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 57 | |||
| B.21. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 57 | B.21. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 57 | |||
| B.22. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 57 | B.22. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 57 | |||
| B.23. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 57 | B.23. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 57 | |||
| B.24. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 58 | B.24. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 57 | |||
| B.25. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 58 | B.25. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 58 | |||
| B.26. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 58 | ||||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 58 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 58 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| 1. Introduction | 1. Introduction | |||
| HTTP semantics are used for a broad range of services on the | HTTP semantics are used for a broad range of services on the | |||
| Internet. These semantics have commonly been used with two different | Internet. These semantics have commonly been used with two different | |||
| TCP mappings, HTTP/1.1 and HTTP/2. HTTP/3 supports the same | TCP mappings, HTTP/1.1 and HTTP/2. HTTP/3 supports the same | |||
| semantics over a new transport protocol, QUIC. | semantics over a new transport protocol, QUIC. | |||
| skipping to change at page 5, line 43 ¶ | skipping to change at page 5, line 43 ¶ | |||
| endpoint can be discovered using HTTP Alternative Services; this | endpoint can be discovered using HTTP Alternative Services; this | |||
| process is described in greater detail 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 and response 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, | |||
| DUPLICATE_PUSH, MAX_PUSH_ID, and CANCEL_PUSH. | DUPLICATE_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 headers 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 header blocks (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 header table state, while | |||
| header blocks refer to the state of the table without modifying it. | header blocks refer to the state of the table without modifying it. | |||
| 2.1. Document Organization | 2.1. Document Organization | |||
| The HTTP/3 specification is split into seven parts. The document | The following sections provide a detailed overview of the connection | |||
| begins with a detailed overview of the connection lifecycle and key | lifecycle and key concepts: | |||
| concepts: | ||||
| o 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. | |||
| o HTTP Request Lifecycle (Section 4) describes how HTTP semantics | * HTTP Request Lifecycle (Section 4) describes how HTTP semantics | |||
| are expressed using frames. | are expressed using frames. | |||
| o Connection Closure (Section 5) describes how connections are | * Connection Closure (Section 5) describes how connections are | |||
| terminated, either gracefully or abruptly. | terminated, either gracefully or abruptly. | |||
| The details of the wire protocol and interactions with the transport | The details of the wire protocol and interactions with the transport | |||
| are described in subsequent sections: | are described in subsequent sections: | |||
| o Stream Mapping and Usage (Section 6) describes the way QUIC | * Stream Mapping and Usage (Section 6) describes the way QUIC | |||
| streams are used. | streams are used. | |||
| o HTTP Framing Layer (Section 7) describes the frames used on most | * HTTP Framing Layer (Section 7) describes the frames used on most | |||
| streams. | streams. | |||
| o Error Handling (Section 8) describes how error conditions are | * Error Handling (Section 8) describes how error conditions are | |||
| handled and expressed, either on a particular stream or for the | handled and expressed, either on a particular stream or for the | |||
| connection as a whole. | connection as a whole. | |||
| Additional resources are provided in the final sections: | Additional resources are provided in the final sections: | |||
| o 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. | |||
| o 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 BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| skipping to change at page 10, line 32 ¶ | skipping to change at page 10, line 38 ¶ | |||
| 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 non-final 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. | |||
| An HTTP message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
| 1. the message header (see [RFC7230], Section 3.2), sent as a single | 1. the message header (see Section 3.2 of [RFC7230]), sent as a | |||
| HEADERS frame (see Section 7.2.2), | single HEADERS frame (see Section 7.2.2), | |||
| 2. optionally, the payload body, if present (see [RFC7230], | 2. optionally, the payload body, if present (see Section 3.3 of | |||
| Section 3.3), sent as a series of DATA frames (see | [RFC7230]), sent as a series of DATA frames (see Section 7.2.1), | |||
| Section 7.2.1), | ||||
| 3. optionally, trailing headers, if present (see [RFC7230], | 3. optionally, trailing headers, if present (see Section 4.1.2 of | |||
| Section 4.1.2), sent as a single HEADERS frame. | [RFC7230]), sent as a single HEADERS frame. | |||
| A server MAY send one or more PUSH_PROMISE frames (see Section 7.2.5) | A server MAY send one or more PUSH_PROMISE (see Section 7.2.5) or | |||
| before, after, or interleaved with the frames of a response message. | DUPLICATE_PUSH (see Section 7.2.8) frames before, after, or | |||
| These PUSH_PROMISE frames are not part of the response; see | interleaved with the frames of a response message. These | |||
| Section 4.4 for more details. | PUSH_PROMISE and DUPLICATE_PUSH frames are not part of the response; | |||
| see Section 4.4 for more details. | ||||
| Frames of unknown types (Section 9), including reserved frames | Frames of unknown types (Section 9), including reserved frames | |||
| (Section 7.2.9) MAY be sent on a request or push stream before, | (Section 7.2.9) 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 4.1 of [RFC7230] | |||
| MUST NOT be used. | MUST NOT be used. | |||
| A response MAY consist of multiple messages when and only when one or | A response MAY consist of multiple messages when and only when one or | |||
| more informational responses (1xx; see [RFC7231], Section 6.2) | more informational responses (1xx; see Section 6.2 of [RFC7231]) | |||
| precede a final response to the same request. Non-final responses do | precede a final response to the same request. Non-final responses do | |||
| not contain a payload body or trailers. | not contain a payload body or trailers. | |||
| If an endpoint receives an invalid sequence of frames on either a | If an endpoint receives an invalid sequence of frames on either a | |||
| request or a push stream, it MUST respond with a connection error of | request or a push stream, it MUST respond with a connection error of | |||
| type H3_FRAME_UNEXPECTED (Section 8). In particular, a DATA frame | type H3_FRAME_UNEXPECTED (Section 8). In particular, a DATA frame | |||
| before any HEADERS frame, or a HEADERS or DATA frame after the | before any HEADERS frame, or a HEADERS or DATA frame after the | |||
| trailing HEADERS frame is considered invalid. | trailing HEADERS frame is considered invalid. | |||
| An HTTP request/response exchange fully consumes a bidirectional QUIC | An HTTP request/response exchange fully consumes a bidirectional QUIC | |||
| skipping to change at page 11, line 40 ¶ | skipping to change at page 11, line 47 ¶ | |||
| Because some messages are large or unbounded, endpoints SHOULD begin | Because some messages are large or unbounded, endpoints SHOULD begin | |||
| processing partial HTTP messages once enough of the message has been | processing partial HTTP messages once enough of the message has been | |||
| received to make progress. If a client stream terminates without | received to make progress. If a client stream terminates without | |||
| enough of the HTTP message to provide a complete response, the server | enough of the HTTP message to provide a complete response, the server | |||
| SHOULD abort its response with the error code H3_REQUEST_INCOMPLETE. | SHOULD abort its response with the error code H3_REQUEST_INCOMPLETE. | |||
| A server can send a complete response prior to the client sending an | A server can send a complete response prior to the client sending an | |||
| entire request if the response does not depend on any portion of the | entire request if the response does not depend on any portion of the | |||
| request that has not been sent and received. When the server does | request that has not been sent and received. When the server does | |||
| not need to receive the remainder of the request, it MAY abort | not need to receive the remainder of the request, it MAY abort | |||
| reading the request stream with error code H3_EARLY_RESPONSE, send a | reading the request stream, send a complete response, and cleanly | |||
| complete response, and cleanly close the sending part of the stream. | close the sending part of the stream. The error code H3_NO_ERROR | |||
| Clients MUST NOT discard complete responses as a result of having | SHOULD be used when requesting that the client stop sending on the | |||
| their request terminated abruptly, though clients can always discard | request stream. Clients MUST NOT discard complete responses as a | |||
| responses at their discretion for other reasons. If the server sends | result of having their request terminated abruptly, though clients | |||
| a partial or complete response but does not abort reading, clients | can always discard responses at their discretion for other reasons. | |||
| SHOULD continue sending the body of the request and close the stream | ||||
| normally. | If the server sends a partial or complete response but does not abort | |||
| reading, clients SHOULD continue sending the body of the request and | ||||
| close the stream normally. | ||||
| 4.1.1. Header Formatting and Compression | 4.1.1. Header Formatting and Compression | |||
| HTTP message headers carry information as a series of key-value | HTTP message headers carry information as a series of key-value | |||
| pairs, called header fields. For a listing of registered HTTP header | pairs, called header fields. For a listing of registered HTTP header | |||
| fields, see the "Message Header Field" registry maintained at | fields, see the "Message Header Field" registry maintained at | |||
| https://www.iana.org/assignments/message-headers [4]. | https://www.iana.org/assignments/message-headers | |||
| (https://www.iana.org/assignments/message-headers). | ||||
| Just as in previous versions of HTTP, header field names are strings | Just as in previous versions of HTTP, header field names are strings | |||
| of ASCII characters that are compared in a case-insensitive fashion. | of ASCII characters that are compared in a case-insensitive fashion. | |||
| Properties of HTTP header field names and values are discussed in | Properties of HTTP header field names and values are discussed in | |||
| more detail in Section 3.2 of [RFC7230], though the wire rendering in | more detail in Section 3.2 of [RFC7230], though the wire rendering in | |||
| HTTP/3 differs. As in HTTP/2, header field names MUST be converted | HTTP/3 differs. As in HTTP/2, header field names MUST be converted | |||
| to lowercase prior to their encoding. A request or response | to lowercase prior to their encoding. A request or response | |||
| containing uppercase header field names MUST be treated as malformed | containing uppercase header field names MUST be treated as malformed | |||
| (Section 4.1.3). | (Section 4.1.3). | |||
| skipping to change at page 12, line 42 ¶ | skipping to change at page 12, line 47 ¶ | |||
| HTTP/3 uses QPACK header compression as described in [QPACK], a | HTTP/3 uses QPACK header compression as described in [QPACK], a | |||
| variation of HPACK which allows the flexibility to avoid header- | variation of HPACK which allows the flexibility to avoid header- | |||
| compression-induced head-of-line blocking. See that document for | compression-induced head-of-line blocking. See that document for | |||
| additional details. | additional details. | |||
| To allow for better compression efficiency, the cookie header field | To allow for better compression efficiency, the cookie header field | |||
| [RFC6265] MAY be split into separate header fields, each with one or | [RFC6265] MAY be split into separate header fields, each with one or | |||
| more cookie-pairs, before compression. If a decompressed header list | more cookie-pairs, before compression. If a decompressed header list | |||
| contains multiple cookie header fields, these MUST be concatenated | contains multiple cookie header fields, these MUST be concatenated | |||
| before being passed into a non-HTTP/2, non-HTTP/3 context, as | before being passed into a non-HTTP/2, non-HTTP/3 context, as | |||
| described in [HTTP2], Section 8.1.2.5. | described in Section 8.1.2.5 of [HTTP2]. | |||
| 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 field list 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 header field list is calculated based on the | |||
| uncompressed size of header fields, including the length of the name | uncompressed size of header fields, including the length of the name | |||
| and value in bytes plus an overhead of 32 bytes for each header | and value in bytes plus an overhead of 32 bytes for each header | |||
| field. | field. | |||
| skipping to change at page 14, line 30 ¶ | skipping to change at page 14, line 35 ¶ | |||
| 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 ([RFC7231], Section 4.3.6) is primarily | The pseudo-method CONNECT (Section 4.3.6 of [RFC7231]) is primarily | |||
| used with HTTP proxies to establish a TLS session with an origin | used with HTTP proxies to establish a TLS session with an origin | |||
| server for the purposes of interacting with "https" resources. In | server for the purposes of interacting with "https" resources. In | |||
| HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a | HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a | |||
| tunnel to a remote host. In HTTP/2, the CONNECT method is used to | tunnel to a remote host. In HTTP/2, the CONNECT method is used to | |||
| establish a tunnel over a single HTTP/2 stream to a remote host for | establish a tunnel over a single HTTP/2 stream to a remote host for | |||
| similar purposes. | similar purposes. | |||
| A CONNECT request in HTTP/3 functions in the same manner as in | A CONNECT request in HTTP/3 functions in the same manner as in | |||
| HTTP/2. The request MUST be formatted as described in [HTTP2], | HTTP/2. The request MUST be formatted as described in Section 8.3 of | |||
| Section 8.3. A CONNECT request that does not conform to these | [HTTP2]. A CONNECT request that does not conform to these | |||
| restrictions is malformed (see Section 4.1.3). The request stream | restrictions is malformed (see Section 4.1.3). The request stream | |||
| MUST NOT be closed at the end of the request. | MUST NOT be closed at the end of the request. | |||
| 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 [RFC7231], Section 4.3.6. | the client, as defined in Section 4.3.6 of [RFC7231]. | |||
| 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 15, line 35 ¶ | skipping to change at page 15, line 40 ¶ | |||
| 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 ([RFC7230], | HTTP/3 does not support the HTTP Upgrade mechanism (Section 6.7 of | |||
| Section 6.7) or 101 (Switching Protocols) informational status code | [RFC7230]) or 101 (Switching Protocols) informational status code | |||
| ([RFC7231], Section 6.2.2). | (Section 6.2.2 of [RFC7231]). | |||
| 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 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. HTTP/3 server | off network usage against a potential latency gain. HTTP/3 server | |||
| push is similar to what is described in HTTP/2 [HTTP2], but uses | push is similar to what is described in HTTP/2 [HTTP2], but uses | |||
| different mechanisms. | different mechanisms. | |||
| skipping to change at page 16, line 18 ¶ | skipping to change at page 16, line 22 ¶ | |||
| 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 of the request message is carried by a PUSH_PROMISE frame | |||
| (see Section 7.2.5) on the request stream which generated the push. | (see Section 7.2.5) on the request stream which generated the push. | |||
| This allows the server push to be associated with a client request. | ||||
| Promised requests MUST conform to the requirements in Section 8.2 of | Promised requests MUST conform to the requirements in Section 8.2 of | |||
| [HTTP2]. | [HTTP2]. | |||
| The same server push can be associated with additional client | Each pushed response is associated with one or more client requests. | |||
| requests using a DUPLICATE_PUSH frame (see Section 7.2.8). | The push is associated with the request stream on which the | |||
| PUSH_PROMISE frame was received. The same server push can be | ||||
| associated with additional client requests using a DUPLICATE_PUSH | ||||
| frame (see Section 7.2.8). These associations do not affect the | ||||
| operation of the protocol, but MAY be used by user agents when | ||||
| deciding how to use pushed resources. | ||||
| Ordering of a PUSH_PROMISE or DUPLICATE_PUSH in relation to certain | Ordering of a PUSH_PROMISE or DUPLICATE_PUSH in relation to certain | |||
| parts of the response is important. The server SHOULD send | parts of the response is important. The server SHOULD send | |||
| PUSH_PROMISE or DUPLICATE_PUSH frames prior to sending HEADERS or | PUSH_PROMISE or DUPLICATE_PUSH frames prior to sending HEADERS or | |||
| DATA frames that reference the promised responses. This reduces the | DATA frames that reference the promised responses. This reduces the | |||
| chance that a client requests a resource that will be pushed by the | chance that a client requests a resource that will be pushed by the | |||
| server. | 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 | |||
| skipping to change at page 18, line 39 ¶ | skipping to change at page 18, line 47 ¶ | |||
| 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. A server MAY send | |||
| multiple GOAWAY frames indicating different stream IDs, but MUST NOT | multiple GOAWAY frames indicating different stream IDs, but MUST NOT | |||
| increase the value they send in the last Stream ID, since clients | increase the value they send in the last Stream ID, since clients | |||
| might already have retried unprocessed requests on another | might already have retried unprocessed requests on another | |||
| connection. A server that is attempting to gracefully shut down a | connection. | |||
| connection SHOULD send an initial GOAWAY frame with the last Stream | ||||
| ID set to the maximum value allowed by QUIC's MAX_STREAMS and SHOULD | A server that is attempting to gracefully shut down a connection can | |||
| NOT increase the MAX_STREAMS limit thereafter. This signals to the | send an initial GOAWAY frame with the last Stream ID set to the | |||
| client that a shutdown is imminent and that initiating further | maximum possible value for a client-initiated, bidirectional stream | |||
| (i.e. 2^62-4 in case of QUIC version 1). This GOAWAY frame signals | ||||
| to the client that shutdown is imminent and that initiating further | ||||
| requests is prohibited. After allowing time for any in-flight | requests is prohibited. After allowing time for any in-flight | |||
| requests (at least one round-trip time), the server MAY send another | requests to reach the server, the server can send another GOAWAY | |||
| GOAWAY frame with an updated last Stream ID. 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 | Once all accepted requests have been processed, the server can permit | |||
| the connection to become idle, or MAY initiate an immediate closure | the connection to become idle, or MAY initiate an immediate closure | |||
| of the connection. An endpoint that completes a graceful shutdown | of the connection. An endpoint that completes a graceful shutdown | |||
| SHOULD use the H3_NO_ERROR code when closing the connection. | SHOULD use the H3_NO_ERROR code when closing the connection. | |||
| If a client has consumed all available bidirectional stream IDs with | If a client has consumed all available bidirectional stream IDs with | |||
| requests, the server need not send a GOAWAY frame, since the client | requests, the server need not send a GOAWAY frame, since the client | |||
| is unable to make further requests. | is unable to make further requests. | |||
| skipping to change at page 20, line 42 ¶ | skipping to change at page 20, line 50 ¶ | |||
| as a variable-length integer at the start of the stream. The format | as a variable-length integer at the start of the stream. The format | |||
| and structure of data that follows this integer is determined by the | and structure of data that follows this integer is determined by the | |||
| stream type. | stream type. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream Type (i) ... | | Stream Type (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 1: Unidirectional Stream Header | Figure 1: Unidirectional Stream Header | |||
| Some stream types are reserved (Section 6.2.3). Two stream types are | Some stream types are reserved (Section 6.2.3). Two stream types are | |||
| defined in this document: control streams (Section 6.2.1) and push | defined in this document: control streams (Section 6.2.1) and push | |||
| streams (Section 6.2.2). [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 | |||
| lifetime is sensitive to the creation and exchange of data on | lifetime is sensitive to the creation and exchange of data on | |||
| unidirectional streams. Endpoints that excessively restrict the | unidirectional streams. Endpoints that excessively restrict the | |||
| skipping to change at page 22, line 42 ¶ | skipping to change at page 23, line 4 ¶ | |||
| 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 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | 0x01 (i) ... | | 0x01 (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 2: Push Stream Header | ||||
| Figure 2: Push Stream Header | ||||
| Each Push ID MUST only be used once in a push stream header. If a | Each Push ID MUST only be used once in a push stream header. If a | |||
| push stream header includes a Push ID that was used in another push | push stream header includes a Push ID that was used in another push | |||
| stream header, the client MUST treat this as a connection error of | stream header, the client MUST treat this as a connection error of | |||
| type 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 integer values of N | |||
| are reserved to exercise the requirement that unknown types be | are reserved to exercise the requirement that unknown types be | |||
| ignored. These streams have no semantics, and can be sent when | ignored. These streams have no semantics, and can be sent when | |||
| application-layer padding is desired. They MAY also be sent on | application-layer padding is desired. They MAY also be sent on | |||
| connections where no data is currently being transferred. Endpoints | connections where no data is currently being transferred. Endpoints | |||
| MUST NOT consider these streams to have any meaning upon receipt. | MUST NOT consider these streams to have any meaning upon receipt. | |||
| 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. | implementation chooses. Implementations MAY terminate these streams | |||
| cleanly, or MAY abruptly terminate them. When terminating abruptly, | ||||
| the error code H3_NO_ERROR or a reserved error code (Section 8.1) | ||||
| SHOULD be used. | ||||
| 7. HTTP Framing Layer | 7. HTTP Framing Layer | |||
| HTTP frames are carried on QUIC streams, as described in Section 6. | HTTP frames are carried on QUIC streams, as described in Section 6. | |||
| HTTP/3 defines three stream types: control stream, request stream, | HTTP/3 defines three stream types: control stream, request stream, | |||
| and push stream. This section describes HTTP/3 frame formats and the | and push stream. This section describes HTTP/3 frame formats and the | |||
| streams types on which they are permitted; see Table 1 for an | streams types on which they are permitted; see Table 1 for an | |||
| overview. A comparison between HTTP/2 and HTTP/3 frames is provided | overview. A comparison between HTTP/2 and HTTP/3 frames is provided | |||
| in Appendix A.2. | in Appendix A.2. | |||
| +----------------+------------+------------+-----------+------------+ | +----------------+----------------+---------+--------+---------+ | |||
| | Frame | Control | Request | Push | Section | | | Frame | Control Stream | Request | Push | Section | | |||
| | | Stream | Stream | Stream | | | | | | Stream | Stream | | | |||
| +----------------+------------+------------+-----------+------------+ | +================+================+=========+========+=========+ | |||
| | DATA | No | Yes | Yes | Section | | | DATA | No | Yes | Yes | Section | | |||
| | | | | | 7.2.1 | | | | | | | 7.2.1 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | HEADERS | No | Yes | Yes | Section | | | HEADERS | No | Yes | Yes | Section | | |||
| | | | | | 7.2.2 | | | | | | | 7.2.2 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | CANCEL_PUSH | Yes | No | No | Section | | | CANCEL_PUSH | Yes | No | No | Section | | |||
| | | | | | 7.2.3 | | | | | | | 7.2.3 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | SETTINGS | Yes (1) | No | No | Section | | | SETTINGS | Yes (1) | No | No | Section | | |||
| | | | | | 7.2.4 | | | | | | | 7.2.4 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | PUSH_PROMISE | No | Yes | No | Section | | | PUSH_PROMISE | No | Yes | No | Section | | |||
| | | | | | 7.2.5 | | | | | | | 7.2.5 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | GOAWAY | Yes | No | No | Section | | | GOAWAY | Yes | No | No | Section | | |||
| | | | | | 7.2.6 | | | | | | | 7.2.6 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | MAX_PUSH_ID | Yes | No | No | Section | | | MAX_PUSH_ID | Yes | No | No | Section | | |||
| | | | | | 7.2.7 | | | | | | | 7.2.7 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | DUPLICATE_PUSH | No | Yes | No | Section | | | DUPLICATE_PUSH | No | Yes | No | Section | | |||
| | | | | | 7.2.8 | | | | | | | 7.2.8 | | |||
| | | | | | | | +----------------+----------------+---------+--------+---------+ | |||
| | Reserved | Yes | Yes | Yes | Section | | | Reserved | Yes | Yes | Yes | Section | | |||
| | | | | | 7.2.9 | | | | | | | 7.2.9 | | |||
| +----------------+------------+------------+-----------+------------+ | +----------------+----------------+---------+--------+---------+ | |||
| Table 1: HTTP/3 frames and stream type overview | Table 1: HTTP/3 Frames and Stream Type Overview | |||
| Certain frames can only occur as the first frame of a particular | Certain frames can only occur as the first frame of a particular | |||
| stream type; these are indicated in Table 1 with a (1). Specific | stream type; these are indicated in Table 1 with a (1). Specific | |||
| guidance is provided in the relevant section. | guidance is provided in the relevant section. | |||
| Note that, unlike QUIC frames, HTTP/3 frames can span multiple | Note that, unlike QUIC frames, HTTP/3 frames can span multiple | |||
| packets. | packets. | |||
| 7.1. Frame Layout | 7.1. Frame Layout | |||
| skipping to change at page 25, line 15 ¶ | skipping to change at page 25, line 15 ¶ | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type (i) ... | | Type (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (i) ... | | Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame Payload (*) ... | | Frame Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: HTTP/3 frame format | Figure 3: HTTP/3 Frame Format | |||
| A frame includes the following fields: | A frame includes the following fields: | |||
| Type: A variable-length integer that identifies the frame type. | Type: A variable-length integer that identifies the frame type. | |||
| Length: A variable-length integer that describes the length in bytes | Length: A variable-length integer that describes the length in bytes | |||
| of the Frame Payload. | of the Frame Payload. | |||
| Frame Payload: A payload, the semantics of which are determined by | Frame Payload: A payload, the semantics of which are determined by | |||
| the Type field. | the Type field. | |||
| skipping to change at page 26, line 11 ¶ | skipping to change at page 26, line 11 ¶ | |||
| 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 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Payload (*) ... | | Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 4: DATA frame payload | Figure 4: DATA Frame Payload | |||
| 7.2.2. HEADERS | 7.2.2. HEADERS | |||
| The HEADERS frame (type=0x1) is used to carry a header block, | The HEADERS frame (type=0x1) is used to carry a header block, | |||
| compressed using QPACK. See [QPACK] for more details. | compressed using QPACK. See [QPACK] for more details. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: HEADERS frame payload | Figure 5: HEADERS Frame Payload | |||
| HEADERS frames can only be sent on request / push streams. If a | HEADERS frames can only be sent on request / push streams. If a | |||
| HEADERS frame is received on a control stream, the recipient MUST | HEADERS frame is received on a control stream, the recipient MUST | |||
| respond with a connection error (Section 8) of type | respond with a connection error (Section 8) of type | |||
| 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 27, line 18 ¶ | skipping to change at page 27, line 18 ¶ | |||
| 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 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 6: CANCEL_PUSH frame payload | Figure 6: CANCEL_PUSH Frame Payload | |||
| The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | |||
| integer. The Push ID identifies the server push that is being | integer. The Push ID identifies the server push that is being | |||
| cancelled (see Section 7.2.5). 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 | |||
| skipping to change at page 28, line 35 ¶ | skipping to change at page 28, line 35 ¶ | |||
| encoded as QUIC variable-length integers. | encoded as QUIC variable-length integers. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Identifier (i) ... | | Identifier (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Value (i) ... | | Value (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 7: SETTINGS parameter format | Figure 7: SETTINGS Parameter Format | |||
| 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_HEADER_LIST_SIZE (0x6): The default value is unlimited. | |||
| See Section 4.1.1 for usage. | See Section 4.1.1 for usage. | |||
| skipping to change at page 30, line 37 ¶ | skipping to change at page 30, line 37 ¶ | |||
| header set from server to client on a request stream, as in HTTP/2. | header set from server to client on a request stream, as in HTTP/2. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: PUSH_PROMISE frame payload | Figure 8: PUSH_PROMISE Frame Payload | |||
| 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), and | (Section 4.4), CANCEL_PUSH frames (Section 7.2.3), and | |||
| DUPLICATE_PUSH frames (Section 7.2.8). | DUPLICATE_PUSH frames (Section 7.2.8). | |||
| Header Block: QPACK-compressed request header fields for the | Header Block: QPACK-compressed request header fields for the | |||
| promised response. See [QPACK] for more details. | promised response. See [QPACK] for more details. | |||
| skipping to change at page 31, line 36 ¶ | skipping to change at page 31, line 36 ¶ | |||
| new requests while still finishing processing of previously received | new requests while still finishing processing of previously received | |||
| requests. This enables administrative actions, like server | requests. This enables administrative actions, like server | |||
| maintenance. GOAWAY by itself does not close a connection. | maintenance. GOAWAY by itself does not close a connection. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 9: GOAWAY frame payload | Figure 9: GOAWAY Frame Payload | |||
| The GOAWAY frame is always sent on the control stream. It carries a | The GOAWAY frame is always sent on the control stream. It carries a | |||
| QUIC Stream ID for a client-initiated bidirectional stream encoded as | QUIC Stream ID for a client-initiated bidirectional stream encoded as | |||
| a variable-length integer. A client MUST treat receipt of a GOAWAY | a variable-length integer. A client MUST treat receipt of a GOAWAY | |||
| frame containing a Stream ID of any other type as a connection error | frame containing a Stream ID of any other type as a connection error | |||
| of type H3_ID_ERROR. | of type H3_ID_ERROR. | |||
| Clients do not need to send GOAWAY to initiate a graceful shutdown; | Clients do not need to send GOAWAY to initiate a graceful shutdown; | |||
| they simply stop making new requests. A server MUST treat receipt of | they simply stop making new requests. A server MUST treat receipt of | |||
| a GOAWAY frame on any stream as a connection error (Section 8) of | a GOAWAY frame on any stream as a connection error (Section 8) of | |||
| skipping to change at page 32, line 36 ¶ | skipping to change at page 32, line 36 ¶ | |||
| client that wishes to manage the number of promised server pushes can | client that wishes to manage the number of promised server pushes can | |||
| increase the maximum Push ID by sending MAX_PUSH_ID frames as the | increase the maximum Push ID by sending MAX_PUSH_ID frames as the | |||
| server fulfills or cancels server pushes. | server fulfills or cancels server pushes. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 10: MAX_PUSH_ID frame payload | Figure 10: MAX_PUSH_ID Frame Payload | |||
| The MAX_PUSH_ID frame carries a single variable-length integer that | The MAX_PUSH_ID frame carries a single variable-length integer that | |||
| identifies the maximum value for a Push ID that the server can use | identifies the maximum value for a Push ID that the server can use | |||
| (see Section 7.2.5). A MAX_PUSH_ID frame cannot reduce the maximum | (see Section 7.2.5). A MAX_PUSH_ID frame cannot reduce the maximum | |||
| Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | |||
| previously received MUST be treated as a connection error of type | previously received MUST be treated as a connection error of type | |||
| H3_ID_ERROR. | H3_ID_ERROR. | |||
| 7.2.8. DUPLICATE_PUSH | 7.2.8. DUPLICATE_PUSH | |||
| skipping to change at page 33, line 19 ¶ | skipping to change at page 33, line 17 ¶ | |||
| A client MUST NOT send a DUPLICATE_PUSH frame. A server MUST treat | A client MUST NOT send a DUPLICATE_PUSH frame. A server MUST treat | |||
| the receipt of a DUPLICATE_PUSH frame as a connection error of type | the receipt of a DUPLICATE_PUSH frame as a connection error of type | |||
| H3_FRAME_UNEXPECTED. | H3_FRAME_UNEXPECTED. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 11: DUPLICATE_PUSH frame payload | Figure 11: DUPLICATE_PUSH Frame Payload | |||
| The DUPLICATE_PUSH frame carries a single variable-length integer | The DUPLICATE_PUSH frame carries a single variable-length integer | |||
| that identifies the Push ID of a resource that the server has | that identifies the Push ID of a resource that the server has | |||
| previously promised (see Section 7.2.5), though that promise might | previously promised (see Section 7.2.5), though that promise might | |||
| not be received before this frame. A server MUST NOT use a Push ID | not be received before this frame. A server MUST NOT use a Push ID | |||
| that is larger than the client has provided in a MAX_PUSH_ID frame | that is larger than the client has provided in a MAX_PUSH_ID frame | |||
| (Section 7.2.7). A client MUST treat receipt of a DUPLICATE_PUSH | (Section 7.2.7). A client MUST treat receipt of a DUPLICATE_PUSH | |||
| that contains a larger Push ID than the client has advertised as a | that contains a larger Push ID than the client has advertised as a | |||
| connection error of type H3_ID_ERROR. | connection error of type H3_ID_ERROR. | |||
| skipping to change at page 34, line 9 ¶ | skipping to change at page 34, line 9 ¶ | |||
| ignored (Section 9). These frames have no semantics, and can be sent | ignored (Section 9). These frames have no semantics, and can be sent | |||
| on any open stream when application-layer padding is desired. They | on any open stream when application-layer padding is desired. They | |||
| MAY also be sent on connections where no data is currently being | MAY also be sent on connections where no data is currently being | |||
| transferred. Endpoints MUST NOT consider these frames to have any | transferred. Endpoints MUST NOT consider these frames to have any | |||
| meaning upon receipt. | meaning upon receipt. | |||
| The payload and length of the frames are selected in any manner the | The payload and length of the frames are selected in any manner the | |||
| implementation chooses. | implementation chooses. | |||
| Frame types which were used in HTTP/2 where there is no corresponding | Frame types which were used in HTTP/2 where there is no corresponding | |||
| HTTP/3 frame have also been reserved (Section 11.2). 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 | |||
| QUIC allows the application to abruptly terminate (reset) individual | QUIC allows the application to abruptly terminate (reset) individual | |||
| streams or the entire connection when an error is encountered. These | streams or the entire connection when an error is encountered. These | |||
| are referred to as "stream errors" or "connection errors" and are | are referred to as "stream errors" or "connection errors" and are | |||
| described in more detail in [QUIC-TRANSPORT]. An endpoint MAY choose | described in more detail in [QUIC-TRANSPORT]. | |||
| 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 | ||||
| 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), receipt of an unknown error code or use of an error code | Section 9), use of an error code in an unexpected context or receipt | |||
| in an unexpected context MUST NOT be treated as an error. However, | of an unknown error code MUST be treated as equivalent to | |||
| closing a stream can constitute an error regardless of the error code | H3_NO_ERROR. However, closing a stream can have other effects | |||
| (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 35, line 32 ¶ | skipping to change at page 35, line 35 ¶ | |||
| H3_REQUEST_REJECTED (0x10B): A server rejected a request without | H3_REQUEST_REJECTED (0x10B): A server rejected a request without | |||
| performing any application processing. | performing any application processing. | |||
| H3_REQUEST_CANCELLED (0x10C): The request or its response (including | H3_REQUEST_CANCELLED (0x10C): The request or its response (including | |||
| pushed response) is cancelled. | pushed response) is cancelled. | |||
| H3_REQUEST_INCOMPLETE (0x10D): The client's stream terminated | H3_REQUEST_INCOMPLETE (0x10D): The client's stream terminated | |||
| without containing a fully-formed request. | without containing a fully-formed request. | |||
| H3_EARLY_RESPONSE (0x10E): The remainder of the client's request is | ||||
| not needed to produce a response. For use in STOP_SENDING only. | ||||
| 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 | ||||
| are reserved to exercise the requirement that unknown error codes be | ||||
| treated as equivalent to H3_NO_ERROR (Section 9). Implementations | ||||
| SHOULD select an error code from this space with some 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 header fields. | |||
| Extensions are permitted to use new frame types (Section 7.2), new | Extensions are permitted to use new frame types (Section 7.2), new | |||
| settings (Section 7.2.4.1), new error codes (Section 8), or new | settings (Section 7.2.4.1), new error codes (Section 8), or new | |||
| unidirectional stream types (Section 6.2). Registries are | unidirectional stream types (Section 6.2). Registries are | |||
| established for managing these extension points: frame types | established for managing these extension points: frame types | |||
| (Section 11.2), settings (Section 11.3), error codes (Section 11.4), | (Section 11.2.1), settings (Section 11.2.2), error codes | |||
| and stream types (Section 11.5). | (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 | |||
| and unidirectional streams that have unknown or unsupported types. | and unidirectional streams that have unknown or unsupported types. | |||
| This means that any of these extension points can be safely used by | This means that any of these extension points can be safely used by | |||
| extensions without prior arrangement or negotiation. However, where | extensions without prior arrangement or negotiation. However, where | |||
| a known frame type is required to be in a specific location, such as | a known frame type is required to be in a specific location, such as | |||
| the SETTINGS frame as the first frame of the control stream (see | the SETTINGS frame as the first frame of the control stream (see | |||
| Section 6.2.1), an unknown frame type does not satisfy that | Section 6.2.1), an unknown frame type does not satisfy that | |||
| requirement and SHOULD be treated as an error. | requirement and SHOULD be treated as an error. | |||
| Extensions that could change the semantics of existing protocol | Extensions that could change the semantics of existing protocol | |||
| components MUST be negotiated before being used. For example, an | components MUST be negotiated before being used. For example, an | |||
| extension that changes the layout of the HEADERS frame cannot be used | extension that changes the layout of the HEADERS frame cannot be used | |||
| until the peer has given a positive signal that this is acceptable. | until the peer has given a positive signal that this is acceptable. | |||
| In this case, it could also be necessary to coordinate when the | Coordinating when such a revised layout comes into effect could prove | |||
| revised layout comes into effect. | complex. As such, allocating new identifiers for new definitions of | |||
| existing protocol elements is likely to be more effective. | ||||
| This document doesn't mandate a specific method for negotiating the | This document doesn't mandate a specific method for negotiating the | |||
| 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 | |||
| skipping to change at page 37, line 33 ¶ | skipping to change at page 37, line 41 ¶ | |||
| 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. | |||
| 11. IANA Considerations | 11. IANA Considerations | |||
| This document registers a new ALPN protocol ID (Section 11.1) and | ||||
| creates new registries that manage the assignment of codepoints in | ||||
| HTTP/3. | ||||
| 11.1. Registration of HTTP/3 Identification String | 11.1. Registration of HTTP/3 Identification String | |||
| This document creates a new registration for the identification of | This document creates a new registration for the identification of | |||
| HTTP/3 in the "Application Layer Protocol Negotiation (ALPN) Protocol | HTTP/3 in the "Application Layer Protocol Negotiation (ALPN) Protocol | |||
| IDs" registry established in [RFC7301]. | IDs" registry established in [RFC7301]. | |||
| The "h3" string identifies HTTP/3: | The "h3" string identifies HTTP/3: | |||
| Protocol: HTTP/3 | Protocol: HTTP/3 | |||
| Identification Sequence: 0x68 0x33 ("h3") | Identification Sequence: 0x68 0x33 ("h3") | |||
| Specification: This document | Specification: This document | |||
| 11.2. Frame Types | 11.2. New Registries | |||
| This document establishes a registry for HTTP/3 frame type codes. | New registries created in this document operate under the QUIC | |||
| The "HTTP/3 Frame Type" registry governs a 62-bit space. This space | registration policy documented in Section 22.1 of [QUIC-TRANSPORT]. | |||
| is split into three spaces that are governed by different policies. | These registries all include the common set of fields listed in | |||
| Section 22.1.1 of [QUIC-TRANSPORT]. | ||||
| Values between "0x00" and "0x3f" (in hexadecimal) are assigned via | The initial allocations in these registries created in this document | |||
| the Standards Action or IESG Review policies [RFC8126]. Values from | are all assigned permanent status and list as contact both the IESG | |||
| "0x40" to "0x3fff" operate on the Specification Required policy | (iesg@ietf.org) and the HTTP working group (ietf-http-wg@w3.org). | |||
| [RFC8126]. All other values are assigned to Private Use [RFC8126]. | ||||
| 11.2.1. Frame Types | ||||
| This document establishes a registry for HTTP/3 frame type codes. | ||||
| The "HTTP/3 Frame Type" registry governs a 62-bit space. This | ||||
| registry follows the QUIC registry policy; see Section 11.2. | ||||
| Permanent registrations in this registry are assigned using the | ||||
| Specification Required policy [RFC8126], except for values between | ||||
| 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using | ||||
| Standards Action or IESG Approval as defined in Section 4.9 and 4.10 | ||||
| of [RFC8126]. | ||||
| While this registry is separate from the "HTTP/2 Frame Type" registry | While this registry is separate from the "HTTP/2 Frame Type" registry | |||
| defined in [HTTP2], it is preferable that the assignments parallel | defined in [HTTP2], it is preferable that the assignments parallel | |||
| each other where the code spaces overlap. If an entry is present in | each other where the code spaces overlap. If an entry is present in | |||
| only one registry, every effort SHOULD be made to avoid assigning the | only one registry, every effort SHOULD be made to avoid assigning the | |||
| corresponding value to an unrelated operation. | corresponding value to an unrelated operation. | |||
| New entries in this registry require the following information: | In addition to common fields as described in Section 11.2, permanent | |||
| registrations in this registry MUST include the following field: | ||||
| Frame Type: A name or label for the frame type. | Frame Type: A name or label for the frame type. | |||
| Code: The 62-bit code assigned to the frame type. | Specifications of frame types MUST include a description of the frame | |||
| layout and its semantics, including any parts of the frame that are | ||||
| conditionally present. | ||||
| Specification: A reference to a specification that includes a | The entries in Table 2 are registered by this document. | |||
| description of the frame layout and its semantics, including any | ||||
| parts of the frame that are conditionally present. | ||||
| The entries in the following table are registered by this document. | +----------------+-------+---------------+ | |||
| | Frame Type | Value | Specification | | ||||
| +================+=======+===============+ | ||||
| | DATA | 0x0 | Section 7.2.1 | | ||||
| +----------------+-------+---------------+ | ||||
| | HEADERS | 0x1 | Section 7.2.2 | | ||||
| +----------------+-------+---------------+ | ||||
| | Reserved | 0x2 | N/A | | ||||
| +----------------+-------+---------------+ | ||||
| | CANCEL_PUSH | 0x3 | Section 7.2.3 | | ||||
| +----------------+-------+---------------+ | ||||
| | SETTINGS | 0x4 | Section 7.2.4 | | ||||
| +----------------+-------+---------------+ | ||||
| | PUSH_PROMISE | 0x5 | Section 7.2.5 | | ||||
| +----------------+-------+---------------+ | ||||
| | Reserved | 0x6 | N/A | | ||||
| +----------------+-------+---------------+ | ||||
| | GOAWAY | 0x7 | Section 7.2.6 | | ||||
| +----------------+-------+---------------+ | ||||
| | Reserved | 0x8 | N/A | | ||||
| +----------------+-------+---------------+ | ||||
| | Reserved | 0x9 | N/A | | ||||
| +----------------+-------+---------------+ | ||||
| | MAX_PUSH_ID | 0xD | Section 7.2.7 | | ||||
| +----------------+-------+---------------+ | ||||
| | DUPLICATE_PUSH | 0xE | Section 7.2.8 | | ||||
| +----------------+-------+---------------+ | ||||
| +----------------+------+---------------+ | Table 2: Initial HTTP/3 Frame Types | |||
| | Frame Type | Code | Specification | | ||||
| +----------------+------+---------------+ | ||||
| | DATA | 0x0 | Section 7.2.1 | | ||||
| | | | | | ||||
| | HEADERS | 0x1 | Section 7.2.2 | | ||||
| | | | | | ||||
| | Reserved | 0x2 | N/A | | ||||
| | | | | | ||||
| | CANCEL_PUSH | 0x3 | Section 7.2.3 | | ||||
| | | | | | ||||
| | SETTINGS | 0x4 | Section 7.2.4 | | ||||
| | | | | | ||||
| | PUSH_PROMISE | 0x5 | Section 7.2.5 | | ||||
| | | | | | ||||
| | Reserved | 0x6 | N/A | | ||||
| | | | | | ||||
| | GOAWAY | 0x7 | Section 7.2.6 | | ||||
| | | | | | ||||
| | Reserved | 0x8 | N/A | | ||||
| | | | | | ||||
| | Reserved | 0x9 | N/A | | ||||
| | | | | | ||||
| | MAX_PUSH_ID | 0xD | Section 7.2.7 | | ||||
| | | | | | ||||
| | DUPLICATE_PUSH | 0xE | Section 7.2.8 | | ||||
| +----------------+------+---------------+ | ||||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for integer | |||
| values of N (that is, "0x21", "0x40", ..., through | values of N (that is, "0x21", "0x40", ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | |||
| 11.3. 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 space is | "HTTP/3 Settings" registry governs a 62-bit space. This registry | |||
| split into three spaces that are governed by different policies. | follows the QUIC registry policy; see Section 11.2. Permanent | |||
| Values between "0x00" and "0x3f" (in hexadecimal) are assigned via | registrations in this registry are assigned using the Specification | |||
| the Standards Action or IESG Review policies [RFC8126]. Values from | Required policy [RFC8126], except for values between 0x00 and 0x3f | |||
| "0x40" to "0x3fff" operate on the Specification Required policy | (in hexadecimal; inclusive), which are assigned using Standards | |||
| [RFC8126]. All other values are assigned to Private Use [RFC8126]. | Action or IESG Approval as defined in Section 4.9 and 4.10 of | |||
| The designated experts are the same as those for the "HTTP/2 | [RFC8126]. | |||
| Settings" registry defined in [HTTP2]. | ||||
| While this registry is separate from the "HTTP/2 Settings" registry | While this registry is separate from the "HTTP/2 Settings" registry | |||
| defined in [HTTP2], it is preferable that the assignments parallel | defined in [HTTP2], it is preferable that the assignments parallel | |||
| each other. If an entry is present in only one registry, every | each other. If an entry is present in only one registry, every | |||
| effort SHOULD be made to avoid assigning the corresponding value to | effort SHOULD be made to avoid assigning the corresponding value to | |||
| an unrelated operation. | an unrelated operation. | |||
| New registrations are advised to provide the following information: | In addition to common fields as described in Section 11.2, permanent | |||
| registrations in this registry MUST include the following fields: | ||||
| Name: A symbolic name for the setting. Specifying a setting name is | ||||
| optional. | ||||
| Code: The 62-bit code assigned to the setting. | Setting Name: A symbolic name for the setting. Specifying a setting | |||
| name is optional. | ||||
| Specification: An optional reference to a specification that | Default: The value of the setting unless otherwise indicated. A | |||
| describes the use of the setting. | default SHOULD be the most restrictive possible value. | |||
| Default: The value of the setting unless otherwise indicated. | The entries in Table 3 are registered by this document. | |||
| SHOULD be the most restrictive possible value. | ||||
| The entries in the following table are registered by this document. | +----------------------+-------+-----------------+-----------+ | |||
| | Setting Name | Value | Specification | Default | | ||||
| +======================+=======+=================+===========+ | ||||
| | Reserved | 0x2 | N/A | N/A | | ||||
| +----------------------+-------+-----------------+-----------+ | ||||
| | Reserved | 0x3 | N/A | N/A | | ||||
| +----------------------+-------+-----------------+-----------+ | ||||
| | Reserved | 0x4 | N/A | N/A | | ||||
| +----------------------+-------+-----------------+-----------+ | ||||
| | Reserved | 0x5 | N/A | N/A | | ||||
| +----------------------+-------+-----------------+-----------+ | ||||
| | MAX_HEADER_LIST_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | ||||
| +----------------------+-------+-----------------+-----------+ | ||||
| +----------------------+------+-----------------+-----------+ | Table 3: Initial HTTP/3 Settings | |||
| | Setting Name | Code | Specification | Default | | ||||
| +----------------------+------+-----------------+-----------+ | ||||
| | Reserved | 0x2 | N/A | N/A | | ||||
| | | | | | | ||||
| | Reserved | 0x3 | N/A | N/A | | ||||
| | | | | | | ||||
| | Reserved | 0x4 | N/A | N/A | | ||||
| | | | | | | ||||
| | Reserved | 0x5 | N/A | N/A | | ||||
| | | | | | | ||||
| | MAX_HEADER_LIST_SIZE | 0x6 | Section 7.2.4.1 | Unlimited | | ||||
| +----------------------+------+-----------------+-----------+ | ||||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for integer | |||
| values of N (that is, "0x21", "0x40", ..., through | values of N (that is, "0x21", "0x40", ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | |||
| 11.4. 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. The "HTTP/3 | "HTTP/3 Error Code" registry manages a 62-bit space. This registry | |||
| Error Code" registry operates under the "Expert Review" policy | follows the QUIC registry policy; see Section 11.2. Permanent | |||
| registrations in this registry are assigned using the Specification | ||||
| Required policy [RFC8126], except for values between 0x00 and 0x3f | ||||
| (in hexadecimal; inclusive), which are assigned using Standards | ||||
| Action or IESG Approval as defined in Section 4.9 and 4.10 of | ||||
| [RFC8126]. | [RFC8126]. | |||
| Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
| of the error code. An expert reviewer is advised to examine new | of the error code. An expert reviewer is advised to examine new | |||
| registrations for possible duplication with existing error codes. | registrations for possible duplication with existing error codes. | |||
| Use of existing registrations is to be encouraged, but not mandated. | Use of existing registrations is to be encouraged, but not mandated. | |||
| New registrations are advised to provide the following information: | In addition to common fields as described in Section 11.2, permanent | |||
| registrations in this registry MUST include the following fields: | ||||
| Name: A name for the error code. Specifying an error code name is | Name: A name for the error code. Specifying an error code name is | |||
| optional. | optional. | |||
| Code: The 62-bit error code value. | Description: A brief description of the error code semantics. | |||
| Description: A brief description of the error code semantics, longer | ||||
| if no detailed specification is provided. | ||||
| Specification: An optional reference for a specification that | ||||
| defines the error code. | ||||
| The entries in the following table are registered by this document. | The entries in the Table 4 are registered by this document. | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| | Name | Code | Description | Specification | | | Name | Value | Description | Specification | | |||
| +---------------------------+--------+--------------+---------------+ | +===========================+========+==============+===============+ | |||
| | H3_NO_ERROR | 0x0100 | No error | Section 8.1 | | | H3_NO_ERROR | 0x0100 | No error | Section 8.1 | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_GENERAL_PROTOCOL_ERROR | 0x0101 | General | Section 8.1 | | | H3_GENERAL_PROTOCOL_ERROR | 0x0101 | General | Section 8.1 | | |||
| | | | protocol | | | | | | protocol | | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_INTERNAL_ERROR | 0x0102 | Internal | Section 8.1 | | | H3_INTERNAL_ERROR | 0x0102 | Internal | Section 8.1 | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_STREAM_CREATION_ERROR | 0x0103 | Stream | Section 8.1 | | | H3_STREAM_CREATION_ERROR | 0x0103 | Stream | Section 8.1 | | |||
| | | | creation | | | | | | creation | | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_CLOSED_CRITICAL_STREAM | 0x0104 | Critical | Section 8.1 | | | H3_CLOSED_CRITICAL_STREAM | 0x0104 | Critical | Section 8.1 | | |||
| | | | stream was | | | | | | stream was | | | |||
| | | | closed | | | | | | closed | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_FRAME_UNEXPECTED | 0x0105 | Frame not | Section 8.1 | | | H3_FRAME_UNEXPECTED | 0x0105 | Frame not | Section 8.1 | | |||
| | | | permitted in | | | | | | permitted | | | |||
| | | | the current | | | | | | in the | | | |||
| | | | current | | | ||||
| | | | state | | | | | | state | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_FRAME_ERROR | 0x0106 | Frame | Section 8.1 | | | H3_FRAME_ERROR | 0x0106 | Frame | Section 8.1 | | |||
| | | | violated | | | | | | violated | | | |||
| | | | layout or | | | | | | layout or | | | |||
| | | | size rules | | | | | | size rules | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_EXCESSIVE_LOAD | 0x0107 | Peer | Section 8.1 | | | H3_EXCESSIVE_LOAD | 0x0107 | Peer | Section 8.1 | | |||
| | | | generating | | | | | | generating | | | |||
| | | | excessive | | | | | | excessive | | | |||
| | | | load | | | | | | load | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_ID_ERROR | 0x0108 | An | Section 8.1 | | | H3_ID_ERROR | 0x0108 | An | Section 8.1 | | |||
| | | | identifier | | | | | | identifier | | | |||
| | | | was used | | | | | | was used | | | |||
| | | | incorrectly | | | | | | incorrectly | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_SETTINGS_ERROR | 0x0109 | SETTINGS | Section 8.1 | | | H3_SETTINGS_ERROR | 0x0109 | SETTINGS | Section 8.1 | | |||
| | | | frame | | | | | | frame | | | |||
| | | | contained | | | | | | contained | | | |||
| | | | invalid | | | | | | invalid | | | |||
| | | | values | | | | | | values | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_MISSING_SETTINGS | 0x010A | No SETTINGS | Section 8.1 | | | H3_MISSING_SETTINGS | 0x010A | No SETTINGS | Section 8.1 | | |||
| | | | frame | | | | | | frame | | | |||
| | | | received | | | | | | received | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_REQUEST_REJECTED | 0x010B | Request not | Section 8.1 | | | H3_REQUEST_REJECTED | 0x010B | Request not | Section 8.1 | | |||
| | | | processed | | | | | | processed | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_REQUEST_CANCELLED | 0x010C | Data no | Section 8.1 | | | H3_REQUEST_CANCELLED | 0x010C | Data no | Section 8.1 | | |||
| | | | longer | | | | | | longer | | | |||
| | | | needed | | | | | | needed | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_REQUEST_INCOMPLETE | 0x010D | Stream | Section 8.1 | | | H3_REQUEST_INCOMPLETE | 0x010D | Stream | Section 8.1 | | |||
| | | | terminated | | | | | | terminated | | | |||
| | | | early | | | | | | early | | | |||
| | | | | | | +---------------------------+--------+--------------+---------------+ | |||
| | H3_EARLY_RESPONSE | 0x010E | Remainder of | Section 8.1 | | | H3_CONNECT_ERROR | 0x010F | TCP reset | Section 8.1 | | |||
| | | | request not | | | | | | or error on | | | |||
| | | | needed | | | ||||
| | | | | | | ||||
| | H3_CONNECT_ERROR | 0x010F | TCP reset or | Section 8.1 | | ||||
| | | | 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 | | | |||
| +---------------------------+--------+--------------+---------------+ | +---------------------------+--------+--------------+---------------+ | |||
| 11.5. Stream Types | Table 4: Initial HTTP/3 Error Codes | |||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | ||||
| values of N (that is, "0x21", "0x40", ..., through | ||||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | ||||
| 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 space is split into three spaces that are governed by different | This registry follows the QUIC registry policy; see Section 11.2. | |||
| policies. Values between "0x00" and 0x3f (in hexadecimal) are | Permanent registrations in this registry are assigned using the | |||
| assigned via the Standards Action or IESG Review policies [RFC8126]. | Specification Required policy [RFC8126], except for values between | |||
| 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using | ||||
| Values from "0x40" to "0x3fff" operate on the Specification Required | Standards Action or IESG Approval as defined in Section 4.9 and 4.10 | |||
| policy [RFC8126]. All other values are assigned to Private Use | of [RFC8126]. | |||
| [RFC8126]. | ||||
| New entries in this registry require the following information: | In addition to common fields as described in Section 11.2, permanent | |||
| registrations in this registry MUST include the following fields: | ||||
| Stream Type: A name or label for the stream type. | Stream Type: A name or label for the stream type. | |||
| Code: The 62-bit code assigned to the stream type. | ||||
| Specification: A reference to a specification that includes a | ||||
| description of the stream type, including the layout semantics of | ||||
| its payload. | ||||
| Sender: Which endpoint on a connection may initiate a stream of this | Sender: Which endpoint on a connection may initiate a stream of this | |||
| type. Values are "Client", "Server", or "Both". | type. Values are "Client", "Server", or "Both". | |||
| Specifications for permanent registrations MUST include a description | ||||
| of the stream type, including the layout semantics of the stream | ||||
| contents. | ||||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +----------------+------+---------------+--------+ | +----------------+-------+---------------+--------+ | |||
| | Stream Type | Code | 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 | ||||
| Additionally, each code of the format "0x1f * N + 0x21" for integer | Additionally, each code of the format "0x1f * N + 0x21" for integer | |||
| values of N (that is, "0x21", "0x40", ..., through | values of N (that is, "0x21", "0x40", ..., through | |||
| "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | "0x3FFFFFFFFFFFFFFE") MUST NOT be assigned by IANA. | |||
| 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 | |||
| skipping to change at page 44, line 6 ¶ | skipping to change at page 44, line 16 ¶ | |||
| 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 | [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
| [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | |||
| Header Compression for HTTP over QUIC", draft-ietf-quic- | Header Compression for HTTP over QUIC", Work in Progress, | |||
| qpack-11 (work in progress), November 2019. | Internet-Draft, draft-ietf-quic-qpack-12, 22 January 2020, | |||
| <https://tools.ietf.org/html/draft-ietf-quic-qpack-12>. | ||||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", draft-ietf-quic- | Multiplexed and Secure Transport", Work in Progress, | |||
| transport-24 (work in progress), November 2019. | Internet-Draft, draft-ietf-quic-transport-25, 22 January | |||
| 2020, <https://tools.ietf.org/html/draft-ietf-quic- | ||||
| transport-25>. | ||||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 45, line 37 ¶ | skipping to change at page 46, line 5 ¶ | |||
| [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 | [RFC7413] 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>. | |||
| 12.3. URIs | ||||
| [1] https://mailarchive.ietf.org/arch/search/?email_list=quic | ||||
| [2] https://github.com/quicwg | ||||
| [3] https://github.com/quicwg/base-drafts/labels/-http | ||||
| [4] https://www.iana.org/assignments/message-headers | ||||
| 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 16 ¶ | skipping to change at page 49, line 26 ¶ | |||
| provides flow control. | provides flow control. | |||
| CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | |||
| larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted. | larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted. | |||
| Frame types defined by extensions to HTTP/2 need to be separately | Frame types defined by extensions to HTTP/2 need to be separately | |||
| registered for HTTP/3 if still applicable. The IDs of frames defined | registered for HTTP/3 if still applicable. The IDs of frames defined | |||
| in [HTTP2] have been reserved for simplicity. Note that the frame | in [HTTP2] have been reserved for simplicity. Note that the frame | |||
| type space in HTTP/3 is substantially larger (62 bits versus 8 bits), | type space in HTTP/3 is substantially larger (62 bits versus 8 bits), | |||
| so many HTTP/3 frame types have no equivalent HTTP/2 code points. | so many HTTP/3 frame types have no equivalent HTTP/2 code points. | |||
| See Section 11.2. | See Section 11.2.1. | |||
| A.3. HTTP/2 SETTINGS Parameters | A.3. HTTP/2 SETTINGS Parameters | |||
| An important difference from HTTP/2 is that settings are sent once, | An important difference from HTTP/2 is that settings are sent once, | |||
| as the first frame of the control stream, and thereafter cannot | as the first frame of the control stream, and thereafter cannot | |||
| change. This eliminates many corner cases around synchronization of | change. This eliminates many corner cases around synchronization of | |||
| changes. | changes. | |||
| Some transport-level options that HTTP/2 specifies via the SETTINGS | Some transport-level options that HTTP/2 specifies via the SETTINGS | |||
| frame are superseded by QUIC transport parameters in HTTP/3. The | frame are superseded by QUIC transport parameters in HTTP/3. The | |||
| skipping to change at page 50, line 4 ¶ | skipping to change at page 50, line 14 ¶ | |||
| 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_HEADER_LIST_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 the format of their | ported from HTTP/2 might choose to redefine their value to limit it | |||
| settings to avoid using the 62-bit encoding. | to 30 bits for more efficient encoding, or to make use of the 62-bit | |||
| 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 | |||
| IDs of settings defined in [HTTP2] have been reserved for simplicity. | IDs of settings defined in [HTTP2] have been reserved for simplicity. | |||
| Note that the settings identifier space in HTTP/3 is substantially | Note that the settings identifier space in HTTP/3 is substantially | |||
| larger (62 bits versus 16 bits), so many HTTP/3 settings have no | larger (62 bits versus 16 bits), so many HTTP/3 settings have no | |||
| equivalent HTTP/2 code point. See Section 11.3. | 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, there is no direct portability of HTTP/2 | |||
| error codes to HTTP/3 error codes; the values are shifted in order to | error codes to HTTP/3 error codes; the values are shifted in order to | |||
| skipping to change at page 51, line 24 ¶ | skipping to change at page 51, line 33 ¶ | |||
| CONNECT_ERROR (0xa): H3_CONNECT_ERROR in Section 8.1. | CONNECT_ERROR (0xa): H3_CONNECT_ERROR in Section 8.1. | |||
| 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.4. | Section 11.2.3. | |||
| 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-23 | B.1. Since draft-ietf-quic-http-24 | |||
| o Removed "quic" Alt-Svc parameter (#3061,#3118) | * Removed H3_EARLY_RESPONSE error code; H3_NO_ERROR is recommended | |||
| instead (#3130,#3208) | ||||
| o Clients need not persist unknown settings for use in 0-RTT | * Unknown error codes are equivalent to H3_NO_ERROR (#3276,#3331) | |||
| * Some error codes are reserved for greasing (#3325,#3360) | ||||
| B.2. Since draft-ietf-quic-http-23 | ||||
| * Removed "quic" Alt-Svc parameter (#3061,#3118) | ||||
| * Clients need not persist unknown settings for use in 0-RTT | ||||
| (#3110,#3113) | (#3110,#3113) | |||
| o Clarify error cases around CANCEL_PUSH (#2819,#3083) | * Clarify error cases around CANCEL_PUSH (#2819,#3083) | |||
| B.2. Since draft-ietf-quic-http-22 | B.3. Since draft-ietf-quic-http-22 | |||
| o Removed priority signaling (#2922,#2924) | * Removed priority signaling (#2922,#2924) | |||
| o 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 | |||
| o Clarify how unknown frame types interact with required frame | * Clarify how unknown frame types interact with required frame | |||
| sequence (#2867,#2858) | sequence (#2867,#2858) | |||
| o Describe interactions with the transport in terms of defined | * Describe interactions with the transport in terms of defined | |||
| interface terms (#2857,#2805) | interface terms (#2857,#2805) | |||
| o Require the use of the "http-opportunistic" resource (RFC 8164) | * Require the use of the "http-opportunistic" resource (RFC 8164) | |||
| when scheme is "http" (#2439,#2973) | when scheme is "http" (#2439,#2973) | |||
| o Settings identifiers cannot be duplicated (#2979) | * Settings identifiers cannot be duplicated (#2979) | |||
| o Changes to SETTINGS frames in 0-RTT (#2972,#2790,#2945): | * Changes to SETTINGS frames in 0-RTT (#2972,#2790,#2945): | |||
| * Servers must send all settings with non-default values in their | - Servers must send all settings with non-default values in their | |||
| SETTINGS frame, even when resuming | SETTINGS frame, even when resuming | |||
| * If a client doesn't have settings associated with a 0-RTT | - If a client doesn't have settings associated with a 0-RTT | |||
| ticket, it uses the defaults | ticket, it uses the defaults | |||
| * Servers can't accept early data if they cannot recover the | - Servers can't accept early data if they cannot recover the | |||
| settings the client will have remembered | settings the client will have remembered | |||
| o Clarify that Upgrade and the 101 status code are prohibited | * Clarify that Upgrade and the 101 status code are prohibited | |||
| (#2898,#2889) | (#2898,#2889) | |||
| o Clarify that frame types reserved for greasing can occur on any | * Clarify that frame types reserved for greasing can occur on any | |||
| stream, but frame types reserved due to HTTP/2 correspondence are | stream, but frame types reserved due to HTTP/2 correspondence are | |||
| prohibited (#2997,#2692,#2693) | prohibited (#2997,#2692,#2693) | |||
| o Unknown error codes cannot be treated as errors (#2998,#2816) | * Unknown error codes cannot be treated as errors (#2998,#2816) | |||
| B.3. Since draft-ietf-quic-http-21 | B.4. Since draft-ietf-quic-http-21 | |||
| No changes | No changes | |||
| B.4. Since draft-ietf-quic-http-20 | B.5. Since draft-ietf-quic-http-20 | |||
| o Prohibit closing the control stream (#2509, #2666) | * Prohibit closing the control stream (#2509, #2666) | |||
| o Change default priority to use an orphan node (#2502, #2690) | * Change default priority to use an orphan node (#2502, #2690) | |||
| o Exclusive priorities are restored (#2754, #2781) | * Exclusive priorities are restored (#2754, #2781) | |||
| o Restrict use of frames when using CONNECT (#2229, #2702) | * Restrict use of frames when using CONNECT (#2229, #2702) | |||
| o 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) | |||
| o Encourage provision of sufficient unidirectional streams for QPACK | * Encourage provision of sufficient unidirectional streams for QPACK | |||
| (#2100, #2529, #2762) | (#2100, #2529, #2762) | |||
| o Allow extensions to use server-initiated bidirectional streams | * Allow extensions to use server-initiated bidirectional streams | |||
| (#2711, #2773) | (#2711, #2773) | |||
| o Clarify use of maximum header list size setting (#2516, #2774) | * Clarify use of maximum header list size setting (#2516, #2774) | |||
| o Extensive changes to error codes and conditions of their sending | * Extensive changes to error codes and conditions of their sending | |||
| * Require connection errors for more error conditions (#2511, | - Require connection errors for more error conditions (#2511, | |||
| #2510) | #2510) | |||
| * Updated the error codes for illegal GOAWAY frames (#2714, | - Updated the error codes for illegal GOAWAY frames (#2714, | |||
| #2707) | #2707) | |||
| * Specified error code for HEADERS on control stream (#2708) | - Specified error code for HEADERS on control stream (#2708) | |||
| * Specified error code for servers receiving PUSH_PROMISE (#2709) | - Specified error code for servers receiving PUSH_PROMISE (#2709) | |||
| * Specified error code for receiving DATA before HEADERS (#2715) | - Specified error code for receiving DATA before HEADERS (#2715) | |||
| * Describe malformed messages and their handling (#2410, #2764) | - Describe malformed messages and their handling (#2410, #2764) | |||
| * Remove HTTP_PUSH_ALREADY_IN_CACHE error (#2812, #2813) | - Remove HTTP_PUSH_ALREADY_IN_CACHE error (#2812, #2813) | |||
| * Refactor Push ID related errors (#2818, #2820) | - Refactor Push ID related errors (#2818, #2820) | |||
| * Rationalize HTTP/3 stream creation errors (#2821, #2822) | - Rationalize HTTP/3 stream creation errors (#2821, #2822) | |||
| B.5. Since draft-ietf-quic-http-19 | B.6. Since draft-ietf-quic-http-19 | |||
| o SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | * SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) | |||
| o 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.6. Since draft-ietf-quic-http-18 | B.7. Since draft-ietf-quic-http-18 | |||
| o Resetting streams following a GOAWAY is recommended, but not | * Resetting streams following a GOAWAY is recommended, but not | |||
| required (#2256,#2457) | required (#2256,#2457) | |||
| o Use variable-length integers throughout (#2437,#2233,#2253,#2275) | * Use variable-length integers throughout (#2437,#2233,#2253,#2275) | |||
| * Variable-length frame types, stream types, and settings | - Variable-length frame types, stream types, and settings | |||
| identifiers | identifiers | |||
| * Renumbered stream type assignments | - Renumbered stream type assignments | |||
| * Modified associated reserved values | - Modified associated reserved values | |||
| o Frame layout switched from Length-Type-Value to Type-Length-Value | * Frame layout switched from Length-Type-Value to Type-Length-Value | |||
| (#2395,#2235) | (#2395,#2235) | |||
| o Specified error code for servers receiving DUPLICATE_PUSH (#2497) | * Specified error code for servers receiving DUPLICATE_PUSH (#2497) | |||
| o Use connection error for invalid PRIORITY (#2507, #2508) | * Use connection error for invalid PRIORITY (#2507, #2508) | |||
| B.7. Since draft-ietf-quic-http-17 | B.8. Since draft-ietf-quic-http-17 | |||
| o 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) | |||
| o Changed error code for GOAWAY on the wrong stream (#2231, #2343) | * Changed error code for GOAWAY on the wrong stream (#2231, #2343) | |||
| B.8. Since draft-ietf-quic-http-16 | B.9. Since draft-ietf-quic-http-16 | |||
| o Rename "HTTP/QUIC" to "HTTP/3" (#1973) | * Rename "HTTP/QUIC" to "HTTP/3" (#1973) | |||
| o 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 | |||
| o Define DUPLICATE_PUSH frame to refer to another PUSH_PROMISE | * Define DUPLICATE_PUSH frame to refer to another PUSH_PROMISE | |||
| (#2072) | (#2072) | |||
| o Set defaults for settings, allow request before receiving SETTINGS | * Set defaults for settings, allow request before receiving SETTINGS | |||
| (#1809, #1846, #2038) | (#1809, #1846, #2038) | |||
| o Clarify message processing rules for streams that aren't closed | * Clarify message processing rules for streams that aren't closed | |||
| (#1972, #2003) | (#1972, #2003) | |||
| o Removed reservation of error code 0 and moved HTTP_NO_ERROR to | * Removed reservation of error code 0 and moved HTTP_NO_ERROR to | |||
| this value (#1922) | this value (#1922) | |||
| o Removed prohibition of zero-length DATA frames (#2098) | * Removed prohibition of zero-length DATA frames (#2098) | |||
| B.9. Since draft-ietf-quic-http-15 | B.10. Since draft-ietf-quic-http-15 | |||
| Substantial editorial reorganization; no technical changes. | Substantial editorial reorganization; no technical changes. | |||
| B.10. Since draft-ietf-quic-http-14 | B.11. Since draft-ietf-quic-http-14 | |||
| o Recommend sensible values for QUIC transport parameters | * Recommend sensible values for QUIC transport parameters | |||
| (#1720,#1806) | (#1720,#1806) | |||
| o Define error for missing SETTINGS frame (#1697,#1808) | * Define error for missing SETTINGS frame (#1697,#1808) | |||
| o 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) | |||
| o Expanded discussion of connection closure (#1599,#1717,#1712) | * Expanded discussion of connection closure (#1599,#1717,#1712) | |||
| o HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | * HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | |||
| B.11. Since draft-ietf-quic-http-13 | B.12. Since draft-ietf-quic-http-13 | |||
| o Reserved some frame types for grease (#1333, #1446) | * Reserved some frame types for grease (#1333, #1446) | |||
| o 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) | |||
| o Require settings to be remembered for 0-RTT, prohibit reductions | * Require settings to be remembered for 0-RTT, prohibit reductions | |||
| (#1541, #1641) | (#1541, #1641) | |||
| o Specify behavior for truncated requests (#1596, #1643) | * Specify behavior for truncated requests (#1596, #1643) | |||
| B.12. Since draft-ietf-quic-http-12 | B.13. Since draft-ietf-quic-http-12 | |||
| o 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) | |||
| o Removed flags from HTTP/3 frames (#1388, #1398) | * Removed flags from HTTP/3 frames (#1388, #1398) | |||
| o Reserved frame types and settings for use in preserving | * Reserved frame types and settings for use in preserving | |||
| extensibility (#1333, #1446) | extensibility (#1333, #1446) | |||
| o Added general error code (#1391, #1397) | * Added general error code (#1391, #1397) | |||
| o Unidirectional streams carry a type byte and are extensible | * Unidirectional streams carry a type byte and are extensible | |||
| (#910,#1359) | (#910,#1359) | |||
| o 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.13. Since draft-ietf-quic-http-11 | B.14. Since draft-ietf-quic-http-11 | |||
| o 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.14. Since draft-ietf-quic-http-10 | B.15. Since draft-ietf-quic-http-10 | |||
| o 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.15. Since draft-ietf-quic-http-09 | B.16. Since draft-ietf-quic-http-09 | |||
| o Selected QCRAM for header compression (#228, #1117) | * Selected QCRAM for header compression (#228, #1117) | |||
| o The server_name TLS extension is now mandatory (#296, #495) | * The server_name TLS extension is now mandatory (#296, #495) | |||
| o Specified handling of unsupported versions in Alt-Svc (#1093, | * Specified handling of unsupported versions in Alt-Svc (#1093, | |||
| #1097) | #1097) | |||
| B.16. Since draft-ietf-quic-http-08 | B.17. Since draft-ietf-quic-http-08 | |||
| o Clarified connection coalescing rules (#940, #1024) | ||||
| B.17. Since draft-ietf-quic-http-07 | * Clarified connection coalescing rules (#940, #1024) | |||
| o Changes for integer encodings in QUIC (#595,#905) | B.18. Since draft-ietf-quic-http-07 | |||
| o Use unidirectional streams as appropriate (#515, #240, #281, #886) | * Changes for integer encodings in QUIC (#595,#905) | |||
| o Improvement to the description of GOAWAY (#604, #898) | * Use unidirectional streams as appropriate (#515, #240, #281, #886) | |||
| o Improve description of server push usage (#947, #950, #957) | * Improvement to the description of GOAWAY (#604, #898) | |||
| B.18. Since draft-ietf-quic-http-06 | * Improve description of server push usage (#947, #950, #957) | |||
| o Track changes in QUIC error code usage (#485) | B.19. Since draft-ietf-quic-http-06 | |||
| * Track changes in QUIC error code usage (#485) | ||||
| B.19. Since draft-ietf-quic-http-05 | B.20. Since draft-ietf-quic-http-05 | |||
| o 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) | |||
| o Guidance about keep-alive and QUIC PINGs (#729) | * Guidance about keep-alive and QUIC PINGs (#729) | |||
| o Expanded text on GOAWAY and cancellation (#757) | * Expanded text on GOAWAY and cancellation (#757) | |||
| B.20. Since draft-ietf-quic-http-04 | B.21. Since draft-ietf-quic-http-04 | |||
| o Cite RFC 5234 (#404) | * Cite RFC 5234 (#404) | |||
| o Return to a single stream per request (#245,#557) | * Return to a single stream per request (#245,#557) | |||
| o Use separate frame type and settings registries from HTTP/2 (#81) | * Use separate frame type and settings registries from HTTP/2 (#81) | |||
| o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | * SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| o Restored GOAWAY (#696) | * Restored GOAWAY (#696) | |||
| o 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) | |||
| o DATA frames cannot be empty (#700) | * DATA frames cannot be empty (#700) | |||
| B.21. Since draft-ietf-quic-http-03 | B.22. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.22. Since draft-ietf-quic-http-02 | B.23. Since draft-ietf-quic-http-02 | |||
| o Track changes in transport draft | * Track changes in transport draft | |||
| B.23. Since draft-ietf-quic-http-01 | B.24. Since draft-ietf-quic-http-01 | |||
| o 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 | |||
| * Boolean format updated | - Boolean format updated | |||
| o Alt-Svc parameter changed from "v" to "quic"; format updated | * Alt-Svc parameter changed from "v" to "quic"; format updated | |||
| (#229) | (#229) | |||
| o 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) | |||
| o HPACK Sequence counter can wrap (#173) | * HPACK Sequence counter can wrap (#173) | |||
| o 0-RTT guidance added | * 0-RTT guidance added | |||
| o 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.24. Since draft-ietf-quic-http-00 | B.25. Since draft-ietf-quic-http-00 | |||
| o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | * Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | |||
| o 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) | |||
| o Adopted SETTINGS format from draft-bishop-httpbis-extended- | * Adopted SETTINGS format from draft-bishop-httpbis-extended- | |||
| settings-01 | settings-01 | |||
| o Reworked SETTINGS_ACK to account for indeterminate inter-stream | * Reworked SETTINGS_ACK to account for indeterminate inter-stream | |||
| order (#75) | order (#75) | |||
| o Described CONNECT pseudo-method (#95) | * Described CONNECT pseudo-method (#95) | |||
| o Updated ALPN token and Alt-Svc guidance (#13,#87) | * Updated ALPN token and Alt-Svc guidance (#13,#87) | |||
| o Application-layer-defined error codes (#19,#74) | * Application-layer-defined error codes (#19,#74) | |||
| B.25. Since draft-shade-quic-http2-mapping-00 | B.26. Since draft-shade-quic-http2-mapping-00 | |||
| o Adopted as base for draft-ietf-quic-http | * Adopted as base for draft-ietf-quic-http | |||
| o 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 | A substantial portion of Mike's contribution was supported by | |||
| Microsoft during his employment there. | Microsoft during his employment there. | |||
| Author's Address | Author's Address | |||
| End of changes. 252 change blocks. | ||||
| 455 lines changed or deleted | 491 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/ | ||||