| < draft-ietf-masque-h3-datagram-03.txt | draft-ietf-masque-h3-datagram-04.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: 13 January 2022 Cloudflare | Expires: 10 April 2022 Cloudflare | |||
| 12 July 2021 | 7 October 2021 | |||
| Using Datagrams with HTTP | Using Datagrams with HTTP | |||
| draft-ietf-masque-h3-datagram-03 | draft-ietf-masque-h3-datagram-04 | |||
| 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 2, line 4 ¶ | skipping to change at page 2, line 4 ¶ | |||
| 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 10 April 2022. | |||
| 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 . . . . . . . . . . . . . . . 4 | |||
| 2. Multiplexing . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Multiplexing . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. Datagram Contexts . . . . . . . . . . . . . . . . . . . . 4 | 2.1. Datagram Contexts . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.2. Context ID Allocation . . . . . . . . . . . . . . . . . . 4 | 2.2. Datagram Formats . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3. HTTP/3 DATAGRAM Format . . . . . . . . . . . . . . . . . . . 4 | 2.3. Context ID Allocation . . . . . . . . . . . . . . . . . . 5 | |||
| 4. CAPSULE HTTP/3 Frame Definition . . . . . . . . . . . . . . . 6 | 3. HTTP/3 DATAGRAM Format . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.1. The REGISTER_DATAGRAM_CONTEXT Capsule . . . . . . . . . . 7 | 4. Capsules . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule . . . . . . . . 9 | 4.1. Capsule Protocol . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.3. The CLOSE_DATAGRAM_CONTEXT Capsule . . . . . . . . . . . 10 | 4.2. Requirements . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.4. The DATAGRAM Capsule . . . . . . . . . . . . . . . . . . 11 | 4.3. Intermediary Processing . . . . . . . . . . . . . . . . . 9 | |||
| 5. Context Extensibility . . . . . . . . . . . . . . . . . . . . 12 | 4.4. Capsule Types . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5.1. The CLOSE_CODE Context Extension Type . . . . . . . . . . 13 | 4.4.1. The REGISTER_DATAGRAM_CONTEXT Capsule . . . . . . . . 10 | |||
| 5.2. The DETAILS Context Extension Type . . . . . . . . . . . 13 | 4.4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule . . . . . . 11 | |||
| 6. The H3_DATAGRAM HTTP/3 SETTINGS Parameter . . . . . . . . . . 13 | 4.4.3. The CLOSE_DATAGRAM_CONTEXT Capsule . . . . . . . . . 12 | |||
| 7. Prioritization . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.4.4. The DATAGRAM Capsule . . . . . . . . . . . . . . . . 14 | |||
| 8. HTTP/1.x and HTTP/2 Support . . . . . . . . . . . . . . . . . 14 | 5. The H3_DATAGRAM HTTP/3 SETTINGS Parameter . . . . . . . . . . 16 | |||
| 9. Security Considerations . . . . . . . . . . . . . . . . . . . 14 | 5.1. Note About Draft Versions . . . . . . . . . . . . . . . . 16 | |||
| 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 14 | 6. Prioritization . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 10.1. HTTP/3 CAPSULE Frame . . . . . . . . . . . . . . . . . . 14 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 17 | |||
| 10.2. HTTP/3 SETTINGS Parameter . . . . . . . . . . . . . . . 15 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 10.3. Capsule Types . . . . . . . . . . . . . . . . . . . . . 15 | 8.1. HTTP/3 SETTINGS Parameter . . . . . . . . . . . . . . . . 17 | |||
| 10.4. Context Extension Types . . . . . . . . . . . . . . . . 16 | 8.2. Capsule Types . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 10.5. Context Close Codes . . . . . . . . . . . . . . . . . . 17 | 8.3. Datagram Format Types . . . . . . . . . . . . . . . . . . 18 | |||
| 11. Normative References . . . . . . . . . . . . . . . . . . . . 17 | 8.4. Context Close Codes . . . . . . . . . . . . . . . . . . . 19 | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 18 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| A.1. CONNECT-UDP . . . . . . . . . . . . . . . . . . . . . . . 18 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 19 | |||
| A.2. CONNECT-UDP with Timestamp Extension . . . . . . . . . . 19 | 9.2. Informative References . . . . . . . . . . . . . . . . . 20 | |||
| A.3. CONNECT-IP with IP compression . . . . . . . . . . . . . 20 | Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| A.4. WebTransport . . . . . . . . . . . . . . . . . . . . . . 21 | A.1. CONNECT-UDP . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| A.2. CONNECT-UDP with Timestamp Extension . . . . . . . . . . 21 | ||||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 22 | A.3. CONNECT-IP with IP compression . . . . . . . . . . . . . 22 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 22 | A.4. WebTransport . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
| 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. Additionally, this document defines how to | demultiplexing layer. Additionally, this document defines how to | |||
| convey datagrams over prior versions of HTTP. | convey datagrams over prior versions of HTTP. | |||
| This document is structured as follows: | ||||
| * Section 2 presents core concepts for multiplexing across HTTP | ||||
| versions. | ||||
| - Section 2.1 defines datagram contexts, an optional end-to-end | ||||
| multiplexing concept scoped to each HTTP request. | ||||
| - Section 2.2 defines datagram formats, which are scoped to | ||||
| contexts. Formats communicate the format and encoding of | ||||
| datagrams sent using the associated context. | ||||
| - Contexts are identified using a variable-length integer. | ||||
| Requirements for allocating identifier values are detailed in | ||||
| Section 2.3. | ||||
| * Section 3 defines how QUIC DATAGRAM frames are used with HTTP/3. | ||||
| Section 5 defines an HTTP/3 setting that endpoints can use to | ||||
| advertise support of the frame. | ||||
| * Section 4 introduces the Capsule Protocol and the "data stream" | ||||
| concept. Data streams are initiated using special-purpose HTTP | ||||
| requests, after which Capsules, an end-to-end message, can be | ||||
| sent. | ||||
| - The following Capsule types are defined, together with guidance | ||||
| for defining new types: | ||||
| o REGISTER_DATAGRAM_CONTEXT Section 4.4.1 | ||||
| o REGISTER_DATAGRAM_NO_CONTEXT Section 4.4.2 | ||||
| o CLOSE_DATAGRAM_CONTEXT Section 4.4.3 | ||||
| o DATAGRAM Section 4.4.4 | ||||
| 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 | |||
| skipping to change at page 4, line 14 ¶ | skipping to change at page 4, line 44 ¶ | |||
| 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 optional, their use is negotiated on each request stream | Contexts are optional, whether to use them or not is decided by the | |||
| using registration capsules, see Section 4.1 and Section 4.2. When | client on each request stream using registration capsules, see | |||
| contexts are used, they are identified within the scope of a given | Section 4.4.1 and Section 4.4.2. When contexts are used, they are | |||
| request by a numeric value, referred to as the context ID. A context | identified within the scope of a given request by a numeric value, | |||
| ID is a 62-bit integer (0 to 2^62-1). | 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. Datagram Formats | |||
| When an endpoint registers a datagram context (or the lack of | ||||
| contexts), it communicates the format (i.e., the semantics and | ||||
| encoding) of datagrams sent using this context. This is | ||||
| acccomplished by sending a Datagram Format Type as part of the | ||||
| registration capsule, see Section 4.4.1 and Section 4.4.2. This type | ||||
| identifier is registered with IANA (see Section 8.3) and allows | ||||
| applications that use HTTP Datagrams to indicate what the content of | ||||
| datagrams are. Registration capsules carry a Datagram Format | ||||
| Additional Data field which allows sending some additional | ||||
| information that would impact the format of datagrams. | ||||
| For example, a protocol which proxies IP packets can define a | ||||
| Datagram Format Type which represents an IP packet. The | ||||
| corresponding Datagram Format Additional Data field would be empty. | ||||
| An extension to such a protocol that wishes to compress IP addresses | ||||
| could define a distinct Datagram Format Type and exchange two IP | ||||
| addresses via the Datagram Format Additional Data field. Then any | ||||
| datagrams with that type would contain the IP packet with addresses | ||||
| elided. | ||||
| 2.3. Context ID Allocation | ||||
| Implementations of HTTP Datagrams MUST provide a context ID | Implementations of HTTP Datagrams MUST provide a context ID | |||
| allocation service. That service will allow applications co-located | allocation service. That service will allow applications co-located | |||
| with HTTP to request a unique context ID that they can subsequently | with HTTP to request a unique context ID that they can subsequently | |||
| use for their own purposes. The HTTP implementation will then parse | use for their own purposes. The HTTP implementation will then parse | |||
| the context ID of incoming HTTP Datagrams and use it to deliver the | the context ID of incoming HTTP Datagrams and use it to deliver the | |||
| frame to the appropriate application context. | frame to the appropriate application 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 client | context IDs are server-initiated. This means that an HTTP client | |||
| skipping to change at page 5, line 15 ¶ | skipping to change at page 6, line 21 ¶ | |||
| HTTP/3 Datagram { | HTTP/3 Datagram { | |||
| Quarter Stream ID (i), | Quarter Stream ID (i), | |||
| [Context ID (i)], | [Context ID (i)], | |||
| HTTP Datagram Payload (..), | HTTP Datagram Payload (..), | |||
| } | } | |||
| Figure 1: HTTP/3 DATAGRAM Format | Figure 1: HTTP/3 DATAGRAM Format | |||
| Quarter Stream ID: A variable-length integer that contains the value | Quarter Stream ID: A variable-length integer that contains the value | |||
| of the client-initiated bidirectional stream that this datagram is | of the client-initiated bidirectional stream that this datagram is | |||
| associated with, divided by four. (The division by four stems | associated with, divided by four (the division by four stems from | |||
| from the fact that HTTP requests are sent on client-initiated | the fact that HTTP requests are sent on client-initiated | |||
| bidirectional streams, and those have stream IDs that are | bidirectional streams, and those have stream IDs that are | |||
| divisible by four.) | divisible by four). The largest legal QUIC stream ID value is | |||
| 2^62-1, so the largest legal value of Quarter Stream ID is 2^62-1 | ||||
| / 4. Receipt of a frame that includes a larger value MUST be | ||||
| treated as a connection error of type FRAME_ENCODING_ERROR. | ||||
| 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.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.4.2) has been sent or received, then this field is | |||
| if neither has been sent or received, then it is not yet possible | absent; if neither has been sent or received, then it is not yet | |||
| to parse this datagram and the receiver MUST either drop that | possible to parse this datagram and the receiver MUST either drop | |||
| datagram silently or buffer it temporarily while awaiting the | that datagram silently or buffer it temporarily while awaiting the | |||
| registration capsule. | registration capsule. | |||
| HTTP Datagram Payload: The payload of the datagram, whose semantics | HTTP Datagram Payload: The payload of the datagram, whose semantics | |||
| are defined by individual applications. Note that this field can | are defined by individual applications. Note that this 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 whether it is present or not is | |||
| see Section 4.2. Therefore intermediaries cannot know whether the | decided end-to-end by the client, see Section 4.4.2. Therefore | |||
| Context ID field is present or absent and they MUST ignore any HTTP/3 | intermediaries cannot know whether the Context ID field is present or | |||
| Datagram fields after the Quarter Stream ID. | 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 | |||
| skipping to change at page 6, line 21 ¶ | skipping to change at page 7, line 40 ¶ | |||
| longer expected so the endpoint can release related state. Endpoints | longer expected so the endpoint can release related state. Endpoints | |||
| MAY keep state for a short time to account for reordering. Once the | MAY keep state for a short time to account for reordering. Once the | |||
| state is released, the endpoint MUST silently drop received | state is released, the endpoint MUST silently drop received | |||
| associated datagrams. | associated datagrams. | |||
| If an HTTP/3 datagram is received and its Quarter Stream ID maps to a | If an HTTP/3 datagram is received and its Quarter Stream ID maps to a | |||
| stream that has not yet been created, the receiver SHALL either drop | stream that has not yet been created, the receiver SHALL either drop | |||
| that datagram silently or buffer it temporarily while awaiting the | that datagram silently or buffer it temporarily while awaiting the | |||
| creation of the corresponding stream. | creation of the corresponding stream. | |||
| 4. CAPSULE HTTP/3 Frame Definition | 4. Capsules | |||
| CAPSULE allows reliably sending request-related information end-to- | This specification introduces the Capsule Protocol. The Capsule | |||
| Protocol is a sequence of type-length-value tuples that allows | ||||
| endpoints to reliably communicate 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 | 4.1. Capsule Protocol | |||
| only be sent in client-initiated bidirectional streams. | ||||
| Intermediaries forward received CAPSULE frames on the same stream | ||||
| where it would forward DATA frames. Each Capsule Type determines | ||||
| whether it is opaque or transparent to intermediaries: opaque | ||||
| 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 defines the "data stream" of an HTTP request as | |||
| 0xffcab5. If this document is approved, a lower number will be | the bidirectional stream of bytes that follow the headers in both | |||
| requested from IANA. | directions. In HTTP/1.x, the data stream consists of all bytes on | |||
| the connection that follow the blank line that concludes either the | ||||
| request header section, or the 2xx (Successful) response header | ||||
| section. In HTTP/2 and HTTP/3, the data stream of a given HTTP | ||||
| request consists of all bytes sent in DATA frames with the | ||||
| corresponding stream ID. The concept of a data stream is | ||||
| particularly relevant for methods such as CONNECT where there is no | ||||
| HTTP message content after the headers. | ||||
| CAPSULE HTTP/3 Frame { | Definitions of new HTTP Methods or of new HTTP Upgrade Tokens can | |||
| Type (i) = 0xffcab5, | state that their data stream uses the Capsule Protocol. If they do | |||
| Length (i), | so, that means that the contents of their data stream uses the | |||
| following format (using the notation from the "Notational | ||||
| Conventions" section of [QUIC]): | ||||
| Capsule Protocol { | ||||
| Capsule (..) ..., | ||||
| } | ||||
| Figure 2: Capsule Protocol Stream Format | ||||
| Capsule { | ||||
| Capsule Type (i), | Capsule Type (i), | |||
| Capsule Data (..), | Capsule Length (i), | |||
| Capsule Value (..), | ||||
| } | } | |||
| Figure 2: CAPSULE HTTP/3 Frame Format | Figure 3: Capsule Format | |||
| The Type and Length fields follows the definition of HTTP/3 frames | Capsule Type: A variable-length integer indicating the Type of the | |||
| from [H3]. The payload consists of: | capsule. Endpoints that receive a capsule with an unknown Capsule | |||
| Type MUST silently skip over that capsule. | ||||
| Capsule Type: The type of this capsule. | Capsule Length: The length of the Capsule Value field following this | |||
| field, encoded as a variable-length integer. Note that this field | ||||
| can have a value of zero. | ||||
| Capsule Data: Data whose semantics depends on the Capsule Type. | Capsule Value: The payload of this capsule. Its semantics are | |||
| determined by the value of the Capsule Type field. | ||||
| 4.2. Requirements | ||||
| If the definition of an HTTP Method or HTTP Upgrade Token states that | ||||
| it uses the capsule protocol, its implementations MUST follow the | ||||
| following requirements: | ||||
| * A server MUST NOT send any Transfer-Encoding or Content-Length | ||||
| header fields in a 2xx (Successful) response. If a client | ||||
| receives a Content-Length or Transfer-Encoding header fields in a | ||||
| successful response, it MUST treat that response as malformed. | ||||
| * A request message does not have content. | ||||
| * A successful response message does not have content. | ||||
| * Responses are not cacheable. | ||||
| 4.3. Intermediary Processing | ||||
| Intermediaries MUST operate in one of the two following modes: | ||||
| Pass-through mode: In this mode, the intermediary forwards the data | ||||
| stream between two associated streams without any modification of | ||||
| the data stream. | ||||
| Participant mode: In this mode, the intermediary terminates the data | ||||
| stream and parses all Capsule Type and Capsule Length fields it | ||||
| receives. | ||||
| Each Capsule Type determines whether it is opaque or transparent to | ||||
| intermediaries in participant mode: opaque capsules are forwarded | ||||
| unmodified while transparent ones can be parsed, added, or removed by | ||||
| intermediaries. Intermediaries MAY modify the contents of the | ||||
| Capsule Data field of transparent capsule types. | ||||
| Unless otherwise specified, all Capsule Types are defined as opaque | Unless otherwise specified, all Capsule Types are defined as opaque | |||
| to intermediaries. Intermediaries MUST forward all received opaque | to intermediaries. Intermediaries MUST forward all received opaque | |||
| CAPSULE frames in their unmodified entirety. Intermediaries MUST NOT | CAPSULE frames in their unmodified entirety. Intermediaries MUST NOT | |||
| send any opaque CAPSULE frames other than the ones it is forwarding. | send any opaque CAPSULE frames other than the ones it is forwarding. | |||
| All Capsule Types defined in this document are opaque, with the | All Capsule Types defined in this document are opaque, with the | |||
| exception of the DATAGRAM Capsule, see Section 4.4. Definitions of | exception of the DATAGRAM Capsule, see Section 4.4.4. Definitions of | |||
| new Capsule Types MAY specify that the newly introduced type is | new Capsule Types MAY specify that the newly introduced type is | |||
| transparent. Intermediaries MUST treat unknown Capsule Types as | transparent. Intermediaries MUST treat unknown Capsule Types as | |||
| opaque. | opaque. | |||
| Intermediaries respect the order of opaque CAPSULE frames: if an | Intermediaries respect the order of opaque CAPSULE frames: if an | |||
| intermediary receives two opaque CAPSULE frames in a given order, it | intermediary receives two opaque CAPSULE frames in a given order, it | |||
| MUST forward them in the same order. | 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. | silently drop that Capsule. | |||
| Receipt of a CAPSULE HTTP/3 Frame on a stream that is not a client- | 4.4. Capsule Types | |||
| initiated bidirectional stream MUST be treated as a connection error | ||||
| of type H3_FRAME_UNEXPECTED. | ||||
| 4.1. The REGISTER_DATAGRAM_CONTEXT Capsule | 4.4.1. The REGISTER_DATAGRAM_CONTEXT Capsule | |||
| The REGISTER_DATAGRAM_CONTEXT capsule (type=0x00) allows an endpoint | The REGISTER_DATAGRAM_CONTEXT capsule (see Section 8.2 for the value | |||
| to inform its peer of the encoding and semantics of datagrams | of the capsule type) allows an endpoint to inform its peer of the | |||
| associated with a given context ID. Its Capsule Data field consists | encoding and semantics of datagrams associated with a given context | |||
| of: | ID. | |||
| REGISTER_DATAGRAM_CONTEXT Capsule { | REGISTER_DATAGRAM_CONTEXT Capsule { | |||
| Type (i) = REGISTER_DATAGRAM_CONTEXT, | ||||
| Length (i), | ||||
| Context ID (i), | Context ID (i), | |||
| Context Extensions (..), | Datagram Format Type (i), | |||
| Datagram Format Additional Data (..), | ||||
| } | } | |||
| Figure 3: REGISTER_DATAGRAM_CONTEXT Capsule Format | Figure 4: REGISTER_DATAGRAM_CONTEXT Capsule Format | |||
| Context ID: The context ID to register. | Context ID: The context ID to register. | |||
| Context Extensions: See Section 5. | Datagram Format Type: A variable-length integer that defines the | |||
| semantics and encoding of the HTTP Datagram Payload field of | ||||
| datagrams with this context ID, see Section 2.2. | ||||
| Datagram Format Additional Data: This field carries additional | ||||
| information that impact the format of datagrams with this context | ||||
| ID, see Section 2.2. | ||||
| 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, reordering can cause DATAGRAM frames | |||
| receives a DATAGRAM frame with an unknown Context ID MUST NOT treat | to be received with an unknown Context ID. Receipt of such frames | |||
| it as an error, it SHALL instead drop the DATAGRAM frame silently, or | MUST NOT be treated as an error. Endpoints SHALL drop the DATAGRAM | |||
| buffer it temporarily while awaiting the corresponding | frame silently, or buffer it temporarily while awaiting the | |||
| REGISTER_DATAGRAM_CONTEXT Capsule. | corresponding REGISTER_DATAGRAM_CONTEXT Capsule. Intermediaries | |||
| SHALL drop the DATAGRAM frame silently, MAY buffer it, or forward it | ||||
| on immediately. | ||||
| 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. | |||
| 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 | Servers MUST NOT send a REGISTER_DATAGRAM_CONTEXT capsule on a stream | |||
| before they have received at least one REGISTER_DATAGRAM_CONTEXT | before they have received at least one REGISTER_DATAGRAM_CONTEXT | |||
| capsule or one REGISTER_DATAGRAM_NO_CONTEXT capsule from the client | capsule or one REGISTER_DATAGRAM_NO_CONTEXT capsule from the client | |||
| on that stream. This ensures that clients control whether datagrams | on that stream. This ensures that clients control whether datagrams | |||
| are allowed for a given request. If a client receives a | are allowed for a given request. If a client receives a | |||
| REGISTER_DATAGRAM_CONTEXT capsule on a stream where the client has | REGISTER_DATAGRAM_CONTEXT capsule on a stream where the client has | |||
| not yet sent a REGISTER_DATAGRAM_CONTEXT capsule, the client MUST | not yet sent a REGISTER_DATAGRAM_CONTEXT capsule, the client MUST | |||
| abruptly terminate the corresponding stream with a stream error of | abruptly terminate the corresponding stream with a stream error of | |||
| type H3_GENERAL_PROTOCOL_ERROR. | type H3_GENERAL_PROTOCOL_ERROR. | |||
| Servers MUST NOT send a REGISTER_DATAGRAM_CONTEXT capsule on a stream | Servers MUST NOT send a REGISTER_DATAGRAM_CONTEXT capsule on a stream | |||
| where it has received a REGISTER_DATAGRAM_NO_CONTEXT capsule. If a | where it has received a REGISTER_DATAGRAM_NO_CONTEXT capsule. If a | |||
| client receives a REGISTER_DATAGRAM_CONTEXT capsule on a stream where | client receives a REGISTER_DATAGRAM_CONTEXT capsule on a stream where | |||
| the client has sent a REGISTER_DATAGRAM_NO_CONTEXT capsule, the | the client has sent a REGISTER_DATAGRAM_NO_CONTEXT capsule, the | |||
| client MUST abruptly terminate the corresponding stream with a stream | client MUST abruptly terminate the corresponding stream with a stream | |||
| error of type H3_GENERAL_PROTOCOL_ERROR. | error of type H3_GENERAL_PROTOCOL_ERROR. | |||
| 4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule | 4.4.2. The REGISTER_DATAGRAM_NO_CONTEXT Capsule | |||
| The REGISTER_DATAGRAM_NO_CONTEXT capsule (type=0x03) allows a client | The REGISTER_DATAGRAM_NO_CONTEXT capsule (see Section 8.2 for the | |||
| to inform the server that datagram contexts will not be used with | value of the capsule type) allows a client to inform the server that | |||
| this stream. It also informs the server of the encoding and | datagram contexts will not be used with this stream. It also informs | |||
| semantics of datagrams associated with this stream. Its Capsule Data | the server of the encoding and semantics of datagrams associated with | |||
| field consists of: | this stream. | |||
| REGISTER_DATAGRAM_NO_CONTEXT Capsule { | REGISTER_DATAGRAM_NO_CONTEXT Capsule { | |||
| Context Extensions (..), | Type (i) = REGISTER_DATAGRAM_NO_CONTEXT, | |||
| Length (i), | ||||
| Datagram Format Type (i), | ||||
| Datagram Format Additional Data (..), | ||||
| } | } | |||
| Figure 4: REGISTER_DATAGRAM_NO_CONTEXT Capsule Format | Figure 5: REGISTER_DATAGRAM_NO_CONTEXT Capsule Format | |||
| Context Extensions: See Section 5. | Datagram Format Type: A variable-length integer that defines the | |||
| semantics and encoding of the HTTP Datagram Payload field of | ||||
| datagrams, see Section 2.2. | ||||
| Datagram Format Additional Data: This field carries additional | ||||
| information that impact the format of datagrams, see Section 2.2. | ||||
| Note that this registration is unilateral and bidirectional: the | Note that this registration is unilateral and bidirectional: the | |||
| client unilaterally defines the semantics it will apply to the | client unilaterally defines the semantics it will apply to the | |||
| datagrams it sends and receives with this stream. | datagrams it sends and receives with this stream. | |||
| Endpoints MUST NOT send DATAGRAM frames without a Context ID until | Endpoints MUST NOT send DATAGRAM frames without a Context ID until | |||
| they have either sent or received a REGISTER_DATAGRAM_NO_CONTEXT | they have either sent or received a REGISTER_DATAGRAM_NO_CONTEXT | |||
| Capsule. However, due to reordering, an endpoint that receives a | Capsule. However, due to reordering, an endpoint that receives a | |||
| DATAGRAM frame before receiving either a REGISTER_DATAGRAM_CONTEXT | DATAGRAM frame before receiving either a REGISTER_DATAGRAM_CONTEXT | |||
| capsule or a REGISTER_DATAGRAM_NO_CONTEXT capsule MUST NOT treat it | capsule or a REGISTER_DATAGRAM_NO_CONTEXT capsule MUST NOT treat it | |||
| skipping to change at page 10, line 5 ¶ | skipping to change at page 12, line 30 ¶ | |||
| client receives a REGISTER_DATAGRAM_NO_CONTEXT capsule, the client | client receives a REGISTER_DATAGRAM_NO_CONTEXT capsule, the client | |||
| 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. | |||
| Clients MUST NOT send more than one REGISTER_DATAGRAM_NO_CONTEXT | Clients MUST NOT send more than one REGISTER_DATAGRAM_NO_CONTEXT | |||
| capsule on a stream. If a server receives a second | capsule on a stream. If a server receives a second | |||
| REGISTER_DATAGRAM_NO_CONTEXT capsule on the same stream, the server | REGISTER_DATAGRAM_NO_CONTEXT capsule on the same stream, the server | |||
| 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. | |||
| 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 | Clients MUST NOT send both REGISTER_DATAGRAM_CONTEXT capsules and | |||
| REGISTER_DATAGRAM_NO_CONTEXT capsules on the same stream. If a | REGISTER_DATAGRAM_NO_CONTEXT capsules on the same stream. If a | |||
| server receives both a REGISTER_DATAGRAM_CONTEXT capsule and a | server receives both a REGISTER_DATAGRAM_CONTEXT capsule and a | |||
| REGISTER_DATAGRAM_NO_CONTEXT capsule on the same stream, the server | REGISTER_DATAGRAM_NO_CONTEXT capsule on the same stream, the server | |||
| 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. | |||
| Extensions MAY define a different mechanism to negotiate the presence | Extensions MAY define a different mechanism to communicate whether | |||
| of contexts, and they MAY do so in a way which is opaque to | contexts are in use, and they MAY do so in a way which is opaque to | |||
| intermediaries. | intermediaries. | |||
| 4.3. The CLOSE_DATAGRAM_CONTEXT Capsule | 4.4.3. The CLOSE_DATAGRAM_CONTEXT Capsule | |||
| The CLOSE_DATAGRAM_CONTEXT capsule (type=0x01) allows an endpoint to | The CLOSE_DATAGRAM_CONTEXT capsule (see Section 8.2 for the value of | |||
| inform its peer that it will no longer send or parse received | the capsule type) allows an endpoint to inform its peer that it will | |||
| datagrams associated with a given context ID. Its Capsule Data field | no longer send or parse received datagrams associated with a given | |||
| consists of: | context ID. | |||
| CLOSE_DATAGRAM_CONTEXT Capsule { | CLOSE_DATAGRAM_CONTEXT Capsule { | |||
| Type (i) = CLOSE_DATAGRAM_CONTEXT, | ||||
| Length (i), | ||||
| Context ID (i), | Context ID (i), | |||
| Context Extensions (..), | Close Code (i), | |||
| Close Details (..), | ||||
| } | } | |||
| Figure 5: CLOSE_DATAGRAM_CONTEXT Capsule Format | Figure 6: CLOSE_DATAGRAM_CONTEXT Capsule Format | |||
| Context ID: The context ID to close. | Context ID: The context ID to close. | |||
| Context Extensions: See Section 5. | Close Code: The close code allows an endpoint to provide additional | |||
| information as to why a datagram context was closed. | ||||
| Section 4.4.3.1 defines a set of codes, the circumstances under | ||||
| which an implementation sends them, and how receivers react. | ||||
| Close Details: This is meant for debugging purposes. It consists of | ||||
| a human-readable string encoded in UTF-8. | ||||
| 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 Context Extensions | REGISTER_DATAGRAM_CONTEXT capsule if they find its Datagram Format | |||
| field to be unacceptable. | Type 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. | |||
| All CLOSE_DATAGRAM_CONTEXT capsules MUST contain a CLOSE_CODE context | 4.4.3.1. Close Codes | |||
| 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 | Close codes are intended to allow implementations to react | |||
| differently when they receive them - for example, some close codes | ||||
| require the receiver to not open another context under certain | ||||
| conditions. | ||||
| The DATAGRAM capsule (type=0x02) allows an endpoint to send a | This specification defines the close codes below. Their numeric | |||
| datagram frame over an HTTP stream. This is particularly useful when | values are in Section 8.4. Extensions to this mechanism MAY define | |||
| using a version of HTTP that does not support QUIC DATAGRAM frames. | new close codes and they SHOULD state how receivers react to them. | |||
| Its Capsule Data field consists of: | ||||
| NO_ERROR: This indicates that a context was closed without any | ||||
| action specified for the receiver. | ||||
| UNKNOWN_FORMAT: This indicates that the sender does not know how to | ||||
| interpret the datagram format type associated with this context. | ||||
| The endpoint that had originally registered this context MUST NOT | ||||
| try to register another context with the same datagram format type | ||||
| on this stream. | ||||
| DENIED: 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 datagram format type and datagram | ||||
| format data on this stream. | ||||
| RESOURCE_LIMIT: This indicates that the context was closed to save | ||||
| resources. The recipient SHOULD limit its future registration of | ||||
| resource-intensive 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 8.4. | ||||
| 4.4.4. The DATAGRAM Capsule | ||||
| The DATAGRAM capsule (see Section 8.2 for the value of the capsule | ||||
| type) allows an endpoint to send a datagram frame over an HTTP | ||||
| stream. This is particularly useful when using a version of HTTP | ||||
| that does not support QUIC DATAGRAM frames. | ||||
| DATAGRAM Capsule { | DATAGRAM Capsule { | |||
| Type (i) = DATAGRAM, | ||||
| Length (i), | ||||
| [Context ID (i)], | [Context ID (i)], | |||
| HTTP Datagram Payload (..), | HTTP Datagram Payload (..), | |||
| } | } | |||
| Figure 6: DATAGRAM Capsule Format | Figure 7: 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.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.4.2) has been sent or received, then this field is | |||
| if neither has been sent or received, then it is not yet possible | absent; if neither has been sent or received, then it is not yet | |||
| to parse this datagram and the receiver MUST either drop that | possible to parse this datagram and the receiver MUST either drop | |||
| datagram silently or buffer it temporarily while awaiting the | that datagram silently or buffer it temporarily while awaiting the | |||
| registration capsule. | registration capsule. | |||
| HTTP Datagram Payload: The payload of the datagram, whose semantics | HTTP Datagram Payload: The payload of the datagram, whose semantics | |||
| are defined by individual applications. Note that this field can | are defined by individual applications. Note that this 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 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 Datagrams sent | how to process them from Section 3 also apply to HTTP Datagrams sent | |||
| skipping to change at page 12, line 24 ¶ | skipping to change at page 15, line 34 ¶ | |||
| as it forwards them: in other words, an intermediary MAY send a | as it forwards them: in other words, an intermediary MAY send a | |||
| DATAGRAM Capsule to forward an HTTP Datagram which was received in a | DATAGRAM Capsule to forward an HTTP Datagram which was 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 Datagrams into QUIC DATAGRAM frames | intermediaries can reencode HTTP Datagrams into QUIC DATAGRAM frames | |||
| over the next hop, and those could be dropped. Because of this, | over the next hop, and those could be dropped. Because of this, | |||
| applications have to always consider HTTP Datagrams to be unreliable, | applications have to always consider HTTP Datagrams to be unreliable, | |||
| even if they were initially sent in a capsule. | even if they were initially sent in a capsule. | |||
| 5. Context Extensibility | If an intermediary receives an HTTP Datagram in a QUIC DATAGRAM frame | |||
| and is forwarding it on a connection that supports QUIC DATAGRAM | ||||
| In order to facilitate extensibility of contexts, the | frames, the intermediary SHOULD NOT convert that HTTP Datagram to a | |||
| REGISTER_DATAGRAM_CONTEXT, REGISTER_DATAGRAM_NO_CONTEXT, and the | DATAGRAM capsule. If the HTTP Datagram is too large to fit in a | |||
| CLOSE_DATAGRAM_CONTEXT capsules carry a Context Extensions field. | DATAGRAM frame (for example because the path MTU of that QUIC | |||
| That field contains a sequence of context extensions: | connection is too low or if the maximum UDP payload size advertised | |||
| on that connection is too low), the intermediary SHOULD drop the HTTP | ||||
| Context Extensions { | Datagram instead of converting it to a DATAGRAM capsule. This | |||
| Context Extension (..) ..., | preserves the end-to-end unreliability characteristic that methods | |||
| } | such as Datagram Packetization Layer Path MTU Discovery (DPLPMTUD) | |||
| depend on [RFC8899]. An intermediary that converts QUIC DATAGRAM | ||||
| Each context extension is encoded as a (type, length, value) tuple: | frames to DATAGRAM capsules allows HTTP Datagrams to be arbitrarily | |||
| large without suffering any loss; this can misrepresent the true path | ||||
| Context Extension { | properties, defeating methods such a DPLPMTUD. | |||
| 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 | 5. The H3_DATAGRAM HTTP/3 SETTINGS Parameter | |||
| Implementations of HTTP/3 that support this mechanism can indicate | Implementations of HTTP/3 that support HTTP Datagrams 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 HTTP Datagrams are 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 | Endpoints MUST NOT send QUIC DATAGRAM frames until they have both | |||
| value of 1 MUST send the max_datagram_frame_size QUIC Transport | sent and received the H3_DATAGRAM SETTINGS parameter with a value of | |||
| Parameter [DGRAM]. An endpoint that receives the H3_DATAGRAM | 1. | |||
| SETTINGS parameter with a value of 1 on a QUIC connection that did | ||||
| not also receive the max_datagram_frame_size QUIC Transport Parameter | ||||
| MUST terminate the connection with error H3_SETTINGS_ERROR. | ||||
| When clients use 0-RTT, they MAY store the value of the server's | When clients use 0-RTT, they MAY store the value of the server's | |||
| H3_DATAGRAM SETTINGS parameter. Doing so allows the client to use | H3_DATAGRAM SETTINGS parameter. Doing so allows the client to send | |||
| HTTP/3 datagrams in 0-RTT packets. When servers decide to accept | QUIC DATAGRAM frames in 0-RTT packets. When servers decide to accept | |||
| 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. | |||
| 7. Prioritization | 5.1. Note About Draft Versions | |||
| Prioritization of HTTP/3 datagrams is not defined in this document. | [[RFC editor: please remove this section before publication.]] | |||
| 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 | Some revisions of this draft specification use a different value (the | |||
| Identifier field of a Setting in the HTTP/3 SETTINGS frame) for the | ||||
| H3_DATAGRAM Settings Parameter. This allows new draft revisions to | ||||
| make incompatible changes. Multiple draft versions MAY be supported | ||||
| by either endpoint in a connection. Such endpoints MUST send | ||||
| multiple values for H3_DATAGRAM. Once an endpoint has sent and | ||||
| received SETTINGS, it MUST compute the intersection of the values it | ||||
| has sent and received, and then it MUST select and use the most | ||||
| recent draft version from the intersection set. This ensures that | ||||
| both endpoints negotiate the same draft version. | ||||
| We can provide DATAGRAM support in HTTP/2 by defining the CAPSULE | 6. Prioritization | |||
| frame in HTTP/2. | ||||
| We can provide DATAGRAM support in HTTP/1.x by defining its data | Data streams (see Section 4.1) can be prioritized using any means | |||
| stream format to a sequence of length-value capsules. | suited to stream or request prioritization. For example, see | |||
| Section 11 of [PRIORITY]. | ||||
| TODO: Refactor this document and add definitions for HTTP/1.x and | Prioritization of HTTP/3 datagrams is not defined in this document. | |||
| HTTP/2. | Future extensions MAY define how to prioritize datagrams, and MAY | |||
| define signaling to allow endpoints to communicate their | ||||
| prioritization preferences. | ||||
| 9. Security Considerations | 7. 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. | |||
| 10. IANA Considerations | 8. IANA Considerations | |||
| 10.1. HTTP/3 CAPSULE Frame | ||||
| This document will request IANA to register the following entry in | ||||
| the "HTTP/3 Frames" registry: | ||||
| +------------+----------+---------------+ | ||||
| | Frame Type | Value | Specification | | ||||
| +============+==========+===============+ | ||||
| | CAPSULE | 0xffcab5 | This Document | | ||||
| +------------+----------+---------------+ | ||||
| 10.2. HTTP/3 SETTINGS Parameter | 8.1. 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 | 0xffd277 | This Document | 0 | | |||
| +--------------+----------+---------------+---------+ | +--------------+----------+---------------+---------+ | |||
| 10.3. Capsule Types | Table 1: New HTTP/3 Settings | |||
| 8.2. Capsule Types | ||||
| This document establishes a registry for HTTP capsule type codes. | This document establishes a registry for HTTP capsule type codes. | |||
| The "HTTP Capsule Types" registry governs a 62-bit space. | 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.1) is a | |||
| 62bit integer. | 62-bit 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 | | | DATAGRAM | 0xff37a0 | This Document | | |||
| +------------------------------+-------+---------------+ | +------------------------------+----------+---------------+ | |||
| | CLOSE_DATAGRAM_CONTEXT | 0x01 | This Document | | | REGISTER_DATAGRAM_CONTEXT | 0xff37a1 | This Document | | |||
| +------------------------------+-------+---------------+ | +------------------------------+----------+---------------+ | |||
| | DATAGRAM | 0x02 | This Document | | | REGISTER_DATAGRAM_NO_CONTEXT | 0xff37a2 | This Document | | |||
| +------------------------------+-------+---------------+ | +------------------------------+----------+---------------+ | |||
| | REGISTER_DATAGRAM_NO_CONTEXT | 0x03 | This Document | | | CLOSE_DATAGRAM_CONTEXT | 0xff37a3 | This Document | | |||
| +------------------------------+-------+---------------+ | +------------------------------+----------+---------------+ | |||
| Table 2: Initial Capsule Types Registry Entries | ||||
| 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 | 8.3. Datagram Format Types | |||
| This document establishes a registry for HTTP datagram context | ||||
| extension type codes. The "HTTP Context Extension Types" registry | ||||
| governs a 62-bit space. Registrations in this registry MUST include | ||||
| the following fields: | ||||
| Type: | This document establishes a registry for HTTP datagram format type | |||
| codes. The "HTTP Datagram Format Types" registry governs a 62-bit | ||||
| space. Registrations in this registry MUST include the following | ||||
| fields: | ||||
| A name or label for the context extension type. | Type: A name or label for the datagram format type. | |||
| Value: The value of the Context Extension Type field (see Section 5) | Value: The value of the Datagram Format Type field (see Section 2.2) | |||
| is a 62bit integer. | is a 62-bit 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 Type nor Value. | the same Type nor Value. | |||
| This registry initially contains the following entries: | This registry is initially empty. | |||
| +------------------------------+-------+---------------+ | Datagram format types with a value of the form 41 * N + 17 for | |||
| | 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 | integer values of N are reserved to exercise the requirement that | |||
| unknown context extension types be ignored. These extensions have no | unknown datagram format types be ignored. These format types 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 | 8.4. Context Close Codes | |||
| This document establishes a registry for HTTP 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: | This document establishes a registry for HTTP context close codes. | |||
| The "HTTP Context Close Codes" registry governs a 62-bit space. | ||||
| Registrations in this registry MUST include the following fields: | ||||
| A name or label for the close code. | Type: 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 field (see Section 4.4.3) is a | |||
| (see Section 5.1) is a 62bit integer. | 62-bit 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 Type nor Value. | the same Type nor Value. | |||
| This registry initially contains the following entries: | This registry initially contains the following entries: | |||
| +------------------------------+-------+---------------+ | +====================+==========+===============+ | |||
| | Context Close Code | Value | Specification | | | Context Close Code | Value | Specification | | |||
| +------------------------------+-------+---------------+ | +====================+==========+===============+ | |||
| | NO_ERROR | 0x00 | This Document | | | NO_ERROR | 0xff78a0 | This Document | | |||
| +------------------------------+-------+---------------+ | +--------------------+----------+---------------+ | |||
| | DENIED | 0x01 | This Document | | | UNKNOWN_FORMAT | 0xff78a1 | This Document | | |||
| +------------------------------+-------+---------------+ | +--------------------+----------+---------------+ | |||
| | RESOURCE_LIMIT | 0x02 | This Document | | | DENIED | 0xff78a2 | This Document | | |||
| +------------------------------+-------+---------------+ | +--------------------+----------+---------------+ | |||
| | RESOURCE_LIMIT | 0xff78a3 | This Document | | ||||
| +--------------------+----------+---------------+ | ||||
| Table 3: Initial Context Close Code Registry | ||||
| Entries | ||||
| 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 | 9. References | |||
| 9.1. 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-03, 12 July 2021, | Draft, draft-ietf-quic-datagram-06, 5 October 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
| datagram-03>. | datagram-06>. | |||
| [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://datatracker.ietf.org/doc/html/draft-ietf-quic- | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
| http-34>. | 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., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| and Secure Transport", Work in Progress, Internet-Draft, | Multiplexed and Secure Transport", RFC 9000, | |||
| draft-ietf-quic-transport-34, 14 January 2021, | DOI 10.17487/RFC9000, May 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | <https://www.rfc-editor.org/rfc/rfc9000>. | |||
| 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>. | |||
| 9.2. Informative References | ||||
| [PRIORITY] Oku, K. and L. Pardue, "Extensible Prioritization Scheme | ||||
| for HTTP", Work in Progress, Internet-Draft, draft-ietf- | ||||
| httpbis-priority-06, 30 September 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| priority-06>. | ||||
| [RFC8899] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | ||||
| Völker, "Packetization Layer Path MTU Discovery for | ||||
| Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | ||||
| September 2020, <https://www.rfc-editor.org/rfc/rfc8899>. | ||||
| 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): DATA --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 0 | Context ID = 0 | |||
| Context Extension = {} | Datagram Format Type = UDP_PAYLOAD | |||
| Datagram Format Additional Data = "" | ||||
| 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 20, line 12 ¶ | skipping to change at page 22, line 12 ¶ | |||
| 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): DATA --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 0 | Context ID = 0 | |||
| Context Extension = {} | Datagram Format Type = UDP_PAYLOAD | |||
| Datagram Format Additional Data = "" | ||||
| 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): DATA --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 2 | Context ID = 2 | |||
| Context Extension = {TIMESTAMP=""} | Datagram Format Type = UDP_PAYLOAD_WITH_TIMESTAMP | |||
| Datagram Format Additional Data = "" | ||||
| 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): DATA --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 0 | Context ID = 0 | |||
| Context Extension = {} | Datagram Format Type = IP_PACKET | |||
| Datagram Format Additional Data = "" | ||||
| 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 2-tuple. */ | |||
| STREAM(44): CAPSULE --------> | STREAM(44): DATA --------> | |||
| Capsule Type = REGISTER_DATAGRAM_CONTEXT | Capsule Type = REGISTER_DATAGRAM_CONTEXT | |||
| Context ID = 2 | Context ID = 2 | |||
| Context Extension = {IP_COMPRESSION=tcp,192.0.2.6:9876,192.0.2.7:443} | Datagram Format Type = COMPRESSED_IP_PACKET | |||
| Datagram Format Additional Data = "192.0.2.6,192.0.2.7" | ||||
| 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): DATA --------> | |||
| Capsule Type = REGISTER_DATAGRAM_NO_CONTEXT | Capsule Type = REGISTER_DATAGRAM_NO_CONTEXT | |||
| Context Extension = {} | Datagram Format Type = WEBTRANSPORT_DATAGRAM | |||
| Datagram Format Additional Data = "" | ||||
| <-------- 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. 112 change blocks. | ||||
| 351 lines changed or deleted | 473 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/ | ||||