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

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/