draft-ietf-masque-h3-datagram-02.txt | draft-ietf-masque-h3-datagram-03.txt | |||
---|---|---|---|---|
MASQUE D. Schinazi | MASQUE D. Schinazi | |||
Internet-Draft Google LLC | Internet-Draft Google LLC | |||
Intended status: Standards Track L. Pardue | Intended status: Standards Track L. Pardue | |||
Expires: 28 November 2021 Cloudflare | Expires: 13 January 2022 Cloudflare | |||
27 May 2021 | 12 July 2021 | |||
Using QUIC Datagrams with HTTP/3 | Using Datagrams with HTTP | |||
draft-ietf-masque-h3-datagram-02 | draft-ietf-masque-h3-datagram-03 | |||
Abstract | Abstract | |||
The QUIC DATAGRAM extension provides application protocols running | The QUIC DATAGRAM extension provides application protocols running | |||
over QUIC with a mechanism to send unreliable data while leveraging | over QUIC with a mechanism to send unreliable data while leveraging | |||
the security and congestion-control properties of QUIC. However, | the security and congestion-control properties of QUIC. However, | |||
QUIC DATAGRAM frames do not provide a means to demultiplex | QUIC DATAGRAM frames do not provide a means to demultiplex | |||
application contexts. This document describes how to use QUIC | application contexts. This document describes how to use QUIC | |||
DATAGRAM frames when the application protocol running over QUIC is | DATAGRAM frames when the application protocol running over QUIC is | |||
HTTP/3. It associates datagrams with client-initiated bidirectional | HTTP/3. It associates datagrams with client-initiated bidirectional | |||
streams and defines an optional additional demultiplexing layer. | streams and defines an optional additional demultiplexing layer. | |||
Additionally, this document defines how to convey datagrams over | ||||
prior versions of HTTP. | ||||
Discussion of this work is encouraged to happen on the MASQUE IETF | Discussion Venues | |||
mailing list (masque@ietf.org (mailto:masque@ietf.org)) or on the | ||||
GitHub repository which contains the draft: https://github.com/ietf- | This note is to be removed before publishing as an RFC. | |||
wg-masque/draft-ietf-masque-h3-datagram. | ||||
Discussion of this document takes place on the MASQUE WG mailing list | ||||
(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 Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on 13 January 2022. | ||||
This Internet-Draft will expire on 28 November 2021. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Conventions and Definitions . . . . . . . . . . . . . . . 3 | 1.1. Conventions and Definitions . . . . . . . . . . . . . . . 3 | |||
2. Multiplexing . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Multiplexing . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2.1. Datagram Contexts . . . . . . . . . . . . . . . . . . . . 3 | 2.1. Datagram Contexts . . . . . . . . . . . . . . . . . . . . 4 | |||
2.2. Context ID Allocation . . . . . . . . . . . . . . . . . . 4 | 2.2. Context ID Allocation . . . . . . . . . . . . . . . . . . 4 | |||
3. HTTP/3 DATAGRAM Format . . . . . . . . . . . . . . . . . . . 4 | 3. HTTP/3 DATAGRAM Format . . . . . . . . . . . . . . . . . . . 4 | |||
4. CAPSULE HTTP/3 Frame Definition . . . . . . . . . . . . . . . 6 | 4. CAPSULE HTTP/3 Frame Definition . . . . . . . . . . . . . . . 6 | |||
4.1. The REGISTER_DATAGRAM_CONTEXT Capsule . . . . . . . . . . 7 | 4.1. The REGISTER_DATAGRAM_CONTEXT Capsule . . . . . . . . . . 7 | |||
4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule . . . . . . . . 8 | 4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule . . . . . . . . 9 | |||
4.3. The CLOSE_DATAGRAM_CONTEXT Capsule . . . . . . . . . . . 10 | 4.3. The CLOSE_DATAGRAM_CONTEXT Capsule . . . . . . . . . . . 10 | |||
4.4. The DATAGRAM Capsule . . . . . . . . . . . . . . . . . . 11 | 4.4. The DATAGRAM Capsule . . . . . . . . . . . . . . . . . . 11 | |||
5. Context Extensibility . . . . . . . . . . . . . . . . . . . . 12 | 5. Context Extensibility . . . . . . . . . . . . . . . . . . . . 12 | |||
5.1. The CLOSE_CODE Context Extension Type . . . . . . . . . . 12 | 5.1. The CLOSE_CODE Context Extension Type . . . . . . . . . . 13 | |||
5.2. The DETAILS Context Extension Type . . . . . . . . . . . 13 | 5.2. The DETAILS Context Extension Type . . . . . . . . . . . 13 | |||
6. The H3_DATAGRAM HTTP/3 SETTINGS Parameter . . . . . . . . . . 13 | 6. The H3_DATAGRAM HTTP/3 SETTINGS Parameter . . . . . . . . . . 13 | |||
7. Prioritization . . . . . . . . . . . . . . . . . . . . . . . 14 | 7. Prioritization . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
8. HTTP/1.x and HTTP/2 Support . . . . . . . . . . . . . . . . . 14 | 8. HTTP/1.x and HTTP/2 Support . . . . . . . . . . . . . . . . . 14 | |||
9. Security Considerations . . . . . . . . . . . . . . . . . . . 14 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 14 | |||
10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 14 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 14 | |||
10.1. HTTP/3 CAPSULE Frame . . . . . . . . . . . . . . . . . . 14 | 10.1. HTTP/3 CAPSULE Frame . . . . . . . . . . . . . . . . . . 14 | |||
10.2. HTTP SETTINGS Parameter . . . . . . . . . . . . . . . . 14 | 10.2. HTTP/3 SETTINGS Parameter . . . . . . . . . . . . . . . 15 | |||
10.3. Capsule Types . . . . . . . . . . . . . . . . . . . . . 15 | 10.3. Capsule Types . . . . . . . . . . . . . . . . . . . . . 15 | |||
10.4. Context Extension Types . . . . . . . . . . . . . . . . 16 | 10.4. Context Extension Types . . . . . . . . . . . . . . . . 16 | |||
10.5. Context Close Codes . . . . . . . . . . . . . . . . . . 16 | 10.5. Context Close Codes . . . . . . . . . . . . . . . . . . 17 | |||
11. Normative References . . . . . . . . . . . . . . . . . . . . 17 | 11. Normative References . . . . . . . . . . . . . . . . . . . . 17 | |||
Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 18 | Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 18 | |||
A.1. CONNECT-UDP . . . . . . . . . . . . . . . . . . . . . . . 18 | A.1. CONNECT-UDP . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
A.2. CONNECT-UDP with Timestamp Extension . . . . . . . . . . 19 | A.2. CONNECT-UDP with Timestamp Extension . . . . . . . . . . 19 | |||
A.3. CONNECT-IP with IP compression . . . . . . . . . . . . . 19 | A.3. CONNECT-IP with IP compression . . . . . . . . . . . . . 20 | |||
A.4. WebTransport . . . . . . . . . . . . . . . . . . . . . . 20 | A.4. WebTransport . . . . . . . . . . . . . . . . . . . . . . 21 | |||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 21 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 21 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 22 | ||||
1. Introduction | 1. Introduction | |||
The QUIC DATAGRAM extension [DGRAM] provides application protocols | The QUIC DATAGRAM extension [DGRAM] provides application protocols | |||
running over QUIC [QUIC] with a mechanism to send unreliable data | running over QUIC [QUIC] with a mechanism to send unreliable data | |||
while leveraging the security and congestion-control properties of | while leveraging the security and congestion-control properties of | |||
QUIC. However, QUIC DATAGRAM frames do not provide a means to | QUIC. However, QUIC DATAGRAM frames do not provide a means to | |||
demultiplex application contexts. This document describes how to use | demultiplex application contexts. This document describes how to use | |||
QUIC DATAGRAM frames when the application protocol running over QUIC | QUIC DATAGRAM frames when the application protocol running over QUIC | |||
is HTTP/3 [H3]. It associates datagrams with client-initiated | is HTTP/3 [H3]. It associates datagrams with client-initiated | |||
bidirectional streams and defines an optional additional | bidirectional streams and defines an optional additional | |||
demultiplexing layer. | demultiplexing layer. Additionally, this document defines how to | |||
convey datagrams over prior versions of HTTP. | ||||
Discussion of this work is encouraged to happen on the MASQUE IETF | ||||
mailing list (masque@ietf.org (mailto:masque@ietf.org)) or on the | ||||
GitHub repository which contains the draft: https://github.com/ietf- | ||||
wg-masque/draft-ietf-masque-h3-datagram. | ||||
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 BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
2. Multiplexing | 2. Multiplexing | |||
In order to allow multiple exchanges of datagrams to coexist on a | When running over HTTP/3, multiple exchanges of datagrams need the | |||
given QUIC connection, HTTP datagrams contain two layers of | ability to coexist on a given QUIC connection. To allow this, HTTP | |||
multiplexing. First, the QUIC DATAGRAM frame payload starts with an | datagrams contain two layers of multiplexing. First, the QUIC | |||
encoded stream identifier that associates the datagram with a given | DATAGRAM frame payload starts with an encoded stream identifier that | |||
QUIC stream. Second, datagrams optionally carry a context identifier | associates the datagram with a given QUIC stream. Second, datagrams | |||
(see Section 2.1) that allows multiplexing multiple datagram contexts | optionally carry a context identifier (see Section 2.1) that allows | |||
related to a given HTTP request. Conceptually, the first layer of | multiplexing multiple datagram contexts related to a given HTTP | |||
multiplexing is per-hop, while the second is end-to-end. | request. Conceptually, the first layer of multiplexing is per-hop, | |||
while the second is end-to-end. | ||||
When running over HTTP/2, the first level of demultiplexing is | ||||
provided by the HTTP/2 framing layer. When running over HTTP/1, | ||||
requests are strictly serialized in the connection, therefore the | ||||
first layer of demultiplexing is not needed. | ||||
2.1. Datagram Contexts | 2.1. Datagram Contexts | |||
Within the scope of a given HTTP request, contexts provide an | Within the scope of a given HTTP request, contexts provide an | |||
additional demultiplexing layer. Contexts determine the encoding of | additional demultiplexing layer. Contexts determine the encoding of | |||
datagrams, and can be used to implicitly convey metadata. For | datagrams, and can be used to implicitly convey metadata. For | |||
example, contexts can be used for compression to elide some parts of | example, contexts can be used for compression to elide some parts of | |||
the datagram: the context identifier then maps to a compression | the datagram: the context identifier then maps to a compression | |||
context that the receiver can use to reconstruct the elided data. | context that the receiver can use to reconstruct the elided data. | |||
skipping to change at page 4, line 19 ¶ | skipping to change at page 4, line 28 ¶ | |||
ID is a 62-bit integer (0 to 2^62-1). | ID is a 62-bit integer (0 to 2^62-1). | |||
While stream IDs are a per-hop concept, context IDs are an end-to-end | While stream IDs are a per-hop concept, context IDs are an end-to-end | |||
concept. In other words, if a datagram travels through one or more | concept. In other words, if a datagram travels through one or more | |||
intermediaries on its way from client to server, the stream ID will | intermediaries on its way from client to server, the stream ID will | |||
most likely change from hop to hop, but the context ID will remain | most likely change from hop to hop, but the context ID will remain | |||
the same. Context IDs are opaque to intermediaries. | the same. Context IDs are opaque to intermediaries. | |||
2.2. Context ID Allocation | 2.2. Context ID Allocation | |||
Implementations of HTTP/3 that support the DATAGRAM extension MUST | Implementations of HTTP Datagrams MUST provide a context ID | |||
provide a context ID allocation service. That service will allow | allocation service. That service will allow applications co-located | |||
applications co-located with HTTP/3 to request a unique context ID | with HTTP to request a unique context ID that they can subsequently | |||
that they can subsequently use for their own purposes. The HTTP/3 | use for their own purposes. The HTTP implementation will then parse | |||
implementation will then parse the context ID of incoming DATAGRAM | the context ID of incoming HTTP Datagrams and use it to deliver the | |||
frames and use it to deliver the frame to the appropriate application | frame to the appropriate application context. | |||
context. | ||||
Even-numbered context IDs are client-initiated, while odd-numbered | Even-numbered context IDs are client-initiated, while odd-numbered | |||
context IDs are server-initiated. This means that an HTTP/3 client | context IDs are server-initiated. This means that an HTTP client | |||
implementation of the context ID allocation service MUST only provide | implementation of the context ID allocation service MUST only provide | |||
even-numbered IDs, while a server implementation MUST only provide | even-numbered IDs, while a server implementation MUST only provide | |||
odd-numbered IDs. Note that, once allocated, any context ID can be | odd-numbered IDs. Note that, once allocated, any context ID can be | |||
used by both client and server - only allocation carries separate | used by both client and server - only allocation carries separate | |||
namespaces to avoid requiring synchronization. Additionally, note | namespaces to avoid requiring synchronization. Additionally, note | |||
that the context ID namespace is tied to a given HTTP request: it is | that the context ID namespace is tied to a given HTTP request: it is | |||
possible for the same numeral context ID to be used simultaneously in | possible for the same numeral context ID to be used simultaneously in | |||
distinct requests. | distinct requests. | |||
3. HTTP/3 DATAGRAM Format | 3. HTTP/3 DATAGRAM Format | |||
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 (using the notation from the | frames uses the following format (using the notation from the | |||
"Notational Conventions" section of [QUIC]): | "Notational Conventions" section of [QUIC]): | |||
HTTP/3 Datagram { | HTTP/3 Datagram { | |||
Quarter Stream ID (i), | Quarter Stream ID (i), | |||
[Context ID (i)], | [Context ID (i)], | |||
HTTP/3 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 | associated with, divided by four. (The division by four stems | |||
from the fact that HTTP requests are sent on client-initiated | from the fact that HTTP requests are sent on client-initiated | |||
bidirectional streams, and those have stream IDs that are | bidirectional streams, and those have stream IDs that are | |||
divisible by four.) | divisible by four.) | |||
skipping to change at page 5, line 22 ¶ | skipping to change at page 5, line 32 ¶ | |||
present depends on which registration capsules were exchanged on | present depends on which registration capsules were exchanged on | |||
the associated stream: if a REGISTER_DATAGRAM_CONTEXT capsule (see | the associated stream: if a REGISTER_DATAGRAM_CONTEXT capsule (see | |||
Section 4.1) has been sent or received on this stream, then the | Section 4.1) has been sent or received on this stream, then the | |||
field is present; if a REGISTER_DATAGRAM_NO_CONTEXT capsule (see | field is present; if a REGISTER_DATAGRAM_NO_CONTEXT capsule (see | |||
Section 4.2) has been sent or received, then this field is absent; | Section 4.2) has been sent or received, then this field is absent; | |||
if neither has been sent or received, then it is not yet possible | if neither has been sent or received, then it is not yet possible | |||
to parse this datagram and the receiver MUST either drop that | to parse this datagram and the receiver MUST either drop that | |||
datagram silently or buffer it temporarily while awaiting the | datagram silently or buffer it temporarily while awaiting the | |||
registration capsule. | registration capsule. | |||
HTTP/3 Datagram Payload: The payload of the datagram, whose | HTTP Datagram Payload: The payload of the datagram, whose semantics | |||
semantics are defined by individual applications. Note that this | are defined by individual applications. Note that this field can | |||
field can be empty. | be empty. | |||
Intermediaries parse the Quarter Stream ID field in order to | Intermediaries parse the Quarter Stream ID field in order to | |||
associate the QUIC DATAGRAM frame with a stream. If an intermediary | associate the QUIC DATAGRAM frame with a stream. If an intermediary | |||
receives a QUIC DATAGRAM frame whose payload is too short to allow | receives a QUIC DATAGRAM frame whose payload is too short to allow | |||
parsing the Quarter Stream ID field, the intermediary MUST treat it | parsing the Quarter Stream ID field, the intermediary MUST treat it | |||
as an HTTP/3 connection error of type H3_GENERAL_PROTOCOL_ERROR. The | as an HTTP/3 connection error of type H3_GENERAL_PROTOCOL_ERROR. The | |||
Context ID field is optional and its use is negotiated end-to-end, | Context ID field is optional and its use is negotiated end-to-end, | |||
see Section 4.2. Therefore intermediaries cannot know whether the | see Section 4.2. Therefore intermediaries cannot know whether the | |||
Context ID field is present or absent and they MUST ignore any HTTP/3 | Context ID field is present or absent and they MUST ignore any HTTP/3 | |||
Datagram fields after the Quarter Stream ID. | Datagram fields after the Quarter Stream ID. | |||
skipping to change at page 11, line 20 ¶ | skipping to change at page 11, line 33 ¶ | |||
4.4. The DATAGRAM Capsule | 4.4. The DATAGRAM Capsule | |||
The DATAGRAM capsule (type=0x02) allows an endpoint to send a | The DATAGRAM capsule (type=0x02) allows an endpoint to send a | |||
datagram frame over an HTTP stream. This is particularly useful when | datagram frame over an HTTP stream. This is particularly useful when | |||
using a version of HTTP that does not support QUIC DATAGRAM frames. | using a version of HTTP that does not support QUIC DATAGRAM frames. | |||
Its Capsule Data field consists of: | Its Capsule Data field consists of: | |||
DATAGRAM Capsule { | DATAGRAM Capsule { | |||
[Context ID (i)], | [Context ID (i)], | |||
HTTP/3 Datagram Payload (..), | HTTP Datagram Payload (..), | |||
} | } | |||
Figure 6: DATAGRAM Capsule Format | Figure 6: DATAGRAM Capsule Format | |||
Context ID: A variable-length integer indicating the context ID of | Context ID: A variable-length integer indicating the context ID of | |||
the datagram (see Section 2.1). Whether or not this field is | the datagram (see Section 2.1). Whether or not this field is | |||
present depends on which registration capsules were exchanged on | present depends on which registration capsules were exchanged on | |||
the associated stream: if a REGISTER_DATAGRAM_CONTEXT capsule (see | the associated stream: if a REGISTER_DATAGRAM_CONTEXT capsule (see | |||
Section 4.1) has been sent or received on this stream, then the | Section 4.1) has been sent or received on this stream, then the | |||
field is present; if a REGISTER_DATAGRAM_NO_CONTEXT capsule (see | field is present; if a REGISTER_DATAGRAM_NO_CONTEXT capsule (see | |||
Section 4.2) has been sent or received, then this field is absent; | Section 4.2) has been sent or received, then this field is absent; | |||
if neither has been sent or received, then it is not yet possible | if neither has been sent or received, then it is not yet possible | |||
to parse this datagram and the receiver MUST either drop that | to parse this datagram and the receiver MUST either drop that | |||
datagram silently or buffer it temporarily while awaiting the | datagram silently or buffer it temporarily while awaiting the | |||
registration capsule. | registration capsule. | |||
HTTP/3 Datagram Payload: The payload of the datagram, whose | HTTP Datagram Payload: The payload of the datagram, whose semantics | |||
semantics are defined by individual applications. Note that this | are defined by individual applications. Note that this field can | |||
field can be empty. | be empty. | |||
Datagrams sent using the DATAGRAM Capsule have the exact same | Datagrams sent using the DATAGRAM Capsule have the exact same | |||
semantics as datagrams sent in QUIC DATAGRAM frames. In particular, | semantics as datagrams sent in QUIC DATAGRAM frames. In particular, | |||
the restrictions on when it is allowed to send an HTTP/3 datagram and | the restrictions on when it is allowed to send an HTTP Datagram and | |||
how to process them from Section 3 also apply to HTTP/3 datagrams | how to process them from Section 3 also apply to HTTP Datagrams sent | |||
sent and received using the DATAGRAM capsule. | and received using the DATAGRAM capsule. | |||
The DATAGRAM Capsule is transparent to intermediaries, meaning that | The DATAGRAM Capsule is transparent to intermediaries, meaning that | |||
intermediaries MAY parse it and send DATAGRAM Capsules that they did | intermediaries MAY parse it and send DATAGRAM Capsules that they did | |||
not receive. This allows an intermediary to reencode HTTP/3 | not receive. This allows an intermediary to reencode HTTP Datagrams | |||
Datagrams as it forwards them: in other words, an intermediary MAY | as it forwards them: in other words, an intermediary MAY send a | |||
send a DATAGRAM Capsule to forward an HTTP/3 Datagram which was | DATAGRAM Capsule to forward an HTTP Datagram which was received in a | |||
received in a QUIC DATAGRAM frame, and vice versa. | QUIC DATAGRAM frame, and vice versa. | |||
Note that while DATAGRAM capsules are sent on a stream, | Note that while DATAGRAM capsules are sent on a stream, | |||
intermediaries can reencode HTTP/3 datagrams into QUIC DATAGRAM | intermediaries can reencode HTTP Datagrams into QUIC DATAGRAM frames | |||
frames over the next hop, and those could be dropped. Because of | over the next hop, and those could be dropped. Because of this, | |||
this, applications have to always consider HTTP/3 datagrams to be | applications have to always consider HTTP Datagrams to be unreliable, | |||
unreliable, even if they were initially sent in a capsule. | even if they were initially sent in a capsule. | |||
5. Context Extensibility | 5. Context Extensibility | |||
In order to facilitate extensibility of contexts, the | In order to facilitate extensibility of contexts, the | |||
REGISTER_DATAGRAM_CONTEXT, REGISTER_DATAGRAM_NO_CONTEXT, and the | REGISTER_DATAGRAM_CONTEXT, REGISTER_DATAGRAM_NO_CONTEXT, and the | |||
CLOSE_DATAGRAM_CONTEXT capsules carry a Context Extensions field. | CLOSE_DATAGRAM_CONTEXT capsules carry a Context Extensions field. | |||
That field contains a sequence of context extensions: | That field contains a sequence of context extensions: | |||
Context Extensions { | Context Extensions { | |||
Context Extension (..) ..., | Context Extension (..) ..., | |||
skipping to change at page 14, line 20 ¶ | skipping to change at page 14, line 33 ¶ | |||
prioritization preferences. | prioritization preferences. | |||
8. HTTP/1.x and HTTP/2 Support | 8. HTTP/1.x and HTTP/2 Support | |||
We can provide DATAGRAM support in HTTP/2 by defining the CAPSULE | We can provide DATAGRAM support in HTTP/2 by defining the CAPSULE | |||
frame in HTTP/2. | frame in HTTP/2. | |||
We can provide DATAGRAM support in HTTP/1.x by defining its data | We can provide DATAGRAM support in HTTP/1.x by defining its data | |||
stream format to a sequence of length-value capsules. | stream format to a sequence of length-value capsules. | |||
TODO: Refactor this document into "HTTP Datagrams" with definitions | TODO: Refactor this document and add definitions for HTTP/1.x and | |||
for HTTP/1.x, HTTP/2, and HTTP/3. | HTTP/2. | |||
9. Security Considerations | 9. Security Considerations | |||
Since this feature requires sending an HTTP/3 Settings parameter, it | Since this feature requires sending an HTTP/3 Settings parameter, it | |||
"sticks out". In other words, probing clients can learn whether a | "sticks out". In other words, probing clients can learn whether a | |||
server supports this feature. Implementations that support this | server supports this feature. Implementations that support this | |||
feature SHOULD always send this Settings parameter to avoid leaking | feature SHOULD always send this Settings parameter to avoid leaking | |||
the fact that there are applications using HTTP/3 datagrams enabled | the fact that there are applications using HTTP/3 datagrams enabled | |||
on this endpoint. | on this endpoint. | |||
skipping to change at page 14, line 45 ¶ | skipping to change at page 15, line 11 ¶ | |||
This document will request IANA to register the following entry in | This document will request IANA to register the following entry in | |||
the "HTTP/3 Frames" registry: | the "HTTP/3 Frames" registry: | |||
+------------+----------+---------------+ | +------------+----------+---------------+ | |||
| Frame Type | Value | Specification | | | Frame Type | Value | Specification | | |||
+============+==========+===============+ | +============+==========+===============+ | |||
| CAPSULE | 0xffcab5 | This Document | | | CAPSULE | 0xffcab5 | This Document | | |||
+------------+----------+---------------+ | +------------+----------+---------------+ | |||
10.2. HTTP SETTINGS Parameter | 10.2. HTTP/3 SETTINGS Parameter | |||
This document will request IANA to register the following entry in | This document will request IANA to register the following entry in | |||
the "HTTP/3 Settings" registry: | the "HTTP/3 Settings" registry: | |||
+--------------+----------+---------------+---------+ | +--------------+----------+---------------+---------+ | |||
| Setting Name | Value | Specification | Default | | | Setting Name | Value | Specification | Default | | |||
+==============+==========+===============+=========+ | +==============+==========+===============+=========+ | |||
| H3_DATAGRAM | 0xffd276 | This Document | 0 | | | H3_DATAGRAM | 0xffd276 | This Document | 0 | | |||
+--------------+----------+---------------+---------+ | +--------------+----------+---------------+---------+ | |||
10.3. Capsule Types | 10.3. Capsule Types | |||
This document establishes a registry for HTTP/3 capsule type codes. | This document establishes a registry for HTTP capsule type codes. | |||
The "HTTP Capsule Types" registry governs a 62-bit space. | The "HTTP Capsule Types" registry governs a 62-bit space. | |||
Registrations in this registry MUST include the following fields: | Registrations in this registry MUST include the following fields: | |||
Type: | Type: | |||
A name or label for the capsule type. | A name or label for the capsule type. | |||
Value: The value of the Capsule Type field (see Section 4) is a | Value: The value of the Capsule Type field (see Section 4) is a | |||
62bit integer. | 62bit integer. | |||
skipping to change at page 16, line 7 ¶ | skipping to change at page 16, line 25 ¶ | |||
+------------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
Capsule types with a value of the form 41 * N + 23 for integer values | Capsule types with a value of the form 41 * N + 23 for integer values | |||
of N are reserved to exercise the requirement that unknown capsule | of N are reserved to exercise the requirement that unknown capsule | |||
types be ignored. These capsules have no semantics and can carry | types be ignored. These capsules have no semantics and can carry | |||
arbitrary values. These values MUST NOT be assigned by IANA and MUST | arbitrary values. These values MUST NOT be assigned by IANA and MUST | |||
NOT appear in the listing of assigned values. | NOT appear in the listing of assigned values. | |||
10.4. Context Extension Types | 10.4. Context Extension Types | |||
This document establishes a registry for HTTP/3 datagram context | This document establishes a registry for HTTP datagram context | |||
extension type codes. The "HTTP Context Extension Types" registry | extension type codes. The "HTTP Context Extension Types" registry | |||
governs a 62-bit space. Registrations in this registry MUST include | governs a 62-bit space. Registrations in this registry MUST include | |||
the following fields: | the following fields: | |||
Type: | Type: | |||
A name or label for the context extension type. | A name or label for the context extension type. | |||
Value: The value of the Context Extension Type field (see Section 5) | Value: The value of the Context Extension Type field (see Section 5) | |||
is a 62bit integer. | is a 62bit integer. | |||
skipping to change at page 16, line 35 ¶ | skipping to change at page 17, line 4 ¶ | |||
This registry initially contains the following entries: | This registry initially contains the following entries: | |||
+------------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| Context Extension Type | Value | Specification | | | Context Extension Type | Value | Specification | | |||
+------------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| CLOSE_CODE | 0x00 | This Document | | | CLOSE_CODE | 0x00 | This Document | | |||
+------------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| DETAILS | 0x01 | This Document | | | DETAILS | 0x01 | This Document | | |||
+------------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
Context extension types with a value of the form 41 * N + 17 for | Context extension types with a value of the form 41 * N + 17 for | |||
integer values of N are reserved to exercise the requirement that | integer values of N are reserved to exercise the requirement that | |||
unknown context extension types be ignored. These extensions have no | unknown context extension types be ignored. These extensions have no | |||
semantics and can carry arbitrary values. These values MUST NOT be | semantics and can carry arbitrary values. These values MUST NOT be | |||
assigned by IANA and MUST NOT appear in the listing of assigned | assigned by IANA and MUST NOT appear in the listing of assigned | |||
values. | values. | |||
10.5. Context Close Codes | 10.5. Context Close Codes | |||
This document establishes a registry for HTTP/3 context extension | This document establishes a registry for HTTP context extension type | |||
type codes. The "HTTP Context Close Codes" registry governs a 62-bit | codes. The "HTTP Context Close Codes" registry governs a 62-bit | |||
space. Registrations in this registry MUST include the following | space. Registrations in this registry MUST include the following | |||
fields: | fields: | |||
Type: | Type: | |||
A name or label for the close code. | A name or label for the close code. | |||
Value: The value of the CLOSE_CODE Context Extension Value field | Value: The value of the CLOSE_CODE Context Extension Value field | |||
(see Section 5.1) is a 62bit integer. | (see Section 5.1) is a 62bit integer. | |||
skipping to change at page 17, line 37 ¶ | skipping to change at page 18, line 7 ¶ | |||
Context close codes with a value of the form 41 * N + 19 for integer | Context close codes with a value of the form 41 * N + 19 for integer | |||
values of N are reserved to exercise the requirement that unknown | values of N are reserved to exercise the requirement that unknown | |||
context close codes be treated as NO_ERROR. These values MUST NOT be | context close codes be treated as NO_ERROR. These values MUST NOT be | |||
assigned by IANA and MUST NOT appear in the listing of assigned | assigned by IANA and MUST NOT appear in the listing of assigned | |||
values. | values. | |||
11. Normative References | 11. Normative References | |||
[DGRAM] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | [DGRAM] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | |||
Datagram Extension to QUIC", Work in Progress, Internet- | Datagram Extension to QUIC", Work in Progress, Internet- | |||
Draft, draft-ietf-quic-datagram-02, 16 February 2021, | Draft, draft-ietf-quic-datagram-03, 12 July 2021, | |||
<https://tools.ietf.org/html/draft-ietf-quic-datagram-02>. | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
datagram-03>. | ||||
[H3] Bishop, M., "Hypertext Transfer Protocol Version 3 | [H3] Bishop, M., "Hypertext Transfer Protocol Version 3 | |||
(HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | (HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | |||
quic-http-34, 2 February 2021, | quic-http-34, 2 February 2021, | |||
<https://tools.ietf.org/html/draft-ietf-quic-http-34>. | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
http-34>. | ||||
[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/rfc/rfc8126>. | |||
[QUIC] Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed | [QUIC] Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed | |||
and Secure Transport", Work in Progress, Internet-Draft, | and Secure Transport", Work in Progress, Internet-Draft, | |||
draft-ietf-quic-transport-34, 14 January 2021, | draft-ietf-quic-transport-34, 14 January 2021, | |||
<https://tools.ietf.org/html/draft-ietf-quic-transport- | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
34>. | transport-34>. | |||
[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/rfc/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/rfc/rfc8174>. | |||
End of changes. 31 change blocks. | ||||
73 lines changed or deleted | 83 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |