rfc9297.original | rfc9297.txt | |||
---|---|---|---|---|
MASQUE D. Schinazi | Internet Engineering Task Force (IETF) D. Schinazi | |||
Internet-Draft Google LLC | Request for Comments: 9297 Google LLC | |||
Intended status: Standards Track L. Pardue | Category: Standards Track L. Pardue | |||
Expires: 19 December 2022 Cloudflare | ISSN: 2070-1721 Cloudflare | |||
17 June 2022 | August 2022 | |||
HTTP Datagrams and the Capsule Protocol | HTTP Datagrams and the Capsule Protocol | |||
draft-ietf-masque-h3-datagram-11 | ||||
Abstract | Abstract | |||
This document describes HTTP Datagrams, a convention for conveying | This document describes HTTP Datagrams, a convention for conveying | |||
multiplexed, potentially unreliable datagrams inside an HTTP | multiplexed, potentially unreliable datagrams inside an HTTP | |||
connection. | connection. | |||
In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC | In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC | |||
DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or | DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or | |||
undesirable, they can be sent using the Capsule Protocol, a more | undesirable, HTTP Datagrams can be sent using the Capsule Protocol, | |||
general convention for conveying data in HTTP connections. | which is a more general convention for conveying data in HTTP | |||
connections. | ||||
HTTP Datagrams and the Capsule Protocol are intended for use by HTTP | HTTP Datagrams and the Capsule Protocol are intended for use by HTTP | |||
extensions, not applications. | extensions, not applications. | |||
About This Document | ||||
This note is to be removed before publishing as an RFC. | ||||
The latest revision of this draft can be found at https://ietf-wg- | ||||
masque.github.io/draft-ietf-masque-h3-datagram/draft-ietf-masque- | ||||
h3-datagram.html. Status information for this document may be found | ||||
at https://datatracker.ietf.org/doc/draft-ietf-masque-h3-datagram/. | ||||
Discussion of this document takes place on the MASQUE Working Group | ||||
mailing list (mailto:masque@ietf.org), which is archived at | ||||
https://mailarchive.ietf.org/arch/browse/masque/. | ||||
Source for this draft and an issue tracker can be found at | ||||
https://github.com/ietf-wg-masque/draft-ietf-masque-h3-datagram. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 19 December 2022. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9297. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2022 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
1.1. Conventions and Definitions . . . . . . . . . . . . . . . 3 | 1.1. Conventions and Definitions | |||
2. HTTP Datagrams . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. HTTP Datagrams | |||
2.1. HTTP/3 Datagrams . . . . . . . . . . . . . . . . . . . . 4 | 2.1. HTTP/3 Datagrams | |||
2.1.1. The SETTINGS_H3_DATAGRAM HTTP/3 Setting . . . . . . . 5 | 2.1.1. The SETTINGS_H3_DATAGRAM HTTP/3 Setting | |||
2.2. HTTP Datagrams using Capsules . . . . . . . . . . . . . . 6 | 2.2. HTTP Datagrams Using Capsules | |||
3. Capsules . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 3. Capsules | |||
3.1. HTTP Data Streams . . . . . . . . . . . . . . . . . . . . 7 | 3.1. HTTP Data Streams | |||
3.2. The Capsule Protocol . . . . . . . . . . . . . . . . . . 8 | 3.2. The Capsule Protocol | |||
3.3. Error Handling . . . . . . . . . . . . . . . . . . . . . 9 | 3.3. Error Handling | |||
3.4. The Capsule-Protocol Header Field . . . . . . . . . . . . 10 | 3.4. The Capsule-Protocol Header Field | |||
3.5. The DATAGRAM Capsule . . . . . . . . . . . . . . . . . . 10 | 3.5. The DATAGRAM Capsule | |||
4. Security Considerations . . . . . . . . . . . . . . . . . . . 12 | 4. Security Considerations | |||
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 12 | 5. IANA Considerations | |||
5.1. HTTP/3 Setting . . . . . . . . . . . . . . . . . . . . . 12 | 5.1. HTTP/3 Setting | |||
5.2. HTTP/3 Error Code . . . . . . . . . . . . . . . . . . . . 13 | 5.2. HTTP/3 Error Code | |||
5.3. HTTP Header Field Name . . . . . . . . . . . . . . . . . 13 | 5.3. HTTP Header Field Name | |||
5.4. Capsule Types . . . . . . . . . . . . . . . . . . . . . . 13 | 5.4. Capsule Types | |||
6. References . . . . . . . . . . . . . . . . . . . . . . . . . 14 | 6. References | |||
6.1. Normative References . . . . . . . . . . . . . . . . . . 14 | 6.1. Normative References | |||
6.2. Informative References . . . . . . . . . . . . . . . . . 15 | 6.2. Informative References | |||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 16 | Acknowledgments | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 16 | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
HTTP extensions (as defined in Section 16 of [HTTP]) sometimes need | HTTP extensions (as defined in Section 16 of [HTTP]) sometimes need | |||
to access underlying transport protocol features such as unreliable | to access underlying transport protocol features such as unreliable | |||
delivery (as offered by [DGRAM]) to enable desirable features. For | delivery (as offered by [QUIC-DGRAM]) to enable desirable features. | |||
example, this could allow introducing an unreliable version of the | For example, this could allow for the introduction of an unreliable | |||
CONNECT method, or adding unreliable delivery to WebSockets | version of the CONNECT method and the addition of unreliable delivery | |||
[WEBSOCKET]. | to WebSockets [WEBSOCKET]. | |||
In Section 2, this document describes HTTP Datagrams, a convention | In Section 2, this document describes HTTP Datagrams, a convention | |||
that supports the bidirectional and optionally multiplexed exchange | for conveying bidirectional and potentially unreliable datagrams | |||
of data inside an HTTP connection. While HTTP Datagrams are | inside an HTTP connection, with multiplexing when possible. While | |||
associated with HTTP requests, they are not part of message content; | HTTP Datagrams are associated with HTTP requests, they are not a part | |||
instead, they are intended for use by HTTP extensions (such as the | of message content. Instead, they are intended for use by HTTP | |||
CONNECT method), and are compatible with all versions of HTTP. | extensions (such as the CONNECT method) and are compatible with all | |||
versions of HTTP. | ||||
When HTTP is running over a transport protocol that supports | When HTTP is running over a transport protocol that supports | |||
unreliable delivery (such as when the QUIC DATAGRAM extension [DGRAM] | unreliable delivery (such as when the QUIC DATAGRAM extension | |||
is available to HTTP/3 [HTTP/3]), HTTP Datagrams can use that | [QUIC-DGRAM] is available to HTTP/3 [HTTP/3]), HTTP Datagrams can use | |||
capability. | that capability. | |||
This document also describes the HTTP Capsule Protocol in Section 3, | In Section 3, this document describes the HTTP Capsule Protocol, | |||
to allow conveyance of HTTP Datagrams using reliable delivery. This | which allows the conveyance of HTTP Datagrams using reliable | |||
addresses HTTP/3 cases where use of the QUIC DATAGRAM frame is | delivery. This addresses HTTP/3 cases where use of the QUIC DATAGRAM | |||
unavailable or undesirable, or where the transport protocol only | frame is unavailable or undesirable or where the transport protocol | |||
provides reliable delivery, such as with HTTP/1.1 [HTTP/1.1] or | only provides reliable delivery, such as with HTTP/1.1 [HTTP/1.1] or | |||
HTTP/2 [HTTP/2] over TCP [TCP]. | HTTP/2 [HTTP/2] over TCP [TCP]. | |||
1.1. Conventions and Definitions | 1.1. Conventions and Definitions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
skipping to change at page 4, line 11 ¶ | skipping to change at line 131 ¶ | |||
types are integers, they are encoded using the variable-length | types are integers, they are encoded using the variable-length | |||
integer encoding from Section 16 of [QUIC]. Integer values do not | integer encoding from Section 16 of [QUIC]. Integer values do not | |||
need to be encoded on the minimum number of bytes necessary. | need to be encoded on the minimum number of bytes necessary. | |||
In this document, the term "intermediary" refers to an HTTP | In this document, the term "intermediary" refers to an HTTP | |||
intermediary as defined in Section 3.7 of [HTTP]. | intermediary as defined in Section 3.7 of [HTTP]. | |||
2. HTTP Datagrams | 2. HTTP Datagrams | |||
HTTP Datagrams are a convention for conveying bidirectional and | HTTP Datagrams are a convention for conveying bidirectional and | |||
potentially unreliable datagrams inside an HTTP connection, with | potentially unreliable datagrams inside an HTTP connection with | |||
multiplexing when possible. All HTTP Datagrams are associated with | multiplexing when possible. All HTTP Datagrams are associated with | |||
an HTTP request. | an HTTP request. | |||
When HTTP Datagrams are conveyed on an HTTP/3 connection, the QUIC | When HTTP Datagrams are conveyed on an HTTP/3 connection, the QUIC | |||
DATAGRAM frame can be used to achieve these goals, including | DATAGRAM frame can be used to provide demultiplexing and unreliable | |||
unreliable delivery; see Section 2.1. Negotiating the use of QUIC | delivery; see Section 2.1. Negotiating the use of QUIC DATAGRAM | |||
DATAGRAM frames for HTTP Datagrams is achieved via the exchange of | frames for HTTP Datagrams is achieved via the exchange of HTTP/3 | |||
HTTP/3 settings; see Section 2.1.1. | settings; see Section 2.1.1. | |||
When running over HTTP/2, demultiplexing is provided by the HTTP/2 | When running over HTTP/2, demultiplexing is provided by the HTTP/2 | |||
framing layer, but unreliable delivery is unavailable. HTTP | framing layer, but unreliable delivery is unavailable. HTTP | |||
Datagrams are negotiated and conveyed using the Capsule Protocol; see | Datagrams are negotiated and conveyed using the Capsule Protocol; see | |||
Section 3.5. | Section 3.5. | |||
When running over HTTP/1.x, requests are strictly serialized in the | When running over HTTP/1.x, requests are strictly serialized in the | |||
connection, and therefore demultiplexing is not available. | connection; therefore, demultiplexing is not available. Unreliable | |||
Unreliable delivery is likewise not available. HTTP Datagrams are | delivery is likewise not available. HTTP Datagrams are negotiated | |||
negotiated and conveyed using the Capsule Protocol; see Section 3.5. | and conveyed using the Capsule Protocol; see Section 3.5. | |||
HTTP Datagrams MUST only be sent with an association to an HTTP | HTTP Datagrams MUST only be sent with an association to an HTTP | |||
request that explicitly supports them. For example, existing HTTP | request that explicitly supports them. For example, existing HTTP | |||
methods GET and POST do not define semantics for associated HTTP | methods GET and POST do not define semantics for associated HTTP | |||
Datagrams; therefore, HTTP Datagrams cannot be sent associated with | Datagrams; therefore, HTTP Datagrams associated with GET or POST | |||
GET or POST request streams. | request streams cannot be sent. | |||
If an HTTP Datagram is received and it is associated with a request | If an HTTP Datagram is received and it is associated with a request | |||
that has no known semantics for HTTP Datagrams, the receiver MUST | that has no known semantics for HTTP Datagrams, the receiver MUST | |||
terminate the request; if HTTP/3 is in use, the request stream MUST | terminate the request. If HTTP/3 is in use, the request stream MUST | |||
be aborted with H3_DATAGRAM_ERROR (0x33). HTTP extensions MAY | be aborted with H3_DATAGRAM_ERROR (0x33). HTTP extensions MAY | |||
override these requirements by defining a negotiation mechanism and | override these requirements by defining a negotiation mechanism and | |||
semantics for HTTP Datagrams. | semantics for HTTP Datagrams. | |||
2.1. HTTP/3 Datagrams | 2.1. HTTP/3 Datagrams | |||
When used with HTTP/3, the Datagram Data field of QUIC DATAGRAM | When used with HTTP/3, the Datagram Data field of QUIC DATAGRAM | |||
frames uses the following format: | frames uses the following format: | |||
HTTP/3 Datagram { | HTTP/3 Datagram { | |||
skipping to change at page 5, line 4 ¶ | skipping to change at line 173 ¶ | |||
2.1. HTTP/3 Datagrams | 2.1. HTTP/3 Datagrams | |||
When used with HTTP/3, the Datagram Data field of QUIC DATAGRAM | When used with HTTP/3, the Datagram Data field of QUIC DATAGRAM | |||
frames uses the following format: | frames uses the following format: | |||
HTTP/3 Datagram { | HTTP/3 Datagram { | |||
Quarter Stream ID (i), | Quarter Stream ID (i), | |||
HTTP Datagram Payload (..), | HTTP Datagram Payload (..), | |||
} | } | |||
Figure 1: HTTP/3 Datagram Format | Figure 1: HTTP/3 Datagram Format | |||
Quarter Stream ID: A variable-length integer that contains the value | Quarter Stream ID: A variable-length integer that contains the value | |||
of the client-initiated bidirectional stream that this datagram is | of the client-initiated bidirectional stream that this datagram is | |||
associated with, divided by four (the division by four stems from | associated with divided by four (the division by four stems from | |||
the fact that HTTP requests are sent on client-initiated | the fact that HTTP requests are sent on client-initiated | |||
bidirectional streams, and those have stream IDs that are | bidirectional streams, which have stream IDs that are divisible by | |||
divisible by four). The largest legal QUIC stream ID value is | four). The largest legal QUIC stream ID value is 2^62-1, so the | |||
2^62-1, so the largest legal value of Quarter Stream ID is 2^60-1. | largest legal value of the Quarter Stream ID field is 2^60-1. | |||
Receipt of an HTTP/3 Datagram that includes a larger value MUST be | Receipt of an HTTP/3 Datagram that includes a larger value MUST be | |||
treated as an HTTP/3 connection error of type H3_DATAGRAM_ERROR | treated as an HTTP/3 connection error of type H3_DATAGRAM_ERROR | |||
(0x33). | (0x33). | |||
HTTP Datagram Payload: The payload of the datagram, whose semantics | HTTP Datagram Payload: The payload of the datagram, whose semantics | |||
are defined by the extension that is using HTTP Datagrams. Note | are defined by the extension that is using HTTP Datagrams. Note | |||
that this field can be empty. | that this field can be empty. | |||
Receipt of a QUIC DATAGRAM frame whose payload is too short to allow | Receipt of a QUIC DATAGRAM frame whose payload is too short to allow | |||
parsing the Quarter Stream ID field MUST be treated as an HTTP/3 | parsing the Quarter Stream ID field MUST be treated as an HTTP/3 | |||
connection error of type H3_DATAGRAM_ERROR (0x33). | connection error of type H3_DATAGRAM_ERROR (0x33). | |||
HTTP/3 Datagrams MUST NOT be sent unless the corresponding stream's | HTTP/3 Datagrams MUST NOT be sent unless the corresponding stream's | |||
send side is open. If a datagram is received after the corresponding | send side is open. If a datagram is received after the corresponding | |||
stream's receive side is closed, the received datagrams MUST be | stream's receive side is closed, the received datagrams MUST be | |||
silently dropped. | silently dropped. | |||
If an HTTP/3 Datagram is received and its Quarter Stream ID maps to a | If an HTTP/3 Datagram is received and its Quarter Stream ID field | |||
stream that has not yet been created, the receiver SHALL either drop | maps to a stream that has not yet been created, the receiver SHALL | |||
that datagram silently or buffer it temporarily (on the order of a | either drop that datagram silently or buffer it temporarily (on the | |||
round trip) while awaiting the creation of the corresponding stream. | order of a round trip) while awaiting the creation of the | |||
corresponding stream. | ||||
If an HTTP/3 Datagram is received and its Quarter Stream ID maps to a | If an HTTP/3 Datagram is received and its Quarter Stream ID field | |||
stream that cannot be created due to client-initiated bidirectional | maps to a stream that cannot be created due to client-initiated | |||
stream limits, it SHOULD be treated as an HTTP/3 connection error of | bidirectional stream limits, it SHOULD be treated as an HTTP/3 | |||
type H3_ID_ERROR. Generating an error is not mandatory in this case | connection error of type H3_ID_ERROR. Generating an error is not | |||
because HTTP/3 implementations might have practical barriers to | mandatory because the QUIC stream limit might be unknown to the | |||
determining the active stream concurrency limit that is applied by | HTTP/3 layer. | |||
the QUIC layer. | ||||
Prioritization of HTTP/3 Datagrams is not defined in this document. | Prioritization of HTTP/3 Datagrams is not defined in this document. | |||
Future extensions MAY define how to prioritize datagrams, and MAY | Future extensions MAY define how to prioritize datagrams and MAY | |||
define signaling to allow communicating prioritization preferences. | define signaling to allow communicating prioritization preferences. | |||
2.1.1. The SETTINGS_H3_DATAGRAM HTTP/3 Setting | 2.1.1. The SETTINGS_H3_DATAGRAM HTTP/3 Setting | |||
Endpoints can indicate to their peer that they are willing to receive | An endpoint can indicate to its peer that it is willing to receive | |||
HTTP/3 Datagrams by sending the SETTINGS_H3_DATAGRAM (0x33) setting | HTTP/3 Datagrams by sending the SETTINGS_H3_DATAGRAM (0x33) setting | |||
with a value of 1. | with a value of 1. | |||
The value of the SETTINGS_H3_DATAGRAM setting MUST be either 0 or 1. | The value of the SETTINGS_H3_DATAGRAM setting MUST be either 0 or 1. | |||
A value of 0 indicates that the implementation is not willing to | A value of 0 indicates that the implementation is not willing to | |||
receive HTTP Datagrams. If the SETTINGS_H3_DATAGRAM setting is | receive HTTP Datagrams. If the SETTINGS_H3_DATAGRAM setting is | |||
received with a value that is neither 0 nor 1, the receiver MUST | received with a value that is neither 0 nor 1, the receiver MUST | |||
terminate the connection with error H3_SETTINGS_ERROR. | terminate the connection with error H3_SETTINGS_ERROR. | |||
QUIC DATAGRAM frames MUST NOT be sent until the SETTINGS_H3_DATAGRAM | QUIC DATAGRAM frames MUST NOT be sent until the SETTINGS_H3_DATAGRAM | |||
skipping to change at page 6, line 33 ¶ | skipping to change at line 251 ¶ | |||
greater than or equal to the stored value; if not, the client MUST | greater than or equal to the stored value; if not, the client MUST | |||
terminate the connection with error H3_SETTINGS_ERROR. In all cases, | terminate the connection with error H3_SETTINGS_ERROR. In all cases, | |||
the maximum permitted value of the SETTINGS_H3_DATAGRAM setting | the maximum permitted value of the SETTINGS_H3_DATAGRAM setting | |||
parameter is 1. | parameter is 1. | |||
It is RECOMMENDED that implementations that support receiving HTTP/3 | It is RECOMMENDED that implementations that support receiving HTTP/3 | |||
Datagrams always send the SETTINGS_H3_DATAGRAM setting with a value | Datagrams always send the SETTINGS_H3_DATAGRAM setting with a value | |||
of 1, even if the application does not intend to use HTTP/3 | of 1, even if the application does not intend to use HTTP/3 | |||
Datagrams. This helps to avoid "sticking out"; see Section 4. | Datagrams. This helps to avoid "sticking out"; see Section 4. | |||
2.1.1.1. Note About Draft Versions | 2.2. HTTP Datagrams Using Capsules | |||
[[RFC editor: please remove this section before publication.]] | ||||
Some revisions of this draft specification use a different value (the | ||||
Identifier field of a Setting in the HTTP/3 SETTINGS frame) for the | ||||
SETTINGS_H3_DATAGRAM setting. This allows new draft revisions to | ||||
make incompatible changes. Multiple draft versions MAY be supported | ||||
by sending multiple values for SETTINGS_H3_DATAGRAM. Once SETTINGS | ||||
have been sent and received, an implementation that supports multiple | ||||
drafts MUST compute the intersection of the values it has sent and | ||||
received, and then it MUST select and use the most recent draft | ||||
version from the intersection set. This ensures that both peers | ||||
negotiate the same draft version. | ||||
2.2. HTTP Datagrams using Capsules | ||||
When HTTP/3 Datagrams are unavailable or undesirable, HTTP Datagrams | When HTTP/3 Datagrams are unavailable or undesirable, HTTP Datagrams | |||
can be sent using the Capsule Protocol, see Section 3.5. | can be sent using the Capsule Protocol; see Section 3.5. | |||
3. Capsules | 3. Capsules | |||
One mechanism to extend HTTP is to introduce new HTTP Upgrade Tokens | One mechanism to extend HTTP is to introduce new HTTP upgrade tokens; | |||
(see Section 16.7 of [HTTP]). In HTTP/1.x, these tokens are used via | see Section 16.7 of [HTTP]. In HTTP/1.x, these tokens are used via | |||
the Upgrade mechanism (see Section 7.8 of [HTTP]). In HTTP/2 and | the Upgrade mechanism; see Section 7.8 of [HTTP]. In HTTP/2 and | |||
HTTP/3, these tokens are used via the Extended CONNECT mechanism (see | HTTP/3, these tokens are used via the Extended CONNECT mechanism; see | |||
[EXT-CONNECT2] and [EXT-CONNECT3]). | [EXT-CONNECT2] and [EXT-CONNECT3]. | |||
This specification introduces the Capsule Protocol. The Capsule | This specification introduces the Capsule Protocol. The Capsule | |||
Protocol is a sequence of type-length-value tuples that definitions | Protocol is a sequence of type-length-value tuples that definitions | |||
of new HTTP Upgrade Tokens can choose to use. It allows endpoints to | of new HTTP upgrade tokens can choose to use. It allows endpoints to | |||
reliably communicate request-related information end-to-end on HTTP | reliably communicate request-related information end-to-end on HTTP | |||
request streams, even in the presence of HTTP intermediaries. The | request streams, even in the presence of HTTP intermediaries. The | |||
Capsule Protocol can be used to exchange HTTP Datagrams, which is | Capsule Protocol can be used to exchange HTTP Datagrams, which is | |||
necessary when HTTP is running over a transport that does not support | necessary when HTTP is running over a transport that does not support | |||
the QUIC DATAGRAM frame. The Capsule Protocol can also be used to | the QUIC DATAGRAM frame. The Capsule Protocol can also be used to | |||
communicate reliable and bidirectional control messages associated | communicate reliable and bidirectional control messages associated | |||
with a datagram-based protocol even when HTTP/3 Datagrams are in use. | with a datagram-based protocol even when HTTP/3 Datagrams are in use. | |||
3.1. HTTP Data Streams | 3.1. HTTP Data Streams | |||
This specification defines the "data stream" of an HTTP request as | This specification defines the "data stream" of an HTTP request as | |||
the bidirectional stream of bytes that follows the header section of | the bidirectional stream of bytes that follows the header section of | |||
the request message and the final response message that is either | the request message and the final response message that is either | |||
successful (i.e., 2xx) or upgraded (i.e., 101). | successful (i.e., 2xx) or upgraded (i.e., 101). | |||
In HTTP/1.x, the data stream consists of all bytes on the connection | In HTTP/1.x, the data stream consists of all bytes on the connection | |||
that follow the blank line that concludes either the request header | that follow the blank line that concludes either the request header | |||
section, or the final response header section. As a result, only the | section or the final response header section. As a result, only the | |||
last HTTP request on an HTTP/1.x connection can start the capsule | last HTTP request on an HTTP/1.x connection can start the Capsule | |||
protocol. | Protocol. | |||
In HTTP/2 and HTTP/3, the data stream of a given HTTP request | In HTTP/2 and HTTP/3, the data stream of a given HTTP request | |||
consists of all bytes sent in DATA frames with the corresponding | consists of all bytes sent in DATA frames with the corresponding | |||
stream ID. | stream ID. | |||
The concept of a data stream is particularly relevant for methods | The concept of a data stream is particularly relevant for methods | |||
such as CONNECT where there is no HTTP message content after the | such as CONNECT, where there is no HTTP message content after the | |||
headers. | headers. | |||
Data streams can be prioritized using any means suited to stream or | Data streams can be prioritized using any means suited to stream or | |||
request prioritization. For example, see Section 11 of [PRIORITY]. | request prioritization. For example, see Section 11 of [PRIORITY]. | |||
Data streams are subject to the flow control mechanisms of the | Data streams are subject to the flow control mechanisms of the | |||
underlying layers (for example, HTTP/2 stream flow control, HTTP/2 | underlying layers; examples include HTTP/2 stream flow control, | |||
connection flow control, and TCP flow control). | HTTP/2 connection flow control, and TCP flow control. | |||
3.2. The Capsule Protocol | 3.2. The Capsule Protocol | |||
Definitions of new HTTP Upgrade Tokens can state that their | Definitions of new HTTP upgrade tokens can state that their | |||
associated request's data stream uses the Capsule Protocol. If they | associated request's data stream uses the Capsule Protocol. If they | |||
do so, that means that the contents of the associated request's data | do so, the contents of the associated request's data stream uses the | |||
stream uses the following format: | following format: | |||
Capsule Protocol { | Capsule Protocol { | |||
Capsule (..) ..., | Capsule (..) ..., | |||
} | } | |||
Figure 2: Capsule Protocol Stream Format | Figure 2: Capsule Protocol Stream Format | |||
Capsule { | Capsule { | |||
Capsule Type (i), | Capsule Type (i), | |||
Capsule Length (i), | Capsule Length (i), | |||
Capsule Value (..), | Capsule Value (..), | |||
} | } | |||
Figure 3: Capsule Format | Figure 3: Capsule Format | |||
Capsule Type: A variable-length integer indicating the Type of the | Capsule Type: A variable-length integer indicating the type of the | |||
capsule. An IANA registry is used to manage the assignment of | capsule. An IANA registry is used to manage the assignment of | |||
Capsule Types; see Section 5.4. | Capsule Types; see Section 5.4. | |||
Capsule Length: The length in bytes of the Capsule Value field | Capsule Length: The length, in bytes, of the Capsule Value field, | |||
following this field, encoded as a variable-length integer. Note | which follows this field, encoded as a variable-length integer. | |||
that this field can have a value of zero. | Note that this field can have a value of zero. | |||
Capsule Value: The payload of this capsule. Its semantics are | Capsule Value: The payload of this Capsule. Its semantics are | |||
determined by the value of the Capsule Type field. | determined by the value of the Capsule Type field. | |||
An intermediary can identify the use of the capsule protocol either | An intermediary can identify the use of the Capsule Protocol either | |||
through the presence of the Capsule-Protocol header field | through the presence of the Capsule-Protocol header field | |||
(Section 3.4) or by understanding the chosen HTTP Upgrade token. | (Section 3.4) or by understanding the chosen HTTP Upgrade token. | |||
Because new protocols or extensions might define new capsule types, | Because new protocols or extensions might define new Capsule Types, | |||
intermediaries that wish to allow for future extensibility SHOULD | intermediaries that wish to allow for future extensibility SHOULD | |||
forward capsules without modification, unless the definition of the | forward Capsules without modification unless the definition of the | |||
Capsule Type in use specifies additional intermediary processing. | Capsule Type in use specifies additional intermediary processing. | |||
One such Capsule Type is the DATAGRAM capsule; see Section 3.5. In | One such Capsule Type is the DATAGRAM Capsule; see Section 3.5. In | |||
particular, intermediaries SHOULD forward Capsules with an unknown | particular, intermediaries SHOULD forward Capsules with an unknown | |||
Capsule Type without modification. | Capsule Type without modification. | |||
Endpoints which receive a Capsule with an unknown Capsule Type MUST | Endpoints that receive a Capsule with an unknown Capsule Type MUST | |||
silently drop that Capsule and skip over it to parse the next | silently drop that Capsule and skip over it to parse the next | |||
Capsule. | Capsule. | |||
By virtue of the definition of the data stream: | By virtue of the definition of the data stream: | |||
* The Capsule Protocol is not in use unless the response includes a | * The Capsule Protocol is not in use unless the response includes a | |||
2xx (Successful) or 101 (Switching Protocols) status code. | 2xx (Successful) or 101 (Switching Protocols) status code. | |||
* When the Capsule Protocol is in use, the associated HTTP request | * When the Capsule Protocol is in use, the associated HTTP request | |||
and response do not carry HTTP content. A future extension MAY | and response do not carry HTTP content. A future extension MAY | |||
define a new capsule type to carry HTTP content. | define a new Capsule Type to carry HTTP content. | |||
Since the Capsule Protocol only applies to definitions of new HTTP | The Capsule Protocol only applies to definitions of new HTTP upgrade | |||
Upgrade Tokens, in HTTP/2 and HTTP/3 it can only be used with the | tokens; thus, in HTTP/2 and HTTP/3, it can only be used with the | |||
CONNECT method. Therefore, once both endpoints agree to use the | CONNECT method. Therefore, once both endpoints agree to use the | |||
Capsule Protocol, the frame usage requirements of the stream change | Capsule Protocol, the frame usage requirements of the stream change | |||
as specified in Section 8.5 of [HTTP/2] and Section 4.2 of [HTTP/3]. | as specified in Section 8.5 of [HTTP/2] and Section 4.4 of [HTTP/3]. | |||
The Capsule Protocol MUST NOT be used with messages that contain | The Capsule Protocol MUST NOT be used with messages that contain | |||
Content-Length, Content-Type, or Transfer-Encoding header fields. | Content-Length, Content-Type, or Transfer-Encoding header fields. | |||
Additionally, HTTP status codes 204 (No Content), 205 (Reset | Additionally, HTTP status codes 204 (No Content), 205 (Reset | |||
Content), and 206 (Partial Content) MUST NOT be sent on responses | Content), and 206 (Partial Content) MUST NOT be sent on responses | |||
that use the Capsule Protocol. A receiver that observes a violation | that use the Capsule Protocol. A receiver that observes a violation | |||
of these requirements MUST treat the HTTP message as malformed. | of these requirements MUST treat the HTTP message as malformed. | |||
When processing capsules, a receiver might be tempted to accumulate | When processing Capsules, a receiver might be tempted to accumulate | |||
the full length of the capsule value in the data stream before | the full length of the Capsule Value field in the data stream before | |||
handling it. This approach SHOULD be avoided, because it can consume | handling it. This approach SHOULD be avoided because it can consume | |||
flow control in underlying layers, and that might lead to deadlocks | flow control in underlying layers, and that might lead to deadlocks | |||
if the capsule data exhausts the flow control window. | if the Capsule data exhausts the flow control window. | |||
3.3. Error Handling | 3.3. Error Handling | |||
When a receiver encounters an error processing the Capsule Protocol, | When a receiver encounters an error processing the Capsule Protocol, | |||
the receiver MUST treat it as if it had received a malformed or | the receiver MUST treat it as if it had received a malformed or | |||
incomplete HTTP message. For HTTP/3, the handling of malformed | incomplete HTTP message. For HTTP/3, the handling of malformed | |||
messages is described in Section 4.1.3 of [HTTP/3]. For HTTP/2, the | messages is described in Section 4.1.2 of [HTTP/3]. For HTTP/2, the | |||
handling of malformed messages is described in Section 8.1.1 of | handling of malformed messages is described in Section 8.1.1 of | |||
[HTTP/2]. For HTTP/1.x, the handling of incomplete messages is | [HTTP/2]. For HTTP/1.x, the handling of incomplete messages is | |||
described in Section 8 of [HTTP/1.1]. | described in Section 8 of [HTTP/1.1]. | |||
Each capsule's payload MUST contain exactly the fields identified in | Each Capsule's payload MUST contain exactly the fields identified in | |||
its description. A capsule payload that contains additional bytes | its description. A Capsule payload that contains additional bytes | |||
after the identified fields or a capsule payload that terminates | after the identified fields or a Capsule payload that terminates | |||
before the end of the identified fields MUST be treated as it if were | before the end of the identified fields MUST be treated as it if were | |||
a malformed or incomplete message. In particular, redundant length | a malformed or incomplete message. In particular, redundant length | |||
encodings MUST be verified to be self-consistent. | encodings MUST be verified to be self-consistent. | |||
If the receive side of a stream carrying capsules is terminated | If the receive side of a stream carrying Capsules is terminated | |||
cleanly (for example, in HTTP/3 this is defined as receiving a QUIC | cleanly (for example, in HTTP/3 this is defined as receiving a QUIC | |||
STREAM frame with the FIN bit set) and the last capsule on the stream | STREAM frame with the FIN bit set) and the last Capsule on the stream | |||
was truncated, this MUST be treated as if it were a malformed or | was truncated, this MUST be treated as if it were a malformed or | |||
incomplete message. | incomplete message. | |||
3.4. The Capsule-Protocol Header Field | 3.4. The Capsule-Protocol Header Field | |||
The "Capsule-Protocol" header field is an Item Structured Field, see | The "Capsule-Protocol" header field is an Item Structured Field; see | |||
Section 3.3 of [STRUCT-FIELD]; its value MUST be a Boolean; any other | Section 3.3 of [STRUCTURED-FIELDS]. Its value MUST be a Boolean; any | |||
value type MUST be handled as if the field were not present by | other value type MUST be handled as if the field were not present by | |||
recipients (for example, if this field is included multiple times, | recipients (for example, if this field is included multiple times, | |||
its type will become a List and the field will therefore be ignored). | its type will become a List and the field will be ignored). This | |||
This document does not define any parameters for the Capsule-Protocol | document does not define any parameters for the Capsule-Protocol | |||
header field value, but future documents might define parameters. | header field value, but future documents might define parameters. | |||
Receivers MUST ignore unknown parameters. | Receivers MUST ignore unknown parameters. | |||
Endpoints indicate that the Capsule Protocol is in use on a data | Endpoints indicate that the Capsule Protocol is in use on a data | |||
stream by sending a Capsule-Protocol header field with a true value. | stream by sending a Capsule-Protocol header field with a true value. | |||
A Capsule-Protocol header field with a false value has the same | A Capsule-Protocol header field with a false value has the same | |||
semantics as when the header is not present. | semantics as when the header is not present. | |||
Intermediaries MAY use this header field to allow processing of HTTP | Intermediaries MAY use this header field to allow processing of HTTP | |||
Datagrams for unknown HTTP Upgrade Tokens; note that this is only | Datagrams for unknown HTTP upgrade tokens. Note that this is only | |||
possible for HTTP Upgrade or Extended CONNECT. | possible for HTTP Upgrade or Extended CONNECT. | |||
The Capsule-Protocol header field MUST NOT be used on HTTP responses | The Capsule-Protocol header field MUST NOT be used on HTTP responses | |||
with a status code that is both different from 101 and outside the | with a status code that is both different from 101 (Switching | |||
2xx range. | Protocols) and outside the 2xx (Successful) range. | |||
When using the Capsule Protocol, HTTP endpoints SHOULD send the | When using the Capsule Protocol, HTTP endpoints SHOULD send the | |||
Capsule-Protocol header field to simplify intermediary processing. | Capsule-Protocol header field to simplify intermediary processing. | |||
Definitions of new HTTP Upgrade Tokens that use the Capsule Protocol | Definitions of new HTTP upgrade tokens that use the Capsule Protocol | |||
MAY alter this recommendation. | MAY alter this recommendation. | |||
3.5. The DATAGRAM Capsule | 3.5. The DATAGRAM Capsule | |||
This document defines the DATAGRAM (0x00) capsule type. This capsule | This document defines the DATAGRAM (0x00) Capsule Type. This Capsule | |||
allows HTTP Datagrams to be sent on a stream using the Capsule | allows HTTP Datagrams to be sent on a stream using the Capsule | |||
Protocol. This is particularly useful when HTTP is running over a | Protocol. This is particularly useful when HTTP is running over a | |||
transport that does not support the QUIC DATAGRAM frame. | transport that does not support the QUIC DATAGRAM frame. | |||
Datagram Capsule { | Datagram Capsule { | |||
Type (i) = 0x00, | Type (i) = 0x00, | |||
Length (i), | Length (i), | |||
HTTP Datagram Payload (..), | HTTP Datagram Payload (..), | |||
} | } | |||
Figure 4: DATAGRAM Capsule Format | Figure 4: DATAGRAM Capsule Format | |||
HTTP Datagram Payload: The payload of the datagram, whose semantics | HTTP Datagram Payload: The payload of the datagram, whose semantics | |||
are defined by the extension that is using HTTP Datagrams. Note | are defined by the extension that is using HTTP Datagrams. Note | |||
that this field can be empty. | that this field can be empty. | |||
HTTP Datagrams sent using the DATAGRAM capsule have the same | HTTP Datagrams sent using the DATAGRAM Capsule have the same | |||
semantics as those sent in QUIC DATAGRAM frames. In particular, the | semantics as those sent in QUIC DATAGRAM frames. In particular, the | |||
restrictions on when it is allowed to send an HTTP Datagram and how | restrictions on when it is allowed to send an HTTP Datagram and how | |||
to process them from Section 2.1 also apply to HTTP Datagrams sent | to process them (from Section 2.1) also apply to HTTP Datagrams sent | |||
and received using the DATAGRAM capsule. | and received using the DATAGRAM Capsule. | |||
An intermediary can reencode HTTP Datagrams as it forwards them. In | An intermediary can re-encode HTTP Datagrams as it forwards them. In | |||
other words, an intermediary MAY send a DATAGRAM capsule to forward | other words, an intermediary MAY send a DATAGRAM Capsule to forward | |||
an HTTP Datagram that was received in a QUIC DATAGRAM frame, and vice | an HTTP Datagram that was received in a QUIC DATAGRAM frame and vice | |||
versa. Intermediaries MUST NOT perform this reencoding unless they | versa. Intermediaries MUST NOT perform this re-encoding unless they | |||
have identified the use of the Capsule Protocol on the corresponding | have identified the use of the Capsule Protocol on the corresponding | |||
request stream; see Section 3.2. | request stream; see Section 3.2. | |||
Note that while DATAGRAM capsules that are sent on a stream are | Note that while DATAGRAM Capsules, which are sent on a stream, are | |||
reliably delivered in order, intermediaries can reencode DATAGRAM | reliably delivered in order, intermediaries can re-encode DATAGRAM | |||
capsules into QUIC DATAGRAM frames when forwarding messages, which | Capsules into QUIC DATAGRAM frames when forwarding messages, which | |||
could result in loss or reordering. | could result in loss or reordering. | |||
If an intermediary receives an HTTP Datagram in a QUIC DATAGRAM frame | If an intermediary receives an HTTP Datagram in a QUIC DATAGRAM frame | |||
and is forwarding it on a connection that supports QUIC DATAGRAM | and is forwarding it on a connection that supports QUIC DATAGRAM | |||
frames, the intermediary SHOULD NOT convert that HTTP Datagram to a | frames, the intermediary SHOULD NOT convert that HTTP Datagram to a | |||
DATAGRAM capsule. If the HTTP Datagram is too large to fit in a | DATAGRAM Capsule. If the HTTP Datagram is too large to fit in a | |||
DATAGRAM frame (for example because the path MTU of that QUIC | DATAGRAM frame (for example, because the Path MTU (PMTU) of that QUIC | |||
connection is too low or if the maximum UDP payload size advertised | connection is too low or if the maximum UDP payload size advertised | |||
on that connection is too low), the intermediary SHOULD drop the HTTP | on that connection is too low), the intermediary SHOULD drop the HTTP | |||
Datagram instead of converting it to a DATAGRAM capsule. This | Datagram instead of converting it to a DATAGRAM Capsule. This | |||
preserves the end-to-end unreliability characteristic that methods | preserves the end-to-end unreliability characteristic that methods | |||
such as Datagram Packetization Layer Path MTU Discovery (DPLPMTUD) | such as Datagram Packetization Layer PMTU Discovery (DPLPMTUD) depend | |||
depend on [DPLPMTUD]. An intermediary that converts QUIC DATAGRAM | on [DPLPMTUD]. An intermediary that converts QUIC DATAGRAM frames to | |||
frames to DATAGRAM capsules allows HTTP Datagrams to be arbitrarily | DATAGRAM Capsules allows HTTP Datagrams to be arbitrarily large | |||
large without suffering any loss; this can misrepresent the true path | without suffering any loss. This can misrepresent the true path | |||
properties, defeating methods such as DPLPMTUD. | properties, defeating methods such as DPLPMTUD. | |||
While DATAGRAM capsules can theoretically carry a payload of length | While DATAGRAM Capsules can theoretically carry a payload of length | |||
2^62-1, most HTTP extensions that use HTTP Datagrams will have their | 2^62-1, most HTTP extensions that use HTTP Datagrams will have their | |||
own limits on what datagram payload sizes are practical. | own limits on what datagram payload sizes are practical. | |||
Implementations SHOULD take those limits into account when parsing | Implementations SHOULD take those limits into account when parsing | |||
DATAGRAM capsules: if an incoming DATAGRAM capsule has a length that | DATAGRAM Capsules. If an incoming DATAGRAM Capsule has a length that | |||
is known to be so large as to not be usable, the implementation | is known to be so large as to not be usable, the implementation | |||
SHOULD discard the capsule without buffering its contents into | SHOULD discard the Capsule without buffering its contents into | |||
memory. | memory. | |||
Since QUIC DATAGRAM frames are required to fit within a QUIC packet, | Since QUIC DATAGRAM frames are required to fit within a QUIC packet, | |||
implementations that reencode DATAGRAM capsules into QUIC DATAGRAM | implementations that re-encode DATAGRAM Capsules into QUIC DATAGRAM | |||
frames might be tempted to accumulate the entire capsule in the | frames might be tempted to accumulate the entire Capsule in the | |||
stream before reencoding it. This SHOULD be avoided, because it can | stream before re-encoding it. This SHOULD be avoided, because it can | |||
cause flow control problems; see Section 3.2. | cause flow control problems; see Section 3.2. | |||
Note that it is possible for an HTTP extension to use HTTP Datagrams | Note that it is possible for an HTTP extension to use HTTP Datagrams | |||
without using the Capsule Protocol. For example, if an HTTP | without using the Capsule Protocol. For example, if an HTTP | |||
extension that uses HTTP Datagrams is only defined over transports | extension that uses HTTP Datagrams is only defined over transports | |||
that support QUIC DATAGRAM frames, it might not need a stream | that support QUIC DATAGRAM frames, it might not need a stream | |||
encoding. Additionally, HTTP extensions can use HTTP Datagrams with | encoding. Additionally, HTTP extensions can use HTTP Datagrams with | |||
their own data stream protocol. However, new HTTP extensions that | their own data stream protocol. However, new HTTP extensions that | |||
wish to use HTTP Datagrams SHOULD use the Capsule Protocol as failing | wish to use HTTP Datagrams SHOULD use the Capsule Protocol, as | |||
to do so will make it harder for the HTTP extension to support | failing to do so will make it harder for the HTTP extension to | |||
versions of HTTP other than HTTP/3 and will prevent interoperability | support versions of HTTP other than HTTP/3 and will prevent | |||
with intermediaries that only support the Capsule Protocol. | interoperability with intermediaries that only support the Capsule | |||
Protocol. | ||||
4. Security Considerations | 4. Security Considerations | |||
Since transmitting HTTP Datagrams using QUIC DATAGRAM frames requires | Since transmitting HTTP Datagrams using QUIC DATAGRAM frames requires | |||
sending the HTTP/3 SETTINGS_H3_DATAGRAM setting, it "sticks out". In | sending the HTTP/3 SETTINGS_H3_DATAGRAM setting, it "sticks out". In | |||
other words, probing clients can learn whether a server supports HTTP | other words, probing clients can learn whether a server supports HTTP | |||
Datagrams over QUIC DATAGRAM frames. As some servers might wish to | Datagrams over QUIC DATAGRAM frames. As some servers might wish to | |||
obfuscate the fact that they offer application services that use HTTP | obfuscate the fact that they offer application services that use HTTP | |||
Datagrams, it's best for all implementations that support this | Datagrams, it's best for all implementations that support this | |||
feature to always send this setting, see Section 2.1.1. | feature to always send this setting; see Section 2.1.1. | |||
Since use of the Capsule Protocol is restricted to new HTTP Upgrade | Since use of the Capsule Protocol is restricted to new HTTP upgrade | |||
Tokens, it is not accessible from Web Platform APIs (such as those | tokens, it is not directly accessible from Web Platform APIs (such as | |||
commonly accessed via JavaScript in web browsers). | those commonly accessed via JavaScript in web browsers). | |||
Definitions of new HTTP Upgrade Tokens that use the Capsule Protocol | Definitions of new HTTP upgrade tokens that use the Capsule Protocol | |||
need to perform a security analysis that considers the impact of HTTP | need to include a security analysis that considers the impact of HTTP | |||
Datagrams and Capsules in the context of their protocol. | Datagrams and Capsules in the context of their protocol. | |||
5. IANA Considerations | 5. IANA Considerations | |||
5.1. HTTP/3 Setting | 5.1. HTTP/3 Setting | |||
This document will request IANA to register the following entry in | IANA has registered the following entry in the "HTTP/3 Settings" | |||
the "HTTP/3 Settings" registry maintained at | registry maintained at <https://www.iana.org/assignments/ | |||
<https://www.iana.org/assignments/http3-parameters>: | http3-parameters>: | |||
Value: 0x33 | Value: 0x33 | |||
Setting Name: SETTINGS_H3_DATAGRAM | Setting Name: SETTINGS_H3_DATAGRAM | |||
Default: 0 | Default: 0 | |||
Status: provisional (permanent if this document is approved) | Status: permanent | |||
Specification: This Document | Reference: RFC 9297 | |||
Change Controller: IETF | Change Controller: IETF | |||
Contact: HTTP_WG; HTTP working group; ietf-http-wg@w3.org | Contact: HTTP_WG; HTTP working group; ietf-http-wg@w3.org | |||
Notes: None | ||||
5.2. HTTP/3 Error Code | 5.2. HTTP/3 Error Code | |||
This document will request IANA to register the following entry in | IANA has registered the following entry in the "HTTP/3 Error Codes" | |||
the "HTTP/3 Error Codes" registry maintained at | registry maintained at <https://www.iana.org/assignments/ | |||
<https://www.iana.org/assignments/http3-parameters>: | http3-parameters>: | |||
Value: 0x33 | Value: 0x33 | |||
Name: H3_DATAGRAM_ERROR | Name: H3_DATAGRAM_ERROR | |||
Description: Datagram or capsule protocol parse error | Description: Datagram or Capsule Protocol parse error | |||
Status: provisional (permanent if this document is approved) | Status: permanent | |||
Specification: This Document | Reference: RFC 9297 | |||
Change Controller: IETF | Change Controller: IETF | |||
Contact: HTTP_WG; HTTP working group; ietf-http-wg@w3.org | Contact: HTTP_WG; HTTP working group; ietf-http-wg@w3.org | |||
Notes: None | ||||
5.3. HTTP Header Field Name | 5.3. HTTP Header Field Name | |||
This document will request IANA to register the following entry in | IANA has registered the following entry in the "Hypertext Transfer | |||
the "HTTP Field Name" registry maintained at | Protocol (HTTP) Field Name Registry" maintained at | |||
<https://www.iana.org/assignments/http-fields>: | <https://www.iana.org/assignments/http-fields>: | |||
Field Name: Capsule-Protocol | Field Name: Capsule-Protocol | |||
Template: None | Template: None | |||
Status: provisional (permanent if this document is approved) | Status: permanent | |||
Reference: This document | Reference: RFC 9297 | |||
Comments: None | Comments: None | |||
5.4. Capsule Types | 5.4. Capsule Types | |||
This document establishes a registry for HTTP capsule type codes. | This document establishes a registry for HTTP Capsule Type codes. | |||
The "HTTP Capsule Types" registry governs a 62-bit space, and | The "HTTP Capsule Types" registry governs a 62-bit space and operates | |||
operates under the QUIC registration policy documented in | under the QUIC registration policy documented in Section 22.1 of | |||
Section 22.1 of [QUIC]. This new registry includes the common set of | [QUIC]. This new registry includes the common set of fields listed | |||
fields listed in Section 22.1.1 of [QUIC]. In addition to those | in Section 22.1.1 of [QUIC]. In addition to those common fields, all | |||
common fields, all registrations in this registry MUST include a | registrations in this registry MUST include a "Capsule Type" field | |||
"Capsule Type" field which contains a short name or label for the | that contains a short name or label for the Capsule Type. | |||
capsule type. | ||||
Permanent registrations in this registry are assigned using the | Permanent registrations in this registry are assigned using the | |||
Specification Required policy (Section 4.6 of [IANA-POLICY]), except | Specification Required policy (Section 4.6 of [IANA-POLICY]), except | |||
for values between 0x00 and 0x3f (in hexadecimal; inclusive), which | for values between 0x00 and 0x3f (in hexadecimal; inclusive), which | |||
are assigned using Standards Action or IESG Approval as defined in | are assigned using Standards Action or IESG Approval as defined in | |||
Sections 4.9 and 4.10 of [IANA-POLICY]. | Sections 4.9 and 4.10 of [IANA-POLICY]. | |||
Capsule types with a value of the form 0x29 * N + 0x17 for integer | Capsule Types with a value of the form 0x29 * N + 0x17 for integer | |||
values of N are reserved to exercise the requirement that unknown | values of N are reserved to exercise the requirement that unknown | |||
capsule types be ignored. These capsules have no semantics and can | Capsule Types be ignored. These Capsules have no semantics and can | |||
carry arbitrary values. These values MUST NOT be assigned by IANA | carry arbitrary values. These values MUST NOT be assigned by IANA | |||
and MUST NOT appear in the listing of assigned values. | and MUST NOT appear in the listing of assigned values. | |||
This registry initially contains the following entry: | This registry initially contains the following entry: | |||
Value: 0x00 | Value: 0x00 | |||
Capsule Type: DATAGRAM | Capsule Type: DATAGRAM | |||
Status: permanent | Status: permanent | |||
Specification: This document | Reference: RFC 9297 | |||
Change Controller: IETF | Change Controller: IETF | |||
Contact: MASQUE Working Group masque@ietf.org | Contact: MASQUE Working Group masque@ietf.org | |||
(mailto:masque@ietf.org) | (mailto:masque@ietf.org) | |||
Notes: None | Notes: None | |||
6. References | 6. References | |||
6.1. Normative References | 6.1. Normative References | |||
[DGRAM] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | ||||
Datagram Extension to QUIC", RFC 9221, | ||||
DOI 10.17487/RFC9221, March 2022, | ||||
<https://www.rfc-editor.org/rfc/rfc9221>. | ||||
[HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP Semantics", STD 97, RFC 9110, | Ed., "HTTP Semantics", STD 97, RFC 9110, | |||
DOI 10.17487/RFC9110, June 2022, | DOI 10.17487/RFC9110, June 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9110>. | <https://www.rfc-editor.org/info/rfc9110>. | |||
[HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | |||
June 2022, <https://www.rfc-editor.org/rfc/rfc9112>. | June 2022, <https://www.rfc-editor.org/info/rfc9112>. | |||
[HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, | [HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, | |||
DOI 10.17487/RFC9113, June 2022, | DOI 10.17487/RFC9113, June 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9113>. | <https://www.rfc-editor.org/info/rfc9113>. | |||
[HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | |||
June 2022, <https://www.rfc-editor.org/rfc/rfc9114>. | June 2022, <https://www.rfc-editor.org/info/rfc9114>. | |||
[IANA-POLICY] | [IANA-POLICY] | |||
Cotton, M., Leiba, B., and T. Narten, "Guidelines for | 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/rfc/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
[QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
Multiplexed and Secure Transport", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
<https://www.rfc-editor.org/rfc/rfc9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
[QUIC-DGRAM] | ||||
Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | ||||
Datagram Extension to QUIC", RFC 9221, | ||||
DOI 10.17487/RFC9221, March 2022, | ||||
<https://www.rfc-editor.org/info/rfc9221>. | ||||
[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/rfc/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[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/rfc/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[STRUCT-FIELD] | [STRUCTURED-FIELDS] | |||
Nottingham, M. and P-H. Kamp, "Structured Field Values for | Nottingham, M. and P-H. Kamp, "Structured Field Values for | |||
HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8941>. | <https://www.rfc-editor.org/info/rfc8941>. | |||
[TCP] Postel, J., "Transmission Control Protocol", STD 7, | [TCP] 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/rfc/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
6.2. Informative References | 6.2. Informative References | |||
[DPLPMTUD] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | [DPLPMTUD] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | |||
Völker, "Packetization Layer Path MTU Discovery for | Völker, "Packetization Layer Path MTU Discovery for | |||
Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | |||
September 2020, <https://www.rfc-editor.org/rfc/rfc8899>. | September 2020, <https://www.rfc-editor.org/info/rfc8899>. | |||
[EXT-CONNECT2] | [EXT-CONNECT2] | |||
McManus, P., "Bootstrapping WebSockets with HTTP/2", | McManus, P., "Bootstrapping WebSockets with HTTP/2", | |||
RFC 8441, DOI 10.17487/RFC8441, September 2018, | RFC 8441, DOI 10.17487/RFC8441, September 2018, | |||
<https://www.rfc-editor.org/rfc/rfc8441>. | <https://www.rfc-editor.org/info/rfc8441>. | |||
[EXT-CONNECT3] | [EXT-CONNECT3] | |||
Hamilton, R., "Bootstrapping WebSockets with HTTP/3", | Hamilton, R., "Bootstrapping WebSockets with HTTP/3", | |||
RFC 9220, DOI 10.17487/RFC9220, June 2022, | RFC 9220, DOI 10.17487/RFC9220, June 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9220>. | <https://www.rfc-editor.org/info/rfc9220>. | |||
[PRIORITY] Oku, K. and L. Pardue, "Extensible Prioritization Scheme | [PRIORITY] Oku, K. and L. Pardue, "Extensible Prioritization Scheme | |||
for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022, | for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9218>. | <https://www.rfc-editor.org/info/rfc9218>. | |||
[WEBSOCKET] | [WEBSOCKET] | |||
Fette, I. and A. Melnikov, "The WebSocket Protocol", | Fette, I. and A. Melnikov, "The WebSocket Protocol", | |||
RFC 6455, DOI 10.17487/RFC6455, December 2011, | RFC 6455, DOI 10.17487/RFC6455, December 2011, | |||
<https://www.rfc-editor.org/rfc/rfc6455>. | <https://www.rfc-editor.org/info/rfc6455>. | |||
Acknowledgments | Acknowledgments | |||
Portions of this document were previously part of the QUIC DATAGRAM | Portions of this document were previously part of the QUIC DATAGRAM | |||
frame definition itself, the authors would like to acknowledge the | frame definition itself; the authors would like to acknowledge the | |||
authors of that document and the members of the IETF MASQUE working | authors of that document and the members of the IETF MASQUE working | |||
group for their suggestions. Additionally, the authors would like to | group for their suggestions. Additionally, the authors would like to | |||
thank Martin Thomson for suggesting the use of an HTTP/3 setting. | thank Martin Thomson for suggesting the use of an HTTP/3 setting. | |||
Furthermore, the authors would like to thank Ben Schwartz for writing | Furthermore, the authors would like to thank Ben Schwartz for | |||
the first proposal that used two layers of indirection. The final | substantive input. The final design in this document came out of the | |||
design in this document came out of the HTTP Datagrams Design Team, | HTTP Datagrams Design Team, whose members were Alan Frindell, Alex | |||
whose members were Alan Frindell, Alex Chernyakhovsky, Ben Schwartz, | Chernyakhovsky, Ben Schwartz, Eric Rescorla, Marcus Ihlar, Martin | |||
Eric Rescorla, Marcus Ihlar, Martin Thomson, Mike Bishop, Tommy | Thomson, Mike Bishop, Tommy Pauly, Victor Vasiliev, and the authors | |||
Pauly, Victor Vasiliev, and the authors of this document. The | of this document. The authors thank Mark Nottingham and Philipp | |||
authors thank Mark Nottingham and Philipp Tiesel for their helpful | Tiesel for their helpful comments. | |||
comments. | ||||
Authors' Addresses | Authors' Addresses | |||
David Schinazi | David Schinazi | |||
Google LLC | Google LLC | |||
1600 Amphitheatre Parkway | 1600 Amphitheatre Parkway | |||
Mountain View, CA 94043 | Mountain View, CA 94043 | |||
United States of America | United States of America | |||
Email: dschinazi.ietf@gmail.com | Email: dschinazi.ietf@gmail.com | |||
End of changes. 104 change blocks. | ||||
266 lines changed or deleted | 238 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |