<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.13 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jholland-quic-multicast-02" category="exp" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <front>
    <title abbrev="Multicast QUIC">Multicast Extension for QUIC</title>
    <seriesInfo name="Internet-Draft" value="draft-jholland-quic-multicast-02"/>
    <author fullname="Jake Holland">
      <organization>Akamai Technologies, Inc.</organization>
      <address>
        <email>jakeholland.net@gmail.com</email>
      </address>
    </author>
    <author fullname="Lucas Pardue">
      <organization/>
      <address>
        <email>lucaspardue.24.7@gmail.com</email>
      </address>
    </author>
    <author fullname="Max Franke">
      <organization>TU Berlin</organization>
      <address>
        <email>mfranke@inet.tu-berlin.de</email>
      </address>
    </author>
    <date year="2022" month="July" day="11"/>
    <area>TSV</area>
    <workgroup>QUIC Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document defines a multicast extension to QUIC to enable the efficient use of multicast-capable networks to send identical data streams to many clients at once, coordinated through individual unicast QUIC connections.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://GrumpyOldTroll.github.io/draft-jholland-quic-multicast/draft-jholland-quic-multicast.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-jholland-quic-multicast/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        QUIC Individual Draft mailing list (<eref target="mailto:quic@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/quic/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/GrumpyOldTroll/draft-jholland-quic-multicast"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies an extension to QUIC version 1 <xref target="RFC9000"/> to enable the use of multicast IP transport of identical packets for use in many individual QUIC connections.</t>
      <t>The multicast data can only be consumed in conjunction with a unicast QUIC connection.
When the client has support for multicast as described in <xref target="transport-parameter"/>, the server can tell the client about multicast channels and ask the client to join and leave them as described in <xref target="channel-management"/>.</t>
      <t>The client reports its joins and leaves to the server and acknowledges the packets received via multicast after verifying their integrity.</t>
      <t>The purpose of this multicast extension is to realize the large scalability benefits for popular traffic over multicast-capable networks without compromising on security, network safety, or implementation reliability.
Thus, this specification has several design goals:</t>
      <ul spacing="normal">
        <li>Re-use as much as possible the mechanisms and packet formats of QUIC version 1</li>
        <li>Provide flow control and congestion control mechanisms that work with multicast traffic</li>
        <li>Maintain the confidentiality, integrity, and authentication guarantees of QUIC as appropriate for multicast traffic, fully meeting the security goals described in <xref target="I-D.draft-krose-multicast-security"/></li>
        <li>Leverage the scalability of multicast IP for data that is transmitted identically to many clients</li>
      </ul>
      <t>This document does not define any multicast transport except server to client and only includes semantics for source-specific multicast.</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>Commonly used terms in this document are described below.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Term</th>
              <th align="left">Definition</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">SSM</td>
              <td align="left">Source-specific multicast, as described in <xref target="RFC4607"/></td>
            </tr>
            <tr>
              <td align="left">ASM</td>
              <td align="left">Any-source multicast, as distinguished from SSM in <xref target="RFC4607"/></td>
            </tr>
            <tr>
              <td align="left">(S,G)</td>
              <td align="left">A tuple of IP addresses (Source IP, Group IP) identifying a source-specific multicast channel as described in <xref target="RFC4607"/></td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="multicast-channel">
      <name>Multicast Channel</name>
      <t>A QUIC multicast channel (or just channel) is a one-way network path that a server can use as an alternate path to send QUIC connection data to a client.</t>
      <t>Multicast channels are designed to leverage multicast IP and to be shared by many different connections simultaneously for unidirectional server-initiated data.</t>
      <t>One or more servers can use the same QUIC multicast channel to send the same data to many clients, as a supplement to the individual QUIC connections between those servers and clients.
(Note that QUIC connections are defined in <xref section="5" sectionFormat="of" target="RFC9000"/> and are not changed in this document; each connection is a shared state between a client and a server.)</t>
      <t>Each QUIC multicast channel has exactly one associated (S,G) that is used for the delivery of the multicast packets on the IP layer. Channels do not support any-source multicast (ASM) semantics.</t>
      <t>Channels carry only 1-RTT packets.
Packets associated with a channel contain a Channel ID in place of a Destination Connection ID.
(A Channel ID cannot be zero length.)
This adds a layer of indirection to the process described in <xref section="5.2" sectionFormat="of" target="RFC9000"/> for matching packets to connections upon receipt.
Incoming packets received on the network path associated with a channel use the Channel ID to associate the packet with a joined channel.</t>
      <t>A client with a matching joined channel always has at least one connection associated with the channel.
If a client has no matching joined channel, the packet is discarded.</t>
      <t>Each channel has an independent packet number space.
Since the network path for a channel is unidirectional and uses a different packet number space than the unicast part of the connection, packets associated with a channel are acknowledged with MC_ACK frames <xref target="channel-ack-frame"/> instead of ACK frames.</t>
      <t>The use of any particular channel is OPTIONAL for both the server and the client.
It is recommended that applications designed to leverage the multicast capabilities of this extension also provide graceful degradation for endpoints that do not or cannot make use of the multicast functionality (see <xref target="graceful-degradation"/>).</t>
      <t>The server has access to all data transmitted on any multicast channel it uses, and could optionally send this data with unicast instead.</t>
      <t>No special handling of the data is required in a client application that has enabled multicast.
A datagram or any particular bytes from a server-initiated unidirectional stream can be delivered over the unicast connection or a multicast channel transparently to a client application consuming the stream or datagram.</t>
      <t>Client applications should have a mechanism that disables the use of multicast on connections with enhanced privacy requirements for the privacy-related reasons covered in <xref target="I-D.draft-krose-multicast-security"/>.</t>
    </section>
    <section anchor="transport-parameter">
      <name>Transport Parameters</name>
      <t>Support for multicast extensions in a client is advertised by means of QUIC transport parameters:</t>
      <ul spacing="normal">
        <li>name: multicast_server_support (TBD - experiments use 0xff3e808)</li>
        <li>name: multicast_client_params (TBD - experiments use 0xff3e800)</li>
      </ul>
      <t>If a multicast_server_support transport parameter is not included, clients MUST NOT send any frames defined in this document.</t>
      <t>If a multicast_client_params transport parameter is not included, servers MUST NOT send any frames defined in this document.</t>
      <t>The multicast_server_support parameter is a 0-length value.
Presence indicates that multicast-capable clients MAY send frames defined in this document, and SHOULD send MC_LIMITS (<xref target="client-limits-frame"/>) frames as appropriate when their capabilities or client-side limitations change.</t>
      <t>The multicast_client_params parameter has the structure shown below in <xref target="fig-transport-parameter-format"/>.</t>
      <figure anchor="fig-transport-parameter-format">
        <name>multicast_client_params Format</name>
        <artwork><![CDATA[
multicast_client_params {
  Reserved (6),
  IPv6 Channels Allowed (1),
  IPv4 Channels Allowed (1),
  Max Aggregate Rate (i),
  Max Channel IDs (i),
  Hash Algorithms Supported (i),
  AEAD Algorithms Supported (i),
  Hash Algorithms List (16 * Hash Algorithms Supported),
  AEAD Algorithms List (16 * AEAD Algorithms Supported)
}
]]></artwork>
      </figure>
      <t>The Reserved, IPv6 Channels Allowed, IPv4 Channels Allowed, Max Aggregate Rate, and Max Channel ID fields are identical to their analogous fields in the MC_LIMITS frame (<xref target="client-limits-frame"/>) and hold the initial values.</t>
      <t>A server MUST NOT send MC_ANNOUNCE (<xref target="channel-announce-frame"/>) frames with addresses using an IP Family that is not allowed according to the IPv4 and IPv6 Channels Allowed fields in the multicast_client_params, unless and until a later MC_LIMITS (<xref target="client-limits-frame"/>) frame adds permission for a different address family.</t>
      <t>The AEAD Algorithms List field is in order of preference (most preferred occurring first) using values from the TLS Cipher Suite registry (<eref target="https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4">https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4</eref>). It lists the algorithms the client is willing to use to decrypt data in multicast channels, and the server MUST NOT send an MC_ANNOUNCE to this client for any channels using unsupported algorithms.
If the server does send an MC_ANNOUNCE with an unsupported cipher suite, the client SHOULD treat it as a connection error of type MC_EXTENSION_ERROR.</t>
      <t>The Hash Algorithms List field is in order of preference (most preferred occurring first) using values from the registry below. It lists the algorithms the client is willing to use to check integrity of data in multicast channels, and the server MUST NOT send an MC_ANNOUNCE to this client for any channels using unsupported algorithms, or the client SHOULD treat it as a connection error of type MC_EXTENSION_ERROR:</t>
      <ul spacing="normal">
        <li>
          <eref target="https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg">https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg</eref></li>
      </ul>
    </section>
    <section anchor="extension-overview">
      <name>Extension Overview</name>
      <t>A client has the option of refusal and the power to impose upper bound maxima on several resources (see <xref target="flow-control"/>), but otherwise its join status for all multicast channels is entirely managed by the server.</t>
      <ul spacing="normal">
        <li>A client MUST NOT join a channel without receiving instructions from a server to do so.</li>
        <li>A client MUST leave joined channels when instructed by the server to do so.</li>
        <li>A client MAY leave channels or refuse to join channels, regardless of instructions from the server.</li>
      </ul>
      <section anchor="channel-management">
        <name>Channel Management</name>
        <t>The client tells its server about some restrictions on resources that it is capable of processing with the initial values in the multicast_client_params transport parameter (<xref target="transport-parameter"/>) and later can update these limits with MC_LIMITS <xref target="client-limits-frame"/> frames. Servers ensure the set of channels the client is currently requested to join remains within these advertised client limits as covered in <xref target="flow-control"/>.</t>
        <t>The server asks the client to join channels with MC_JOIN (<xref target="channel-join-frame"/>) frames and to leave channels with MC_LEAVE (<xref target="channel-leave-frame"/>) frames.</t>
        <t>The server uses the MC_ANNOUNCE (<xref target="channel-announce-frame"/>) frame before any join or leave frames for the channel to describe the channel properties to the client, including values the client can use to ensure the server's requests remain within the limits it has sent to the server, as well as the secrets necessary to decode the headers of packets in the channel.
MC_KEY frames provide the secrets necessary to decode the payload of packets in the channel.
<xref target="fig-client-channel-states"/> shows the states a channel has from the clients point of view.</t>
        <t>Joining a channel after receiving an MC_JOIN frame is OPTIONAL for clients. If a client decides not to join after being asked to do so, it can indicate this decision by sending an MC_STATE (<xref target="client-channel-state-frame"/>) frame with state DECLINED_JOIN and an appropriate reason.</t>
        <t>The server ensures that in aggregate, all channels that the client has currently been asked to join and that the client has not left or declined to join fit within the limits indicated by the initial values in the transport parameter or last MC_LIMITS (<xref target="client-limits-frame"/>) frame the server received.</t>
        <figure anchor="fig-client-channel-states">
          <name>States a channel from the clients point of view.</name>
          <artwork><![CDATA[
                            o
                            |
----------------------->|   | Receive MC_ANNOUNCE and/or MC_KEY
^                       |   |
|                       |   |
|  Receive MC_JOIN (and v   v
|     unable to join) +----------+
|<--------------------*          |
                      | unjoined | Receive MC_RETIRE
--------------------->|          *------------------------>|
^                     +----*-----+                         |
|                          | Receive MC_JOIN               |
|                          |   (and able to join)          |
|                          |                               |
|                          v                               v
|                     +----------+                    +---------+
|    Receive MC_LEAVE |          |                    |         |
|     (or error case) |  joined  | Receive MC_RETIRE  | retired |
|<--------------------*          *------------------->|         |
                      +----------+                    +---------+

*: Each transition except the initial receiving of MC_ANNOUNCE
   and MC_KEY frames causes the client to send an MC_STATE frame
   describing the state transition (for LEFT or DECLINED_JOIN, this
   includes a reason for the transition).

"able to join" means:
- Both MC_KEY and MC_ANNOUNCE have been received
- Result will be within latest advertised client limits
- Nothing preventing a join is active (e.g. a hold-down timer,
  administrative blocking, etc.)
]]></artwork>
        </figure>
        <t>When the server has asked the client to join a channel and has not received any MC_STATE frames <xref target="client-channel-state-frame"/> with state DECLINED_JOIN or LEFT, it also sends MC_INTEGRITY frames (<xref target="channel-integrity-frame"/>) to enable the client to verify packet integrity before processing the packet.
A client MUST NOT decode packets for a channel for which it has not received an applicable MC_ANNOUNCE (<xref target="channel-announce-frame"/>), or for which it has not received a matching packet hash in an MC_INTEGRITY (<xref target="channel-integrity-frame"/>) frame, or for which it has not received an applicable MC_KEY frame <xref target="channel-key-frame"/>.</t>
        <t><xref target="fig-frame-exchange"/> shows the frames that are being exchanged about and over a channel during the lifetime of an example channel.</t>
        <figure anchor="fig-frame-exchange">
          <name>Example flow of frames for a channel. Frames in square brackets are sent over multicast.</name>
          <artwork><![CDATA[
Client                                        Server

MC_LIMITS/initial_limits  --->

                                              MC_ANNOUNCE
                                              MC_KEY
                                       <----  MC_JOIN

MC_STATE(JOINED)  --->

                                              MC_INTEGRITY
                                       <----  [STREAM(...)]
MC_ACK  --->                                  ...
...                                    <----  MC_KEY
...
MC_LIMITS  --->

                                       <----  MC_LEAVE

MC_STATE(LEFT)  --->

                                       <----  MC_JOIN

MC_STATE(JOINED)  --->

                                              MC_INTEGRITY
                                       <----  [STREAM(...)]
MC_ACK  --->                                  ...
...

                                       <----  MC_LEAVE

MC_STATE(LEFT)  --->

                                       <----  MC_RETIRE

MC_STATE(RETIRED)  --->
]]></artwork>
        </figure>
        <t>TODO: incorporate server-side state diagram and explanation, latest proposed sketch at <eref target="https://github.com/GrumpyOldTroll/draft-jholland-quic-multicast/issues/62">https://github.com/GrumpyOldTroll/draft-jholland-quic-multicast/issues/62</eref></t>
      </section>
      <section anchor="client-response">
        <name>Client Response</name>
        <t>The client sends back information about how it has responded to the server's requests to join and leave channels in MC_STATE (<xref target="client-channel-state-frame"/>) frames.
MC_STATE frames are only sent for channels after the server has requested the client to join the channel, and are thereafter sent any time the state changes.</t>
        <t>Clients that receive and decode data on a multicast channel send acknowledgements for the data on the unicast connection using MC_ACK (<xref target="channel-ack-frame"/>) frames.</t>
        <t>A server can determine if a client receives packets for a multicast channel if it receives MC_ACK frames associated with that channel.
As such, it is in general up to the server to decide on the time after which it deems a client to be unable to receive packets on a given channel and take appropriate steps, e.g. sending an MC_LEAVE frame to the client.
Note that clients willing to join a channel SHOULD remain joined to the channel even if they receive no channel data for an extended period, to enable multicast-capable networks to perform popularity-based admission control for multicast channels.</t>
      </section>
      <section anchor="data-carried-in-channels">
        <name>Data Carried in Channels</name>
        <t>Data transmitted in a multicast channel is encrypted with symmetric keys so that on-path observers without access to these keys cannot decode the data.
However, since potentially many receivers receive identical packets and identical keys for the multicast channel and some receivers might be malicious, the packets are also protected by MC_INTEGRITY (<xref target="channel-integrity-frame"/>) frames transmitted over a separate integrity-protected path.</t>
        <t>A client MUST NOT decode packets on a multicast channel for which it has not received a matching hash in an MC_INTEGRITY frame over a different integrity-protected communication path.
The different path can be either the unicast connection or another multicast channel with packets that were verified with an earlier MC_INTEGRITY frame.</t>
        <t>Note that MC_INTEGRITY frames MAY be carried in packets on multicast channels, however such packets will not be accepted unless another accepted MC_INTEGRITY frame contains its packet hash.
Hashes of packets containing hashes of other packets can thus form a Merkle tree <xref target="MERKLE"/> with a root that is carried in the unicast connection.</t>
        <t>See <xref target="data-integrity"/> for a more complete overview of the security issues involved here.</t>
      </section>
      <section anchor="stream-processing">
        <name>Stream Processing</name>
        <t>Stream IDs in channels are restricted to unidirectional server initiated streams, or those with the least significant 2 bits of the stream ID equal to 3 (see <xref section="2.1" sectionFormat="of" target="RFC9000"/>).</t>
        <t>When a channel contains streams with IDs above the client's unidirectional MAX_STREAMS, the server MUST NOT instruct the client to join that channel and SHOULD send a STREAMS_BLOCKED frame, as described in Sections <xref target="RFC9000" section="4.6" sectionFormat="bare"/> and <xref target="RFC9000" section="19.14" sectionFormat="bare"/> of <xref target="RFC9000"/>.</t>
        <t>If the client is already joined to a channel that carries streams that exceed or will soon exceed the client's unidirectional MAX_STREAMS, the server SHOULD send an MC_LEAVE frame.</t>
        <t>If a client receives a STREAM frame with an ID above its MAX_STREAMS on a channel, the client MAY increase its unidirectional MAX_STREAMS to a value greater than the new ID and send an update to the server, otherwise it MUST drop the packet and leave the channel with reason "MAX_STREAMS_EXCEEDED".</t>
        <t>Since clients can join later than a channel began, it is RECOMMENDED that clients supporting the multicast extensions to QUIC be prepared to handle stream IDs that do not begin at early values, since by the time a client joins a channel in progress the stream ID count might have been increasing for a long time.
Clients should therefore begin with a high initial_max_streams_uni or send an early MAX_STREAMS type 0x13 value (see <xref section="19.11" sectionFormat="of" target="RFC9000"/>) with a high limit.
Clients MAY use the maximum 2^60 for this high initial limit, but the specific choice is implementation-dependent.</t>
        <t>The same stream ID may be used in both one or more multicast channels and the unicast connection.  As described in <xref section="2.2" sectionFormat="of" target="RFC9000"/>, stream data received multiple times for the same offset MUST be identical, even across different network paths; if it's not identical it MAY be treated as a connection error of type MC_EXTENSION_ERROR.</t>
      </section>
    </section>
    <section anchor="flow-control">
      <name>Flow Control</name>
      <t>The values used for unicast flow control cannot be used to limit the transmission rate of a multicast channel because a single client with a low MAX_STREAM_DATA or MAX_DATA value that did not acknowledge receipt could block many other receivers if the servers had to ensure that channels responded to each client's limits.</t>
      <t>Instead, clients advertise resource limits via MC_LIMITS (<xref target="client-limits-frame"/>) frames and their initial values from the transport parameter (<xref target="transport-parameter"/>).
The server is responsible for keeping the client within its advertised limits, by ensuring via MC_JOIN and MC_LEAVE frames that the set of channels the client is asked to be joined to will not, in aggregate, exceed the client's advertised limits.
The server also advertises the expected maxima of the values that can contribute toward client resource limits within a channel in an MC_ANNOUNCE (<xref target="channel-announce-frame"/>) frame, and the client also ensures that the set of channels it's joined to does not exceed its limits, according to the advertised values.
The client also monitors the packets received to ensure that channels don't exceed their advertised values, and leaves channels that do.</t>
      <t>If the server asks the client to join a channel that would exceed the client's limits with an up-to-date Client Limit Sequence Number, the client should send back an MC_STATE frame (<xref target="client-channel-state-frame"/>) with "DECLINED_JOIN" and reason "PROPERTY_VIOLATION".
If the server asks the client to join a channel that would exceed the client's limits with an out-of-date Client Limit Sequence Number or a Channel Key Sequence Number that the client has not yet seen, the client should instead send back a "DECLINED_JOIN" with "Desynchronized Limit Violation".
If the actual contents sent in the channel exceed the advertised limits from the MC_ANNOUNCE, clients SHOULD leave the stream and send an MC_STATE(LEFT) frame, using the Limit Violated reason.</t>
    </section>
    <section anchor="congestion-control">
      <name>Congestion Control</name>
      <t>Both the server and the client perform congestion control operations, so that according to the guidelines in <xref section="4.1" sectionFormat="of" target="RFC8085"/>, mechanisms for both feedback-based and receiver-driven styles of congestion control are present and operational.</t>
      <t>The server maintains a full view of the traffic received by the client via the MC_ACK (<xref target="channel-ack-frame"/>) frames and ACK frames it receives, and can detect loss experienced by the client.
Under sustained persistent loss that exceeds server-configured thresholds, the server SHOULD instruct the client to leave channels as appropriate to avoid having the client continue to see sustained persistent loss.</t>
      <t>Under sustained persistent loss that exceeds client-configured thresholds, the client SHOULD reduce its Max Rate and tell the server via MC_LIMITS frames, which also will result in the server instructing the client to leave channels until the clients aggregate rate is below its advertised Max Rate.
Under a higher threshold of sustained persistent loss, the client also SHOULD leave channels, using an MC_STATE(LEFT) frame with the "HIGH_LOSS" reason, as well as reducing the Max Rate in MC_LIMITS.</t>
      <t>The unicast connection's congestion control is unaffected.
However a few potential interactions with the unicast connection are worth highlighting:</t>
      <ul spacing="normal">
        <li>if the client notices high loss on the unicast connection while multicast channel packets are arriving, the client MAY leave channels with reason "HIGH_LOSS".</li>
        <li>if the client notices congestion from unicast this MAY also drive reductions in the client's Max Rate, and a lack of unicast congestion under unicast load MAY also drive increases to the client's Max Rate (along with an updated MC_LIMITS frame).</li>
      </ul>
      <t>Hybrid multicast-unicast congestion control is still an experimental research topic.
Implementations SHOULD follow the guidelines given in <xref section="4.1.1" sectionFormat="of" target="RFC8085"/> under the assumption that applications using QUIC multicast will operate as Bulk-Transfer applications.</t>
    </section>
    <section anchor="data-integrity">
      <name>Data Integrity</name>
      <t>TODO: import the <xref target="I-D.draft-krose-multicast-security"/> explanation for why extra integrity protection is necessary (many client have the shared key, so AEAD doesn't provide authentication against other valid clients on its own, since the same key is given to multiple clients and as the client count grows so does the chance that at least one client is controlled by an attacker.)</t>
      <section anchor="packet-hashes">
        <name>Packet Hashes</name>
        <t>TODO: explanation and example for how to calculate the packet hash.
Note that the hash is on the encrypted packet to avoid leaking data about the encrypted contents to those who can see a hash but not the key.
(This approach also may help make better use of <xref target="I-D.draft-ietf-mboned-ambi"/> by making it possible to generate the same hashes for use in both AMBI and QUIC MC_INTEGRITY frames.)</t>
      </section>
    </section>
    <section anchor="recovery">
      <name>Recovery</name>
      <t>TODO: Articulate key differences with <xref target="RFC9002"/>.
The main known difference is that servers might not be running on the same devices that are sending the channel packets, therefore the RTT for channel packets might use an estimated send time that can vary according to the clock synchronization among servers and the deployment and implementation details of how the servers find out the sending timestamps of channel packets.
Experience-based guidance on the recovery timing estimates is one anticipated outcome of experimenting with deployments of this experimental extension.</t>
      <t>All the new frames defined in this document except MC_ACK are ack-eliciting and are retransmitted until acknowledged to provide reliable, though possibly out of order, delivery.</t>
      <t>Note that recovery MAY be achieved either by retransmitting frame data that was lost and needs reliable transport either by sending the frame data on the unicast connection or by coordinating to cause an aggregated retransmission of widely dropped data on a multicast channel, at the server's discretion.
However, the server in each connection is responsible for ensuring that any necessary server-to-client frame data lost by a multicast channel packet loss ultimately arrives at the client.</t>
    </section>
    <section anchor="connection-termination">
      <name>Connection Termination</name>
      <t>Termination of the unicast connection behaves as described in <xref section="10" sectionFormat="of" target="RFC9000"/>, with the following notable differences:</t>
      <ul spacing="normal">
        <li>On the client side, termination of the unicast connection means that it MUST leave all multicast channels and discard any state associated with them. Servers MAY stop sending to multicast channels if there are no unicast connections left that are associated with them.</li>
        <li>For determining the liveness of a connection, the client MUST only consider packets received on the unicast connection. Any packets received on a multicast channel MUST NOT be used to reset a timer checking if a potentially specified max_idle_timeout has been reached. If the unicast connection becomes idle, as described in <xref section="10.1" sectionFormat="of" target="RFC9000"/>, the client MUST terminate the connection as described above.</li>
      </ul>
      <section anchor="stateless-reset">
        <name>Stateless Reset</name>
        <t>As clients can unilaterally stop the delivery of multicast packets by leaving the relevant (S,G), channels do not need stateless reset tokens.
Clients therefore do not share the stateless reset tokens of channels with the server. Instead, if an endpoint receives packets addressed to an (S,G) that it can not associate with any existing channel,
it MAY take the necessary steps to prevent the reception of further such packets, without the need to signal to the server that it should stop sending.</t>
        <t>If a server or client detect a stateless reset for a channel, they MUST ignore it.</t>
      </section>
    </section>
    <section anchor="new-frames">
      <name>New Frames</name>
      <section anchor="channel-announce-frame">
        <name>MC_ANNOUNCE</name>
        <t>Once a server learns that a client supports multicast through its transport parameters, it can send one or multiple MC_ANNOUNCE frames (type=TBD-11..TBD-12) to share information about available channels with the client.
The MC_ANNOUNCE frame contains the properties of a channel that do not change during its lifetime.</t>
        <t>MC_ANNOUNCE frames are formatted as shown in <xref target="fig-mc-channel-announce"/>.</t>
        <figure anchor="fig-mc-channel-announce">
          <name>MC_ANNOUNCE Frame Format</name>
          <artwork><![CDATA[
MC_ANNOUNCE Frame {
  Type (i) = TBD-11..TBD-12 (experiments use 0xff3e811/0xff3e812),
  ID Length (8),
  Channel ID (8..160),
  Source IP (32..128),
  Group IP (32..128),
  UDP Port (16),
  Header AEAD Algorithm (16),
  Header Secret Length (i),
  Header Secret (..),
  AEAD Algorithm (16),
  Integrity Hash Algorithm (16),
  Max Rate (i),
  Max ACK Delay (i)
}
]]></artwork>
        </figure>
        <t>Frames of type TBD-11 are used for IPv4 and both Source and Group address are 32 bits long. Frames of type TBD-12 are used for IPv6 and both Source and Group address are 128 bits long.</t>
        <t>MC_ANNOUNCE frames contain the following fields:</t>
        <ul spacing="normal">
          <li>ID Length: The length in bytes of the Channel ID field.</li>
          <li>Channel ID: The channel ID of the channel that is getting announced.</li>
          <li>Source IP: The IP Address of the source of the (S,G) for the channel.  Either a 32-bit IPv4 address or a 128-bit IPv6 address, as indicated by the frame type (TBD-11 indicates IPv4, TBD-12 indicates IPv6).</li>
          <li>Group IP: The IP Address of the group of the (S,G) for the channel.  Either a 32-bit IPv4 address or a 128-bit IPv6 address, as indicated by the frame type (TBD-11 indicates IPv4, TBD-12 indicates IPv6).</li>
          <li>UDP Port: The 16-bit UDP Port of traffic for the channel.</li>
          <li>Header AEAD Algorithm: A value from the TLS Cipher Suite registry (<eref target="https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4">https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4</eref>), used to protect the header fields in the channel packets.  The value MUST match a value provided in the "AEAD Algorithms List" of the transport parameter (see <xref target="transport-parameter"/>).</li>
          <li>Header Secret Length: Provides the length of the Secret field.</li>
          <li>Header Secret: A secret for use with the Header AEAD Algorithm for protecting the header fields of 1-RTT packets in the channel as described in <xref target="RFC9001"/>.  The Key and Initial Vector for the application data carried in the 1-RTT packet header fields are derived from this secret as described in <xref section="7.3" sectionFormat="of" target="RFC8446"/>.</li>
          <li>AEAD Algorithm: A value from the TLS Cipher Suite registry (<eref target="https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4">https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4</eref>), used to protect the payloads in the channel packets.  The value MUST match a value provided in the "AEAD Algorithms List" of the transport parameter (see <xref target="transport-parameter"/>).</li>
          <li>
            <t>Integrity Hash Algorithm: The hash algorithm used in integrity frames.
            </t>
            <ul spacing="normal">
              <li>
                <t><strong>Author's Note:</strong> Several candidate IANA registries, not sure which one to use?  Some have only text for some possibly useful values.  For now we use the first of these:
                </t>
                <ul spacing="normal">
                  <li>
                    <eref target="https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg">https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg</eref></li>
                  <li>
                    <eref target="https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-18">https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-18</eref></li>
                  <li>(text-only): <eref target="https://www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xhtml">https://www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xhtml</eref></li>
                </ul>
              </li>
            </ul>
          </li>
          <li>Max Rate: The maximum rate in Kibps of the payload data for this channel. Channel data MUST NOT exceed this rate over any 5s window, if it does clients SHOULD leave the channel with reason "MAX_RATE_EXCEEDED".</li>
          <li>Max ACK Delay: A value used similarly to max_ack_delay (<xref section="18.2" sectionFormat="of" target="RFC9000"/>) that applies to traffic in this channel.  Clients SHOULD NOT intentionally add delay to MC_ACK frames for traffic in this channel beyond this value, in milliseconds, and SHOULD NOT add any delay to the first MC_ACK of data packets for a channel.  As long as they stay inside these limits, clients can improve efficiency and network load for the uplink by aggregating MC_ACK frames whenever possible.</li>
        </ul>
        <t>A client MUST NOT use the channel ID included in an MC_ANNOUNCE frame as a connection ID for the unicast connection. If it is already in use, the client should retire it as soon as possible.
As the server knows which connection IDs are in use by the client, it MUST wait with the sending of an MC_JOIN frame until the channel ID associated with it has been retired by the client.</t>
        <t>As all the properties in MC_ANNOUNCE frames are immutable during the lifetime of a channel, a server SHOULD NOT send an MC_ANNOUNCE frame for the same channel more than once to each client except as needed for recovery.</t>
        <t>A server SHOULD send an MC_ANNOUNCE frame for a channel before sending an MC_KEY and SHOULD send an MC_KEY frame for a channel before sending an MC_JOIN frame for it.
Each of these recommended orderings MAY occur within the same packet.</t>
      </section>
      <section anchor="channel-key-frame">
        <name>MC_KEY</name>
        <t>An MC_KEY frame (type=TBD-01) is sent from server to client, either with the unicast connection or in an existing joined multicast channel.
The MC_KEY frame contains an updated secret that is used to generate the keying material for the payload of 1-RTT packets received on the multicast channel.</t>
        <t>A server can send a new MC_KEY frame with a sequence number increased by one.
A server MUST generate continuous sequence numbers, and MAY start at a value higher than 0.
Note that while not joined, a client will not receive updates to channel secrets, and thus may see jumps in the Key Sequence Number values between MC_KEY frames.
However, while joined the Key Sequence Numbers in the MC_KEY frames MUST increment by 1 for each new secret.</t>
        <t>Secrets with even-valued Key Sequence Numbers have a Key Phase of 0 in the 1-RTT packet, and secrets with odd-valued Key Sequence Numbers have a Key Phase of 1 in the 1-RTT packet.
Secrets with a Key Phase indicating an unknown key SHOULD be discarded without attempting to decrypt them.
(An unknown key might happen after loss of the latest MC_KEY frame, so that packets on a channel have an updated Key Phase starting at a particular packet number, but the client does not yet know about the key change.)</t>
        <t>It is RECOMMENDED that servers send regular secret updates.</t>
        <t>MC_KEY frames are formatted as shown in <xref target="fig-mc-channel-key-format"/>.</t>
        <figure anchor="fig-mc-channel-key-format">
          <name>MC_KEY Frame Format</name>
          <artwork><![CDATA[
MC_KEY Frame {
  Type (i) = TBD-01 (experiments use 0xff3e801),
  ID Length (8),
  Channel ID (8..160),
  Key Sequence Number (i),
  From Packet Number (i),
  Secret Length (i),
  Secret (..)
}
]]></artwork>
        </figure>
        <t>MC_KEY frames contain the following fields:</t>
        <ul spacing="normal">
          <li>ID Length: The length in bytes of the Channel ID field.</li>
          <li>Channel ID: The channel ID for the channel associated with this frame.</li>
          <li>Key Sequence Number: Increases by 1 each time the secret for the channel is changed by the server.  If there is a gap in sequence numbers due to reordering or retransmission of packets, on receipt of the older MC_KEY frame, the client MUST apply the secret contained and the packet numbers on which it applies as if they arrived in order.</li>
          <li>From Packet Number: The values in this MC_KEY frame apply only to packets starting at From Packet Number and continuing until they are overwritten by a new MC_KEY frame with a higher From Packet Number.  The Packet Number MUST never decrease with an increased Key Sequence Number.</li>
          <li>Secret Length: Provides the length of the secret field.</li>
          <li>Secret: Used to protect the packet contents of 1-RTT packets for the channel as described in <xref target="RFC9001"/>.  The Key and Initial Vector for the application data carried in the 1-RTT packet payloads are derived from the secret as described in <xref section="7.3" sectionFormat="of" target="RFC8446"/>.
To maintain forward secrecy and prevent malicious clients from decrypting packets long after they have left or were removed from the unicast connection, servers SHOULD periodically send key updates using only unicast.</li>
        </ul>
        <t>Clients MUST delete old secrets and the keys derived from them after receiving new MC_KEY frames.
Deleting old keys prevents later compromise of a client from discovering an otherwise uncompromised key, thus improving the chances of achieving forward secrecy for data sent before a key rotation.</t>
        <t>Client implementations MAY institute a delay before deleting secrets to allow for decoding of packets for the channel that arrive shortly after a new MC_KEY frame.
For this experimental specification, it is RECOMMENDED that clients delete old keys 10 seconds after receiving a new key or after 3 seconds that elapse without receiving any new data to decode with the old key, whichever is shorter.
Clients MUST NOT delay more than 60 seconds before deleting the old keys.</t>
        <t>The delay values for this specification are somewhat arbitrary and allow for implementation-dependent experimentation.
One of the target discoveries for experimental evaluation is to determine good default delay values to use, and to understand whether there are use cases that would benefit from a negotiation between server and client to determine the delays to use dynamically.
(A poor delay choice results in either overhead from dropping packets instead of decoding them with old keys for too short a delay or in extra forward secrecy exposure time for too long a delay, and the purpose of the delays are to bound the forward secrecy exposure without inducing unreasonable overhead.)</t>
        <t>The From Packet Number is used to indicate the starting packet number (<xref section="17.1" sectionFormat="of" target="RFC9000"/>) of the 1-RTT packets for which the secret contained in an MC_KEY frame is applicable.
This secret is applicable to all future packets until it is updated by a new MC_KEY frame.</t>
        <t>A server SHOULD NOT send MC_KEY frames for channels except those the client has joined or will be imminently asked to join.</t>
      </section>
      <section anchor="channel-join-frame">
        <name>MC_JOIN</name>
        <t>An MC_JOIN frame (type TBD-02) is sent from server to client and requests that a client join the given transport addresses and ports and process packets with the given Channel ID according to the corresponding MC_ANNOUNCE frame and the latest MC_KEY frame for the channel.</t>
        <t>A client cannot join a multicast channel without first receiving an MC_ANNOUNCE frame and an MC_KEY frame, which together set all the values necessary to process the channel.</t>
        <t>If a client receives an MC_JOIN for a channel for which it has not received both an MC_ANNOUNCE frame and an MC_KEY frame, it MUST respond with an MC_STATE with State "DECLINED_JOIN" and reason "Missing Properties". The server MAY send another MC_JOIN after receiving an acknowledgement indicating receipt of the MC_ANNOUNCE frame and the MC_KEY frame.</t>
        <t>MC_JOIN frames are formatted as shown in <xref target="fig-mc-channel-join-format"/>.</t>
        <figure anchor="fig-mc-channel-join-format">
          <name>MC_JOIN Frame Format</name>
          <artwork><![CDATA[
MC_JOIN Frame {
  Type (i) = TBD-02 (experiments use 0xff3e802),
  MC_LIMITS Sequence Number (i),
  MC_STATE Sequence Number (i),
  MC_KEY Sequence Number (i),
  ID Length (8),
  Channel ID (8..160)
}
]]></artwork>
        </figure>
        <t>The sequence numbers are the most recently processed sequence number by the server from the respective frame type. They are present to allow the client to distinguish between a broken server that has performed an illegal action and an instruction that's based on updates that are out of sync (either one or more missing updates to MC_KEY not yet received by the client or one or more missing updates to MC_LIMITS or MC_STATE not yet received by the server).</t>
        <t>A client MAY perform the join if it has the sequence number of the corresponding channel properties and the client's limits will not be exceeded, even if the client sequence numbers are not up-to-date.</t>
        <t>If the client does not join, it MUST send an MC_STATE frame with "DECLINED_JOIN" and a reason.</t>
        <t>If the client does join, it MUST send an MC_STATE frame with "JOINED".</t>
      </section>
      <section anchor="channel-leave-frame">
        <name>MC_LEAVE</name>
        <t>An MC_LEAVE frame (type=TBD-03) is sent from server to client, and requests that a client leave the given channel.</t>
        <t>If the client has already left or declined to join the channel, the MC_LEAVE is ignored.</t>
        <t>If an MC_JOIN or an MC_LEAVE with the same Channel ID and a higher MC_STATE Sequence number has previously been received, the MC_LEAVE is ignored.</t>
        <t>Otherwise, the client MUST leave the channel and send a new MC_STATE frame with reason LEFT as requested by server.</t>
        <t>MC_LEAVE frames are formatted as shown in <xref target="fig-mc-channel-leave-format"/>.</t>
        <figure anchor="fig-mc-channel-leave-format">
          <name>MC_LEAVE Frame Format</name>
          <artwork><![CDATA[
MC_LEAVE Frame {
  Type (i) = TBD-03 (experiments use 0xff3e803),
  ID Length (8),
  Channel ID (8..160),
  MC_STATE Sequence Number (i),
  After Packet Number (i)
}
]]></artwork>
        </figure>
        <t>If After Packet Number is nonzero, wait until receiving that packet or a higher valued number before leaving.</t>
      </section>
      <section anchor="channel-integrity-frame">
        <name>MC_INTEGRITY</name>
        <t>MC_INTEGRITY frames are sent from server to client and are used to convey packet hashes for validating the integrity of packets received over the multicast channel as described in <xref target="packet-hashes"/>.</t>
        <t>MC_INTEGRITY frames are formatted as shown in <xref target="fig-mc-channel-integrity-format"/>.</t>
        <figure anchor="fig-mc-channel-integrity-format">
          <name>MC_INTEGRITY Frame Format</name>
          <artwork><![CDATA[
MC_INTEGRITY Frame {
  Type (i) = TBD-04..TBD-05 (experiments use 0xff3e804/0xff3e805),
  ID Length (8),
  Channel ID (8..160),
  Packet Number Start (i),
  [Length (i)],
  Packet Hashes (..)
}
]]></artwork>
        </figure>
        <t>For type TBD-05, Length is present and is a count of packet hashes.  For TBD-04, Length is not present and the packet hashes extend to the end of the packet.</t>
        <t>The first hash in the Packet Hashes list is a hash of a 1-RTT packet with the Channel ID equal to the Channel ID in the MC_INTEGRITY frame and packet number equal to the Packet Number Start field.
Subsequent hashes refer to the packets for the channel with packet numbers increasing by 1.</t>
        <t>Packet hashes MUST have length with an integer multiple of the length indicated by the Hash Algorithm from the MC_ANNOUNCE frame.</t>
        <t>See <xref target="packet-hashes"/> for a description of the packet hash calculation.</t>
      </section>
      <section anchor="channel-ack-frame">
        <name>MC_ACK</name>
        <t>The MC_ACK frame (types TBD-06 and TBD-07; experiments use 0xff3e806..0xff3e807) is an extension of the ACK frame defined by <xref target="RFC9000"/>. It is used to acknowledge packets that were sent on multicast channels. If the frame type is TBD-07, MC_ACK frames also contain the sum of QUIC packets with associated ECN marks received on the connection up to this point.</t>
        <t>(TODO: Would there be value in reusing the multiple packet number space version of ACK_MP from <xref section="12.2" sectionFormat="of" target="I-D.draft-ietf-quic-multipath"/>, defining channel ID as the packet number space?  at 2022-05 they're identical except the Channel ID and types.)</t>
        <t>MC_ACK frames are formatted as shown in <xref target="fig-mc-channel-ack-format"/>.</t>
        <figure anchor="fig-mc-channel-ack-format">
          <name>MC_ACK Frame Format</name>
          <artwork><![CDATA[
MC_ACK Frame {
  Type (i) = TBD-06..TBD-07 (experiments use 0xff3e806, 0xff3e807),
  ID Length (8),
  Channel ID (8..160),
  Largest Acknowledged (i),
  ACK Delay (i),
  ACK Range Count (i),
  First ACK Range (i),
  ACK Range (..) ...,
  [ECN Counts (..)],
}
]]></artwork>
        </figure>
      </section>
      <section anchor="client-limits-frame">
        <name>MC_LIMITS</name>
        <t>MC_LIMITS frames are formatted as shown in <xref target="fig-mc-client-limits-format"/>.</t>
        <figure anchor="fig-mc-client-limits-format">
          <name>MC_LIMITS Frame Format</name>
          <artwork><![CDATA[
MC_LIMITS Frame {
  Type (i) = TBD-09 (experiments use 0xff3e809),
  Client Limits Sequence Number (i),
  Reserved (6),
  IPv6 Channels Allowed (1),
  IPv4 Channels Allowed (1),
  Max Aggregate Rate (i),
  Max Channel IDs (i),
  Max Joined Count (i),
}
]]></artwork>
        </figure>
        <t>The sequence number is implicitly 0 before the first MC_LIMITS frame from the client, and increases by 1 each new frame that's sent.
Newer frames override older ones.</t>
        <t>The 6 Reserved bits MUST be set to 0 by the client and MUST be ignored by the server.
These are reserved to advertise future capabilities.</t>
        <t>IPv6 Channels Allowed is a 1-bit field set to 1 if IPv6 channels can be joined and 0 if IPv6 channels cannot be joined.</t>
        <t>IPv4 Channels Allowed is a 1-bit field set to 1 if IPv4 channels can be joined and 0 if IPv4 channels cannot be joined.</t>
        <t>Max Aggregate Rate allowed across all joined channels is in Kibps.</t>
        <t>Max Channel IDs is the count of channel IDs that can be announced to this client and have keys.  Retired Channel IDs don't count against this value.</t>
        <t>Max Joined Count is the count of channels that are allowed to be joined concurrently.</t>
      </section>
      <section anchor="channel-retire-frame">
        <name>MC_RETIRE</name>
        <t>MC_RETIRE frames are formatted as shown in <xref target="fig-mc-channel-retire-format"/>.</t>
        <figure anchor="fig-mc-channel-retire-format">
          <name>MC_RETIRE Frame Format</name>
          <artwork><![CDATA[
MC_RETIRE Frame {
  Type (i) = TBD-0a (experiments use 0xff3e80a),
  ID Length (8),
  Channel ID (8..160),
  After Packet Number (i)
}
]]></artwork>
        </figure>
        <t>Retires a channel by ID, discarding any state associated with it.   (Author comment: We can't use RETIRE_CONNECTION_ID because we don't have a coherent sequence number.)
If After Packet Number is nonzero and the channel is joined and has received any data, the channel will be retired after receiving that packet or a higher valued number, otherwise it will be retired immediately.</t>
        <t>After retiring a channel, the client MUST send a new MC_STATE frame with reason RETIRED to the server.</t>
        <t>If the client is still joined in the channel that is being retired, it MUST also leave it. If a channel is left this way, it does not need to send an additional MC_STATE frame with state LEFT, as state RETIRED also implies the channel was left.</t>
      </section>
      <section anchor="client-channel-state-frame">
        <name>MC_STATE</name>
        <t>MC_STATE frames (type=TBD-0b or TBD-0c) are sent from client to server to report changes in the client's channel state.
Each time the channel state changes, the Client Channel State Sequence number is increased by one.
It is a state change to the channel if the server requests that a client join a channel and the client declines the join, even though no join occurs on the network.</t>
        <t>Frames of type TBD-0b are used for cases in which the reason for the state change occur in the QUIC multicast layer while frames of type TBD-0c are used for reasons that are application specific.</t>
        <t>MC_STATE frames are formatted as shown in <xref target="fig-mc-client-channel-state-format"/>.</t>
        <figure anchor="fig-mc-client-channel-state-format">
          <name>MC_STATE Frame Format</name>
          <artwork><![CDATA[
MC_STATE Frame {
  Type (i) = TBD-0b..TBD-0c (experiments use 0xff3e80b and 0xff3e80c),
  Client Channel State Sequence Number (i),
  ID Length (8),
  Channel ID (8..160),
  State (8),
  Reason Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..)
}
]]></artwork>
        </figure>
        <t>State has these defined values:</t>
        <ul spacing="normal">
          <li>0x1: LEFT</li>
          <li>0x2: DECLINED_JOIN</li>
          <li>0x3: JOINED</li>
          <li>0x4: RETIRED</li>
        </ul>
        <t>If a server receives an undefined value, it SHOULD close the connection with reason MC_EXTENSION_ERROR.</t>
        <t>If State is JOINED or RETIRED, the Reason Code MUST be REQUESTED_BY_SERVER (0x1).</t>
        <t>If State is LEFT or DECLINED_JOIN, for frames of type TBD-0b the Reason Code field is set to one of:</t>
        <ul spacing="normal">
          <li>0x0: UNSPECIFIED_OTHER</li>
          <li>0x1: REQUESTED_BY_SERVER</li>
          <li>0x2: ADMINISTRATIVE_BLOCK</li>
          <li>0x3: PROTOCOL_ERROR</li>
          <li>0x4: PROPERTY_VIOLATION</li>
          <li>0x5: UNSYNCHRONIZED_PROPERTIES</li>
          <li>0x6: ID_COLLISION</li>
          <li>0x10: HELD_DOWN</li>
          <li>0x12: MAX_RATE_EXCEEDED</li>
          <li>0x13: HIGH_LOSS</li>
          <li>0x14: EXCESSIVE_SPURIOUS_TRAFFIC</li>
          <li>0x15: MAX_STREAMS_EXCEEDED</li>
        </ul>
        <t>(Author's note TODO: consider whether that these reasons should be added to the QUIC Transport Error Codes registry (<xref section="22.5" sectionFormat="of" target="RFC9000"/>) instead of defining a new registry specific to multicast.)</t>
        <t>For frames of type TBD-0c, the Reason Code is left to the application, as described in <xref section="20.2" sectionFormat="of" target="RFC9000"/></t>
        <t>The Reason Phrase field, in combination with the Reason Phrase Length field, can optionally be used to give further details for the state change.</t>
        <t>A client might receive multicast packets that it can not associate with any channel ID, or that cannot be verified as matching hashes from MC_INTEGRITY frames, or cannot be decrypted.
This traffic is presumed either to have been corrupted in transit or to have been sent by someone other than the legitimate sender of traffic for the channel, possibly by an attacker or a misconfigured sender.
If these packets are addressed to an (S,G) that is used for reception in one or more known channels, the client MAY leave these channels with reason "Excessive Spurious traffic".</t>
      </section>
    </section>
    <section anchor="frames-carried-in-channel-packets">
      <name>Frames Carried in Channel Packets</name>
      <t>Multicast channels will contain normal QUIC 1-RTT data packets (see <xref section="17.3.1" sectionFormat="of" target="RFC9000"/>) except using the Channel ID instead of a Connection ID.  The packets are protected with the keys derived from the secrets in MC_KEY frames for the corresponding channel.</t>
      <t>Data packet hashes will also be sent in MC_INTEGRITY frames, as keys cannot be trusted for integrity due to giving them to too many receivers, as described in <xref target="I-D.draft-krose-multicast-security"/>.</t>
      <t>The 1-RTT packets in multicast channels will have a restricted set of frames.
Since the channel is strictly 1-way server to client, the general principle is that broadcastable shared server-&gt;client data frames can be sent, but frames that make sense only for individualized connections or that are sent client-to-server cannot.</t>
      <t>Should a not permitted frame arrive on a multicast channel, the connection MUST be closed with a connection error of type MC_EXTENSION_ERROR.</t>
      <t>Permitted:</t>
      <ul spacing="normal">
        <li>PADDING Frames (<xref section="19.1" sectionFormat="of" target="RFC9000"/> )</li>
        <li>PING Frames (<xref section="19.2" sectionFormat="of" target="RFC9000"/> )</li>
        <li>RESET_STREAM Frames (<xref section="19.4" sectionFormat="of" target="RFC9000"/> )</li>
        <li>STREAM Frames (<xref section="19.8" sectionFormat="of" target="RFC9000"/> )</li>
        <li>DATAGRAM Frames (both types) (<xref section="4" sectionFormat="of" target="RFC9221"/>)</li>
        <li>MC_KEY</li>
        <li>MC_LEAVE (however, join must come over unicast?)</li>
        <li>MC_INTEGRITY (not for this channel, only for another)</li>
        <li>MC_RETIRE</li>
      </ul>
      <t>Not permitted:</t>
      <ul spacing="normal">
        <li>19.3.  ACK Frames</li>
        <li>19.6.  CRYPTO Frames (crypto handshake does not happen on mc channels)</li>
        <li>19.7.  NEW_TOKEN Frames</li>
        <li>
          <t>Flow control is different:
          </t>
          <ul spacing="normal">
            <li>19.5.  STOP_SENDING Frames</li>
            <li>19.9.  MAX_DATA Frames  (flow control for mc channels is by rate)</li>
            <li>19.10. MAX_STREAM_DATA Frames</li>
            <li>19.11. MAX_STREAMS Frames</li>
            <li>19.12. DATA_BLOCKED Frames</li>
            <li>19.13. STREAM_DATA_BLOCKED Frames</li>
            <li>19.14. STREAMS_BLOCKED Frames</li>
          </ul>
        </li>
        <li>
          <t>Channel ID Migration can't use the "prior to" concept within a channel, not 0-starting
          </t>
          <ul spacing="normal">
            <li>19.15. NEW_CONNECTION_ID Frames</li>
            <li>19.16. RETIRE_CONNECTION_ID Frames</li>
          </ul>
        </li>
        <li>
          <t>Channels don't have the same kind of path validation, as there's a unicast anchor with acks for the multicast packets:
          </t>
          <ul spacing="normal">
            <li>19.17. PATH_CHALLENGE Frames</li>
            <li>19.18. PATH_RESPONSE Frames</li>
          </ul>
        </li>
        <li>19.19. CONNECTION_CLOSE Frames</li>
        <li>19.20. HANDSHAKE_DONE Frames</li>
        <li>MC_ANNOUNCE</li>
        <li>MC_LIMITS</li>
        <li>MC_STATE</li>
        <li>MC_ACK</li>
      </ul>
    </section>
    <section anchor="implementation-and-operational-considerations">
      <name>Implementation and Operational Considerations</name>
      <section anchor="constraints-on-stream-data">
        <name>Constraints on Stream Data</name>
        <t>Note that when a newly connected client joins a channel, the client will only be able to receive application data carried in stream frames delivered on that channel when they have received the stream data starting from offset 0 of the stream.</t>
        <t>This usually means that new streams must be started for application data carried in channel packets whenever there might be new clients that have joined since an earlier stream started.</t>
        <t>With broadcast video, this usually means a new stream is necessary for every video segment or group of video frames since new clients will join throughout the broadcast, whereas for video conferencing, it could be possible to start a new stream whenever new clients join the conference without needing a new stream per object.</t>
      </section>
      <section anchor="application-use-cases">
        <name>Application Use Cases</name>
        <t>There are several known applications that could benefit from using multicast QUIC, either with their own custom application-layer transport or with one of the transports discussed in <xref target="data-use-cases"/>.  A few examples include:</t>
        <ul spacing="normal">
          <li>
            <t>Existing multicast-capable applications that are modified to use QUIC datagrams instead of UDP payloads can potentially get improved encryption and congestion feedback, while keeping existing error recovery techniques (e.g. techniques based on the forward error correction (FEC) framework in <xref target="RFC6363"/>).
            </t>
            <ul spacing="normal">
              <li>An external tunnel could supply this kind of encapsulation without modification to the sender or receiver for some applications, while retaining the benefits of multicast scalability</li>
              <li>Using QUIC datagrams in place of UDP packets could usefully support existing implementations of file-transfer protocols like FLUTE <xref target="RFC6726"/> or FCAST <xref target="RFC6968"/> to enable file downloads such as operating system updates or popular game downloads, but adding encryption, packet-level authentication, and congestion control as provided by QUIC.</li>
            </ul>
          </li>
          <li>Conferencing systems, especially within an enterprise that can deploy multicast network support, often can save significantly on server costs by using multicast</li>
          <li>The traditional multicast use case of broadcasting of live sports with a set-top box would benefit from an interoperable system such as these QUIC extensions that can fall back to unicast transparently as needed, for example if there are a few customers who installed a non-multicast-capable home router.</li>
          <li>Smart TVs or other video playing in-home devices could interoperate with a standard sender using multicast QUIC, rather than requiring proprietary integrations with TV operators.</li>
        </ul>
      </section>
      <section anchor="data-use-cases">
        <name>Data Transport Use Cases</name>
        <t>This section outlines considerations for some known transport mechanisms that are worth highlighting as potentially useful with multicast QUIC.</t>
        <section anchor="server-push">
          <name>HTTP/3 Server Push</name>
          <t>HTTP/3 Server Push is defined in <xref section="4.6" sectionFormat="of" target="RFC9114"/>.</t>
          <t>Server push is a good use case for multicast transport because the same data can be pushed to many different receivers on a multicast channel.
Applications designed to work well with server push can leverage multicast QUIC very effectively with only a few extra considerations.</t>
          <t>A QUIC connection using HTTP/3 can use multicast channels to deliver server-initiated streams that implement HTTP/3 Server Push.</t>
          <t>Applications expecting to use server push with multicast SHOULD use a high MAX_PUSH_ID in order to work with channels that have been active for a long time already when the connection is first established.
Servers SHOULD NOT allow clients to remain joined to channels if their MAX_PUSH_ID will be exceeded by push streams that are to be sent imminently.</t>
          <t>If a client receives data from a push ID that exceeds its MAX_PUSH_ID causing an H3_ID_ERROR on a multicast channel, it SHOULD leave the channel with reason 0x1000108 (computed by adding the H3_ID_ERROR value 0x0108 to the Application-defined Reason start value 0x1000000).
This SHOULD NOT cause a close of the whole connection but MAY cause a stream error and reset of the stream.</t>
          <t>TODO: flesh out this principle for application-level error code assignment in general for known error code values, and specifically all HTTP/3 ones? (Or is there a better approach?)</t>
        </section>
        <section anchor="webtransport">
          <name>HTTP/3 WebTransport Streams</name>
          <t>WebTransport over HTTP/3 is defined in <xref target="I-D.draft-ietf-webtrans-http3"/>.</t>
          <t>Popular data that can be sent with server-initiated streams and carried over WebTransport is a good use cases for multicast transport because the same server-to-client data can be pushed to many different receivers on a multicast channel.</t>
          <t>A QUIC connection using HTTP/3 and WebTransport can use multicast channels to deliver WebTransport server-initiated streams.</t>
          <t>However, because the WebTransport Session ID is a client-specific value, the bytes that carry the WebTransport Session ID value within the stream would need to be carried over unicast, since it's not the same for different clients.</t>
          <t>For this situation, note that the Session ID is a variable length integer, and that a variable length integer can be encoded in any size that's big enough to hold it.  In particular, it's possible to use the largest size of any Session IDs of any of the WebTransport sessions of any clients (or 8 octets, the maximum size for a variable length integer), and that all clients receiving stream data on a channel will need to use the same size for the Session ID so that the rest of the stream data will be at the same offset for every client.</t>
        </section>
        <section anchor="datagrams">
          <name>Datagrams</name>
          <t>DATAGRAM frames (<xref target="RFC9221"/>) can be carried in multicast channels, and can be a good way to deliver popular content to receivers.
Doing so can align well with existing multicast UDP-based applications, since a datagram API in a QUIC application offers similar functionality to a UDP API for sending and receiving packets.</t>
          <t>However, at the time of this writing (version -05 of <xref target="I-D.draft-ietf-masque-h3-datagram"/>) multicast channels generally cannot deliver HTTP/3 datagrams, including WebTransport datagrams (version -02 of <xref target="I-D.draft-ietf-webtrans-http3"/>), since the demuxing of WebTransport datagrams uses a Session ID based on a client-specific value (the HTTP/3 Session ID comes from the Stream ID of the client-initiated stream that issued the initial extended CONNECT request).</t>
          <t>It is therefore hoped that an extension or revision to WebTransport and HTTP/3 datagrams can be adopted in a future version of their specifications that make it possible to use a server-chosen Session ID value for demuxing WebTransport datagrams (and HTTP/3 datagrams in general).</t>
          <t>Such a value could for instance be sent in an HTTP/3 response header, and as long as it is unique within the connection and avoids collision with any client-initiated stream ID values, it could still be used to multiplex data associated with different HTTP/3 traffic and different WebTransport sessions carried on the same connection.
Then by choosing the same server-chosen session ID for all the connections, the server would be able to use the same channel to carry the identical complete datagrams, including the server-chosen Session ID, to multiple receivers that the server asks to join the same channel.
Such a change could either replace the current client-chosen definition for Session ID in server-to-client datagrams, or could add new HTTP/3 frame types that allow a server-chosen Session ID when the client has advertised support for this extended functionality.</t>
        </section>
      </section>
      <section anchor="graceful-degradation">
        <name>Graceful Degradation</name>
        <t>Clients with multicast QUIC support can stop accepting multicast for a variety of reasons.</t>
        <t>Applications like live broadcast-scale video that rely on multicast QUIC may benefit from anticipating that clients might stop using multicast and providing data feeds with similar content that can scale even if many clients stop using multicast, for example by ensuring that a lower-bitrate rendition can still be delivered over unicast to all or most of the clients simultaneously, and ensuring that the server has a way to make the client start using the low-bitrate version when it switches to unicast.</t>
        <t>While some existing Adaptive Bitrate video players might have an easy way to provide this, other video players might need specialized logic to provide the server a way to control what bitrate individual clients consume.
Although under ideal conditions it may often be possible using features like server push (<xref target="server-push"/>) to use unmodified existing HTTP-based video players with multicast QUIC, in practice it may require extra development at the application level to make a player that robustly delivers a good user experience under variable network conditions, depending on the scalability gains that multicast transport is providing and the Adaptive Bitrate algorithms the player is using.</t>
        <section anchor="circuit-breakers">
          <name>Circuit Breakers</name>
          <t>Operators of multicast QUIC services should consider that some networks may implement circuit breakers such as the one described in <xref target="I-D.draft-ietf-mboned-cbacc"/>, or similar network-level safety features that might cut off previously operational multicast transport under certain conditions.</t>
          <t>The servers will notice the transport loss from the lack of MC_ACK frames from receivers in a network that cut off multicast transport, but it may be beneficial when possible in a transport cutoff event correlated across many clients to pace the recovery response according to aggregations of the affected clients so that a sudden unicast storm doesn't overload the network further.</t>
        </section>
      </section>
      <section anchor="server-scalability">
        <name>Server Scalability</name>
        <t>Use of QUIC multicast channels can provide large scalability gains, but there still will be significant scaling requirements on server operators to support a large client footprint.</t>
        <t>Servers, possibly many of them, still will be required to maintain unicast connections with all the clients and provide for handling MC_ACK frames from the clients, delivering MC_INTEGRITY frames, managing the clients' channel join states, and providing recovery for lost packets.</t>
        <t>Further, the use of multicast channels likely requires increased coordination between the different servers, relative to services that operate completely independently.</t>
        <t>For large deployments, server implementations will often need to operate on separate devices from the ones generating the multicast channel packets, and will need to be designed accordingly.</t>
      </section>
      <section anchor="address-collisions">
        <name>Address Collisions</name>
        <t>Multicast channels at the network layer are addressed with a source IP, a destination group IP address, and a destination UDP port.</t>
        <t>These offers a number of potential address collision considerations that are worth mentioning:</t>
        <ol spacing="normal" type="1"><li>If properties change for the data being used in a channel (for example, new video encoding settings might result in a change to the expected max rate for a video feed), a server might reuse the same network addresses in a new QUIC multicast channel, and might send a join for the new channel and a leave for the old channel to clients that can support the new max rate.  If they arrive together, this could be handled by the client without making a change to the IGMP or MLD membership state, as an optimization that can prevent the need for some recovery, or even by reusing the same UDP socket.  Doing so does not change any requirements for the channel state management at the QUIC layer, and as long as the situation is transient, should not result in leaving due to Excessive Spurious Traffic even if some packets were reordered or may still be in flight.</li>
          <li>As described in <xref section="6" sectionFormat="of" target="RFC4607"/>, link-layer addresses can be linked to the low-order bits of multicast addresses, and may be the same for different group destinations.  Collisions in the link-layer addressing, even with traffic that comes from other sources, can cause congestion or receiver CPU load for colliding channels that might be different from that seen with other channels that were delivered with apparently the same network paths.</li>
          <li>Even though multicast QUIC uses only source-specific multicast, older networks with devices that don't have IGMPv3 or MLDv2 support can propagate the joins as any-source multicast. If there are active senders sending to that destination, this can cause network congestion and CPU load due to discarding packets from the wrong source, even though at the application layer the UDP socket won't receive those packets from the wrong source.</li>
          <li>If different channels use the same (S,G) but different UDP ports, they will share the same multicast forwarding tree in an IP network. This is often useful when the data in the channels are linked, for example if MC_INTEGRITY frames are carried on one channel for packets carried on another channel, because it provides some fate-sharing for the linked data.  However, for data that is not so linked, it would generally be a disadvantage to share the (S,G) because the network link of any receiver joined to one of those channels but not the other would receive both packets and throw away the data for the un-joined port, causing extra congestion and CPU load for the receiving device.</li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>(Authors comment: Mostly incorporate <xref target="I-D.draft-krose-multicast-security"/>.  Anything else?</t>
      <t>e.g. if a different legitimate quic connection says someone
else's quic multicast stream is theirs, that's maybe a problem
worth protecting against.  Maybe we need a periodic asymmetric
challenge?  I'm thinking send a public key on the multicast
channel and in the unicast channels send an individualized MAC
signed with the private key and verify it with the public key,
so that in addition to validating that the unicast server knows
the contents of the multicast packets via the hashes it supplies,
the multicast stream provides a way for the client to validate
that the unicast stream is authorized to use it for data transport
via proof they know the private key corresponding to the public
key that arrived on the multicast channel.
Note this doesn't prevent unauthorized receipt of multicast
data packets, but does prevent a quic server from lying when
claiming a multicast data channel belongs to it, preventing
legit receivers from consuming it.</t>
      <t>alternatively, can the multicast channel just periodically say
what domain name is expected for the quic connection and get the
same crypto guarantee of a proper sender via the domain's cert,
which was already checked on the unicast channel?)</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO: MC_EXTENSION_ERROR error code</t>
      <t>TODO: lots</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="I-D.draft-krose-multicast-security">
          <front>
            <title>Security and Privacy Considerations for Multicast Transports</title>
            <author fullname="Kyle Rose">
              <organization>Akamai Technologies, Inc.</organization>
            </author>
            <author fullname="Jake Holland">
              <organization>Akamai Technologies, Inc.</organization>
            </author>
            <date day="31" month="January" year="2022"/>
            <abstract>
              <t>   Interdomain multicast has unique potential to solve delivery
   scalability for popular content, but it carries a set of security and
   privacy issues that differ from those in unicast delivery.  This
   document analyzes the security threats unique to multicast-based
   delivery for Internet and Web traffic under the Internet and Web
   threat models.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-krose-multicast-security-02"/>
        </reference>
        <reference anchor="I-D.draft-ietf-mboned-ambi">
          <front>
            <title>Asymmetric Manifest Based Integrity</title>
            <author fullname="Jake Holland">
              <organization>Akamai Technologies, Inc.</organization>
            </author>
            <author fullname="Kyle Rose">
              <organization>Akamai Technologies, Inc.</organization>
            </author>
            <date day="7" month="March" year="2022"/>
            <abstract>
              <t>   This document defines Asymmetric Manifest-Based Integrity (AMBI).
   AMBI allows each receiver or forwarder of a stream of multicast
   packets to check the integrity of the contents of each packet in the
   data stream.  AMBI operates by passing cryptographically verifiable
   hashes of the data packets inside manifest messages, and sending the
   manifests over authenticated out-of-band communication channels.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mboned-ambi-03"/>
        </reference>
        <reference anchor="I-D.draft-ietf-mboned-cbacc">
          <front>
            <title>Circuit Breaker Assisted Congestion Control</title>
            <author fullname="Jake Holland">
              <organization>Akamai Technologies, Inc.</organization>
            </author>
            <date day="7" month="March" year="2022"/>
            <abstract>
              <t>   This document specifies Circuit Breaker Assisted Congestion Control
   (CBACC).  CBACC enables fast-trip Circuit Breakers by publishing rate
   metadata about multicast channels from senders to intermediate
   network nodes or receivers.  The circuit breaker behavior is defined
   as a supplement to receiver driven congestion control systems, to
   preserve network health if misbehaving or malicious receiver
   applications subscribe to a volume of traffic that exceeds capacity
   policies or capability for a network or receiving device.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mboned-cbacc-04"/>
        </reference>
        <reference anchor="I-D.draft-ietf-quic-multipath">
          <front>
            <title>Multipath Extension for QUIC</title>
            <author fullname="Yanmei Liu">
              <organization>Alibaba Inc.</organization>
            </author>
            <author fullname="Yunfei Ma">
              <organization>Alibaba Inc.</organization>
            </author>
            <author fullname="Quentin De Coninck">
              <organization>UCLouvain</organization>
            </author>
            <author fullname="Olivier Bonaventure">
              <organization>UCLouvain</organization>
            </author>
            <author fullname="Christian Huitema">
              <organization>Private Octopus Inc.</organization>
            </author>
            <author fullname="Mirja Kuehlewind">
              <organization>Ericsson</organization>
            </author>
            <date day="11" month="July" year="2022"/>
            <abstract>
              <t>   This document specifies a multipath extension for the QUIC protocol
   to enable the simultaneous usage of multiple paths for a single
   connection.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the QUIC Working Group
   mailing list (quic@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/browse/quic/.

   Source for this draft and an issue tracker can be found at
   https://github.com/mirjak/draft-lmbdhk-quic-multipath.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-multipath-02"/>
        </reference>
        <reference anchor="RFC8085">
          <front>
            <title>UDP Usage Guidelines</title>
            <author fullname="L. Eggert" initials="L." surname="Eggert">
              <organization/>
            </author>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst">
              <organization/>
            </author>
            <author fullname="G. Shepherd" initials="G." surname="Shepherd">
              <organization/>
            </author>
            <date month="March" year="2017"/>
            <abstract>
              <t>The User Datagram Protocol (UDP) provides a minimal message-passing transport that has no inherent congestion control mechanisms.  This document provides guidelines on the use of UDP for the designers of applications, tunnels, and other protocols that use UDP.  Congestion control guidelines are a primary focus, but the document also provides guidance on other topics, including message sizes, reliability, checksums, middlebox traversal, the use of Explicit Congestion Notification (ECN), Differentiated Services Code Points (DSCPs), and ports.</t>
              <t>Because congestion control is critical to the stable operation of the Internet, applications and other protocols that choose to use UDP as an Internet transport must employ mechanisms to prevent congestion collapse and to establish some degree of fairness with concurrent traffic.  They may also need to implement additional mechanisms, depending on how they use UDP.</t>
              <t>Some guidance is also applicable to the design of other protocols (e.g., protocols layered directly on IP or via IP-based tunnels), especially when these protocols do not themselves provide congestion control.</t>
              <t>This document obsoletes RFC 5405 and adds guidelines for multicast UDP usage.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="145"/>
          <seriesInfo name="RFC" value="8085"/>
          <seriesInfo name="DOI" value="10.17487/RFC8085"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol.  QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances.  Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9001">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <author fullname="S. Turner" initials="S." role="editor" surname="Turner">
              <organization/>
            </author>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar">
              <organization/>
            </author>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett">
              <organization/>
            </author>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="RFC9221">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly">
              <organization/>
            </author>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear">
              <organization/>
            </author>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi">
              <organization/>
            </author>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.draft-ietf-webtrans-http3">
          <front>
            <title>WebTransport over HTTP/3</title>
            <author fullname="Alan Frindell">
              <organization>Facebook</organization>
            </author>
            <author fullname="Eric Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="6" month="July" year="2022"/>
            <abstract>
              <t>   WebTransport [OVERVIEW] is a protocol framework that enables clients
   constrained by the Web security model to communicate with a remote
   server using a secure multiplexed transport.  This document describes
   a WebTransport protocol that is based on HTTP/3 [HTTP3] and provides
   support for unidirectional streams, bidirectional streams and
   datagrams, all multiplexed within the same HTTP/3 connection.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-03"/>
        </reference>
        <reference anchor="I-D.draft-ietf-masque-h3-datagram">
          <front>
            <title>HTTP Datagrams and the Capsule Protocol</title>
            <author fullname="David Schinazi">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Lucas Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="17" month="June" year="2022"/>
            <abstract>
              <t>   This document describes HTTP Datagrams, a convention for conveying
   multiplexed, potentially unreliable datagrams inside an HTTP
   connection.

   In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC
   DATAGRAM extension.  When the QUIC DATAGRAM frame is unavailable or
   undesirable, they can be sent using the Capsule Protocol, a more
   general convention for conveying data in HTTP connections.

   HTTP Datagrams and the Capsule Protocol are intended for use by HTTP
   extensions, not applications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-h3-datagram-11"/>
        </reference>
        <reference anchor="RFC4607">
          <front>
            <title>Source-Specific Multicast for IP</title>
            <author fullname="H. Holbrook" initials="H." surname="Holbrook">
              <organization/>
            </author>
            <author fullname="B. Cain" initials="B." surname="Cain">
              <organization/>
            </author>
            <date month="August" year="2006"/>
            <abstract>
              <t>IP version 4 (IPv4) addresses in the 232/8 (232.0.0.0 to 232.255.255.255) range are designated as source-specific multicast (SSM) destination addresses and are reserved for use by source-specific applications and protocols.  For IP version 6 (IPv6), the address prefix FF3x::/32 is reserved for source-specific multicast use.  This document defines an extension to the Internet network service that applies to datagrams sent to SSM addresses and defines the host and router requirements to support this extension.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4607"/>
          <seriesInfo name="DOI" value="10.17487/RFC4607"/>
        </reference>
        <reference anchor="RFC6363">
          <front>
            <title>Forward Error Correction (FEC) Framework</title>
            <author fullname="M. Watson" initials="M." surname="Watson">
              <organization/>
            </author>
            <author fullname="A. Begen" initials="A." surname="Begen">
              <organization/>
            </author>
            <author fullname="V. Roca" initials="V." surname="Roca">
              <organization/>
            </author>
            <date month="October" year="2011"/>
            <abstract>
              <t>This document describes a framework for using Forward Error Correction (FEC) codes with applications in public and private IP networks to provide protection against packet loss.  The framework supports applying FEC to arbitrary packet flows over unreliable transport and is primarily intended for real-time, or streaming, media.  This framework can be used to define Content Delivery Protocols that provide FEC for streaming media delivery or other packet flows.  Content Delivery Protocols defined using this framework can support any FEC scheme (and associated FEC codes) that is compliant with various requirements defined in this document. Thus, Content Delivery Protocols can be defined that are not specific to a particular FEC scheme, and FEC schemes can be defined that are not specific to a particular Content Delivery Protocol.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6363"/>
          <seriesInfo name="DOI" value="10.17487/RFC6363"/>
        </reference>
        <reference anchor="RFC6726">
          <front>
            <title>FLUTE - File Delivery over Unidirectional Transport</title>
            <author fullname="T. Paila" initials="T." surname="Paila">
              <organization/>
            </author>
            <author fullname="R. Walsh" initials="R." surname="Walsh">
              <organization/>
            </author>
            <author fullname="M. Luby" initials="M." surname="Luby">
              <organization/>
            </author>
            <author fullname="V. Roca" initials="V." surname="Roca">
              <organization/>
            </author>
            <author fullname="R. Lehtonen" initials="R." surname="Lehtonen">
              <organization/>
            </author>
            <date month="November" year="2012"/>
            <abstract>
              <t>This document defines File Delivery over Unidirectional Transport (FLUTE), a protocol for the unidirectional delivery of files over the Internet, which is particularly suited to multicast networks.  The specification builds on Asynchronous Layered Coding, the base protocol designed for massively scalable multicast distribution. This document obsoletes RFC 3926.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6726"/>
          <seriesInfo name="DOI" value="10.17487/RFC6726"/>
        </reference>
        <reference anchor="RFC6968">
          <front>
            <title>FCAST: Object Delivery for the Asynchronous Layered Coding (ALC) and NACK-Oriented Reliable Multicast (NORM) Protocols</title>
            <author fullname="V. Roca" initials="V." surname="Roca">
              <organization/>
            </author>
            <author fullname="B. Adamson" initials="B." surname="Adamson">
              <organization/>
            </author>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document introduces the FCAST reliable object (e.g., file) delivery application.  It is designed to operate either on top of the underlying Asynchronous Layered Coding (ALC) / Layered Coding Transport (LCT) reliable multicast transport protocol or the NACK-Oriented Reliable Multicast (NORM) transport protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6968"/>
          <seriesInfo name="DOI" value="10.17487/RFC6968"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment.  This document describes a mapping of HTTP semantics over QUIC.  This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="MERKLE">
          <front>
            <title>Secrecy, Authentication, and Public Key Systems</title>
            <author initials="R." surname="Merkle">
              <organization/>
            </author>
            <date year="1983"/>
          </front>
          <seriesInfo name="Computer Science Series, UMI Research Press, ISBN: 9780835713849" value=""/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
oHFUJRQ+tmWUh73/A7H9UCIc/AAA

-->

</rfc>
