| 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. | ||||