| < draft-ietf-masque-h3-datagram-01.txt | draft-ietf-masque-h3-datagram-02.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: 14 November 2021 Cloudflare | Expires: 28 November 2021 Cloudflare | |||
| 13 May 2021 | 27 May 2021 | |||
| Using QUIC Datagrams with HTTP/3 | Using QUIC Datagrams with HTTP/3 | |||
| draft-ietf-masque-h3-datagram-01 | draft-ietf-masque-h3-datagram-02 | |||
| 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 | |||
| skipping to change at page 1, line 43 ¶ | skipping to change at page 1, line 43 ¶ | |||
| 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 14 November 2021. | 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 | |||
| skipping to change at page 2, line 21 ¶ | skipping to change at page 2, line 21 ¶ | |||
| 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 . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2.2. Context ID Allocation . . . . . . . . . . . . . . . . . . 4 | 2.2. Context ID Allocation . . . . . . . . . . . . . . . . . . 4 | |||
| 3. HTTP/3 DATAGRAM Frame Format . . . . . . . . . . . . . . . . 4 | 3. HTTP/3 DATAGRAM Format . . . . . . . . . . . . . . . . . . . 4 | |||
| 4. CAPSULE HTTP/3 Frame Definition . . . . . . . . . . . . . . . 5 | 4. CAPSULE HTTP/3 Frame Definition . . . . . . . . . . . . . . . 6 | |||
| 4.1. The REGISTER_DATAGRAM_CONTEXT Capsule . . . . . . . . . . 6 | 4.1. The REGISTER_DATAGRAM_CONTEXT Capsule . . . . . . . . . . 7 | |||
| 4.2. The CLOSE_DATAGRAM_CONTEXT Capsule . . . . . . . . . . . 7 | 4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule . . . . . . . . 8 | |||
| 4.3. The DATAGRAM Capsule . . . . . . . . . . . . . . . . . . 8 | 4.3. The CLOSE_DATAGRAM_CONTEXT Capsule . . . . . . . . . . . 10 | |||
| 5. The H3_DATAGRAM HTTP/3 SETTINGS Parameter . . . . . . . . . . 9 | 4.4. The DATAGRAM Capsule . . . . . . . . . . . . . . . . . . 11 | |||
| 6. HTTP/1.x and HTTP/2 Support . . . . . . . . . . . . . . . . . 9 | 5. Context Extensibility . . . . . . . . . . . . . . . . . . . . 12 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 10 | 5.1. The CLOSE_CODE Context Extension Type . . . . . . . . . . 12 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10 | 5.2. The DETAILS Context Extension Type . . . . . . . . . . . 13 | |||
| 8.1. HTTP/3 CAPSULE Frame . . . . . . . . . . . . . . . . . . 10 | 6. The H3_DATAGRAM HTTP/3 SETTINGS Parameter . . . . . . . . . . 13 | |||
| 8.2. HTTP SETTINGS Parameter . . . . . . . . . . . . . . . . . 10 | 7. Prioritization . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 8.3. Capsule Types . . . . . . . . . . . . . . . . . . . . . . 10 | 8. HTTP/1.x and HTTP/2 Support . . . . . . . . . . . . . . . . . 14 | |||
| 8.4. Context Extension Keys . . . . . . . . . . . . . . . . . 11 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 14 | |||
| 9. Normative References . . . . . . . . . . . . . . . . . . . . 11 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 14 | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 12 | 10.1. HTTP/3 CAPSULE Frame . . . . . . . . . . . . . . . . . . 14 | |||
| A.1. CONNECT-UDP . . . . . . . . . . . . . . . . . . . . . . . 12 | 10.2. HTTP SETTINGS Parameter . . . . . . . . . . . . . . . . 14 | |||
| A.2. CONNECT-UDP with Timestamp Extension . . . . . . . . . . 13 | 10.3. Capsule Types . . . . . . . . . . . . . . . . . . . . . 15 | |||
| A.3. CONNECT-IP with IP compression . . . . . . . . . . . . . 14 | 10.4. Context Extension Types . . . . . . . . . . . . . . . . 16 | |||
| A.4. WebTransport . . . . . . . . . . . . . . . . . . . . . . 15 | 10.5. Context Close Codes . . . . . . . . . . . . . . . . . . 16 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 16 | 11. Normative References . . . . . . . . . . . . . . . . . . . . 17 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 16 | Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| A.1. CONNECT-UDP . . . . . . . . . . . . . . . . . . . . . . . 18 | ||||
| A.2. CONNECT-UDP with Timestamp Extension . . . . . . . . . . 19 | ||||
| A.3. CONNECT-IP with IP compression . . . . . . . . . . . . . 19 | ||||
| A.4. WebTransport . . . . . . . . . . . . . . . . . . . . . . 20 | ||||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 21 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 21 | ||||
| 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 | |||
| skipping to change at page 3, line 36 ¶ | skipping to change at page 3, line 36 ¶ | |||
| "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 | In order to allow multiple exchanges of datagrams to coexist on a | |||
| given QUIC connection, HTTP datagrams contain two layers of | given QUIC connection, HTTP datagrams contain two layers of | |||
| multiplexing. First, the QUIC DATAGRAM frame payload starts with an | multiplexing. First, the QUIC DATAGRAM frame payload starts with an | |||
| encoded stream identifier that associates the datagram with a given | encoded stream identifier that associates the datagram with a given | |||
| QUIC stream. Second, datagrams carry a context identifier (see | QUIC stream. Second, datagrams optionally carry a context identifier | |||
| Section 2.1) that allows multiplexing multiple datagram contexts | (see Section 2.1) that allows multiplexing multiple datagram contexts | |||
| related to a given HTTP request. Conceptually, the first layer of | related to a given HTTP request. Conceptually, the first layer of | |||
| multiplexing is per-hop, while the second is end-to-end. | multiplexing is per-hop, while the second is end-to-end. | |||
| 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. | |||
| Contexts are identified within the scope of a given request by a | Contexts are optional, their use is negotiated on each request stream | |||
| numeric value, referred to as the context ID. A context ID is a | using registration capsules, see Section 4.1 and Section 4.2. When | |||
| 62-bit integer (0 to 2^62-1). | contexts are used, they are identified within the scope of a given | |||
| request by a numeric value, referred to as the context ID. A context | ||||
| 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/3 that support the DATAGRAM extension MUST | |||
| skipping to change at page 4, line 32 ¶ | skipping to change at page 4, line 38 ¶ | |||
| context IDs are server-initiated. This means that an HTTP/3 client | context IDs are server-initiated. This means that an HTTP/3 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 Frame 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/3 Datagram Payload (..), | |||
| } | } | |||
| Figure 1: HTTP/3 DATAGRAM Frame 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.) | |||
| 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). | the datagram (see Section 2.1). Whether or not this field is | |||
| present depends on which registration capsules were exchanged on | ||||
| the associated stream: if a REGISTER_DATAGRAM_CONTEXT capsule (see | ||||
| Section 4.1) has been sent or received on this stream, then the | ||||
| field is present; if a REGISTER_DATAGRAM_NO_CONTEXT capsule (see | ||||
| 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 | ||||
| to parse this datagram and the receiver MUST either drop that | ||||
| datagram silently or buffer it temporarily while awaiting the | ||||
| registration capsule. | ||||
| HTTP/3 Datagram Payload: The payload of the datagram, whose | HTTP/3 Datagram Payload: The payload of the datagram, whose | |||
| semantics are defined by individual applications. Note that this | semantics are defined by individual applications. Note that this | |||
| field can be empty. | field can 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. | as an HTTP/3 connection error of type H3_GENERAL_PROTOCOL_ERROR. The | |||
| Intermediaries MUST ignore any HTTP/3 Datagram fields after the | Context ID field is optional and its use is negotiated end-to-end, | |||
| Quarter Stream ID. | see Section 4.2. Therefore intermediaries cannot know whether the | |||
| Context ID field is present or absent and they MUST ignore any HTTP/3 | ||||
| Datagram fields after the Quarter Stream ID. | ||||
| Endpoints parse both the Quarter Stream ID field and the Context ID | Endpoints parse both the Quarter Stream ID field and the Context ID | |||
| field in order to associate the QUIC DATAGRAM frame with a stream and | field in order to associate the QUIC DATAGRAM frame with a stream and | |||
| context within that stream. If an endpoint receives a QUIC DATAGRAM | context within that stream. If an endpoint receives a QUIC DATAGRAM | |||
| frame whose payload is too short to allow parsing the Quarter Stream | frame whose payload is too short to allow parsing the Quarter Stream | |||
| ID field, the endpoint MUST treat it as an HTTP/3 connection error of | ID field, the endpoint MUST treat it as an HTTP/3 connection error of | |||
| type H3_GENERAL_PROTOCOL_ERROR. If an endpoint receives a QUIC | type H3_GENERAL_PROTOCOL_ERROR. If an endpoint receives a QUIC | |||
| DATAGRAM frame whose payload is long enough to allow parsing the | DATAGRAM frame whose payload is long enough to allow parsing the | |||
| Quarter Stream ID field but too short to allow parsing the Context ID | Quarter Stream ID field but too short to allow parsing the Context ID | |||
| field, the endpoint MUST abruptly terminate the corresponding stream | field, the endpoint MUST abruptly terminate the corresponding stream | |||
| with a stream error of type H3_GENERAL_PROTOCOL_ERROR. | with a stream error of type H3_GENERAL_PROTOCOL_ERROR. | |||
| If a DATAGRAM frame is received and its Quarter Stream ID maps to a | Endpoints MUST NOT send HTTP/3 datagrams unless the corresponding | |||
| stream that has already been closed, the receiver MUST silently drop | stream's send side is open. On a given endpoint, once the receive | |||
| that frame. If a DATAGRAM frame is received and its Quarter Stream | side of a stream is closed, incoming datagrams for this stream are no | |||
| ID maps to a stream that has not yet been created, the receiver SHALL | longer expected so the endpoint can release related state. Endpoints | |||
| either drop that frame silently or buffer it temporarily while | MAY keep state for a short time to account for reordering. Once the | |||
| awaiting the creation of the corresponding stream. | state is released, the endpoint MUST silently drop received | |||
| associated datagrams. | ||||
| If an HTTP/3 datagram is received and its Quarter Stream ID maps to a | ||||
| stream that has not yet been created, the receiver SHALL either drop | ||||
| that datagram silently or buffer it temporarily while awaiting the | ||||
| creation of the corresponding stream. | ||||
| 4. CAPSULE HTTP/3 Frame Definition | 4. CAPSULE HTTP/3 Frame Definition | |||
| CAPSULE allows reliably sending request-related information end-to- | CAPSULE allows reliably sending request-related information end-to- | |||
| end, even in the presence of HTTP intermediaries. | end, even in the presence of HTTP intermediaries. | |||
| CAPSULE is an HTTP/3 Frame (as opposed to a QUIC frame) which SHALL | CAPSULE is an HTTP/3 Frame (as opposed to a QUIC frame) which SHALL | |||
| only be sent in client-initiated bidirectional streams. | only be sent in client-initiated bidirectional streams. | |||
| Intermediaries MUST forward all received CAPSULE frames in their | Intermediaries forward received CAPSULE frames on the same stream | |||
| unmodified entirety on the same stream where it would forward DATA | where it would forward DATA frames. Each Capsule Type determines | |||
| frames. Intermediaries MUST NOT send any CAPSULE frames other than | whether it is opaque or transparent to intermediaries: opaque | |||
| the ones it is forwarding. | capsules are forwarded unmodified while transparent ones can be | |||
| parsed, added, or removed by intermediaries. | ||||
| This specification of CAPSULE currently uses HTTP/3 frame type | This specification of CAPSULE currently uses HTTP/3 frame type | |||
| 0xffcab5. If this document is approved, a lower number will be | 0xffcab5. If this document is approved, a lower number will be | |||
| requested from IANA. | requested from IANA. | |||
| CAPSULE HTTP/3 Frame { | CAPSULE HTTP/3 Frame { | |||
| Type (i) = 0xffcab5, | Type (i) = 0xffcab5, | |||
| Length (i), | Length (i), | |||
| Capsule Type (i), | Capsule Type (i), | |||
| Capsule Data (..), | Capsule Data (..), | |||
| skipping to change at page 6, line 21 ¶ | skipping to change at page 7, line 5 ¶ | |||
| Figure 2: CAPSULE HTTP/3 Frame Format | Figure 2: CAPSULE HTTP/3 Frame Format | |||
| The Type and Length fields follows the definition of HTTP/3 frames | The Type and Length fields follows the definition of HTTP/3 frames | |||
| from [H3]. The payload consists of: | from [H3]. The payload consists of: | |||
| Capsule Type: The type of this capsule. | Capsule Type: The type of this capsule. | |||
| Capsule Data: Data whose semantics depends on the Capsule Type. | Capsule Data: Data whose semantics depends on the Capsule Type. | |||
| Unless otherwise specified, all Capsule Types are defined as opaque | ||||
| to intermediaries. Intermediaries MUST forward all received opaque | ||||
| CAPSULE frames in their unmodified entirety. Intermediaries MUST NOT | ||||
| send any opaque CAPSULE frames other than the ones it is forwarding. | ||||
| All Capsule Types defined in this document are opaque, with the | ||||
| exception of the DATAGRAM Capsule, see Section 4.4. Definitions of | ||||
| new Capsule Types MAY specify that the newly introduced type is | ||||
| transparent. Intermediaries MUST treat unknown Capsule Types as | ||||
| opaque. | ||||
| Intermediaries respect the order of opaque CAPSULE frames: if an | ||||
| intermediary receives two opaque CAPSULE frames in a given order, it | ||||
| MUST forward them in the same order. | ||||
| Endpoints which receive a Capsule with an unknown Capsule Type MUST | Endpoints which receive a Capsule with an unknown Capsule Type MUST | |||
| silently drop that Capsule. Intermediaries MUST forward Capsules, | silently drop that Capsule. | |||
| even if they do not know the Capsule Type or cannot parse the Capsule | ||||
| Data. | Receipt of a CAPSULE HTTP/3 Frame on a stream that is not a client- | |||
| initiated bidirectional stream MUST be treated as a connection error | ||||
| of type H3_FRAME_UNEXPECTED. | ||||
| 4.1. The REGISTER_DATAGRAM_CONTEXT Capsule | 4.1. The REGISTER_DATAGRAM_CONTEXT Capsule | |||
| The REGISTER_DATAGRAM_CONTEXT capsule (type=0x00) allows an endpoint | The REGISTER_DATAGRAM_CONTEXT capsule (type=0x00) allows an endpoint | |||
| to inform its peer of the encoding and semantics of datagrams | to inform its peer of the encoding and semantics of datagrams | |||
| associated with a given context ID. Its Capsule Data field consists | associated with a given context ID. Its Capsule Data field consists | |||
| of: | of: | |||
| REGISTER_DATAGRAM_CONTEXT Capsule { | REGISTER_DATAGRAM_CONTEXT Capsule { | |||
| Context ID (i), | Context ID (i), | |||
| Extension String (..), | Context Extensions (..), | |||
| } | } | |||
| Figure 3: REGISTER_DATAGRAM_CONTEXT Capsule Format | Figure 3: REGISTER_DATAGRAM_CONTEXT Capsule Format | |||
| Context ID: The context ID to register. | Context ID: The context ID to register. | |||
| Extension String: A string of comma-separated key-value pairs to | Context Extensions: See Section 5. | |||
| enable extensibility. Keys are registered with IANA, see | ||||
| Section 8.4. | ||||
| The ABNF for the Extension String field is as follows (using syntax | ||||
| from Section 3.2.6 of [RFC7230]): | ||||
| extension-string = [ ext-member *( "," ext-member ) ] | ||||
| ext-member = ext-member-key "=" ext-member-value | ||||
| ext-member-key = token | ||||
| ext-member-value = token | ||||
| Note that these registrations are unilateral and bidirectional: the | Note that these registrations are unilateral and bidirectional: the | |||
| sender of the frame unilaterally defines the semantics it will apply | sender of the frame unilaterally defines the semantics it will apply | |||
| to the datagrams it sends and receives using this context ID. Once a | to the datagrams it sends and receives using this context ID. Once a | |||
| context ID is registered, it can be used in both directions. | context ID is registered, it can be used in both directions. | |||
| Endpoints MUST NOT send DATAGRAM frames using a Context ID until they | Endpoints MUST NOT send DATAGRAM frames using a Context ID until they | |||
| have either sent or received a REGISTER_DATAGRAM_CONTEXT Capsule with | have either sent or received a REGISTER_DATAGRAM_CONTEXT Capsule with | |||
| the same Context ID. However, due to reordering, an endpoint that | the same Context ID. However, due to reordering, an endpoint that | |||
| receives a DATAGRAM frame with an unknown Context ID MUST NOT treat | receives a DATAGRAM frame with an unknown Context ID MUST NOT treat | |||
| skipping to change at page 7, line 27 ¶ | skipping to change at page 8, line 17 ¶ | |||
| Endpoints MUST NOT register the same Context ID twice on the same | Endpoints MUST NOT register the same Context ID twice on the same | |||
| stream. This also applies to Context IDs that have been closed using | stream. This also applies to Context IDs that have been closed using | |||
| a CLOSE_DATAGRAM_CONTEXT capsule. Clients MUST NOT register server- | a CLOSE_DATAGRAM_CONTEXT capsule. Clients MUST NOT register server- | |||
| initiated Context IDs and servers MUST NOT register client-initiated | initiated Context IDs and servers MUST NOT register client-initiated | |||
| Context IDs. If an endpoint receives a REGISTER_DATAGRAM_CONTEXT | Context IDs. If an endpoint receives a REGISTER_DATAGRAM_CONTEXT | |||
| capsule that violates one or more of these requirements, the endpoint | capsule that violates one or more of these requirements, the endpoint | |||
| MUST abruptly terminate the corresponding stream with a stream error | MUST abruptly terminate the corresponding stream with a stream error | |||
| of type H3_GENERAL_PROTOCOL_ERROR. | of type H3_GENERAL_PROTOCOL_ERROR. | |||
| 4.2. The CLOSE_DATAGRAM_CONTEXT Capsule | Endpoints MUST NOT send a REGISTER_DATAGRAM_CONTEXT capsule on a | |||
| stream before they have sent at least one HEADERS frame on that | ||||
| stream. This removes the need to buffer REGISTER_DATAGRAM_CONTEXT | ||||
| capsules when the endpoint needs information from headers to | ||||
| determine how to react to the capsule. If an endpoint receives a | ||||
| REGISTER_DATAGRAM_CONTEXT capsule on a stream that hasn't yet | ||||
| received a HEADERS frame, the endpoint MUST abruptly terminate the | ||||
| corresponding stream with a stream error of type | ||||
| H3_GENERAL_PROTOCOL_ERROR. | ||||
| Servers MUST NOT send a REGISTER_DATAGRAM_CONTEXT capsule on a stream | ||||
| before they have received at least one REGISTER_DATAGRAM_CONTEXT | ||||
| capsule or one REGISTER_DATAGRAM_NO_CONTEXT capsule from the client | ||||
| on that stream. This ensures that clients control whether datagrams | ||||
| are allowed for a given request. If a client receives a | ||||
| REGISTER_DATAGRAM_CONTEXT capsule on a stream where the client has | ||||
| not yet sent a REGISTER_DATAGRAM_CONTEXT capsule, the client MUST | ||||
| abruptly terminate the corresponding stream with a stream error of | ||||
| type H3_GENERAL_PROTOCOL_ERROR. | ||||
| Servers MUST NOT send a REGISTER_DATAGRAM_CONTEXT capsule on a stream | ||||
| where it has received a REGISTER_DATAGRAM_NO_CONTEXT capsule. If a | ||||
| client receives a REGISTER_DATAGRAM_CONTEXT capsule on a stream where | ||||
| the client has sent a REGISTER_DATAGRAM_NO_CONTEXT capsule, the | ||||
| client MUST abruptly terminate the corresponding stream with a stream | ||||
| error of type H3_GENERAL_PROTOCOL_ERROR. | ||||
| 4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule | ||||
| The REGISTER_DATAGRAM_NO_CONTEXT capsule (type=0x03) allows a client | ||||
| to inform the server that datagram contexts will not be used with | ||||
| this stream. It also informs the server of the encoding and | ||||
| semantics of datagrams associated with this stream. Its Capsule Data | ||||
| field consists of: | ||||
| REGISTER_DATAGRAM_NO_CONTEXT Capsule { | ||||
| Context Extensions (..), | ||||
| } | ||||
| Figure 4: REGISTER_DATAGRAM_NO_CONTEXT Capsule Format | ||||
| Context Extensions: See Section 5. | ||||
| Note that this registration is unilateral and bidirectional: the | ||||
| client unilaterally defines the semantics it will apply to the | ||||
| datagrams it sends and receives with this stream. | ||||
| Endpoints MUST NOT send DATAGRAM frames without a Context ID until | ||||
| they have either sent or received a REGISTER_DATAGRAM_NO_CONTEXT | ||||
| Capsule. However, due to reordering, an endpoint that receives a | ||||
| DATAGRAM frame before receiving either a REGISTER_DATAGRAM_CONTEXT | ||||
| capsule or a REGISTER_DATAGRAM_NO_CONTEXT capsule MUST NOT treat it | ||||
| as an error, it SHALL instead drop the DATAGRAM frame silently, or | ||||
| buffer it temporarily while awaiting a REGISTER_DATAGRAM_NO_CONTEXT | ||||
| capsule or the corresponding REGISTER_DATAGRAM_CONTEXT capsule. | ||||
| Servers MUST NOT send the REGISTER_DATAGRAM_NO_CONTEXT capsule. If a | ||||
| client receives a REGISTER_DATAGRAM_NO_CONTEXT capsule, the client | ||||
| MUST abruptly terminate the corresponding stream with a stream error | ||||
| of type H3_GENERAL_PROTOCOL_ERROR. | ||||
| Clients MUST NOT send more than one REGISTER_DATAGRAM_NO_CONTEXT | ||||
| capsule on a stream. If a server receives a second | ||||
| REGISTER_DATAGRAM_NO_CONTEXT capsule on the same stream, the server | ||||
| MUST abruptly terminate the corresponding stream with a stream error | ||||
| of type H3_GENERAL_PROTOCOL_ERROR. | ||||
| Clients MUST NOT send a REGISTER_DATAGRAM_NO_CONTEXT capsule on a | ||||
| stream before they have sent at least one HEADERS frame on that | ||||
| stream. This removes the need to buffer REGISTER_DATAGRAM_CONTEXT | ||||
| capsules when the server needs information from headers to determine | ||||
| how to react to the capsule. If a server receives a | ||||
| REGISTER_DATAGRAM_NO_CONTEXT capsule on a stream that hasn't yet | ||||
| received a HEADERS frame, the server MUST abruptly terminate the | ||||
| corresponding stream with a stream error of type | ||||
| H3_GENERAL_PROTOCOL_ERROR. | ||||
| Clients MUST NOT send both REGISTER_DATAGRAM_CONTEXT capsules and | ||||
| REGISTER_DATAGRAM_NO_CONTEXT capsules on the same stream. If a | ||||
| server receives both a REGISTER_DATAGRAM_CONTEXT capsule and a | ||||
| REGISTER_DATAGRAM_NO_CONTEXT capsule on the same stream, the server | ||||
| MUST abruptly terminate the corresponding stream with a stream error | ||||
| of type H3_GENERAL_PROTOCOL_ERROR. | ||||
| Extensions MAY define a different mechanism to negotiate the presence | ||||
| of contexts, and they MAY do so in a way which is opaque to | ||||
| intermediaries. | ||||
| 4.3. The CLOSE_DATAGRAM_CONTEXT Capsule | ||||
| The CLOSE_DATAGRAM_CONTEXT capsule (type=0x01) allows an endpoint to | The CLOSE_DATAGRAM_CONTEXT capsule (type=0x01) allows an endpoint to | |||
| inform its peer that it will no longer send or parse received | inform its peer that it will no longer send or parse received | |||
| datagrams associated with a given context ID. Its Capsule Data field | datagrams associated with a given context ID. Its Capsule Data field | |||
| consists of: | consists of: | |||
| CLOSE_DATAGRAM_CONTEXT Capsule { | CLOSE_DATAGRAM_CONTEXT Capsule { | |||
| Context ID (i), | Context ID (i), | |||
| Extension String (..), | Context Extensions (..), | |||
| } | } | |||
| Figure 4: CLOSE_DATAGRAM_CONTEXT Capsule Format | Figure 5: CLOSE_DATAGRAM_CONTEXT Capsule Format | |||
| Context ID: The context ID to close. | Context ID: The context ID to close. | |||
| Extension String: A string of comma-separated key-value pairs to | Context Extensions: See Section 5. | |||
| enable extensibility, see the definition of the same field in | ||||
| Section 4.1 for details. | ||||
| Note that this close is unilateral and bidirectional: the sender of | Note that this close is unilateral and bidirectional: the sender of | |||
| the frame unilaterally informs its peer of the closure. Endpoints | the frame unilaterally informs its peer of the closure. Endpoints | |||
| can use CLOSE_DATAGRAM_CONTEXT capsules to close a context that was | can use CLOSE_DATAGRAM_CONTEXT capsules to close a context that was | |||
| initially registered by either themselves, or by their peer. | initially registered by either themselves, or by their peer. | |||
| Endpoints MAY use the CLOSE_DATAGRAM_CONTEXT capsule to immediately | Endpoints MAY use the CLOSE_DATAGRAM_CONTEXT capsule to immediately | |||
| reject a context that was just registered using a | reject a context that was just registered using a | |||
| REGISTER_DATAGRAM_CONTEXT capsule if they find its Extension String | REGISTER_DATAGRAM_CONTEXT capsule if they find its Context Extensions | |||
| to be unacceptable. | field to be unacceptable. | |||
| After an endpoint has either sent or received a | After an endpoint has either sent or received a | |||
| CLOSE_DATAGRAM_CONTEXT frame, it MUST NOT send any DATAGRAM frames | CLOSE_DATAGRAM_CONTEXT frame, it MUST NOT send any DATAGRAM frames | |||
| with that Context ID. However, due to reordering, an endpoint that | with that Context ID. However, due to reordering, an endpoint that | |||
| receives a DATAGRAM frame with a closed Context ID MUST NOT treat it | receives a DATAGRAM frame with a closed Context ID MUST NOT treat it | |||
| as an error, it SHALL instead drop the DATAGRAM frame silently. | as an error, it SHALL instead drop the DATAGRAM frame silently. | |||
| Endpoints MUST NOT close a Context ID that was not previously | Endpoints MUST NOT close a Context ID that was not previously | |||
| registered. Endpoints MUST NOT close a Context ID that has already | registered. Endpoints MUST NOT close a Context ID that has already | |||
| been closed. If an endpoint receives a CLOSE_DATAGRAM_CONTEXT | been closed. If an endpoint receives a CLOSE_DATAGRAM_CONTEXT | |||
| capsule that violates one or more of these requirements, the endpoint | capsule that violates one or more of these requirements, the endpoint | |||
| MUST abruptly terminate the corresponding stream with a stream error | MUST abruptly terminate the corresponding stream with a stream error | |||
| of type H3_GENERAL_PROTOCOL_ERROR. | of type H3_GENERAL_PROTOCOL_ERROR. | |||
| 4.3. The DATAGRAM Capsule | All CLOSE_DATAGRAM_CONTEXT capsules MUST contain a CLOSE_CODE context | |||
| extension, see Section 5.1. If an endpoint receives a | ||||
| CLOSE_DATAGRAM_CONTEXT capsule without a CLOSE_CODE context | ||||
| extension, the endpoint MUST abruptly terminate the corresponding | ||||
| stream with a stream error of type H3_GENERAL_PROTOCOL_ERROR. | ||||
| 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/3 Datagram Payload (..), | |||
| } | } | |||
| Figure 5: 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). | the datagram (see Section 2.1). Whether or not this field is | |||
| present depends on which registration capsules were exchanged on | ||||
| the associated stream: if a REGISTER_DATAGRAM_CONTEXT capsule (see | ||||
| Section 4.1) has been sent or received on this stream, then the | ||||
| field is present; if a REGISTER_DATAGRAM_NO_CONTEXT capsule (see | ||||
| 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 | ||||
| to parse this datagram and the receiver MUST either drop that | ||||
| datagram silently or buffer it temporarily while awaiting the | ||||
| registration capsule. | ||||
| HTTP/3 Datagram Payload: The payload of the datagram, whose | HTTP/3 Datagram Payload: The payload of the datagram, whose | |||
| semantics are defined by individual applications. Note that this | semantics are defined by individual applications. Note that this | |||
| field can be empty. | field can 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. | semantics as datagrams sent in QUIC DATAGRAM frames. In particular, | |||
| the restrictions on when it is allowed to send an HTTP/3 datagram and | ||||
| how to process them from Section 3 also apply to HTTP/3 datagrams | ||||
| sent and received using the DATAGRAM capsule. | ||||
| 5. The H3_DATAGRAM HTTP/3 SETTINGS Parameter | The DATAGRAM Capsule is transparent to intermediaries, meaning that | |||
| intermediaries MAY parse it and send DATAGRAM Capsules that they did | ||||
| not receive. This allows an intermediary to reencode HTTP/3 | ||||
| Datagrams as it forwards them: in other words, an intermediary MAY | ||||
| send a DATAGRAM Capsule to forward an HTTP/3 Datagram which was | ||||
| received in a QUIC DATAGRAM frame, and vice versa. | ||||
| Note that while DATAGRAM capsules are sent on a stream, | ||||
| intermediaries can reencode HTTP/3 datagrams into QUIC DATAGRAM | ||||
| frames over the next hop, and those could be dropped. Because of | ||||
| this, applications have to always consider HTTP/3 datagrams to be | ||||
| unreliable, even if they were initially sent in a capsule. | ||||
| 5. Context Extensibility | ||||
| In order to facilitate extensibility of contexts, the | ||||
| REGISTER_DATAGRAM_CONTEXT, REGISTER_DATAGRAM_NO_CONTEXT, and the | ||||
| CLOSE_DATAGRAM_CONTEXT capsules carry a Context Extensions field. | ||||
| That field contains a sequence of context extensions: | ||||
| Context Extensions { | ||||
| Context Extension (..) ..., | ||||
| } | ||||
| Each context extension is encoded as a (type, length, value) tuple: | ||||
| Context Extension { | ||||
| Context Extension Type (i), | ||||
| Context Extension Length (i), | ||||
| Context Extension Value (..), | ||||
| } | ||||
| Context Extension Types are registered with IANA, see Section 10.4. | ||||
| The Context Extension Length field contains the length of the Context | ||||
| Extension Value field in bytes. The semantics of the Context | ||||
| Extension Value field are defined by the corresponding Context | ||||
| Extension Type. | ||||
| 5.1. The CLOSE_CODE Context Extension Type | ||||
| The CLOSE_CODE context extension type (type=0x00) allows an endpoint | ||||
| to provide additional information as to why a datagram context was | ||||
| closed. This type SHALL only be sent in CLOSE_DATAGRAM_CONTEXT | ||||
| capsules. Its Context Extension Value field consists of a single | ||||
| variable-length integer which contains the close code. The following | ||||
| codes are defined: | ||||
| NO_ERROR (code=0x00): This indicates that the registration was | ||||
| closed without any additional information. | ||||
| DENIED (code=0x01): This indicates that the sender has rejected the | ||||
| context registration based on its local policy. The endpoint that | ||||
| had originally registered this context MUST NOT try to register | ||||
| another context with the same context extensions on this stream. | ||||
| RESOURCE_LIMIT (code=0x02): This indicates that the context was | ||||
| closed to save resources. The recipient SHOULD limit its future | ||||
| registration of resource-incentive contexts. | ||||
| Receipt of an unknown close code MUST be treated as if the NO_ERROR | ||||
| code was present. Close codes are registered with IANA, see | ||||
| Section 10.5. | ||||
| 5.2. The DETAILS Context Extension Type | ||||
| The DETAILS context extension type (type=0x01) allows an endpoint to | ||||
| provide additional details to context capsules. It is meant for | ||||
| debugging purposes. Its Context Extension Value field consists of a | ||||
| human-readable string encoded in UTF-8. | ||||
| 6. The H3_DATAGRAM HTTP/3 SETTINGS Parameter | ||||
| Implementations of HTTP/3 that support this mechanism can indicate | Implementations of HTTP/3 that support this mechanism can indicate | |||
| that to their peer by sending the H3_DATAGRAM SETTINGS parameter with | that to their peer by sending the H3_DATAGRAM SETTINGS parameter with | |||
| a value of 1. The value of the H3_DATAGRAM SETTINGS parameter MUST | a value of 1. The value of the H3_DATAGRAM SETTINGS parameter MUST | |||
| be either 0 or 1. A value of 0 indicates that this mechanism is not | be either 0 or 1. A value of 0 indicates that this mechanism is not | |||
| supported. An endpoint that receives the H3_DATAGRAM SETTINGS | supported. An endpoint that receives the H3_DATAGRAM SETTINGS | |||
| parameter with a value that is neither 0 or 1 MUST terminate the | parameter with a value that is neither 0 or 1 MUST terminate the | |||
| connection with error H3_SETTINGS_ERROR. | connection with error H3_SETTINGS_ERROR. | |||
| An endpoint that sends the H3_DATAGRAM SETTINGS parameter with a | An endpoint that sends the H3_DATAGRAM SETTINGS parameter with a | |||
| skipping to change at page 9, line 35 ¶ | skipping to change at page 14, line 5 ¶ | |||
| 0-RTT data, they MUST send a H3_DATAGRAM SETTINGS parameter greater | 0-RTT data, they MUST send a H3_DATAGRAM SETTINGS parameter greater | |||
| than or equal to the value they sent to the client in the connection | than or equal to the value they sent to the client in the connection | |||
| where they sent them the NewSessionTicket message. If a client | where they sent them the NewSessionTicket message. If a client | |||
| stores the value of the H3_DATAGRAM SETTINGS parameter with their | stores the value of the H3_DATAGRAM SETTINGS parameter with their | |||
| 0-RTT state, they MUST validate that the new value of the H3_DATAGRAM | 0-RTT state, they MUST validate that the new value of the H3_DATAGRAM | |||
| SETTINGS parameter sent by the server in the handshake is greater | SETTINGS parameter sent by the server in the handshake is greater | |||
| than or equal to the stored value; if not, the client MUST terminate | than or equal to the stored value; if not, the client MUST terminate | |||
| the connection with error H3_SETTINGS_ERROR. In all cases, the | the connection with error H3_SETTINGS_ERROR. In all cases, the | |||
| maximum permitted value of the H3_DATAGRAM SETTINGS parameter is 1. | maximum permitted value of the H3_DATAGRAM SETTINGS parameter is 1. | |||
| 6. HTTP/1.x and HTTP/2 Support | 7. Prioritization | |||
| Prioritization of HTTP/3 datagrams is not defined in this document. | ||||
| Future extensions MAY define how to prioritize datagrams, and MAY | ||||
| define signaling to allow endpoints to communicate their | ||||
| prioritization preferences. | ||||
| 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 into "HTTP Datagrams" with definitions | |||
| for HTTP/1.x, HTTP/2, and HTTP/3. | for HTTP/1.x, HTTP/2, and HTTP/3. | |||
| 7. 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. | |||
| 8. IANA Considerations | 10. IANA Considerations | |||
| 8.1. HTTP/3 CAPSULE Frame | 10.1. HTTP/3 CAPSULE Frame | |||
| 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 | | |||
| +------------+----------+---------------+ | +------------+----------+---------------+ | |||
| 8.2. HTTP SETTINGS Parameter | 10.2. HTTP 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 | | |||
| +--------------+----------+---------------+---------+ | +--------------+----------+---------------+---------+ | |||
| 8.3. Capsule Types | 10.3. Capsule Types | |||
| This document establishes a registry for HTTP/3 frame type codes. | This document establishes a registry for HTTP/3 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. | |||
| Reference: An optional reference to a specification for the type. | Reference: An optional reference to a specification for the type. | |||
| This field MAY be empty. | This field MAY be empty. | |||
| Registrations follow the "First Come First Served" policy (see | Registrations follow the "First Come First Served" policy (see | |||
| Section 4.4 of [IANA-POLICY]) where two registrations MUST NOT have | Section 4.4 of [IANA-POLICY]) where two registrations MUST NOT have | |||
| the same Type. | the same Type. | |||
| This registry initially contains the following entries: | This registry initially contains the following entries: | |||
| +---------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| | Capsule Type | Value | Specification | | | Capsule Type | Value | Specification | | |||
| +---------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| | REGISTER_DATAGRAM_CONTEXT | 0x00 | This Document | | | REGISTER_DATAGRAM_CONTEXT | 0x00 | This Document | | |||
| +---------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| | CLOSE_DATAGRAM_CONTEXT | 0x01 | This Document | | | CLOSE_DATAGRAM_CONTEXT | 0x01 | This Document | | |||
| +---------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| | DATAGRAM | 0x02 | This Document | | | DATAGRAM | 0x02 | This Document | | |||
| +---------------------------+-------+---------------+ | +------------------------------+-------+---------------+ | |||
| | REGISTER_DATAGRAM_NO_CONTEXT | 0x03 | This Document | | ||||
| +------------------------------+-------+---------------+ | ||||
| 8.4. Context Extension Keys | 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 | ||||
| types be ignored. These capsules have no semantics and can carry | ||||
| arbitrary values. These values MUST NOT be assigned by IANA and MUST | ||||
| NOT appear in the listing of assigned values. | ||||
| REGISTER_DATAGRAM_CONTEXT capsules carry key-value pairs, see | 10.4. Context Extension Types | |||
| Section 4.1. This document will request IANA to create an "HTTP | ||||
| Datagram Context Extension Keys" registry. Registrations in this | ||||
| registry MUST include the following fields: | ||||
| Key: The key (see Section 4.1). Keys MUST be valid tokens as | This document establishes a registry for HTTP/3 datagram context | |||
| defined in Section 3.2.6 of [RFC7230]. | extension type codes. The "HTTP Context Extension Types" registry | |||
| governs a 62-bit space. Registrations in this registry MUST include | ||||
| the following fields: | ||||
| Description: A brief description of the key semantics, which MAY be | Type: | |||
| a summary if a specification reference is provided. | ||||
| A name or label for the context extension type. | ||||
| Value: The value of the Context Extension Type field (see Section 5) | ||||
| is a 62bit integer. | ||||
| Reference: An optional reference to a specification for the | Reference: An optional reference to a specification for the | |||
| parameter. This field MAY be empty. | parameter. This field MAY be empty. | |||
| Registrations follow the "First Come First Served" policy (see | Registrations follow the "First Come First Served" policy (see | |||
| Section 4.4 of [IANA-POLICY]) where two registrations MUST NOT have | Section 4.4 of [IANA-POLICY]) where two registrations MUST NOT have | |||
| the same Key. This registry is initially empty. | the same Type nor Value. | |||
| 9. Normative References | This registry initially contains the following entries: | |||
| +------------------------------+-------+---------------+ | ||||
| | Context Extension Type | Value | Specification | | ||||
| +------------------------------+-------+---------------+ | ||||
| | CLOSE_CODE | 0x00 | This Document | | ||||
| +------------------------------+-------+---------------+ | ||||
| | DETAILS | 0x01 | This Document | | ||||
| +------------------------------+-------+---------------+ | ||||
| Context extension types with a value of the form 41 * N + 17 for | ||||
| integer values of N are reserved to exercise the requirement that | ||||
| unknown context extension types be ignored. These extensions have no | ||||
| semantics and can carry arbitrary values. These values MUST NOT be | ||||
| assigned by IANA and MUST NOT appear in the listing of assigned | ||||
| values. | ||||
| 10.5. Context Close Codes | ||||
| This document establishes a registry for HTTP/3 context extension | ||||
| type codes. The "HTTP Context Close Codes" registry governs a 62-bit | ||||
| space. Registrations in this registry MUST include the following | ||||
| fields: | ||||
| Type: | ||||
| A name or label for the close code. | ||||
| Value: The value of the CLOSE_CODE Context Extension Value field | ||||
| (see Section 5.1) is a 62bit integer. | ||||
| Reference: An optional reference to a specification for the | ||||
| parameter. This field MAY be empty. | ||||
| Registrations follow the "First Come First Served" policy (see | ||||
| Section 4.4 of [IANA-POLICY]) where two registrations MUST NOT have | ||||
| the same Type nor Value. | ||||
| This registry initially contains the following entries: | ||||
| +------------------------------+-------+---------------+ | ||||
| | Context Close Code | Value | Specification | | ||||
| +------------------------------+-------+---------------+ | ||||
| | NO_ERROR | 0x00 | This Document | | ||||
| +------------------------------+-------+---------------+ | ||||
| | DENIED | 0x01 | This Document | | ||||
| +------------------------------+-------+---------------+ | ||||
| | RESOURCE_LIMIT | 0x02 | This Document | | ||||
| +------------------------------+-------+---------------+ | ||||
| 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 | ||||
| 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 | ||||
| values. | ||||
| 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-02, 16 February 2021, | |||
| <https://tools.ietf.org/html/draft-ietf-quic-datagram-02>. | <https://tools.ietf.org/html/draft-ietf-quic-datagram-02>. | |||
| [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://tools.ietf.org/html/draft-ietf-quic-http-34>. | |||
| skipping to change at page 12, line 22 ¶ | skipping to change at page 18, line 16 ¶ | |||
| 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://tools.ietf.org/html/draft-ietf-quic-transport- | |||
| 34>. | 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>. | |||
| [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
| Protocol (HTTP/1.1): Message Syntax and Routing", | ||||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | ||||
| <https://www.rfc-editor.org/rfc/rfc7230>. | ||||
| [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>. | |||
| Appendix A. Examples | Appendix A. Examples | |||
| A.1. CONNECT-UDP | A.1. CONNECT-UDP | |||
| Client Server | Client Server | |||
| STREAM(44): HEADERS --------> | STREAM(44): HEADERS --------> | |||
| :method = CONNECT-UDP | :method = CONNECT-UDP | |||
| :scheme = https | :scheme = https | |||
| :path = / | :path = / | |||
| :authority = target.example.org:443 | :authority = target.example.org:443 | |||
| STREAM(44): CAPSULE --------> | STREAM(44): CAPSULE --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 0 | Context ID = 0 | |||
| Extension String = "" | Context Extension = {} | |||
| DATAGRAM --------> | DATAGRAM --------> | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated UDP Payload | Payload = Encapsulated UDP Payload | |||
| <-------- STREAM(44): HEADERS | <-------- STREAM(44): HEADERS | |||
| :status = 200 | :status = 200 | |||
| /* Wait for target server to respond to UDP packet. */ | /* Wait for target server to respond to UDP packet. */ | |||
| skipping to change at page 14, line 4 ¶ | skipping to change at page 19, line 6 ¶ | |||
| :status = 200 | :status = 200 | |||
| /* Wait for target server to respond to UDP packet. */ | /* Wait for target server to respond to UDP packet. */ | |||
| <-------- DATAGRAM | <-------- DATAGRAM | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated UDP Payload | Payload = Encapsulated UDP Payload | |||
| A.2. CONNECT-UDP with Timestamp Extension | A.2. CONNECT-UDP with Timestamp Extension | |||
| Client Server | Client Server | |||
| STREAM(44): HEADERS --------> | STREAM(44): HEADERS --------> | |||
| :method = CONNECT-UDP | :method = CONNECT-UDP | |||
| :scheme = https | :scheme = https | |||
| :path = / | :path = / | |||
| :authority = target.example.org:443 | :authority = target.example.org:443 | |||
| STREAM(44): CAPSULE --------> | STREAM(44): CAPSULE --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 0 | Context ID = 0 | |||
| Extension String = "" | Context Extension = {} | |||
| DATAGRAM --------> | DATAGRAM --------> | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated UDP Payload | Payload = Encapsulated UDP Payload | |||
| <-------- STREAM(44): HEADERS | <-------- STREAM(44): HEADERS | |||
| :status = 200 | :status = 200 | |||
| /* Wait for target server to respond to UDP packet. */ | /* Wait for target server to respond to UDP packet. */ | |||
| <-------- DATAGRAM | <-------- DATAGRAM | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated UDP Payload | Payload = Encapsulated UDP Payload | |||
| STREAM(44): CAPSULE --------> | STREAM(44): CAPSULE --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 2 | Context ID = 2 | |||
| Extension String = "timestamp" | Context Extension = {TIMESTAMP=""} | |||
| DATAGRAM --------> | DATAGRAM --------> | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 2 | Context ID = 2 | |||
| Payload = Encapsulated UDP Payload With Timestamp | Payload = Encapsulated UDP Payload With Timestamp | |||
| A.3. CONNECT-IP with IP compression | A.3. CONNECT-IP with IP compression | |||
| Client Server | Client Server | |||
| STREAM(44): HEADERS --------> | STREAM(44): HEADERS --------> | |||
| :method = CONNECT-IP | :method = CONNECT-IP | |||
| :scheme = https | :scheme = https | |||
| :path = / | :path = / | |||
| :authority = proxy.example.org:443 | :authority = proxy.example.org:443 | |||
| <-------- STREAM(44): HEADERS | <-------- STREAM(44): HEADERS | |||
| :status = 200 | :status = 200 | |||
| /* Exchange CONNECT-IP configuration information. */ | /* Exchange CONNECT-IP configuration information. */ | |||
| STREAM(44): CAPSULE --------> | STREAM(44): CAPSULE --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 0 | Context ID = 0 | |||
| Extension String = "" | Context Extension = {} | |||
| DATAGRAM --------> | DATAGRAM --------> | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated IP Packet | Payload = Encapsulated IP Packet | |||
| /* Endpoint happily exchange encapsulated IP packets */ | /* Endpoint happily exchange encapsulated IP packets */ | |||
| /* using Quarter Stream ID 11 and Context ID 0. */ | /* using Quarter Stream ID 11 and Context ID 0. */ | |||
| DATAGRAM --------> | DATAGRAM --------> | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated IP Packet | Payload = Encapsulated IP Packet | |||
| /* After performing some analysis on traffic patterns, */ | /* After performing some analysis on traffic patterns, */ | |||
| /* the client decides it wants to compress a 5-tuple. */ | /* the client decides it wants to compress a 5-tuple. */ | |||
| STREAM(44): CAPSULE --------> | STREAM(44): CAPSULE --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 2 | Context ID = 2 | |||
| Extension String = "ip=192.0.2.42,port=443" | Context Extension = {IP_COMPRESSION=tcp,192.0.2.6:9876,192.0.2.7:443} | |||
| DATAGRAM --------> | DATAGRAM --------> | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 2 | Context ID = 2 | |||
| Payload = Compressed IP Packet | Payload = Compressed IP Packet | |||
| A.4. WebTransport | A.4. WebTransport | |||
| Client Server | Client Server | |||
| STREAM(44): HEADERS --------> | STREAM(44): HEADERS --------> | |||
| :method = CONNECT | :method = CONNECT | |||
| :scheme = https | :scheme = https | |||
| :method = webtransport | :method = webtransport | |||
| :path = /hello | :path = /hello | |||
| :authority = webtransport.example.org:443 | :authority = webtransport.example.org:443 | |||
| Origin = https://www.example.org:443 | Origin = https://www.example.org:443 | |||
| STREAM(44): CAPSULE --------> | STREAM(44): CAPSULE --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_NO_CONTEXT | |||
| Context ID = 0 | Context Extension = {} | |||
| Extension String = "" | ||||
| <-------- STREAM(44): HEADERS | <-------- STREAM(44): HEADERS | |||
| :status = 200 | :status = 200 | |||
| /* Both endpoints can now send WebTransport datagrams. */ | /* Both endpoints can now send WebTransport datagrams. */ | |||
| Acknowledgments | Acknowledgments | |||
| The DATAGRAM context identifier was previously part of the DATAGRAM | The DATAGRAM context identifier was previously part of the DATAGRAM | |||
| frame definition itself, the authors would like to acknowledge the | frame definition itself, the authors would like to acknowledge the | |||
| End of changes. 60 change blocks. | ||||
| 147 lines changed or deleted | 421 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/ | ||||