draft-ietf-quic-http-20.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 April 23, 2019 Intended status: Standards Track June 24, 2019
Expires: October 25, 2019 Expires: December 26, 2019
Hypertext Transfer Protocol Version 3 (HTTP/3) Hypertext Transfer Protocol Version 3 (HTTP/3)
draft-ietf-quic-http-20 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.
skipping to change at page 1, line 45 skipping to change at page 1, line 45
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 October 25, 2019. This Internet-Draft will expire on December 26, 2019.
Copyright Notice Copyright Notice
Copyright (c) 2019 IETF Trust and the persons identified as the Copyright (c) 2019 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 . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 1.1. Prior versions of HTTP . . . . . . . . . . . . . . . . . 4
2. Connection Setup and Management . . . . . . . . . . . . . . . 5 1.2. Delegation to QUIC . . . . . . . . . . . . . . . . . . . 4
2.1. Draft Version Identification . . . . . . . . . . . . . . 5 2. HTTP/3 Protocol Overview . . . . . . . . . . . . . . . . . . 5
2.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 5 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6
2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 6 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6
2.3. Connection Establishment . . . . . . . . . . . . . . . . 6 3. Connection Setup and Management . . . . . . . . . . . . . . . 8
2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 7 3.1. Draft Version Identification . . . . . . . . . . . . . . 8
3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 3.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 8
3.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 8 3.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 9
3.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 8 3.3. Connection Establishment . . . . . . . . . . . . . . . . 9
3.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 10 3.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 10
3.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 10 4. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 10
3.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 11 4.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 10
4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 11 4.1.1. Header Formatting and Compression . . . . . . . . . . 12
4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 12 4.1.2. Request Cancellation and Rejection . . . . . . . . . 13
4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 13 4.1.3. Malformed Requests and Responses . . . . . . . . . . 14
4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 14
4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 14 4.3. Prioritization . . . . . . . . . . . . . . . . . . . . . 15
4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 14 4.3.1. Placeholders . . . . . . . . . . . . . . . . . . . . 17
4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 17 4.3.2. Priority Tree Maintenance . . . . . . . . . . . . . . 17
4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 18 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 20 5. Connection Closure . . . . . . . . . . . . . . . . . . . . . 20
4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 21 5.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 20
4.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 21 5.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 20
4.2.9. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 22 5.3. Immediate Application Closure . . . . . . . . . . . . . . 22
4.2.10. Reserved Frame Types . . . . . . . . . . . . . . . . 23 5.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 22
5. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 23 6. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 22
5.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 23 6.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 23
5.1.1. Header Formatting and Compression . . . . . . . . . . 25 6.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 23
5.1.2. Request Cancellation and Rejection . . . . . . . . . 25 6.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 24
6.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 25
5.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 26 6.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 25
5.3. Prioritization . . . . . . . . . . . . . . . . . . . . . 27 7. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 26
5.3.1. Placeholders . . . . . . . . . . . . . . . . . . . . 28 7.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 27
5.3.2. Priority Tree Maintenance . . . . . . . . . . . . . . 28 7.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 28
5.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 29 7.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 28
6. Connection Closure . . . . . . . . . . . . . . . . . . . . . 31 7.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 29
6.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 31 7.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 29
6.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 31 7.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 32
6.3. Immediate Application Closure . . . . . . . . . . . . . . 33 7.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 32
6.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 33 7.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 35
7. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 33 7.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 36
8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 34 7.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 36
8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 34 7.2.9. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 37
9. Security Considerations . . . . . . . . . . . . . . . . . . . 36 7.2.10. Reserved Frame Types . . . . . . . . . . . . . . . . 38
10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 38
10.1. Registration of HTTP/3 Identification String . . . . . . 37 8.1. HTTP/3 Error Codes . . . . . . . . . . . . . . . . . . . 39
10.2. Registration of QUIC Version Hint Alt-Svc Parameter . . 37 9. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 40
10.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . 37 10. Security Considerations . . . . . . . . . . . . . . . . . . . 41
10.4. Settings Parameters . . . . . . . . . . . . . . . . . . 38 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 42
10.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 39 11.1. Registration of HTTP/3 Identification String . . . . . . 42
10.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 42 11.2. Registration of QUIC Version Hint Alt-Svc Parameter . . 42
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 11.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . 42
11.1. Normative References . . . . . . . . . . . . . . . . . . 43 11.4. Settings Parameters . . . . . . . . . . . . . . . . . . 44
11.2. Informative References . . . . . . . . . . . . . . . . . 44 11.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 45
11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 45 11.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 47
Appendix A. Considerations for Transitioning from HTTP/2 . . . . 45 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 48
A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 45 12.1. Normative References . . . . . . . . . . . . . . . . . . 48
A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 45 12.2. Informative References . . . . . . . . . . . . . . . . . 50
A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 48 12.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 50
A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 49 Appendix A. Considerations for Transitioning from HTTP/2 . . . . 50
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 50 A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 51
B.1. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 50 A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 51
B.2. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 50 A.2.1. Prioritization Differences . . . . . . . . . . . . . 51
B.3. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 50 A.2.2. Header Compression Differences . . . . . . . . . . . 52
B.4. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 51 A.2.3. Guidance for New Frame Type Definitions . . . . . . . 52
B.5. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 51 A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types . . . . 52
B.6. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 51 A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 53
B.7. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 52 A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 54
B.8. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 52 Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 55
B.9. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 52 B.1. Since draft-ietf-quic-http-19 . . . . . . . . . . . . . . 56
B.10. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 52 B.2. Since draft-ietf-quic-http-18 . . . . . . . . . . . . . . 56
B.11. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 52 B.3. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 56
B.12. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 53 B.4. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 56
B.13. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 53 B.5. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 57
B.14. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 53 B.6. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 57
B.15. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 53 B.7. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 57
B.16. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 53 B.8. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 58
B.17. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 54 B.9. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 58
B.18. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 54 B.10. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 58
B.19. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 54 B.11. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 58
B.20. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 54 B.12. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 58
B.21. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 55 B.13. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 58
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 55 B.14. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 59
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 55 B.15. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 59
B.16. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 59
B.17. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 59
B.18. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 59
B.19. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 59
B.20. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 60
B.21. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 60
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 60
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 61
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/2 introduced a framing and TCP mappings, HTTP/1.1 and HTTP/2. HTTP/3 supports the same
multiplexing layer to improve latency without modifying the transport semantics over a new transport protocol, QUIC.
layer. However, TCP's lack of visibility into parallel requests in
both mappings limited the possible performance gains. 1.1. Prior versions of HTTP
HTTP/1.1 is a TCP mapping which uses whitespace-delimited text fields
to convey HTTP messages. While these exchanges are human-readable,
using whitespace for message formatting leads to parsing difficulties
and workarounds to be tolerant of variant behavior. Because each
connection can transfer only a single HTTP request or response at a
time in each direction, multiple parallel TCP connections are often
used, reducing the ability of the congestion controller to accurately
manage traffic between endpoints.
HTTP/2 introduced a binary framing and multiplexing layer to improve
latency without modifying the transport layer. However, because the
parallel nature of HTTP/2's multiplexing is not visible to TCP's loss
recovery mechanisms, a lost or reordered packet causes all active
transactions to experience a stall regardless of whether that
transaction was impacted by the lost packet.
1.2. Delegation to QUIC
The QUIC transport protocol incorporates stream multiplexing and per- The QUIC transport protocol incorporates stream multiplexing and per-
stream flow control, similar to that provided by the HTTP/2 framing stream flow control, similar to that provided by the HTTP/2 framing
layer. By providing reliability at the stream level and congestion layer. By providing reliability at the stream level and congestion
control across the entire connection, it has the capability to control across the entire connection, it has the capability to
improve the performance of HTTP compared to a TCP mapping. QUIC also improve the performance of HTTP compared to a TCP mapping. QUIC also
incorporates TLS 1.3 at the transport layer, offering comparable incorporates TLS 1.3 at the transport layer, offering comparable
security to running TLS over TCP, but with improved connection setup security to running TLS over TCP, with the improved connection setup
latency (unless TCP Fast Open [RFC7413]} is used). latency of TCP Fast Open [RFC7413]}.
This document defines a mapping of HTTP semantics over the QUIC This document defines a mapping of HTTP semantics over the QUIC
transport protocol, drawing heavily on the design of HTTP/2. This transport protocol, drawing heavily on the design of HTTP/2. While
document identifies HTTP/2 features that are subsumed by QUIC, and delegating stream lifetime and flow control issues to QUIC, a similar
describes how the other features can be implemented atop QUIC. binary framing is used on each stream. Some HTTP/2 features are
subsumed by QUIC, while other features are implemented atop QUIC.
QUIC is described in [QUIC-TRANSPORT]. For a full description of QUIC is described in [QUIC-TRANSPORT]. For a full description of
HTTP/2, see [RFC7540]. HTTP/2, see [HTTP2].
1.1. Notational Conventions 2. HTTP/3 Protocol Overview
HTTP/3 provides a transport for HTTP semantics using the QUIC
transport protocol and an internal framing layer similar to HTTP/2.
Once a client knows that an HTTP/3 server exists at a certain
endpoint, it opens a QUIC connection. QUIC provides protocol
negotiation, stream-based multiplexing, and flow control. An HTTP/3
endpoint can be discovered using HTTP Alternative Services; this
process is described in greater detail in Section 3.2.
Within each stream, the basic unit of HTTP/3 communication is a frame
(Section 7.2). Each frame type serves a different purpose. For
example, HEADERS and DATA frames form the basis of HTTP requests and
responses (Section 4.1). Other frame types like SETTINGS, PRIORITY,
and GOAWAY are used to manage the overall connection and
relationships between streams.
Multiplexing of requests is performed using the QUIC stream
abstraction, described in Section 2 of [QUIC-TRANSPORT]. Each
request and response consumes a single QUIC stream. Streams are
independent of each other, so one stream that is blocked or suffers
packet loss does not prevent progress on other streams.
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
anticipation of the client making the indicated request. This trades
off network usage against a potential latency gain. Several HTTP/3
frames are used to manage server push, such as PUSH_PROMISE,
DUPLICATE_PUSH, MAX_PUSH_ID, and CANCEL_PUSH.
As in HTTP/2, request and response headers are compressed for
transmission. Because HPACK [HPACK] relies on in-order transmission
of compressed header blocks (a guarantee not provided by QUIC),
HTTP/3 replaces HPACK with QPACK [QPACK]. QPACK uses separate
unidirectional streams to modify and track header table state, while
header blocks refer to the state of the table without modifying it.
2.1. Document Organization
The HTTP/3 specification is split into seven parts. The document
begins with a detailed overview of the connection lifecycle and key
concepts:
o Connection Setup and Management (Section 3) covers how an HTTP/3
endpoint is discovered and a connection is established.
o HTTP Request Lifecycle (Section 4) describes how HTTP semantics
are expressed using frames.
o Connection Closure (Section 5) describes how connections are
terminated, either gracefully or abruptly.
The details of the wire protocol and interactions with the transport
are described in subsequent sections:
o Stream Mapping and Usage (Section 6) describes the way QUIC
streams are used.
o HTTP Framing Layer (Section 7) describes the frames used on most
streams.
o Error Handling (Section 8) describes how error conditions are
handled and expressed, either on a particular stream or for the
connection as a whole.
Additional resources are provided in the final sections:
o Extensions to HTTP/3 (Section 9) describes how new capabilities
can be added in future documents.
o A more detailed comparison between HTTP/2 and HTTP/3 can be found
in Appendix A.
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.
Field definitions are given in Augmented Backus-Naur Form (ABNF), as Field definitions are given in Augmented Backus-Naur Form (ABNF), as
defined in [RFC5234]. defined in [RFC5234].
This document uses the variable-length integer encoding from This document uses the variable-length integer encoding from
[QUIC-TRANSPORT]. [QUIC-TRANSPORT].
Protocol elements called "frames" exist in both this document and The following terms are used:
[QUIC-TRANSPORT]. Where frames from [QUIC-TRANSPORT] are referenced,
the frame name will be prefaced with "QUIC." For example, "QUIC
CONNECTION_CLOSE frames." References without this preface refer to
frames defined in Section 4.2.
2. Connection Setup and Management abort: An abrupt termination of a connection or stream, possibly due
to an error condition.
2.1. Draft Version Identification client: The endpoint that initiates an HTTP/3 connection. Clients
send HTTP requests and receive HTTP responses.
connection: A transport-layer connection between two endpoints,
using QUIC as the transport protocol.
connection error: An error that affects the entire HTTP/3
connection.
endpoint: Either the client or server of the connection.
frame: The smallest unit of communication on a stream in HTTP/3,
consisting of a header and a variable-length sequence of octets
structured according to the frame type. Protocol elements called
"frames" exist in both this document and [QUIC-TRANSPORT]. Where
frames from [QUIC-TRANSPORT] are referenced, the frame name will
be prefaced with "QUIC." For example, "QUIC CONNECTION_CLOSE
frames." References without this preface refer to frames defined
in Section 7.2.
peer: An endpoint. When discussing a particular endpoint, "peer"
refers to the endpoint that is remote to the primary subject of
discussion.
receiver: An endpoint that is receiving frames.
sender: An endpoint that is transmitting frames.
server: The endpoint that accepts an HTTP/3 connection. Servers
receive HTTP requests and send HTTP responses.
stream: A bidirectional or unidirectional bytestream provided by the
QUIC transport.
stream error: An error on the individual HTTP/3 stream.
The term "payload body" is defined in Section 3.3 of [RFC7230].
Finally, the terms "gateway", "intermediary", "proxy", and "tunnel"
are defined in Section 2.3 of [RFC7230]. Intermediaries act as both
client and server at different times.
3. Connection Setup and Management
3.1. Draft Version Identification
*RFC Editor's Note:* Please remove this section prior to *RFC Editor's Note:* Please remove this section prior to
publication of a final version of this document. publication of a final version of this document.
HTTP/3 uses the token "h3" to identify itself in ALPN and Alt-Svc. HTTP/3 uses the token "h3" to identify itself in ALPN and Alt-Svc.
Only implementations of the final, published RFC can identify Only implementations of the final, published RFC can identify
themselves as "h3". Until such an RFC exists, implementations MUST themselves as "h3". Until such an RFC exists, implementations MUST
NOT identify themselves using this string. NOT identify themselves using this string.
Implementations of draft versions of the protocol MUST add the string Implementations of draft versions of the protocol MUST add the string
skipping to change at page 5, line 37 skipping to change at page 8, line 35
Non-compatible experiments that are based on these draft versions Non-compatible experiments that are based on these draft versions
MUST append the string "-" and an experiment name to the identifier. MUST append the string "-" and an experiment name to the identifier.
For example, an experimental implementation based on draft-ietf-quic- For example, an experimental implementation based on draft-ietf-quic-
http-09 which reserves an extra stream for unsolicited transmission http-09 which reserves an extra stream for unsolicited transmission
of 1980s pop music might identify itself as "h3-09-rickroll". Note of 1980s pop music might identify itself as "h3-09-rickroll". Note
that any label MUST conform to the "token" syntax defined in that any label MUST conform to the "token" syntax defined in
Section 3.2.6 of [RFC7230]. Experimenters are encouraged to Section 3.2.6 of [RFC7230]. Experimenters are encouraged to
coordinate their experiments on the quic@ietf.org mailing list. coordinate their experiments on the quic@ietf.org mailing list.
2.2. Discovering an HTTP/3 Endpoint 3.2. Discovering an HTTP/3 Endpoint
An HTTP origin advertises the availability of an equivalent HTTP/3 An HTTP origin advertises the availability of an equivalent HTTP/3
endpoint via the Alt-Svc HTTP response header field or the HTTP/2 endpoint via the Alt-Svc HTTP response header field or the HTTP/2
ALTSVC frame ([ALTSVC]), using the ALPN token defined in Section 2.3. ALTSVC frame ([ALTSVC]), using the ALPN token defined in Section 3.3.
For example, an origin could indicate in an HTTP response that HTTP/3 For example, an origin could indicate in an HTTP response that HTTP/3
was available on UDP port 50781 at the same hostname by including the was available on UDP port 50781 at the same hostname by including the
following header field: following header field:
Alt-Svc: h3=":50781" Alt-Svc: h3=":50781"
On receipt of an Alt-Svc record indicating HTTP/3 support, a client On receipt of an Alt-Svc record indicating HTTP/3 support, a client
MAY attempt to establish a QUIC connection to the indicated host and MAY attempt to establish a QUIC connection to the indicated host and
port and, if successful, send HTTP requests using the mapping port and, if successful, send HTTP requests using the mapping
described in this document. described in this document.
Connectivity problems (e.g. firewall blocking UDP) can result in QUIC Connectivity problems (e.g. firewall blocking UDP) can result in QUIC
connection establishment failure, in which case the client SHOULD connection establishment failure, in which case the client SHOULD
continue using the existing connection or try another alternative continue using the existing connection or try another alternative
endpoint offered by the origin. endpoint offered by the origin.
Servers MAY serve HTTP/3 on any UDP port, since an alternative always Servers MAY serve HTTP/3 on any UDP port, since an alternative always
includes an explicit port. includes an explicit port.
2.2.1. QUIC Version Hints 3.2.1. QUIC Version Hints
This document defines the "quic" parameter for Alt-Svc, which MAY be This document defines the "quic" parameter for Alt-Svc, which MAY be
used to provide version-negotiation hints to HTTP/3 clients. QUIC used to provide version-negotiation hints to HTTP/3 clients. QUIC
versions are four-byte sequences with no additional constraints on versions are four-byte sequences with no additional constraints on
format. Leading zeros SHOULD be omitted for brevity. format. Leading zeros SHOULD be omitted for brevity.
Syntax: Syntax:
quic = DQUOTE version-number [ "," version-number ] * DQUOTE quic = DQUOTE version-number [ "," version-number ] * DQUOTE
version-number = 1*8HEXDIG; hex-encoded QUIC version version-number = 1*8HEXDIG; hex-encoded QUIC version
skipping to change at page 6, line 47 skipping to change at page 9, line 47
the version rendered in ASCII as "Q034". If it also opted to include the version rendered in ASCII as "Q034". If it also opted to include
the reserved version (from Section 15 of [QUIC-TRANSPORT]) the reserved version (from Section 15 of [QUIC-TRANSPORT])
0x1abadaba, it could specify the following header field: 0x1abadaba, it could specify the following header field:
Alt-Svc: h3=":49288";quic="1,1abadaba,51303334" Alt-Svc: h3=":49288";quic="1,1abadaba,51303334"
A client acting on this header field would drop the reserved version A client acting on this header field would drop the reserved version
(not supported), then attempt to connect to the alternative using the (not supported), then attempt to connect to the alternative using the
first version in the list which it does support, if any. first version in the list which it does support, if any.
2.3. Connection Establishment 3.3. Connection Establishment
HTTP/3 relies on QUIC as the underlying transport. The QUIC version HTTP/3 relies on QUIC as the underlying transport. The QUIC version
being used MUST use TLS version 1.3 or greater as its handshake being used MUST use TLS version 1.3 or greater as its handshake
protocol. HTTP/3 clients MUST indicate the target domain name during protocol. HTTP/3 clients MUST indicate the target domain name during
the TLS handshake. This may be done using the Server Name Indication the TLS handshake. This may be done using the Server Name Indication
(SNI) [RFC6066] extension to TLS or using some other mechanism. (SNI) [RFC6066] extension to TLS or using some other mechanism.
QUIC connections are established as described in [QUIC-TRANSPORT]. QUIC connections are established as described in [QUIC-TRANSPORT].
During connection establishment, HTTP/3 support is indicated by During connection establishment, HTTP/3 support is indicated by
selecting the ALPN token "h3" in the TLS handshake. Support for selecting the ALPN token "h3" in the TLS handshake. Support for
other application-layer protocols MAY be offered in the same other application-layer protocols MAY be offered in the same
handshake. handshake.
While connection-level options pertaining to the core QUIC protocol While connection-level options pertaining to the core QUIC protocol
are set in the initial crypto handshake, HTTP/3-specific settings are are set in the initial crypto handshake, HTTP/3-specific settings are
conveyed in the SETTINGS frame. After the QUIC connection is conveyed in the SETTINGS frame. After the QUIC connection is
established, a SETTINGS frame (Section 4.2.5) MUST be sent by each established, a SETTINGS frame (Section 7.2.5) MUST be sent by each
endpoint as the initial frame of their respective HTTP control stream endpoint as the initial frame of their respective HTTP control stream
(see Section 3.2.1). (see Section 6.2.1).
2.4. Connection Reuse 3.4. Connection Reuse
Once a connection exists to a server endpoint, this connection MAY be Once a connection exists to a server endpoint, this connection MAY be
reused for requests with multiple different URI authority components. reused for requests with multiple different URI authority components.
The client MAY send any requests for which the client considers the The client MAY send any requests for which the client considers the
server authoritative. server authoritative.
An authoritative HTTP/3 endpoint is typically discovered because the An authoritative HTTP/3 endpoint is typically discovered because the
client has received an Alt-Svc record from the request's origin which client has received an Alt-Svc record from the request's origin which
nominates the endpoint as a valid HTTP Alternative Service for that nominates the endpoint as a valid HTTP Alternative Service for that
origin. As required by [RFC7838], clients MUST check that the origin. As required by [RFC7838], clients MUST check that the
nominated server can present a valid certificate for the origin nominated server can present a valid certificate for the origin
before considering it authoritative. Clients MUST NOT assume that an before considering it authoritative. Clients MUST NOT assume that an
HTTP/3 endpoint is authoritative for other origins without an HTTP/3 endpoint is authoritative for other origins without an
explicit signal. explicit signal.
A server that does not wish clients to reuse connections for a A server that does not wish clients to reuse connections for a
particular origin can indicate that it is not authoritative for a particular origin can indicate that it is not authoritative for a
request by sending a 421 (Misdirected Request) status code in request by sending a 421 (Misdirected Request) status code in
response to the request (see Section 9.1.2 of [RFC7540]). response to the request (see Section 9.1.2 of [HTTP2]).
The considerations discussed in Section 9.1 of [RFC7540] also apply The considerations discussed in Section 9.1 of [HTTP2] also apply to
to the management of HTTP/3 connections. the management of HTTP/3 connections.
3. Stream Mapping and Usage 4. HTTP Request Lifecycle
4.1. HTTP Message Exchanges
A client sends an HTTP request on a client-initiated bidirectional
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
same stream as the request, followed by a single final HTTP response,
as detailed below.
An HTTP message (request or response) consists of:
1. the message header (see [RFC7230], Section 3.2), sent as a single
HEADERS frame (see Section 7.2.2),
2. the payload body (see [RFC7230], Section 3.3), sent as a series
of DATA frames (see Section 7.2.1),
3. optionally, one HEADERS frame containing the trailer-part, if
present (see [RFC7230], Section 4.1.2).
A server MAY send one or more PUSH_PROMISE frames (see Section 7.2.6)
before, after, or interleaved with the frames of a response message.
These PUSH_PROMISE frames are not part of the response; see
Section 4.4 for more details.
The HEADERS and PUSH_PROMISE frames might reference updates to the
QPACK dynamic table. While these updates are not directly part of
the message exchange, they must be received and processed before the
message can be consumed. See Section 4.1.1 for more details.
The "chunked" transfer encoding defined in Section 4.1 of [RFC7230]
MUST NOT be used.
If a DATA frame is received before a HEADERS frame on a either a
request or push stream, the recipient MUST respond with a connection
error of type HTTP_UNEXPECTED_FRAME (Section 8).
Trailing header fields are carried in an additional HEADERS frame
following the body. Senders MUST send only one HEADERS frame in the
trailers section; receivers MUST discard any subsequent HEADERS
frames.
A response MAY consist of multiple messages when and only when one or
more informational responses (1xx; see [RFC7231], Section 6.2)
precede a final response to the same request. Non-final responses do
not contain a payload body or trailers.
An HTTP request/response exchange fully consumes a bidirectional QUIC
stream. After sending a request, a client MUST close the stream for
sending. Unless using the CONNECT method (see Section 4.2), clients
MUST NOT make stream closure dependent on receiving a response to
their request. After sending a final response, the server MUST close
the stream for sending. At this point, the QUIC stream is fully
closed.
When a stream is closed, this indicates the end of an HTTP message.
Because some messages are large or unbounded, endpoints SHOULD begin
processing partial HTTP messages once enough of the message has been
received to make progress. If a client stream terminates without
enough of the HTTP message to provide a complete response, the server
SHOULD abort its response with the error code
HTTP_INCOMPLETE_REQUEST.
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
request that has not been sent and received. When this is true, a
server MAY request that the client abort transmission of a request
without error by triggering a QUIC STOP_SENDING frame with error code
HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing
its stream. Clients MUST NOT discard complete responses as a result
of having their request terminated abruptly, though clients can
always discard responses at their discretion for other reasons.
4.1.1. Header Formatting and Compression
HTTP message headers carry information as a series of key-value
pairs, called header fields. For a listing of registered HTTP header
fields, see the "Message Header Field" registry maintained at
https://www.iana.org/assignments/message-headers [4].
Just as in previous versions of HTTP, header field names are strings
of ASCII characters that are compared in a case-insensitive fashion.
Properties of HTTP header field names and values are discussed 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
to lowercase prior to their encoding. A request or response
containing uppercase header field names MUST be treated as malformed
(Section 4.1.3).
As in HTTP/2, HTTP/3 uses special pseudo-header fields beginning with
the ':' character (ASCII 0x3a) to convey the target URI, the method
of the request, and the status code for the response. These pseudo-
header fields are defined in Section 8.1.2.3 and 8.1.2.4 of [HTTP2].
Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT
generate pseudo-header fields other than those defined in [HTTP2].
The restrictions on the use of pseudo-header fields in
Section 8.1.2.1 of [HTTP2] also apply to HTTP/3.
HTTP/3 uses QPACK header compression as described in [QPACK], a
variation of HPACK which allows the flexibility to avoid header-
compression-induced head-of-line blocking. See that document for
additional details.
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
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
code [RFC6585]. A client can discard responses that it cannot
process. The size of a header field list is calculated based on the
uncompressed size of header fields, including the length of the name
and value in bytes plus an overhead of 32 bytes for each header
field.
If an implementation wishes to advise its peer of this limit, it can
be conveyed as a number of bytes in the
"SETTINGS_MAX_HEADER_LIST_SIZE" parameter. An implementation which
has received this parameter SHOULD NOT send an HTTP message header
which exceeds the indicated size, as the peer will likely refuse to
process it. However, because this limit is applied at each hop,
messages below this limit are not guaranteed to be accepted.
4.1.2. Request Cancellation and Rejection
Clients can cancel requests by aborting the stream (QUIC RESET_STREAM
and/or STOP_SENDING frames, as appropriate) with an error code of
HTTP_REQUEST_CANCELLED (Section 8.1). When the client cancels a
response, it indicates that this response is no longer of interest.
Implementations SHOULD cancel requests by aborting both directions of
a stream.
When the server rejects a request without performing any application
processing, it SHOULD abort its response stream with the error code
HTTP_REQUEST_REJECTED. In this context, "processed" means that some
data from the stream was passed to some higher layer of software that
might have taken some action as a result. The client can treat
requests rejected by the server as though they had never been sent at
all, thereby allowing them to be retried later on a new connection.
Servers MUST NOT use the HTTP_REQUEST_REJECTED error code for
requests which were partially or fully processed. When a server
abandons a response after partial processing, it SHOULD abort its
response stream with the error code HTTP_REQUEST_CANCELLED.
When a client sends a STOP_SENDING with HTTP_REQUEST_CANCELLED, a
server MAY send the error code HTTP_REQUEST_REJECTED in the
corresponding RESET_STREAM if no processing was performed. Clients
MUST NOT reset streams with the HTTP_REQUEST_REJECTED error code
except in response to a QUIC STOP_SENDING frame that contains the
same code.
If a stream is cancelled after receiving a complete response, the
client MAY ignore the cancellation and use the response. However, if
a stream is cancelled after receiving a partial response, the
response SHOULD NOT be used. Automatically retrying such requests is
not possible, unless this is otherwise permitted (e.g., idempotent
actions like GET, PUT, or DELETE).
4.1.3. Malformed Requests and Responses
A malformed request or response is one that is an otherwise valid
sequence of frames but is invalid due to the presence of extraneous
frames, prohibited header fields, the absence of mandatory header
fields, or the inclusion of uppercase header field names.
A request or response that includes a payload body can include a
"content-length" header field. A request or response is also
malformed if the value of a content-length header field does not
equal the sum of the DATA frame payload lengths that form the body.
A response that is defined to have no payload, as described in
Section 3.3.2 of [RFC7230] can have a non-zero content-length header
field, even though no content is included in DATA frames.
Intermediaries that process HTTP requests or responses (i.e., any
intermediary not acting as a tunnel) MUST NOT forward a malformed
request or response. Malformed requests or responses that are
detected MUST be treated as a stream error (Section 8) of type
HTTP_GENERAL_PROTOCOL_ERROR.
For malformed requests, a server MAY send an HTTP response prior to
closing or resetting the stream. Clients MUST NOT accept a malformed
response. Note that these requirements are intended to protect
against several types of common attacks against HTTP; they are
deliberately strict because being permissive can expose
implementations to these vulnerabilities.
4.2. The CONNECT Method
The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily
used with HTTP proxies to establish a TLS session with an origin
server for the purposes of interacting with "https" resources. In
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
establish a tunnel over a single HTTP/2 stream to a remote host for
similar purposes.
A CONNECT request in HTTP/3 functions in the same manner as in
HTTP/2. The request MUST be formatted as described in [HTTP2],
Section 8.3. A CONNECT request that does not conform to these
restrictions is malformed (see Section 4.1.3). The request stream
MUST NOT be closed at the end of the request.
A proxy that supports CONNECT establishes a TCP connection
([RFC0793]) to the server identified in the ":authority" pseudo-
header field. Once this connection is successfully established, the
proxy sends a HEADERS frame containing a 2xx series status code to
the client, as defined in [RFC7231], Section 4.3.6.
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
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
number of TCP segments is not guaranteed to map predictably to the
size and number of HTTP DATA or QUIC STREAM frames.
Once the CONNECT method has completed, only DATA frames are permitted
to be sent on the stream. Extension frames MAY be used if
specifically permitted by the definition of the extension. Receipt
of any other frame type MUST be treated as a connection error of type
HTTP_UNEXPECTED_FRAME.
The TCP connection can be closed by either peer. When the client
ends the request stream (that is, the receive stream at the proxy
enters the "Data Recvd" state), the proxy will set the FIN bit on its
connection to the TCP server. When the proxy receives a packet with
the FIN bit set, it will terminate the send stream that it sends to
the client. TCP connections which remain half-closed in a single
direction are not invalid, but are often handled poorly by servers,
so clients SHOULD NOT close a stream for sending while they still
expect to receive data from the target of the CONNECT.
A TCP connection error is signaled with QUIC RESET_STREAM frame. A
proxy treats any error in the TCP connection, which includes
receiving a TCP segment with the RST bit set, as a stream error of
type HTTP_CONNECT_ERROR (Section 8.1). Correspondingly, if a proxy
detects an error with the stream or the QUIC connection, it MUST
close the TCP connection. If the underlying TCP implementation
permits it, the proxy SHOULD send a TCP segment with the RST bit set.
4.3. Prioritization
The purpose of prioritization is to allow a client to express how it
would prefer the server to allocate resources when managing
concurrent streams. Most importantly, priority can be used to select
streams for transmitting frames when there is limited capacity for
sending.
HTTP/3 uses a priority scheme similar to that described in [RFC7540],
Section 5.3. In this priority scheme, a given element can be
designated as dependent upon another element. Each dependency is
assigned a relative weight, a number that is used to determine the
relative proportion of available resources that are assigned to
streams dependent on the same stream. This information is expressed
in the PRIORITY frame Section 7.2.3 which identifies the element and
the dependency. The elements that can be prioritized are:
o Requests, identified by the ID of the request stream
o Pushes, identified by the Push ID of the promised resource
(Section 7.2.6)
o Placeholders, identified by a Placeholder ID
Taken together, the dependencies across all prioritized elements in a
connection form a dependency tree. An element can depend on another
element or on the root of the tree. The tree also contains an orphan
placeholder. This placeholder cannot be reprioritized, and no
resources should be allocated to descendants of the orphan
placeholder if progress can be made on descendants of the root. The
structure of the dependency tree changes as PRIORITY frames modify
the dependency links between other prioritized elements.
An exclusive flag allows for the insertion of a new level of
dependencies. The exclusive flag causes the prioritized element to
become the sole dependency of its parent, causing other dependencies
to become dependent on the exclusive element.
All dependent streams are allocated an integer weight between 1 and
256 (inclusive), derived by adding one to the weight expressed in the
PRIORITY frame.
Streams with the same parent SHOULD be allocated resources
proportionally based on their weight. Thus, if stream B depends on
stream A with weight 4, stream C depends on stream A with weight 12,
and no progress can be made on stream A, stream B ideally receives
one-third of the resources allocated to stream C.
A reference to an element which is no longer in the tree is treated
as a reference to the orphan placeholder. Due to reordering between
streams, an element can also be prioritized which is not yet in the
tree. Such elements are added to the tree with the requested
priority. If a prioritized element depends on another element which
is not yet in the tree, the requested parent is first added to the
tree with the default priority.
When a prioritized element is first created, it has a default initial
weight of 16 and a default dependency. Requests and placeholders are
dependent on the orphan placeholder; pushes are dependent on the
client request on which the PUSH_PROMISE frame was sent.
Priorities can be updated by sending a PRIORITY frame (see
Section 7.2.3) on the control stream.
4.3.1. Placeholders
In HTTP/2, certain implementations used closed or unused streams as
placeholders in describing the relative priority of requests. This
created confusion as servers could not reliably identify which
elements of the priority tree could be discarded safely. Clients
could potentially reference closed streams long after the server had
discarded state, leading to disparate views of the prioritization the
client had attempted to express.
In HTTP/3, a number of placeholders are explicitly permitted by the
server using the "SETTINGS_NUM_PLACEHOLDERS" setting. Because the
server commits to maintaining these placeholders in the
prioritization tree, clients can use them with confidence that the
server will not have discarded the state. Clients MUST NOT send the
"SETTINGS_NUM_PLACEHOLDERS" setting; receipt of this setting by a
server MUST be treated as a connection error of type
"HTTP_WRONG_SETTING_DIRECTION".
Client-controlled placeholders are identified by an ID between zero
and one less than the number of placeholders the server has
permitted. The orphan placeholder cannot be prioritized or
referenced by the client.
Like streams, client-controlled placeholders have priority
information associated with them.
4.3.2. Priority Tree Maintenance
Because placeholders will be used to "root" any persistent structure
of the tree which the client cares about retaining, servers can
aggressively prune inactive regions from the priority tree. For
prioritization purposes, a node in the tree is considered "inactive"
when the corresponding stream has been closed for at least two round-
trip times (using any reasonable estimate available on the server).
This delay helps mitigate race conditions where the server has pruned
a node the client believed was still active and used as a Stream
Dependency.
Specifically, the server MAY at any time:
o Identify and discard branches of the tree containing only inactive
nodes (i.e. a node with only other inactive nodes as descendants,
along with those descendants)
o Identify and condense interior regions of the tree containing only
inactive nodes, allocating weight appropriately
x x x
| | |
P P P
/ \ | |
I I ==> I ==> A
/ \ | |
A I A A
| |
A A
Figure 1: Example of Priority Tree Pruning
In the example in Figure 1, "P" represents a Placeholder, "A"
represents an active node, and "I" represents an inactive node. In
the first step, the server discards two inactive branches (each a
single node). In the second step, the server condenses an interior
inactive node. Note that these transformations will result in no
change in the resources allocated to a particular active stream.
Clients SHOULD assume the server is actively performing such pruning
and SHOULD NOT declare a dependency on a stream it knows to have been
closed.
4.4. Server Push
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
anticipation of the client making the indicated request. This trades
off network usage against a potential latency gain. HTTP/3 server
push is similar to what is described in HTTP/2 [HTTP2], but uses
different mechanisms.
Each server push is identified by a unique Push ID. This Push ID is
used in a single PUSH_PROMISE frame (see Section 7.2.6) which carries
the request headers, possibly included in one or more DUPLICATE_PUSH
frames (see Section 7.2.9), then included with the push stream which
ultimately fulfills those promises.
Server push is only enabled on a connection when a client sends a
MAX_PUSH_ID frame (see Section 7.2.8). A server cannot use server
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
server can promise. A server SHOULD use Push IDs sequentially,
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
error of type HTTP_LIMIT_EXCEEDED.
The header of the request message is carried by a PUSH_PROMISE frame
(see Section 7.2.6) 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
[HTTP2].
The same server push can be associated with additional client
requests using a DUPLICATE_PUSH frame (see Section 7.2.9).
Ordering of a PUSH_PROMISE or DUPLICATE_PUSH in relation to certain
parts of the response is important. The server SHOULD send
PUSH_PROMISE or DUPLICATE_PUSH frames prior to sending HEADERS or
DATA frames that reference the promised responses. This reduces the
chance that a client requests a resource that will be pushed by the
server.
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
identifies the Push ID of the promise that it fulfills, then contains
a response to the promised request using the same format described
for responses in Section 4.1.
Due to reordering, DUPLICATE_PUSH frames or push stream data can
arrive before the corresponding PUSH_PROMISE frame. When a client
receives a DUPLICATE_PUSH frame for an as-yet-unknown Push ID, the
request headers of the push are not immediately available. The
client can either delay generating new requests for content
referenced following the DUPLICATE_PUSH frame until the request
headers become available, or can initiate requests for discovered
resources and cancel the requests if the requested resource is
already being pushed. When a client receives a new push stream with
an as-yet-unknown Push ID, both the associated client request and the
pushed request headers are unknown. The client can buffer the stream
data in expectation of the matching PUSH_PROMISE. The client can use
stream flow control (see section 4.1 of [QUIC-TRANSPORT]) to limit
the amount of data a server may commit to the pushed stream.
If a promised server push is not needed by the client, the client
SHOULD send a CANCEL_PUSH frame. If the push stream is already open
or opens after sending the CANCEL_PUSH frame, a QUIC STOP_SENDING
frame with an appropriate error code can also be used (e.g.,
HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see Section 8). This
asks the server not to transfer additional data and indicates that it
will be discarded upon receipt.
5. Connection Closure
Once established, an HTTP/3 connection can be used for many requests
and responses over time until the connection is closed. Connection
closure can happen in any of several different ways.
5.1. Idle Connections
Each QUIC endpoint declares an idle timeout during the handshake. If
the connection remains idle (no packets received) for longer than
this duration, the peer will assume that the connection has been
closed. HTTP/3 implementations will need to open a new connection
for new requests if the existing connection has been idle for longer
than the server's advertised idle timeout, and SHOULD do so if
approaching the idle timeout.
HTTP clients are expected to request that the transport keep
connections open while there are responses outstanding for requests
or server pushes, as described in Section 19.2 of [QUIC-TRANSPORT].
If the client is not expecting a response from the server, allowing
an idle connection to time out is preferred over expending effort
maintaining a connection that might not be needed. A gateway MAY
maintain connections in anticipation of need rather than incur the
latency cost of connection establishment to servers. Servers SHOULD
NOT actively keep connections open.
5.2. Connection Shutdown
Even when a connection is not idle, either endpoint can decide to
stop using the connection and let the connection close gracefully.
Since clients drive request generation, clients perform a connection
shutdown by not sending additional requests on the connection;
responses and pushed responses associated to previous requests will
continue to completion. Servers perform the same function by
communicating with clients.
Servers initiate the shutdown of a connection by sending a GOAWAY
frame (Section 7.2.7). The GOAWAY frame indicates that client-
initiated requests on lower stream IDs were or might be processed in
this connection, while requests on the indicated stream ID and
greater were rejected. This enables client and server to agree on
which requests were accepted prior to the connection shutdown. This
identifier MAY be zero if no requests were processed. Servers SHOULD
NOT increase the QUIC MAX_STREAMS limit after sending a GOAWAY frame.
Clients MUST NOT send new requests on the connection after receiving
GOAWAY; a new connection MAY be established to send additional
requests.
Some requests might already be in transit. If the client has already
sent requests on streams with a Stream ID greater than or equal to
that indicated in the GOAWAY frame, those requests will not be
processed and MAY be retried by the client on a different connection.
The client MAY cancel these requests. It is RECOMMENDED that the
server explicitly reject such requests (see Section 4.1.2) in order
to clean up transport state for the affected streams.
Requests on Stream IDs less than the Stream ID in the GOAWAY frame
might have been processed; their status cannot be known until a
response is received, the stream is reset individually, or the
connection terminates. Servers MAY reject individual requests on
streams below the indicated ID if these requests were not processed.
Servers SHOULD send a GOAWAY frame when the closing of a connection
is known in advance, even if the advance notice is small, so that the
remote peer can know whether a request has been partially processed
or not. For example, if an HTTP client sends a POST at the same time
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
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
in flight when the server closes the connection. A server MAY send
multiple GOAWAY frames indicating different stream IDs, but MUST NOT
increase the value they send in the last Stream ID, since clients
might already have retried unprocessed requests on another
connection. A server that is attempting to gracefully shut down a
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
NOT increase the MAX_STREAMS limit thereafter. This signals to the
client that a shutdown is imminent and that initiating further
requests is prohibited. After allowing time for any in-flight
requests (at least one round-trip time), the server MAY send another
GOAWAY frame with an updated last Stream ID. This ensures that a
connection can be cleanly shut down without losing requests.
Once all accepted requests have been processed, the server can permit
the connection to become idle, or MAY initiate an immediate closure
of the connection. An endpoint that completes a graceful shutdown
SHOULD use the HTTP_NO_ERROR code when closing the connection.
If a client has consumed all available bidirectional stream IDs with
requests, the server need not send a GOAWAY frame, since the client
is unable to make further requests.
5.3. Immediate Application Closure
An HTTP/3 implementation can immediately close the QUIC connection at
any time. This results in sending a QUIC CONNECTION_CLOSE frame to
the peer; the error code in this frame indicates to the peer why the
connection is being closed. See Section 8 for error codes which can
be used when closing a connection.
Before closing the connection, a GOAWAY MAY be sent to allow the
client to retry some requests. Including the GOAWAY frame in the
same packet as the QUIC CONNECTION_CLOSE frame improves the chances
of the frame being received by clients.
5.4. Transport Closure
For various reasons, the QUIC transport could indicate to the
application layer that the connection has terminated. This might be
due to an explicit closure by the peer, a transport-level error, or a
change in network topology which interrupts connectivity.
If a connection terminates without a GOAWAY frame, clients MUST
assume that any request which was sent, whether in whole or in part,
might have been processed.
6. Stream Mapping and Usage
A QUIC stream provides reliable in-order delivery of bytes, but makes A QUIC stream provides reliable in-order delivery of bytes, but makes
no guarantees about order of delivery with regard to bytes on other no guarantees about order of delivery with regard to bytes on other
streams. On the wire, data is framed into QUIC STREAM frames, but streams. On the wire, data is framed into QUIC STREAM frames, but
this framing is invisible to the HTTP framing layer. The transport this framing is invisible to the HTTP framing layer. The transport
layer buffers and orders received QUIC STREAM frames, exposing the layer buffers and orders received QUIC STREAM frames, exposing the
data contained within as a reliable byte stream to the application. data contained within as a reliable byte stream to the application.
Although QUIC permits out-of-order delivery within a stream, HTTP/3
Although QUIC permits out-of-order delivery within a stream HTTP/3
does not make use of this feature. does not make use of this feature.
QUIC streams can be either unidirectional, carrying data only from QUIC streams can be either unidirectional, carrying data only from
initiator to receiver, or bidirectional. Streams can be initiated by initiator to receiver, or bidirectional. Streams can be initiated by
either the client or the server. For more detail on QUIC streams, either the client or the server. For more detail on QUIC streams,
see Section 2 of [QUIC-TRANSPORT]. see Section 2 of [QUIC-TRANSPORT].
When HTTP headers and data are sent over QUIC, the QUIC layer handles When HTTP headers and data are sent over QUIC, the QUIC layer handles
most of the stream management. HTTP does not need to do any separate most of the stream management. HTTP does not need to do any separate
multiplexing when using QUIC - data sent over a QUIC stream always multiplexing when using QUIC - data sent over a QUIC stream always
maps to a particular HTTP transaction or connection context. maps to a particular HTTP transaction or connection context.
3.1. Bidirectional Streams 6.1. Bidirectional Streams
All client-initiated bidirectional streams are used for HTTP requests All client-initiated bidirectional streams are used for HTTP requests
and responses. A bidirectional stream ensures that the response can and responses. A bidirectional stream ensures that the response can
be readily correlated with the request. This means that the client's be readily correlated with the request. This means that the client's
first request occurs on QUIC stream 0, with subsequent requests on first request occurs on QUIC stream 0, with subsequent requests on
stream 4, 8, and so on. In order to permit these streams to open, an stream 4, 8, and so on. In order to permit these streams to open, an
HTTP/3 client SHOULD send non-zero values for the QUIC transport HTTP/3 client SHOULD send non-zero values for the QUIC transport
parameters "initial_max_stream_data_bidi_local". An HTTP/3 server parameters "initial_max_stream_data_bidi_local". An HTTP/3 server
SHOULD send non-zero values for the QUIC transport parameters SHOULD send non-zero values for the QUIC transport parameters
"initial_max_stream_data_bidi_remote" and "initial_max_bidi_streams". "initial_max_stream_data_bidi_remote" and "initial_max_bidi_streams".
It is recommended that "initial_max_bidi_streams" be no smaller than It is RECOMMENDED that "initial_max_bidi_streams" be no smaller than
100, so as to not unnecessarily limit parallelism. 100, so as to not unnecessarily limit parallelism.
These streams carry frames related to the request/response (see HTTP/3 does not use server-initiated bidirectional streams, though an
Section 5.1). When a stream terminates cleanly, if the last frame on extension could define a use for these streams. Clients MUST treat
the stream was truncated, this MUST be treated as a connection error receipt of a server-initiated bidirectional stream as a connection
(see HTTP_MALFORMED_FRAME in Section 8.1). Streams which terminate error of type HTTP_GENERAL_PROTOCOL_ERROR unless such an extension
abruptly may be reset at any point in the frame. has been negotiated.
HTTP/3 does not use server-initiated bidirectional streams; clients
MUST omit or specify a value of zero for the QUIC transport parameter
"initial_max_bidi_streams".
3.2. Unidirectional Streams 6.2. Unidirectional Streams
Unidirectional streams, in either direction, are used for a range of Unidirectional streams, in either direction, are used for a range of
purposes. The purpose is indicated by a stream type, which is sent purposes. The purpose is indicated by a stream type, which is sent
as a variable-length integer at the start of the stream. The format as a variable-length integer at the start of the stream. The format
and structure of data that follows this integer is determined by the and structure of data that follows this integer is determined by the
stream type. stream type.
0 1 2 3 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 2: Unidirectional Stream Header
Some stream types are reserved (Section 3.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 3.2.1) and push defined in this document: control streams (Section 6.2.1) and push
streams (Section 3.2.2). Other stream types can be defined by streams (Section 6.2.2). Other stream types can be defined by
extensions to HTTP/3; see Section 7 for more details. extensions to HTTP/3; 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 set low values for the QUIC unidirectional streams. Endpoints that set low values for the QUIC
transport parameters "initial_max_uni_streams" and transport parameters "initial_max_uni_streams" and
"initial_max_stream_data_uni" will increase the chance that the "initial_max_stream_data_uni" will increase the chance that the
remote peer reaches the limit early and becomes blocked. In remote peer reaches the limit early and becomes blocked. In
particular, the value chosen for "initial_max_uni_streams" should particular, the value chosen for "initial_max_uni_streams" should
consider that remote peers may wish to exercise reserved stream consider that remote peers may wish to exercise reserved stream
behaviour (Section 3.2.3). To reduce the likelihood of blocking, behavior (Section 6.2.3). To avoid blocking, both clients and
both clients and servers SHOULD send a value of three or greater for servers MUST allow the peer to create at least one unidirectional
the QUIC transport parameter "initial_max_uni_streams", and a value stream for the HTTP control stream plus the number of unidirectional
of 1,024 or greater for the QUIC transport parameter streams required by mandatory extensions (such as QPACK) by setting
an appropriate value for the QUIC transport parameter
"initial_max_uni_streams" (three being the minimum value required for
the base HTTP/3 protocol and QPACK), and SHOULD use a value of 1,024
or greater for the QUIC transport parameter
"initial_max_stream_data_uni". "initial_max_stream_data_uni".
Note that an endpoint is not required to grant additional credits to
create more unidirectional streams if its peer consumes all the
initial credits before creating the critical unidirectional streams.
Endpoints SHOULD create the HTTP control stream as well as the
unidirectional streams required by mandatory extensions (such as the
QPACK encoder and decoder streams) first, and then create additional
streams as allowed by their peer.
If the stream header indicates a stream type which is not supported If the stream header indicates a stream type which is not supported
by the recipient, the remainder of the stream cannot be consumed as by the recipient, the remainder of the stream cannot be consumed as
the semantics are unknown. Recipients of unknown stream types MAY the semantics are unknown. Recipients of unknown stream types MAY
trigger a QUIC STOP_SENDING frame with an error code of trigger a QUIC STOP_SENDING frame with an error code of
HTTP_UNKNOWN_STREAM_TYPE, but MUST NOT consider such streams to be an HTTP_UNKNOWN_STREAM_TYPE, but MUST NOT consider such streams to be a
error of any kind. connection error of any kind.
Implementations MAY send stream types before knowing whether the peer Implementations MAY send stream types before knowing whether the peer
supports them. However, stream types which could modify the state or supports them. However, stream types which could modify the state or
semantics of existing protocol components, including QPACK or other semantics of existing protocol components, including QPACK or other
extensions, MUST NOT be sent until the peer is known to support them. extensions, MUST NOT be sent until the peer is known to support them.
A sender can close or reset a unidirectional stream unless otherwise A sender can close or reset a unidirectional stream unless otherwise
specified. A receiver MUST tolerate unidirectional streams being specified. A receiver MUST tolerate unidirectional streams being
closed or reset prior to the reception of the unidirectional stream closed or reset prior to the reception of the unidirectional stream
header. header.
3.2.1. Control Streams 6.2.1. Control Streams
A control stream is indicated by a stream type of "0x00". Data on A control stream is indicated by a stream type of "0x00". Data on
this stream consists of HTTP/3 frames, as defined in Section 4.2. this stream consists of HTTP/3 frames, as defined in Section 7.2.
Each side MUST initiate a single control stream at the beginning of Each side MUST initiate a single control stream at the beginning of
the connection and send its SETTINGS frame as the first frame on this the connection and send its SETTINGS frame as the first frame on this
stream. If the first frame of the control stream is any other frame stream. If the first frame of the control stream is any other frame
type, this MUST be treated as a connection error of type type, this MUST be treated as a connection error of type
HTTP_MISSING_SETTINGS. Only one control stream per peer is HTTP_MISSING_SETTINGS. Only one control stream per peer is
permitted; receipt of a second stream which claims to be a control permitted; receipt of a second stream which claims to be a control
stream MUST be treated as a connection error of type stream MUST be treated as a connection error of type
HTTP_WRONG_STREAM_COUNT. The sender MUST NOT close the control HTTP_WRONG_STREAM_COUNT. The sender MUST NOT close the control
stream. If the control stream is closed at any point, this MUST be stream, and the receiver MUST NOT request that the sender close the
treated as a connection error of type HTTP_CLOSED_CRITICAL_STREAM. control stream. If either control stream is closed at any point,
this MUST be treated as a connection error of type
HTTP_CLOSED_CRITICAL_STREAM.
A pair of unidirectional streams is used rather than a single A pair of unidirectional streams is used rather than a single
bidirectional stream. This allows either peer to send data as soon bidirectional stream. This allows either peer to send data as soon
they are able. Depending on whether 0-RTT is enabled on the as it is able. Depending on whether 0-RTT is enabled on the
connection, either client or server might be able to send stream data connection, either client or server might be able to send stream data
first after the cryptographic handshake completes. first after the cryptographic handshake completes.
3.2.2. Push Streams 6.2.2. Push Streams
Server push is an optional feature introduced in HTTP/2 that allows a
server to initiate a response before a request has been made. See
Section 4.4 for more details.
A push stream is indicated by a stream type of "0x01", followed by A push stream is indicated by a stream type of "0x01", followed by
the Push ID of the promise that it fulfills, encoded as a variable- the Push ID of the promise that it fulfills, encoded as a variable-
length integer. The remaining data on this stream consists of HTTP/3 length integer. The remaining data on this stream consists of HTTP/3
frames, as defined in Section 4.2, and fulfills a promised server frames, as defined in Section 7.2, and fulfills a promised server
push. Server push and Push IDs are described in Section 5.4. push. Server push and Push IDs are described in Section 4.4.
Only servers can push; if a server receives a client-initiated push Only servers can push; if a server receives a client-initiated push
stream, this MUST be treated as a stream error of type stream, this MUST be treated as a connection error of type
HTTP_WRONG_STREAM_DIRECTION. HTTP_WRONG_STREAM_DIRECTION.
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 3: 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 HTTP_DUPLICATE_PUSH. type HTTP_DUPLICATE_PUSH.
3.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.
4. HTTP Framing Layer 7. HTTP Framing Layer
HTTP frames are carried on QUIC streams, as described in Section 3. 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
overiew. 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 | Request | Push | Section |
| | Stream | Stream | Stream | | | | Stream | Stream | Stream | |
+----------------+------------+------------+-----------+------------+ +----------------+------------+------------+-----------+------------+
| DATA | No | Yes | Yes | Section | | DATA | No | Yes | Yes | Section |
| | | | | 4.2.1 | | | | | | 7.2.1 |
| | | | | | | | | | | |
| HEADERS | No | Yes | Yes | Section | | HEADERS | No | Yes | Yes | Section |
| | | | | 4.2.2 | | | | | | 7.2.2 |
| | | | | | | | | | | |
| PRIORITY | Yes | Yes (1) | No | Section | | PRIORITY | Yes | No | No | Section |
| | | | | 4.2.3 | | | | | | 7.2.3 |
| | | | | | | | | | | |
| CANCEL_PUSH | Yes | No | No | Section | | CANCEL_PUSH | Yes | No | No | Section |
| | | | | 4.2.4 | | | | | | 7.2.4 |
| | | | | | | | | | | |
| SETTINGS | Yes (1) | No | No | Section | | SETTINGS | Yes (1) | No | No | Section |
| | | | | 4.2.5 | | | | | | 7.2.5 |
| | | | | | | | | | | |
| PUSH_PROMISE | No | Yes | No | Section | | PUSH_PROMISE | No | Yes | No | Section |
| | | | | 4.2.6 | | | | | | 7.2.6 |
| | | | | | | | | | | |
| GOAWAY | Yes | No | No | Section | | GOAWAY | Yes | No | No | Section |
| | | | | 4.2.7 | | | | | | 7.2.7 |
| | | | | | | | | | | |
| MAX_PUSH_ID | Yes | No | No | Section | | MAX_PUSH_ID | Yes | No | No | Section |
| | | | | 4.2.8 | | | | | | 7.2.8 |
| | | | | | | | | | | |
| DUPLICATE_PUSH | No | Yes | No | Section | | DUPLICATE_PUSH | No | Yes | No | Section |
| | | | | 4.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.
4.1. Frame Layout Note that, unlike QUIC frames, HTTP/3 frames can span multiple
packets.
7.1. Frame Layout
All frames have the following format: All frames have the following format:
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 4: 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 of the Length: A variable-length integer that describes the length of the
Frame Payload. Frame Payload.
Frame Payload: A payload, the semantics of which are determined by Frame Payload: A payload, the semantics of which are determined by
the Type field. the Type field.
Each frame's payload MUST contain exactly the fields identified in Each frame's payload MUST contain exactly the fields identified in
its description. A frame payload that contains additional bytes its description. A frame payload that contains additional bytes
after the identified fields or a frame payload that terminates before after the identified fields or a frame payload that terminates before
the end of the identified fields MUST be treated as a connection the end of the identified fields MUST be treated as a connection
error of type HTTP_MALFORMED_FRAME. error of type HTTP_MALFORMED_FRAME.
4.2. Frame Definitions When a stream terminates cleanly, if the last frame on the stream was
truncated, this MUST be treated as a connection error (Section 8) of
type HTTP_MALFORMED_FRAME. Streams which terminate abruptly may be
reset at any point in a frame.
4.2.1. DATA 7.2. Frame Definitions
7.2.1. DATA
DATA frames (type=0x0) convey arbitrary, variable-length sequences of DATA frames (type=0x0) convey arbitrary, variable-length sequences of
bytes associated with an HTTP request or response payload. bytes associated with an HTTP request or response payload.
DATA frames MUST be associated with an HTTP request or response. If DATA frames MUST be associated with an HTTP request or response. If
a DATA frame is received on either 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
HTTP_WRONG_STREAM. HTTP_WRONG_STREAM.
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 5: DATA frame payload
4.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 6: HEADERS frame payload
HEADERS frames can only be sent on request / push streams. HEADERS frames can only be sent on request / push streams. If a
HEADERS frame is received on a control stream, the recipient MUST
respond with a connection error (Section 8) of type
HTTP_WRONG_STREAM.
4.2.3. PRIORITY 7.2.3. PRIORITY
The PRIORITY (type=0x2) frame specifies the client-advised priority The PRIORITY (type=0x2) frame specifies the client-advised priority
of a request, server push or placeholder. of a request, server push or placeholder.
A PRIORITY frame identifies an element to prioritize, and an element A PRIORITY frame identifies an element to prioritize, and an element
upon which it depends. A Prioritized ID or Dependency ID identifies upon which it depends. A Prioritized ID or Dependency ID identifies
a client-initiated request using the corresponding stream ID, a a client-initiated request using the corresponding stream ID, a
server push using a Push ID (see Section 4.2.6), or a placeholder server push using a Push ID (see Section 7.2.6), or a placeholder
using a Placeholder ID (see Section 5.3.1). using a Placeholder ID (see Section 4.3.1).
When a client initiates a request, a PRIORITY frame MAY be sent as
the first frame of the stream, creating a dependency on an existing
element. In order to ensure that prioritization is processed in a
consistent order, any subsequent PRIORITY frames for that request
MUST be sent on the control stream. A PRIORITY frame received after
other frames on a request stream MUST be treated as a stream error of
type HTTP_UNEXPECTED_FRAME.
If, by the time a new request stream is opened, its priority In order to ensure that prioritization is processed in a consistent
information has already been received via the control stream, the order, PRIORITY frames MUST be sent on the control stream.
PRIORITY frame sent on the request stream MUST be ignored.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|PT |DT | Empty | [Prioritized Element ID (i)] ... |PT |DT |X|Empty| Prioritized Element ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Element Dependency ID (i)] ... | [Element Dependency ID (i)] ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Weight (8) | | Weight (8) |
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
Figure 6: PRIORITY frame payload Figure 7: PRIORITY frame payload
The PRIORITY frame payload has the following fields: The PRIORITY frame payload has the following fields:
PT (Prioritized Element Type): A two-bit field indicating the type PT (Prioritized Element Type): A two-bit field indicating the type
of element being prioritized (see Table 2). When sent on a of element being prioritized (see Table 2). This MUST NOT be set
request stream, this MUST be set to "11". When sent on the to "11".
control stream, this MUST NOT be set to "11".
DT (Element Dependency Type): A two-bit field indicating the type of DT (Element Dependency Type): A two-bit field indicating the type of
element being depended on (see Table 3). element being depended on (see Table 2).
Empty: A four-bit field which MUST be zero when sent and has no X (Exclusive Flag): A single-bit flag indicating that the dependency
is exclusive (see Section 4.3).
Empty: A three-bit field which MUST be zero when sent and has no
semantic value on receipt. semantic value on receipt.
Prioritized Element ID: A variable-length integer that identifies Prioritized Element ID: A variable-length integer that identifies
the element being prioritized. Depending on the value of the element being prioritized. Depending on the value of
Prioritized Type, this contains the Stream ID of a request stream, Prioritized Type, this contains the Stream ID of a request stream,
the Push ID of a promised resource, a Placeholder ID of a the Push ID of a promised resource, or a Placeholder ID of a
placeholder, or is absent. placeholder.
Element Dependency ID: A variable-length integer that identifies the Element Dependency ID: A variable-length integer that identifies the
element on which a dependency is being expressed. Depending on element on which a dependency is being expressed. Depending on
the value of Dependency Type, this contains the Stream ID of a the value of Dependency Type, this contains the Stream ID of a
request stream, the Push ID of a promised resource, the request stream, the Push ID of a promised resource, the
Placeholder ID of a placeholder, or is absent. For details of Placeholder ID of a placeholder, or is absent. For details of
dependencies, see Section 5.3 and [RFC7540], Section 5.3. dependencies, see Section 4.3 and [HTTP2], Section 5.3.
Weight: An unsigned 8-bit integer representing a priority weight for Weight: An unsigned 8-bit integer representing a priority weight for
the prioritized element (see [RFC7540], Section 5.3). Add one to the prioritized element (see [HTTP2], Section 5.3). Add one to
the value to obtain a weight between 1 and 256. the value to obtain a weight between 1 and 256.
The values for the Prioritized Element Type (Table 2) and Element The values for the Prioritized Element Type and Element Dependency
Dependency Type (Table 3) imply the interpretation of the associated Type (Table 2) imply the interpretation of the associated Element ID
Element ID fields. fields.
+---------+------------------+---------------------------------+ +-----------+------------------+---------------------+
| PT Bits | Type Description | Prioritized Element ID Contents | | Type Bits | Type Description | Element ID Contents |
+---------+------------------+---------------------------------+ +-----------+------------------+---------------------+
| 00 | Request stream | Stream ID | | 00 | Request stream | Stream ID |
| | | | | | | |
| 01 | Push stream | Push ID | | 01 | Push stream | Push ID |
| | | | | | | |
| 10 | Placeholder | Placeholder ID | | 10 | Placeholder | Placeholder ID |
| | | | | | | |
| 11 | Current stream | Absent | | 11 | Root of the tree | Absent |
+---------+------------------+---------------------------------+ +-----------+------------------+---------------------+
Table 2: Prioritized Element Types Table 2: Element Types of a PRIORITY frame
+---------+------------------+--------------------------------+ Note that unlike in [HTTP2], the root of the tree cannot be
| DT Bits | Type Description | Element Dependency ID Contents | referenced using a Stream ID of 0, as in QUIC stream 0 carries a
+---------+------------------+--------------------------------+ valid HTTP request. The root of the tree cannot be reprioritized.
| 00 | Request stream | Stream ID |
| | | |
| 01 | Push stream | Push ID |
| | | |
| 10 | Placeholder | Placeholder ID |
| | | |
| 11 | Root of the tree | Absent |
+---------+------------------+--------------------------------+
Table 3: Element Dependency Types The PRIORITY frame can express relationships which might not be
permitted based on the stream on which it is sent or its position in
the stream. These situations MUST be treated as a connection error
of type HTTP_MALFORMED_FRAME. The following situations are examples
of invalid PRIORITY frames:
Note that unlike in [RFC7540], the root of the tree cannot be o A PRIORITY frame with the Prioritized Element Type set to "11".
referenced using a Stream ID of 0, as in QUIC stream 0 carries a
valid HTTP request. The root of the tree cannot be reprioritized. A
PRIORITY frame sent on a request stream with the Prioritized Element
Type set to any value other than "11" or which expresses a dependency
on a request with a greater Stream ID than the current stream MUST be
treated as a stream error of type HTTP_MALFORMED_FRAME. Likewise, a
PRIORITY frame sent on a control stream with the Prioritized Element
Type set to "11" MUST be treated as a connection error of type
HTTP_MALFORMED_FRAME. A PRIORITY frame with Empty bits not set to
zero MAY be treated as a connection error of type
HTTP_MALFORMED_FRAME.
When a PRIORITY frame claims to reference a request, the associated o A PRIORITY frame which claims to reference a request, but the
ID MUST identify a client-initiated bidirectional stream. A server associated ID does not identify a client-initiated bidirectional
MUST treat receipt of a PRIORITY frame identifying a stream of any stream
other type as a connection error of type HTTP_MALFORMED_FRAME.
A PRIORITY frame with Empty bits not set to zero MAY be treated as a
connection error of type HTTP_MALFORMED_FRAME.
A PRIORITY frame that references a non-existent Push ID, a A PRIORITY frame that references a non-existent Push ID, a
Placeholder ID greater than the server's limit, or a Stream ID the Placeholder ID greater than the server's limit, or a Stream ID the
client is not yet permitted to open MUST be treated as an client is not yet permitted to open MUST be treated as a connection
HTTP_LIMIT_EXCEEDED error. error of type HTTP_LIMIT_EXCEEDED.
A PRIORITY frame received on any stream other than a request or A PRIORITY frame received on any stream other than the control stream
control stream MUST be treated as a connection error of type MUST be treated as a connection error of type HTTP_WRONG_STREAM.
HTTP_WRONG_STREAM.
PRIORITY frames received by a client MUST be treated as a connection PRIORITY frames received by a client MUST be treated as a connection
error of type HTTP_UNEXPECTED_FRAME. error of type HTTP_UNEXPECTED_FRAME.
4.2.4. CANCEL_PUSH 7.2.4. 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
frame identifies a server push by Push ID (see Section 4.2.6), frame identifies a server push by Push ID (see Section 7.2.6),
encoded as a variable-length integer. encoded as a variable-length integer.
When a server receives this frame, it aborts sending the response for When a server receives this frame, it aborts sending the response for
the identified server push. If the server has not yet started to the identified server push. If the server has not yet started to
send the server push, it can use the receipt of a CANCEL_PUSH frame send the server push, it can use the receipt of a CANCEL_PUSH frame
to avoid opening a push stream. If the push stream has been opened to avoid opening a push stream. If the push stream has been opened
by the server, the server SHOULD send a QUIC RESET_STREAM frame on by the server, the server SHOULD send a QUIC RESET_STREAM frame on
that stream and cease transmission of the response. that stream and cease transmission of the response.
A server can send the CANCEL_PUSH frame to indicate that it will not A server can send the CANCEL_PUSH frame to indicate that it will not
be fulfilling a promise prior to creation of a push stream. Once the be fulfilling a promise prior to creation of a push stream. Once the
push stream has been created, sending CANCEL_PUSH has no effect on push stream has been created, sending CANCEL_PUSH has no effect on
the state of the push stream. A QUIC RESET_STREAM frame SHOULD be the state of the push stream. A QUIC RESET_STREAM frame SHOULD be
used instead to abort transmission of the server push response. used instead to abort transmission of the server push response.
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 stream error of type HTTP_WRONG_STREAM. treated as a connection error of type HTTP_WRONG_STREAM.
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 7: CANCEL_PUSH frame payload Figure 8: 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 4.2.6). cancelled (see Section 7.2.6).
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. a Push ID that has not yet been mentioned by a PUSH_PROMISE frame.
4.2.5. SETTINGS 7.2.5. SETTINGS
The SETTINGS frame (type=0x4) conveys configuration parameters that The SETTINGS frame (type=0x4) 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 a connection, never a single stream. SETTINGS frames always apply to a connection, never a single stream.
A SETTINGS frame MUST be sent as the first frame of each control A SETTINGS frame MUST be sent as the first frame of each control
stream (see Section 3.2.1) by each peer, and MUST NOT be sent stream (see Section 6.2.1) by each peer, and MUST NOT be sent
subsequently or on any other stream. If an endpoint receives a subsequently. If an endpoint receives a second SETTINGS frame on the
SETTINGS frame on a different stream, the endpoint MUST respond with control stream, the endpoint MUST respond with a connection error of
a connection error of type HTTP_WRONG_STREAM. If an endpoint type HTTP_UNEXPECTED_FRAME.
receives a second SETTINGS frame, the endpoint MUST respond with a
connection error of type HTTP_UNEXPECTED_FRAME. SETTINGS frames MUST NOT be sent on any stream other than the control
stream. If an endpoint receives a SETTINGS frame on a different
stream, the endpoint MUST respond with a connection error of type
HTTP_WRONG_STREAM.
SETTINGS parameters are not negotiated; they describe characteristics SETTINGS parameters are not negotiated; they describe characteristics
of the sending peer, which can be used by the receiving peer. of the sending peer, which can be used by the receiving peer.
However, a negotiation can be implied by the use of SETTINGS - each However, a negotiation can be implied by the use of SETTINGS - each
peer uses SETTINGS to advertise a set of supported values. The peer uses SETTINGS to advertise a set of supported values. The
definition of the setting would describe how each peer combines the definition of the setting would describe how each peer combines the
two sets to conclude which choice will be used. SETTINGS does not two sets to conclude which choice will be used. SETTINGS does not
provide a mechanism to identify when the choice takes effect. provide a mechanism to identify when the choice takes effect.
Different values for the same parameter can be advertised by each Different values for the same parameter can be advertised by each
skipping to change at page 18, line 51 skipping to change at page 33, line 45
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 8: SETTINGS parameter format Figure 9: 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.
4.2.5.1. Defined SETTINGS Parameters 7.2.5.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 5.1.1 for usage. See Section 4.1.1 for usage.
SETTINGS_NUM_PLACEHOLDERS (0x9): The default value is 0. However, SETTINGS_NUM_PLACEHOLDERS (0x9): The default value is 0. However,
this value SHOULD be set to a non-zero value by servers. See this value SHOULD be set to a non-zero value by servers. See
Section 5.3.1 for usage. Section 4.3.1 for usage.
Setting identifiers of the format "0x1f * N + 0x21" for integer Setting identifiers of the format "0x1f * N + 0x21" for integer
values of N are reserved to exercise the requirement that unknown values of N are reserved to exercise the requirement that unknown
identifiers be ignored. Such settings have no defined meaning. identifiers be ignored. Such settings have no defined meaning.
Endpoints SHOULD include at least one such setting in their SETTINGS Endpoints SHOULD include at least one such setting in their SETTINGS
frame. Endpoints MUST NOT consider such settings to have any meaning frame. Endpoints MUST NOT consider such settings to have any meaning
upon receipt. upon receipt.
Because the setting has no defined meaning, the value of the setting Because the setting has no defined meaning, the value of the setting
can be any value the implementation selects. can be any value the implementation selects.
Additional settings can be defined by extensions to HTTP/3; see Additional settings can be defined by extensions to HTTP/3; see
Section 7 for more details. Section 9 for more details.
4.2.5.2. Initialization 7.2.5.2. Initialization
An HTTP implementation MUST NOT send frames or requests which would An HTTP implementation MUST NOT send frames or requests which would
be invalid based on its current understanding of the peer's settings. be invalid based on its current understanding of the peer's settings.
All settings begin at an initial value, and are updated upon receipt All settings begin at an initial value, and are updated upon receipt
of a SETTINGS frame. For servers, the initial value of each client of a SETTINGS frame. For servers, the initial value of each client
setting is the default value. setting is the default value.
For clients using a 1-RTT QUIC connection, the initial value of each For clients using a 1-RTT QUIC connection, the initial value of each
server setting is the default value. When a 0-RTT QUIC connection is server setting is the default value. When a 0-RTT QUIC connection is
being used, the initial value of each server setting is the value being used, the initial value of each server setting is the value
used in the previous session. Clients MUST store the settings the used in the previous session. Clients MUST store the settings the
server provided in the session being resumed and MUST comply with server provided in the session being resumed and MUST comply with
stored settings until the current server settings are received. stored settings until the current server settings are received. A
client can use these initial values to send requests before the
server's SETTINGS frame has arrived. This removes the need for a
client to wait for the SETTINGS frame before sending requests.
A server can remember the settings that it advertised, or store an A server can remember the settings that it advertised, or store an
integrity-protected copy of the values in the ticket and recover the integrity-protected copy of the values in the ticket and recover the
information when accepting 0-RTT data. A server uses the HTTP/3 information when accepting 0-RTT data. A server uses the HTTP/3
settings values in determining whether to accept 0-RTT data. settings values in determining whether to accept 0-RTT data.
A server MAY accept 0-RTT and subsequently provide different settings A server MAY accept 0-RTT and subsequently provide different settings
in its SETTINGS frame. If 0-RTT data is accepted by the server, its in its SETTINGS frame. If 0-RTT data is accepted by the server, its
SETTINGS frame MUST NOT reduce any limits or alter any values that SETTINGS frame MUST NOT reduce any limits or alter any values that
might be violated by the client with its 0-RTT data. might be violated by the client with its 0-RTT data. The server MAY
omit settings from its SETTINGS frame which are unchanged from the
initial value.
4.2.6. PUSH_PROMISE 7.2.6. PUSH_PROMISE
The PUSH_PROMISE frame (type=0x5) is used to carry a promised request The PUSH_PROMISE frame (type=0x5) is used to carry a promised request
header set from server to client on a request stream, as in HTTP/2. header 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 9: PUSH_PROMISE frame payload Figure 10: 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 5.4), CANCEL_PUSH frames (Section 4.2.4), DUPLICATE_PUSH (Section 4.4), CANCEL_PUSH frames (Section 7.2.4), DUPLICATE_PUSH
frames (Section 4.2.9), and PRIORITY frames (Section 4.2.3). frames (Section 7.2.9), and PRIORITY frames (Section 7.2.3).
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.
A server MUST NOT use a Push ID that is larger than the client has A server MUST NOT use a Push ID that is larger than the client has
provided in a MAX_PUSH_ID frame (Section 4.2.8) and MUST NOT use the provided in a MAX_PUSH_ID frame (Section 7.2.8) and MUST NOT use the
same Push ID in multiple PUSH_PROMISE frames. A client MUST treat same Push ID in multiple PUSH_PROMISE frames. A client MUST treat
receipt of a PUSH_PROMISE that contains a larger Push ID than the receipt of a PUSH_PROMISE that contains a larger Push ID than the
client has advertised or a Push ID which has already been promised as client has advertised or a Push ID which has already been promised as
a connection error of type HTTP_MALFORMED_FRAME. a connection error of type HTTP_MALFORMED_FRAME.
If a PUSH_PROMISE frame is received on either control stream, the If a PUSH_PROMISE frame is received on the control stream, the client
recipient MUST respond with a connection error (Section 8) of type MUST respond with a connection error (Section 8) of type
HTTP_WRONG_STREAM. HTTP_WRONG_STREAM.
See Section 5.4 for a description of the overall server push 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
HTTP_UNEXPECTED_FRAME.
See Section 4.4 for a description of the overall server push
mechanism. mechanism.
4.2.7. GOAWAY 7.2.7. GOAWAY
The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of
a connection by a server. GOAWAY allows a server to stop accepting a connection by a server. GOAWAY allows a server to stop accepting
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 10: GOAWAY frame payload Figure 11: 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 HTTP_WRONG_STREAM. of type HTTP_MALFORMED_FRAME.
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
type HTTP_UNEXPECTED_FRAME. type HTTP_UNEXPECTED_FRAME.
The GOAWAY frame applies to the connection, not a specific stream. A The GOAWAY frame applies to the connection, not a specific stream. A
client MUST treat a GOAWAY frame on a stream other than the control client MUST treat a GOAWAY frame on a stream other than the control
stream as a connection error (Section 8) of type stream as a connection error (Section 8) of type HTTP_WRONG_STREAM.
HTTP_UNEXPECTED_FRAME.
See Section 6.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.
4.2.8. MAX_PUSH_ID 7.2.8. MAX_PUSH_ID
The MAX_PUSH_ID frame (type=0xD) is used by clients to control the The MAX_PUSH_ID frame (type=0xD) is used by clients to control the
number of server pushes that the server can initiate. This sets the number of server pushes that the server can initiate. This sets the
maximum value for a Push ID that the server can use in a PUSH_PROMISE maximum value for a Push ID that the server can use in a PUSH_PROMISE
frame. Consequently, this also limits the number of push streams frame. Consequently, this also limits the number of push streams
that the server can initiate in addition to the limit set by the QUIC that the server can initiate in addition to the limit set by the QUIC
MAX_STREAMS frame. MAX_STREAMS frame.
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
skipping to change at page 22, line 21 skipping to change at page 37, line 21
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 11: MAX_PUSH_ID frame payload Figure 12: 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 4.2.6). A MAX_PUSH_ID frame cannot reduce the maximum (see Section 7.2.6). 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
HTTP_MALFORMED_FRAME. HTTP_MALFORMED_FRAME.
4.2.9. DUPLICATE_PUSH 7.2.9. DUPLICATE_PUSH
The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate
that an existing pushed resource is related to multiple client that an existing pushed resource is related to multiple client
requests. requests.
The DUPLICATE_PUSH frame is always sent on a request stream. Receipt The DUPLICATE_PUSH frame is always sent on a request stream. Receipt
of a DUPLICATE_PUSH frame on any other stream MUST be treated as a of a DUPLICATE_PUSH frame on any other stream MUST be treated as a
connection error of type HTTP_WRONG_STREAM. connection error of type HTTP_WRONG_STREAM.
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
HTTP_UNEXPECTED_FRAME. HTTP_UNEXPECTED_FRAME.
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 12: DUPLICATE_PUSH frame payload Figure 13: 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 4.2.6). previously promised (see Section 7.2.6), though that promise might
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
(Section 7.2.8). A client MUST treat receipt of a DUPLICATE_PUSH
that contains a larger Push ID than the client has advertised as a
connection error of type HTTP_MALFORMED_FRAME.
This frame allows the server to use the same server push in response This frame allows the server to use the same server push in response
to multiple concurrent requests. Referencing the same server push to multiple concurrent requests. Referencing the same server push
ensures that a promise can be made in relation to every response in ensures that a promise can be made in relation to every response in
which server push might be needed without duplicating request headers which server push might be needed without duplicating request headers
or pushed responses. or pushed responses.
Allowing duplicate references to the same Push ID is primarily to Allowing duplicate references to the same Push ID is primarily to
reduce duplication caused by concurrent requests. A server SHOULD reduce duplication caused by concurrent requests. A server SHOULD
avoid reusing a Push ID over a long period. Clients are likely to avoid reusing a Push ID over a long period. Clients are likely to
consume server push responses and not retain them for reuse over consume server push responses and not retain them for reuse over
time. Clients that see a DUPLICATE_PUSH that uses a Push ID that time. Clients that see a DUPLICATE_PUSH that uses a Push ID that
they have since consumed and discarded are forced to ignore the they have since consumed and discarded are forced to ignore the
DUPLICATE_PUSH. DUPLICATE_PUSH.
4.2.10. Reserved Frame Types 7.2.10. Reserved Frame Types
Frame types of the format "0x1f * N + 0x21" for integer values of N Frame types of the format "0x1f * N + 0x21" for 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 (Section 7). These frames have no semantics, and can be sent ignored (Section 9). These frames 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 frames to have any meaning upon receipt. MUST NOT consider these frames to have any meaning upon receipt.
The payload and length of the frames are selected in any manner the The payload and length of the frames are selected in any manner the
implementation chooses. implementation chooses.
5. HTTP Request Lifecycle
5.1. HTTP Message Exchanges
A client sends an HTTP request on a client-initiated bidirectional
QUIC stream. A client MUST send only a single request on a given
stream. A server sends one or more HTTP responses on the same stream
as the request, as detailed below.
An HTTP message (request or response) consists of:
1. the message header (see [RFC7230], Section 3.2), sent as a single
HEADERS frame (see Section 4.2.2),
2. the payload body (see [RFC7230], Section 3.3), sent as a series
of DATA frames (see Section 4.2.1),
3. optionally, one HEADERS frame containing the trailer-part, if
present (see [RFC7230], Section 4.1.2).
A server MAY interleave one or more PUSH_PROMISE frames (see
Section 4.2.6) with the frames of a response message. These
PUSH_PROMISE frames are not part of the response; see Section 5.4 for
more details.
The "chunked" transfer encoding defined in Section 4.1 of [RFC7230]
MUST NOT be used.
Trailing header fields are carried in an additional HEADERS frame
following the body. Senders MUST send only one HEADERS frame in the
trailers section; receivers MUST discard any subsequent HEADERS
frames.
A response MAY consist of multiple messages when and only when one or
more informational responses (1xx, see [RFC7231], Section 6.2)
precede a final response to the same request. Non-final responses do
not contain a payload body or trailers.
An HTTP request/response exchange fully consumes a bidirectional QUIC
stream. After sending a request, a client MUST close the stream for
sending. Unless using the CONNECT method (see Section 5.2), clients
MUST NOT make stream closure dependent on receiving a response to
their request. After sending a final response, the server MUST close
the stream for sending. At this point, the QUIC stream is fully
closed.
When a stream is closed, this indicates the end of an HTTP message.
Because some messages are large or unbounded, endpoints SHOULD begin
processing partial HTTP messages once enough of the message has been
received to make progress. If a client stream terminates without
enough of the HTTP message to provide a complete response, the server
SHOULD abort its response with the error code
HTTP_INCOMPLETE_REQUEST.
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
request that has not been sent and received. When this is true, a
server MAY request that the client abort transmission of a request
without error by triggering a QUIC STOP_SENDING frame with error code
HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing
its stream. Clients MUST NOT discard complete responses as a result
of having their request terminated abruptly, though clients can
always discard responses at their discretion for other reasons.
5.1.1. Header Formatting and Compression
HTTP message headers carry information as a series of key-value
pairs, called header fields. For a listing of registered HTTP header
fields, see the "Message Header Field" registry maintained at
https://www.iana.org/assignments/message-headers [4].
Just as in previous versions of HTTP, header field names are strings
of ASCII characters that are compared in a case-insensitive fashion.
Properties of HTTP header field names and values are discussed 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
to lowercase prior to their encoding. A request or response
containing uppercase header field names MUST be treated as malformed.
As in HTTP/2, HTTP/3 uses special pseudo-header fields beginning with
the ':' character (ASCII 0x3a) to convey the target URI, the method
of the request, and the status code for the response. These pseudo-
header fields are defined in Section 8.1.2.3 and 8.1.2.4 of
[RFC7540]. Pseudo-header fields are not HTTP header fields.
Endpoints MUST NOT generate pseudo-header fields other than those
defined in [RFC7540]. The restrictions on the use of pseudo-header
fields in Section 8.1.2.1 of [RFC7540] also apply to HTTP/3.
HTTP/3 uses QPACK header compression as described in [QPACK], a
variation of HPACK which allows the flexibility to avoid header-
compression-induced head-of-line blocking. See that document for
additional details.
An HTTP/3 implementation MAY impose a limit on the maximum size of
the header it will accept on an individual HTTP message; encountering
a larger message header SHOULD be treated as a stream error of type
"HTTP_EXCESSIVE_LOAD". If an implementation wishes to advise its
peer of this limit, it can be conveyed as a number of bytes in the
"SETTINGS_MAX_HEADER_LIST_SIZE" parameter. The size of a header list
is calculated based on the uncompressed size of header fields,
including the length of the name and value in bytes plus an overhead
of 32 bytes for each header field.
5.1.2. Request Cancellation and Rejection
Clients can cancel requests by aborting the stream (QUIC RESET_STREAM
and/or STOP_SENDING frames, as appropriate) with an error code of
HTTP_REQUEST_CANCELLED (Section 8.1). When the client cancels a
response, it indicates that this response is no longer of interest.
Implementations SHOULD cancel requests by aborting both directions of
a stream.
When the server rejects a request without performing any application
processing, it SHOULD abort its response stream with the error code
HTTP_REQUEST_REJECTED. In this context, "processed" means that some
data from the stream was passed to some higher layer of software that
might have taken some action as a result. The client can treat
requests rejected by the server as though they had never been sent at
all, thereby allowing them to be retried later on a new connection.
Servers MUST NOT use the HTTP_REQUEST_REJECTED error code for
requests which were partially or fully processed. When a server
abandons a response after partial processing, it SHOULD abort its
response stream with the error code HTTP_REQUEST_CANCELLED.
When a client sends a STOP_SENDING with HTTP_REQUEST_CANCELLED, a
server MAY send the error code HTTP_REQUEST_REJECTED in the
corresponding RESET_STREAM if no processing was performed. Clients
MUST NOT reset streams with the HTTP_REQUEST_REJECTED error code
except in response to a QUIC STOP_SENDING frame that contains the
same code.
If a stream is cancelled after receiving a complete response, the
client MAY ignore the cancellation and use the response. However, if
a stream is cancelled after receiving a partial response, the
response SHOULD NOT be used. Automatically retrying such requests is
not possible, unless this is otherwise permitted (e.g., idempotent
actions like GET, PUT, or DELETE).
5.2. The CONNECT Method
The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily
used with HTTP proxies to establish a TLS session with an origin
server for the purposes of interacting with "https" resources. In
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
establish a tunnel over a single HTTP/2 stream to a remote host for
similar purposes.
A CONNECT request in HTTP/3 functions in the same manner as in
HTTP/2. The request MUST be formatted as described in [RFC7540],
Section 8.3. A CONNECT request that does not conform to these
restrictions is malformed. The request stream MUST NOT be closed at
the end of the request.
A proxy that supports CONNECT establishes a TCP connection
([RFC0793]) to the server identified in the ":authority" pseudo-
header field. Once this connection is successfully established, the
proxy sends a HEADERS frame containing a 2xx series status code to
the client, as defined in [RFC7231], Section 4.3.6.
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
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
number of TCP segments is not guaranteed to map predictably to the
size and number of HTTP DATA or QUIC STREAM frames.
The TCP connection can be closed by either peer. When the client
ends the request stream (that is, the receive stream at the proxy
enters the "Data Recvd" state), the proxy will set the FIN bit on its
connection to the TCP server. When the proxy receives a packet with
the FIN bit set, it will terminate the send stream that it sends to
the client. TCP connections which remain half-closed in a single
direction are not invalid, but are often handled poorly by servers,
so clients SHOULD NOT close a stream for sending while they still
expect to receive data from the target of the CONNECT.
A TCP connection error is signaled with QUIC RESET_STREAM frame. A
proxy treats any error in the TCP connection, which includes
receiving a TCP segment with the RST bit set, as a stream error of
type HTTP_CONNECT_ERROR (Section 8.1). Correspondingly, a proxy MUST
send a TCP segment with the RST bit set if it detects an error with
the stream or the QUIC connection.
5.3. Prioritization
HTTP/3 uses a priority scheme similar to that described in [RFC7540],
Section 5.3. In this priority scheme, a given element can be
designated as dependent upon another element. This information is
expressed in the PRIORITY frame Section 4.2.3 which identifies the
element and the dependency. The elements that can be prioritized
are:
o Requests, identified by the ID of the request stream
o Pushes, identified by the Push ID of the promised resource
(Section 4.2.6)
o Placeholders, identified by a Placeholder ID
Taken together, the dependencies across all prioritized elements in a
connection form a dependency tree. An element can depend on another
element or on the root of the tree. A reference to an element which
is no longer in the tree is treated as a reference to the root of the
tree. The structure of the dependency tree changes as PRIORITY
frames modify the dependency links between prioritized elements.
Due to reordering between streams, an element can also be prioritized
which is not yet in the tree. Such elements are added to the tree
with the requested priority.
When a prioritized element is first created, it has a default initial
weight of 16 and a default dependency. Requests and placeholders are
dependent on the root of the priority tree; pushes are dependent on
the client request on which the PUSH_PROMISE frame was sent.
Requests may override the default initial values by including a
PRIORTIY frame (see Section 4.2.3) at the beginning of the stream.
These priorities can be updated by sending a PRIORITY frame on the
control stream.
5.3.1. Placeholders
In HTTP/2, certain implementations used closed or unused streams as
placeholders in describing the relative priority of requests. This
created confusion as servers could not reliably identify which
elements of the priority tree could be discarded safely. Clients
could potentially reference closed streams long after the server had
discarded state, leading to disparate views of the prioritization the
client had attempted to express.
In HTTP/3, a number of placeholders are explicitly permitted by the
server using the "SETTINGS_NUM_PLACEHOLDERS" setting. Because the
server commits to maintaining these placeholders in the
prioritization tree, clients can use them with confidence that the
server will not have discarded the state. Clients MUST NOT send the
"SETTINGS_NUM_PLACEHOLDERS" setting; receipt of this setting by a
server MUST be treated as a connection error of type
"HTTP_WRONG_SETTING_DIRECTION".
Placeholders are identified by an ID between zero and one less than
the number of placeholders the server has permitted.
Like streams, placeholders have priority information associated with
them.
5.3.2. Priority Tree Maintenance
Because placeholders will be used to "root" any persistent structure
of the tree which the client cares about retaining, servers can
aggressively prune inactive regions from the priority tree. For
prioritization purposes, a node in the tree is considered "inactive"
when the corresponding stream has been closed for at least two round-
trip times (using any reasonable estimate available on the server).
This delay helps mitigate race conditions where the server has pruned
a node the client believed was still active and used as a Stream
Dependency.
Specifically, the server MAY at any time:
o Identify and discard branches of the tree containing only inactive
nodes (i.e. a node with only other inactive nodes as descendants,
along with those descendants)
o Identify and condense interior regions of the tree containing only
inactive nodes, allocating weight appropriately
x x x
| | |
P P P
/ \ | |
I I ==> I ==> A
/ \ | |
A I A A
| |
A A
Figure 13: Example of Priority Tree Pruning
In the example in Figure 13, "P" represents a Placeholder, "A"
represents an active node, and "I" represents an inactive node. In
the first step, the server discards two inactive branches (each a
single node). In the second step, the server condenses an interior
inactive node. Note that these transformations will result in no
change in the resources allocated to a particular active stream.
Clients SHOULD assume the server is actively performing such pruning
and SHOULD NOT declare a dependency on a stream it knows to have been
closed.
5.4. Server Push
HTTP/3 server push is similar to what is described in HTTP/2
[RFC7540], but uses different mechanisms.
Each server push is identified by a unique Push ID. This Push ID is
used in a single PUSH_PROMISE frame (see Section 4.2.6) which carries
the request headers, possibly included in one or more DUPLICATE_PUSH
frames (see Section 4.2.9), then included with the push stream which
ultimately fulfills those promises.
Server push is only enabled on a connection when a client sends a
MAX_PUSH_ID frame (see Section 4.2.8). A server cannot use server
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
server can promise. A server SHOULD use Push IDs sequentially,
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
error of type HTTP_LIMIT_EXCEEDED.
The header of the request message is carried by a PUSH_PROMISE frame
(see Section 4.2.6) on the request stream which generated the push.
This allows the server push to be associated with a client request.
Ordering of a PUSH_PROMISE in relation to certain parts of the
response is important (see Section 8.2.1 of [RFC7540]). Promised
requests MUST conform to the requirements in Section 8.2 of
[RFC7540].
The same server push can be associated with additional client
requests using a DUPLICATE_PUSH frame (see Section 4.2.9). Ordering
of a DUPLICATE_PUSH in relation to certain parts of the response is
similarly important.
When a server later fulfills a promise, the server push response is
conveyed on a push stream (see Section 3.2.2). The push stream
identifies the Push ID of the promise that it fulfills, then contains
a response to the promised request using the same format described
for responses in Section 5.1.
Due to reordering, DUPLICATE_PUSH frames or push stream data can
arrive before the corresponding PUSH_PROMISE frame. When a client
receives a DUPLICATE_PUSH frame for an as-yet-unknown Push ID, the
request headers of the push are not immediately available. The
client can either delay generating new requests for content
referenced following the DUPLICATE_PUSH frame until the request
headers become available, or can initiate requests for discovered
resources and cancel the requests if the requested resource is
already being pushed. When a client receives a new push stream with
an as-yet-unknown Push ID, both the associated client request and the
pushed request headers are unknown. The client can buffer the stream
data in expectation of the matching PUSH_PROMISE. The client can use
stream flow control (see section 4.1 of [QUIC-TRANSPORT]) to limit
the amount of data a server may commit to the pushed stream.
If a promised server push is not needed by the client, the client
SHOULD send a CANCEL_PUSH frame. If the push stream is already open
or opens after sending the CANCEL_PUSH frame, a QUIC STOP_SENDING
frame with an appropriate error code can also be used (e.g.,
HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see Section 8). This
asks the server not to transfer additional data and indicates that it
will be discarded upon receipt.
6. Connection Closure
Once established, an HTTP/3 connection can be used for many requests
and responses over time until the connection is closed. Connection
closure can happen in any of several different ways.
6.1. Idle Connections
Each QUIC endpoint declares an idle timeout during the handshake. If
the connection remains idle (no packets received) for longer than
this duration, the peer will assume that the connection has been
closed. HTTP/3 implementations will need to open a new connection
for new requests if the existing connection has been idle for longer
than the server's advertised idle timeout, and SHOULD do so if
approaching the idle timeout.
HTTP clients are expected to request that the transport keep
connections open while there are responses outstanding for requests
or server pushes, as described in Section 19.2 of [QUIC-TRANSPORT].
If the client is not expecting a response from the server, allowing
an idle connection to time out is preferred over expending effort
maintaining a connection that might not be needed. A gateway MAY
maintain connections in anticipation of need rather than incur the
latency cost of connection establishment to servers. Servers SHOULD
NOT actively keep connections open.
6.2. Connection Shutdown
Even when a connection is not idle, either endpoint can decide to
stop using the connection and let the connection close gracefully.
Since clients drive request generation, clients perform a connection
shutdown by not sending additional requests on the connection;
responses and pushed responses associated to previous requests will
continue to completion. Servers perform the same function by
communicating with clients.
Servers initiate the shutdown of a connection by sending a GOAWAY
frame (Section 4.2.7). The GOAWAY frame indicates that client-
initiated requests on lower stream IDs were or might be processed in
this connection, while requests on the indicated stream ID and
greater were rejected. This enables client and server to agree on
which requests were accepted prior to the connection shutdown. This
identifier MAY be lower than the stream limit identified by a QUIC
MAX_STREAM_ID frame, and MAY be zero if no requests were processed.
Servers SHOULD NOT increase the QUIC MAX_STREAM_ID limit after
sending a GOAWAY frame.
Clients MUST NOT send new requests on the connection after receiving
GOAWAY; a new connection MAY be established to send additional
requests.
Some requests might already be in transit. If the client has already
sent requests on streams with a Stream ID greater than or equal to
that indicated in the GOAWAY frame, those requests will not be
processed and MAY be retried by the client on a different connection.
The client MAY cancel these requests. It is RECOMMENDED that the
server explicitly reject such requests (see Section 5.1.2) in order
to clean up transport state for the affected streams.
Requests on Stream IDs less than the Stream ID in the GOAWAY frame
might have been processed; their status cannot be known until a
response is received, the stream is reset individually, or the
connection terminates. Servers MAY reject individual requests on
streams below the indicated ID if these requests were not processed.
Servers SHOULD send a GOAWAY frame when the closing of a connection
is known in advance, even if the advance notice is small, so that the
remote peer can know whether a request has been partially processed
or not. For example, if an HTTP client sends a POST at the same time
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
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
in flight when the server closes the connection. A server MAY send
multiple GOAWAY frames indicating different stream IDs, but MUST NOT
increase the value they send in the last Stream ID, since clients
might already have retried unprocessed requests on another
connection. A server that is attempting to gracefully shut down a
connection SHOULD send an initial GOAWAY frame with the last Stream
ID set to the current value of QUIC's MAX_STREAM_ID and SHOULD NOT
increase the MAX_STREAM_ID thereafter. This signals to the client
that a shutdown is imminent and that initiating further requests is
prohibited. After allowing time for any in-flight requests (at least
one round-trip time), the server MAY send another GOAWAY frame with
an updated last Stream ID. This ensures that a connection can be
cleanly shut down without losing requests.
Once all accepted requests have been processed, the server can permit
the connection to become idle, or MAY initiate an immediate closure
of the connection. An endpoint that completes a graceful shutdown
SHOULD use the HTTP_NO_ERROR code when closing the connection.
If a client has consumed all available bidirectional stream IDs with
requests, the server need not send a GOAWAY frame, since the client
is unable to make further requests.
6.3. Immediate Application Closure
An HTTP/3 implementation can immediately close the QUIC connection at
any time. This results in sending a QUIC CONNECTION_CLOSE frame to
the peer; the error code in this frame indicates to the peer why the
connection is being closed. See Section 8 for error codes which can
be used when closing a connection.
Before closing the connection, a GOAWAY MAY be sent to allow the
client to retry some requests. Including the GOAWAY frame in the
same packet as the QUIC CONNECTION_CLOSE frame improves the chances
of the frame being received by clients.
6.4. Transport Closure
For various reasons, the QUIC transport could indicate to the
application layer that the connection has terminated. This might be
due to an explicit closure by the peer, a transport-level error, or a
change in network topology which interrupts connectivity.
If a connection terminates without a GOAWAY frame, clients MUST
assume that any request which was sent, whether in whole or in part,
might have been processed.
7. Extensions to HTTP/3
HTTP/3 permits extension of the protocol. Within the limitations
described in this section, protocol extensions can be used to provide
additional services or alter any aspect of the protocol. Extensions
are effective only within the scope of a single HTTP/3 connection.
This applies to the protocol elements defined in this document. This
does not affect the existing options for extending HTTP, such as
defining new methods, status codes, or header fields.
Extensions are permitted to use new frame types (Section 4.2), new
settings (Section 4.2.5.1), new error codes (Section 8), or new
unidirectional stream types (Section 3.2). Registries are
established for managing these extension points: frame types
(Section 10.3), settings (Section 10.4), error codes (Section 10.5),
and stream types (Section 10.6).
Implementations MUST ignore unknown or unsupported values in all
extensible protocol elements. Implementations MUST discard frames
and unidirectional streams that have unknown or unsupported types.
This means that any of these extension points can be safely used by
extensions without prior arrangement or negotiation.
Extensions that could change the semantics of existing protocol
components MUST be negotiated before being used. For example, an
extension that changes the layout of the HEADERS frame cannot be used
until the peer has given a positive signal that this is acceptable.
In this case, it could also be necessary to coordinate when the
revised layout comes into effect.
This document doesn't mandate a specific method for negotiating the
use of an extension but notes that a setting (Section 4.2.5.1) could
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
a setting is used for extension negotiation, the default value MUST
be defined in such a fashion that the extension is disabled if the
setting is omitted.
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]. An endpoint MAY choose
to treat a stream error as a connection error. to treat a stream error as a connection error.
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.
skipping to change at page 36, line 22 skipping to change at page 40, line 38
requirements in a way which doesn't match a more specific error requirements in a way which doesn't 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.
HTTP_MALFORMED_FRAME (0x01XX): An error in a specific frame type. HTTP_MALFORMED_FRAME (0x01XX): An error in a specific frame type.
If the frame type is "0xfe" or less, the type is included as the If the frame type is "0xfe" or less, the type is included as the
last byte of the error code. For example, an error in a last byte of the error code. For example, an error in a
MAX_PUSH_ID frame would be indicated with the code (0x10D). The MAX_PUSH_ID frame would be indicated with the code (0x10D). The
last byte "0xff" is used to indicate any frame type greater than last byte "0xff" is used to indicate any frame type greater than
"0xfe". "0xfe".
9. Security Considerations 9. Extensions to HTTP/3
HTTP/3 permits extension of the protocol. Within the limitations
described in this section, protocol extensions can be used to provide
additional services or alter any aspect of the protocol. Extensions
are effective only within the scope of a single HTTP/3 connection.
This applies to the protocol elements defined in this document. This
does not affect the existing options for extending HTTP, such as
defining new methods, status codes, or header fields.
Extensions are permitted to use new frame types (Section 7.2), new
settings (Section 7.2.5.1), new error codes (Section 8), or new
unidirectional stream types (Section 6.2). Registries are
established for managing these extension points: frame types
(Section 11.3), settings (Section 11.4), error codes (Section 11.5),
and stream types (Section 11.6).
Implementations MUST ignore unknown or unsupported values in all
extensible protocol elements. Implementations MUST discard frames
and unidirectional streams that have unknown or unsupported types.
This means that any of these extension points can be safely used by
extensions without prior arrangement or negotiation.
Extensions that could change the semantics of existing protocol
components MUST be negotiated before being used. For example, an
extension that changes the layout of the HEADERS frame cannot be used
until the peer has given a positive signal that this is acceptable.
In this case, it could also be necessary to coordinate when the
revised layout comes into effect.
This document doesn't mandate a specific method for negotiating the
use of an extension but notes that a setting (Section 7.2.5.1) could
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
a setting is used for extension negotiation, the default value MUST
be defined in such a fashion that the extension is disabled if the
setting is omitted.
10. Security Considerations
The security considerations of HTTP/3 should be comparable to those The security considerations of HTTP/3 should be comparable to those
of HTTP/2 with TLS. Note that where HTTP/2 employs PADDING frames of HTTP/2 with TLS. Note that where HTTP/2 employs PADDING frames
and Padding fields in other frames to make a connection more and Padding fields in other frames to make a connection more
resistant to traffic analysis, HTTP/3 can rely on QUIC PADDING frames resistant to traffic analysis, HTTP/3 can rely on QUIC PADDING frames
or employ the reserved frame and stream types discussed in or employ the reserved frame and stream types discussed in
Section 4.2.10 and Section 3.2.3. Section 7.2.10 and Section 6.2.3.
When HTTP Alternative Services is used for discovery for HTTP/3 When HTTP Alternative Services is used for discovery for HTTP/3
endpoints, the security considerations of [ALTSVC] also apply. endpoints, the security considerations of [ALTSVC] also apply.
Several protocol elements contain nested length elements, typically Several protocol elements contain nested length elements, typically
in the form of frames with an explicit length containing variable- in the form of frames with an explicit length containing variable-
length integers. This could pose a security risk to an incautious length integers. This could pose a security risk to an incautious
implementer. An implementation MUST ensure that the length of a implementer. An implementation MUST ensure that the length of a
frame exactly matches the length of the fields it contains. frame exactly matches the length of the fields it contains.
skipping to change at page 37, line 5 skipping to change at page 42, line 10
using HTTP/3 with 0-RTT. using HTTP/3 with 0-RTT.
Certain HTTP implementations use the client address for logging or Certain HTTP implementations use the client address for logging or
access-control purposes. Since a QUIC client's address might change access-control purposes. Since a QUIC client's address might change
during a connection (and future versions might support simultaneous during a connection (and future versions might support simultaneous
use of multiple addresses), such implementations will need to either use of multiple addresses), such implementations will need to either
actively retrieve the client's current address or addresses when they actively retrieve the client's current address or addresses when they
are relevant or explicitly accept that the original address might are relevant or explicitly accept that the original address might
change. change.
10. IANA Considerations 11. IANA Considerations
10.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
10.2. Registration of QUIC Version Hint Alt-Svc Parameter 11.2. Registration of QUIC Version Hint Alt-Svc Parameter
This document creates a new registration for version-negotiation This document creates a new registration for version-negotiation
hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter"
registry established in [RFC7838]. registry established in [RFC7838].
Parameter: "quic" Parameter: "quic"
Specification: This document, Section 2.2.1 Specification: This document, Section 3.2.1
10.3. Frame Types 11.3. Frame Types
This document establishes a registry for HTTP/3 frame type codes. This document establishes a registry for HTTP/3 frame type codes.
The "HTTP/3 Frame Type" registry governs a 62-bit space. This space The "HTTP/3 Frame Type" registry governs a 62-bit space. This space
is split into three spaces that are governed by different policies. is split into three spaces that are governed by different policies.
Values between "0x00" and "0x3f" (in hexadecimal) are assigned via Values between "0x00" and "0x3f" (in hexadecimal) are assigned via
the Standards Action or IESG Review policies [RFC8126]. Values from the Standards Action or IESG Review policies [RFC8126]. Values from
"0x40" to "0x3fff" operate on the Specification Required policy "0x40" to "0x3fff" operate on the Specification Required policy
[RFC8126]. All other values are assigned to Private Use [RFC8126]. [RFC8126]. All other values are assigned to Private Use [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 [RFC7540], 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: New entries in this registry require the following information:
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. Code: The 62-bit code assigned to the frame type.
Specification: A reference to a specification that includes a Specification: A reference to a specification that includes a
description of the frame layout and its semantics, including any description of the frame layout and its semantics, including any
parts of the frame that are conditionally present. parts of the frame that are conditionally present.
The entries in the following table are registered by this document. The entries in the following table are registered by this document.
+----------------+------+----------------+ +----------------+------+----------------+
| Frame Type | Code | Specification | | Frame Type | Code | Specification |
+----------------+------+----------------+ +----------------+------+----------------+
| DATA | 0x0 | Section 4.2.1 | | DATA | 0x0 | Section 7.2.1 |
| | | | | | | |
| HEADERS | 0x1 | Section 4.2.2 | | HEADERS | 0x1 | Section 7.2.2 |
| | | | | | | |
| PRIORITY | 0x2 | Section 4.2.3 | | PRIORITY | 0x2 | Section 7.2.3 |
| | | | | | | |
| CANCEL_PUSH | 0x3 | Section 4.2.4 | | CANCEL_PUSH | 0x3 | Section 7.2.4 |
| | | | | | | |
| SETTINGS | 0x4 | Section 4.2.5 | | SETTINGS | 0x4 | Section 7.2.5 |
| | | | | | | |
| PUSH_PROMISE | 0x5 | Section 4.2.6 | | PUSH_PROMISE | 0x5 | Section 7.2.6 |
| | | | | | | |
| Reserved | 0x6 | N/A | | Reserved | 0x6 | N/A |
| | | | | | | |
| GOAWAY | 0x7 | Section 4.2.7 | | GOAWAY | 0x7 | Section 7.2.7 |
| | | | | | | |
| Reserved | 0x8 | N/A | | Reserved | 0x8 | N/A |
| | | | | | | |
| Reserved | 0x9 | N/A | | Reserved | 0x9 | N/A |
| | | | | | | |
| MAX_PUSH_ID | 0xD | Section 4.2.8 | | MAX_PUSH_ID | 0xD | Section 7.2.8 |
| | | | | | | |
| DUPLICATE_PUSH | 0xE | Section 4.2.9 | | DUPLICATE_PUSH | 0xE | Section 7.2.9 |
+----------------+------+----------------+ +----------------+------+----------------+
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.
10.4. Settings Parameters 11.4. 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 space is
split into three spaces that are governed by different policies. split into three spaces that are governed by different policies.
Values between "0x00" and "0x3f" (in hexadecimal) are assigned via Values between "0x00" and "0x3f" (in hexadecimal) are assigned via
the Standards Action or IESG Review policies [RFC8126]. Values from the Standards Action or IESG Review policies [RFC8126]. Values from
"0x40" to "0x3fff" operate on the Specification Required policy "0x40" to "0x3fff" operate on the Specification Required policy
[RFC8126]. All other values are assigned to Private Use [RFC8126]. [RFC8126]. All other values are assigned to Private Use [RFC8126].
The designated experts are the same as those for the "HTTP/2 The designated experts are the same as those for the "HTTP/2
Settings" registry defined in [RFC7540]. 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 [RFC7540], 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: New registrations are advised to provide the following information:
Name: A symbolic name for the setting. Specifying a setting name is Name: A symbolic name for the setting. Specifying a setting name is
optional. optional.
Code: The 62-bit code assigned to the setting. Code: The 62-bit code assigned to the setting.
skipping to change at page 39, line 37 skipping to change at page 44, line 46
| Setting Name | Code | Specification | | Setting Name | Code | Specification |
+----------------------+------+------------------+ +----------------------+------+------------------+
| Reserved | 0x2 | N/A | | Reserved | 0x2 | N/A |
| | | | | | | |
| Reserved | 0x3 | N/A | | Reserved | 0x3 | N/A |
| | | | | | | |
| Reserved | 0x4 | N/A | | Reserved | 0x4 | N/A |
| | | | | | | |
| Reserved | 0x5 | N/A | | Reserved | 0x5 | N/A |
| | | | | | | |
| MAX_HEADER_LIST_SIZE | 0x6 | Section 4.2.5.1 | | MAX_HEADER_LIST_SIZE | 0x6 | Section 7.2.5.1 |
| | | | | | | |
| NUM_PLACEHOLDERS | 0x9 | Section 4.2.5.1 | | NUM_PLACEHOLDERS | 0x9 | Section 7.2.5.1 |
+----------------------+------+------------------+ +----------------------+------+------------------+
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.
10.5. Error Codes 11.5. 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 16-bit space. The "HTTP/3 "HTTP/3 Error Code" registry manages a 62-bit space. The "HTTP/3
Error Code" registry operates under the "Expert Review" policy Error Code" registry operates under the "Expert Review" policy
[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: New registrations are advised to provide the following information:
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 16-bit error code value. Code: The 62-bit error code value.
Description: A brief description of the error code semantics, longer Description: A brief description of the error code semantics, longer
if no detailed specification is provided. if no detailed specification is provided.
Specification: An optional reference for a specification that Specification: An optional reference for a specification that
defines the error code. defines the error code.
The entries in the following table are registered by this document. The entries in the following table are registered by this document.
+---------------------------+--------+---------------+--------------+ +---------------------------+--------+---------------+--------------+
skipping to change at page 42, line 22 skipping to change at page 47, line 33
| | | state | | | | | state | |
| | | | | | | | | |
| HTTP_REQUEST_REJECTED | 0x0014 | Request not | Section 8.1 | | HTTP_REQUEST_REJECTED | 0x0014 | Request not | Section 8.1 |
| | | processed | | | | | processed | |
| | | | | | | | | |
| HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 8.1 | | HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 8.1 |
| | | frame | | | | | frame | |
| | | formatting | | | | | formatting | |
+---------------------------+--------+---------------+--------------+ +---------------------------+--------+---------------+--------------+
10.6. Stream Types 11.6. 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 space is split into three spaces that are governed by different
policies. Values between "0x00" and 0x3f (in hexadecimal) are policies. Values between "0x00" and 0x3f (in hexadecimal) are
assigned via the Standards Action or IESG Review policies [RFC8126]. assigned via the Standards Action or IESG Review policies [RFC8126].
Values from "0x40" to "0x3fff" operate on the Specification Required Values from "0x40" to "0x3fff" operate on the Specification Required
policy [RFC8126]. All other values are assigned to Private Use policy [RFC8126]. All other values are assigned to Private Use
[RFC8126]. [RFC8126].
skipping to change at page 43, line 8 skipping to change at page 48, line 17
its payload. 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".
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 | Code | Specification | Sender |
+----------------+------+----------------+--------+ +----------------+------+----------------+--------+
| Control Stream | 0x00 | Section 3.2.1 | Both | | Control Stream | 0x00 | Section 6.2.1 | Both |
| | | | | | | | | |
| Push Stream | 0x01 | Section 5.4 | Server | | Push Stream | 0x01 | Section 4.4 | Server |
+----------------+------+----------------+--------+ +----------------+------+----------------+--------+
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. References 12. References
11.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>.
[HTTP-REPLAY] [HTTP-REPLAY]
Thomson, M., Nottingham, M., and W. Tarreau, "Using Early Thomson, M., Nottingham, M., and W. Tarreau, "Using Early
Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September
2018, <https://www.rfc-editor.org/info/rfc8470>. 2018, <https://www.rfc-editor.org/info/rfc8470>.
[HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext
Transfer Protocol Version 2 (HTTP/2)", RFC 7540,
DOI 10.17487/RFC7540, May 2015,
<https://www.rfc-editor.org/info/rfc7540>.
[QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK:
Header Compression for HTTP over QUIC", draft-ietf-quic- Header Compression for HTTP over QUIC", draft-ietf-quic-
qpack-08 (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", draft-ietf-quic-
transport-20 (work in progress). transport-latest (work in progress).
[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 44, line 38 skipping to change at page 50, line 5
[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>.
11.2. Informative References 12.2. Informative References
[HPACK] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
Protocol (HTTP/1.1): Semantics and Content", RFC 7231,
DOI 10.17487/RFC7231, June 2014,
<https://www.rfc-editor.org/info/rfc7231>.
[RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status
Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012,
<https://www.rfc-editor.org/info/rfc6585>.
[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan,
"Transport Layer Security (TLS) Application-Layer Protocol "Transport Layer Security (TLS) Application-Layer Protocol
Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301,
July 2014, <https://www.rfc-editor.org/info/rfc7301>. July 2014, <https://www.rfc-editor.org/info/rfc7301>.
[RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP [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>.
11.3. URIs 12.3. URIs
[1] https://mailarchive.ietf.org/arch/search/?email_list=quic [1] https://mailarchive.ietf.org/arch/search/?email_list=quic
[2] https://github.com/quicwg [2] https://github.com/quicwg
[3] https://github.com/quicwg/base-drafts/labels/-http [3] https://github.com/quicwg/base-drafts/labels/-http
[4] https://www.iana.org/assignments/message-headers [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
primarily where necessary to accommodate the differences in behavior where QUIC differs from TCP, either to take advantage of QUIC
between QUIC and TCP (lack of ordering, support for streams). We features (like streams) or to accommodate important shortcomings
intend to avoid gratuitous changes which make it difficult or (such as a lack of total ordering). These differences make HTTP/3
impossible to build extensions with the same semantics applicable to similar to HTTP/2 in key aspects, such as the relationship of
both protocols at once. requests and responses to streams. However, the details of the
HTTP/3 design are substantially different than HTTP/2.
These departures are noted in this section. These departures are noted in this section.
A.1. Streams A.1. Streams
HTTP/3 permits use of a larger number of streams (2^62-1) than HTTP/3 permits use of a larger number of streams (2^62-1) than
HTTP/2. The considerations about exhaustion of stream identifier HTTP/2. The considerations about exhaustion of stream identifier
space apply, though the space is significantly larger such that it is space apply, though the space is significantly larger such that it is
likely that other limits in QUIC are reached first, such as the limit likely that other limits in QUIC are reached first, such as the limit
on the connection flow control window. on the connection flow control window.
skipping to change at page 45, line 51 skipping to change at page 51, line 24
Many framing concepts from HTTP/2 can be elided on QUIC, because the Many framing concepts from HTTP/2 can be elided on QUIC, because the
transport deals with them. Because frames are already on a stream, transport deals with them. Because frames are already on a stream,
they can omit the stream number. Because frames do not block they can omit the stream number. Because frames do not block
multiplexing (QUIC's multiplexing occurs below this layer), the multiplexing (QUIC's multiplexing occurs below this layer), the
support for variable-maximum-length packets can be removed. Because support for variable-maximum-length packets can be removed. Because
stream termination is handled by QUIC, an END_STREAM flag is not stream termination is handled by QUIC, an END_STREAM flag is not
required. This permits the removal of the Flags field from the required. This permits the removal of the Flags field from the
generic frame layout. generic frame layout.
Frame payloads are largely drawn from [RFC7540]. However, QUIC Frame payloads are largely drawn from [HTTP2]. However, QUIC
includes many features (e.g., flow control) which are also present in includes many features (e.g., flow control) which are also present in
HTTP/2. In these cases, the HTTP mapping does not re-implement them. HTTP/2. In these cases, the HTTP mapping does not re-implement them.
As a result, several HTTP/2 frame types are not required in HTTP/3. As a result, several HTTP/2 frame types are not required in HTTP/3.
Where an HTTP/2-defined frame is no longer used, the frame ID has Where an HTTP/2-defined frame is no longer used, the frame ID has
been reserved in order to maximize portability between HTTP/2 and been reserved in order to maximize portability between HTTP/2 and
HTTP/3 implementations. However, even equivalent frames between the HTTP/3 implementations. However, even equivalent frames between the
two mappings are not identical. two mappings are not identical.
Many of the differences arise from the fact that HTTP/2 provides an Many of the differences arise from the fact that HTTP/2 provides an
absolute ordering between frames across all streams, while QUIC absolute ordering between frames across all streams, while QUIC
provides this guarantee on each stream only. As a result, if a frame provides this guarantee on each stream only. As a result, if a frame
type makes assumptions that frames from different streams will still type makes assumptions that frames from different streams will still
be received in the order sent, HTTP/3 will break them. be received in the order sent, HTTP/3 will break them.
For example, implicit in the HTTP/2 prioritization scheme is the Some examples of feature adaptations are described below, as well as
notion of in-order delivery of priority changes (i.e., dependency general guidance to extension frame implementors converting an HTTP/2
tree mutations): since operations on the dependency tree such as extension to HTTP/3.
reparenting a subtree are not commutative, both sender and receiver
must apply them in the same order to ensure that both sides have a
consistent view of the stream dependency tree. HTTP/2 specifies
priority assignments in PRIORITY frames and (optionally) in HEADERS
frames. To achieve in-order delivery of priority changes in HTTP/3,
PRIORITY frames are sent as the first frame on a request stream or on
the control stream and exclusive prioritization has been removed.
HTTP/3 permits the prioritisation of requests, pushes and
placeholders that each exist in separate identifier spaces. The
HTTP/3 PRIORITY frame replaces the stream dependency field with
fields that can identify the element of interest and its dependency.
Likewise, HPACK was designed with the assumption of in-order A.2.1. Prioritization Differences
delivery. A sequence of encoded header blocks must arrive (and be
decoded) at an endpoint in the same order in which they were encoded. HTTP/2 specifies priority assignments in PRIORITY frames and
This ensures that the dynamic state at the two endpoints remains in (optionally) in HEADERS frames. Implicit in the HTTP/2
sync. As a result, HTTP/3 uses a modified version of HPACK, prioritization scheme is the notion of in-order delivery of priority
described in [QPACK]. changes (i.e., dependency tree mutations). Since operations on the
dependency tree such as reparenting a subtree are not commutative,
both sender and receiver must apply them in the same order to ensure
that both sides have a consistent view of the stream dependency tree.
To achieve in-order delivery of priority changes in HTTP/3, PRIORITY
frames are sent on the control stream. HTTP/3 permits the
prioritization of requests, pushes and placeholders that each exist
in separate identifier spaces. The HTTP/3 PRIORITY frame replaces
the stream dependency field with fields that can identify the element
of interest and its dependency.
A.2.2. Header Compression Differences
HPACK was designed with the assumption of in-order delivery. A
sequence of encoded header blocks must arrive (and be decoded) at an
endpoint in the same order in which they were encoded. This ensures
that the dynamic state at the two endpoints remains in sync.
Because this total ordering is not provided by QUIC, HTTP/3 uses a
modified version of HPACK, called QPACK. QPACK uses a single
unidirectional stream to make all modifications to the dynamic table,
ensuring a total order of updates. All frames which contain encoded
headers merely reference the table state at a given time without
modifying it.
[QPACK] provides additional details.
A.2.3. Guidance for New Frame Type Definitions
Frame type definitions in HTTP/3 often use the QUIC variable-length Frame type definitions in HTTP/3 often use the QUIC variable-length
integer encoding. In particular, Stream IDs use this encoding, which integer encoding. In particular, Stream IDs use this encoding, which
allow for a larger range of possible values than the encoding used in allows for a larger range of possible values than the encoding used
HTTP/2. Some frames in HTTP/3 use an identifier rather than a Stream in HTTP/2. Some frames in HTTP/3 use an identifier rather than a
ID (e.g. Push IDs in PRIORITY frames). Redefinition of the encoding Stream ID (e.g. Push IDs in PRIORITY frames). Redefinition of the
of extension frame types might be necessary if the encoding includes encoding of extension frame types might be necessary if the encoding
a Stream ID. includes a Stream ID.
Because the Flags field is not present in generic HTTP/3 frames, Because the Flags field is not present in generic HTTP/3 frames,
those frames which depend on the presence of flags need to allocate those frames which depend on the presence of flags need to allocate
space for flags as part of their frame payload. space for flags as part of their frame payload.
Other than this issue, frame type HTTP/2 extensions are typically Other than this issue, 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 would be portable ordering, but would not be harmed by ordering, and would be portable
to HTTP/2 in the same manner. to HTTP/2 in the same manner.
Below is a listing of how each HTTP/2 frame type is mapped: A.2.4. Mapping Between HTTP/2 and HTTP/3 Frame Types
DATA (0x0): Padding is not defined in HTTP/3 frames. See DATA (0x0): Padding is not defined in HTTP/3 frames. See
Section 4.2.1. Section 7.2.1.
HEADERS (0x1): The PRIORITY region of HEADERS is not defined in HEADERS (0x1): The PRIORITY region of HEADERS is not defined in
HTTP/3 frames. A separate PRIORITY frame is used in all cases. HTTP/3 frames. A separate PRIORITY frame is used in all cases.
Padding is not defined in HTTP/3 frames. See Section 4.2.2. Padding is not defined in HTTP/3 frames. See Section 7.2.2.
PRIORITY (0x2): As described above, the PRIORITY frame references a PRIORITY (0x2): As described above, the PRIORITY frame references a
variety of identifiers. It is sent as the first frame on a variety of identifiers. It is sent as the first frame on a
request streams or on the control stream. See Section 4.2.3. request streams or on the control stream. See Section 7.2.3.
RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC
provides stream lifecycle management. The same code point is used provides stream lifecycle management. The same code point is used
for the CANCEL_PUSH frame (Section 4.2.4). for the CANCEL_PUSH frame (Section 7.2.4).
SETTINGS (0x4): SETTINGS frames are sent only at the beginning of SETTINGS (0x4): SETTINGS frames are sent only at the beginning of
the connection. See Section 4.2.5 and Appendix A.3. the connection. See Section 7.2.5 and Appendix A.3.
PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream;
instead the push stream references the PUSH_PROMISE frame using a instead the push stream references the PUSH_PROMISE frame using a
Push ID. See Section 4.2.6. Push ID. See Section 7.2.6.
PING (0x6): PING frames do not exist, since QUIC provides equivalent PING (0x6): PING frames do not exist, since QUIC provides equivalent
functionality. functionality.
GOAWAY (0x7): GOAWAY is sent only from server to client and does not GOAWAY (0x7): GOAWAY is sent only from server to client and does not
contain an error code. See Section 4.2.7. contain an error code. See Section 7.2.7.
WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC
provides flow control. provides flow control.
CONTINUATION (0x9): CONTINUATION frames do not exist; instead, CONTINUATION (0x9): CONTINUATION frames do not exist; instead,
larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted. larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted.
Frame types defined by extensions to HTTP/2 need to be separately Frame types defined by extensions to HTTP/2 need to be separately
registered for HTTP/3 if still applicable. The IDs of frames defined registered for HTTP/3 if still applicable. The IDs of frames defined
in [RFC7540] 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 10.3. See Section 11.3.
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,
at the beginning of the connection, and thereafter cannot change. at the beginning of the connection, and thereafter cannot change.
This eliminates many corner cases around synchronization of changes. This eliminates many corner cases around synchronization of 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
HTTP-level options that are retained in HTTP/3 have the same value as HTTP-level options that are retained in HTTP/3 have the same value as
skipping to change at page 48, line 35 skipping to change at page 54, line 24
SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error. SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error.
SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and
connection flow control window sizes to be specified in the connection flow control window sizes to be specified in the
initial transport handshake. Specifying initial transport handshake. Specifying
SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error.
SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/3. SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/3.
Specifying it in the SETTINGS frame is an error. Specifying it in the SETTINGS frame is an error.
SETTINGS_MAX_HEADER_LIST_SIZE: See Section 4.2.5.1. SETTINGS_MAX_HEADER_LIST_SIZE: See Section 7.2.5.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 the format of their
settings to avoid using the 62-bit encoding. settings to avoid using the 62-bit encoding.
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 [RFC7540] have been reserved for IDs of settings defined in [HTTP2] have been reserved for simplicity.
simplicity. Note that the settings identifier space in HTTP/3 is Note that the settings identifier space in HTTP/3 is substantially
substantially larger (62 bits versus 16 bits), so many HTTP/3 larger (62 bits versus 16 bits), so many HTTP/3 settings have no
settings have no equivalent HTTP/2 code point. See Section 10.4. equivalent HTTP/2 code point. See Section 11.4.
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. error codes.
The HTTP/2 error codes defined in Section 7 of [RFC7540] map to the The HTTP/2 error codes defined in Section 7 of [HTTP2] map to the
HTTP/3 error codes as follows: HTTP/3 error codes as follows:
NO_ERROR (0x0): HTTP_NO_ERROR in Section 8.1. NO_ERROR (0x0): HTTP_NO_ERROR in Section 8.1.
PROTOCOL_ERROR (0x1): No single mapping. See new PROTOCOL_ERROR (0x1): No single mapping. See new
HTTP_MALFORMED_FRAME error codes defined in Section 8.1. HTTP_MALFORMED_FRAME error codes defined in Section 8.1.
INTERNAL_ERROR (0x2): HTTP_INTERNAL_ERROR in Section 8.1. INTERNAL_ERROR (0x2): HTTP_INTERNAL_ERROR in Section 8.1.
FLOW_CONTROL_ERROR (0x3): Not applicable, since QUIC handles flow FLOW_CONTROL_ERROR (0x3): Not applicable, since QUIC handles flow
skipping to change at page 50, line 8 skipping to change at page 55, line 42
CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 8.1. CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 8.1.
ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 8.1. ENHANCE_YOUR_CALM (0xb): HTTP_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.
HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 8.1. HTTP_1_1_REQUIRED (0xd): HTTP_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 10.5. Section 11.5.
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-19 B.1. Since draft-ietf-quic-http-19
o SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530) o SETTINGS_NUM_PLACEHOLDERS is 0x9 (#2443,#2530)
 End of changes. 172 change blocks. 
886 lines changed or deleted 1166 lines changed or added

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