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