<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 2.6.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-lcurley-warp-03" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="WARP">Warp - Live Media Transport over QUIC</title>

    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization>Twitch</organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Pugin" fullname="Kirill Pugin">
      <organization>Meta</organization>
      <address>
        <email>ikir@meta.com</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="V." surname="Vasiliev" fullname="Victor Vasiliev">
      <organization>Google</organization>
      <address>
        <email>vasilvv@google.com</email>
      </address>
    </author>

    <date />

    <area>General</area>
    <workgroup>Independent Submission</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document defines the core behavior for Warp, a live media transport protocol over QUIC.
Media is split into objects based on the underlying media encoding and transmitted independently over QUIC streams.
QUIC streams are prioritized based on the delivery order, allowing less important objects to be starved or dropped during congestion.</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>
<t>Warp is a live media transport protocol that utilizes the QUIC network protocol <xref target="QUIC"/>.</t>

<t><list style="symbols">
  <t><xref target="motivation"/> covers the background and rationale behind Warp.</t>
  <t><xref target="objects"/> covers how media is fragmented into objects.</t>
  <t><xref target="quic"/> covers how QUIC is used to transfer media.</t>
  <t><xref target="messages"/> covers how messages are encoded on the wire.</t>
  <t><xref target="containers"/> covers how media tracks are packaged.</t>
</list></t>

<section anchor="terms-and-definitions"><name>Terms and Definitions</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>

<dl>
  <dt>Bitstream:</dt>
  <dd>
    <t>A continunous series of bytes.</t>
  </dd>
  <dt>Client:</dt>
  <dd>
    <t>The party initiating a Warp session.</t>
  </dd>
  <dt>Codec:</dt>
  <dd>
    <t>A compression algorithm for audio or video.</t>
  </dd>
  <dt>Congestion:</dt>
  <dd>
    <t>Packet loss and queuing caused by degraded or overloaded networks.</t>
  </dd>
  <dt>Consumer:</dt>
  <dd>
    <t>A QUIC endpoint receiving media over the network. This could be the media player or middleware.</t>
  </dd>
  <dt>Container:</dt>
  <dd>
    <t>A file format containing timestamps and the codec bitstream</t>
  </dd>
  <dt>Decoder:</dt>
  <dd>
    <t>A endpoint responsible for a deflating a compressed media stream into raw frames.</t>
  </dd>
  <dt>Decode Timestamp (DTS):</dt>
  <dd>
    <t>A timestamp indicating the order that frames/samples should be fed to the decoder.</t>
  </dd>
  <dt>Encoder:</dt>
  <dd>
    <t>A component responsible for creating a compressed media stream out of raw frames.</t>
  </dd>
  <dt>Frame:</dt>
  <dd>
    <t>An video image or group of audio samples to be rendered at a specific point in time.</t>
  </dd>
  <dt>I-frame:</dt>
  <dd>
    <t>A frame that does not depend on the contents of other frames; effectively an image.</t>
  </dd>
  <dt>Group of pictures (GoP):</dt>
  <dd>
    <t>A I-frame followed by a sequential series of dependent frames.</t>
  </dd>
  <dt>Group of samples:</dt>
  <dd>
    <t>A sequential series of audio samples starting at a given timestamp.</t>
  </dd>
  <dt>Player:</dt>
  <dd>
    <t>A component responsible for presenting frames to a viewer based on the presentation timestamp.</t>
  </dd>
  <dt>Presentation Timestamp (PTS):</dt>
  <dd>
    <t>A timestamp indicating when a frames/samples should be presented to the viewer.</t>
  </dd>
  <dt>Producer:</dt>
  <dd>
    <t>A QUIC endpoint sending media over the network. This could be the media encoder or middleware.</t>
  </dd>
  <dt>Server:</dt>
  <dd>
    <t>The party accepting an incoming Warp session.</t>
  </dd>
  <dt>Slice:</dt>
  <dd>
    <t>A section of a video frame. There may be multiple slices per frame.</t>
  </dd>
  <dt>Track:</dt>
  <dd>
    <t>An encoded bitstream, representing a single media component (ex. audio, video, subtitles) that makes up the larger broadcast.</t>
  </dd>
  <dt>Variant:</dt>
  <dd>
    <t>A track with the same content but different encoding as another track. For example, a different bitrate, codec, language, etc.</t>
  </dd>
</dl>

</section>
<section anchor="notational-conventions"><name>Notational Conventions</name>

<t>This document uses the conventions detailed in Section 1.3 of <xref target="RFC9000"/> when describing the binary encoding.</t>

<t>This document also defines an additional field type for binary data:</t>

<dl>
  <dt>x (b):</dt>
  <dd>
    <t>Indicates that x consists of a variable length integer, followed by that many bytes of binary data.</t>
  </dd>
</dl>

</section>
</section>
<section anchor="model"><name>Model</name>

<t>The basic element of Warp is <em>a media object</em>. A media object is a single addressable cacheable unit that may either contain a sequence of media samples, or some media-specific metadata, and may have relay-related attributes such as TTL or delivery priority associated with it. A media object is a sequence of bytes with a finite length. A Warp media object is similar in function to what is often referred to as "segments" or "chunks" in other media protocols; however, they are different from the traditional notion of chunks. The first key distinction is that Warp media objects are not always expected to be fully available, and thus any relays have to be able to convey partial media objects. The second key distinction is that Warp media objects may not be fully decodable by themselves; an object will contain a description of the prerequisites if that is the case.</t>

<t><em>A media track</em> in Warp is a combination of <em>an init object</em> and a sequence of media objects. An init object is a format-specific self-contained description of the track that is required to decode any media object contained within the track, but can also be used as the metadata for track selection. If two media tracks carry semantically equivalent but differently encoded media, they are referred to as <em>variants</em> of each other.</t>

<t><em>A Warp broadcast</em> is a collection of multiple media tracks produced by a single origin. When subscribing to a broadcast, a peer has an option of subscribing to one, many or all media tracks within the broadcast.</t>

<t>A Warp broadcast is globally identifiable via a URI. Within the broadcast, every media track is identified via <em>a track ID</em> that is unique within the broadcast. Within a single media track, every media object is identified by an <em>object ID</em> that is unique within the track.</t>

<t>Depending on the profile of the application using it, Warp supports both a mode of operation where the peer unilaterally sends a broadcast with the media tracks of its choice, and a mode where the peer has to explicitly subscribe to a broadcast and select media tracks it wishes to receive.</t>

<t>As an example, consider a scenario where <spanx style="verb">example.org</spanx> hosts a simple live stream that anyone can subscribe to. That live stream would be a single Warp broadcast identified by the URL <spanx style="verb">https://example.org/livestream</spanx>. In the simplest implementation, it would provide only two media tracks, one with audio and one with video. In more complicated scenarios, it could provide multiple video formats of different levels of video quality; those tracks would be variants of each other. Note that the track IDs are opaque on the Warp level; if the player has not received the description of media tracks out of band in advance, it would have to request the broadcast description first.</t>

</section>
<section anchor="motivation"><name>Motivation</name>

<section anchor="latency"><name>Latency</name>
<t>In a perfect world, we could deliver live media at the same rate it is produced.
The end-to-end latency of a broadcast would be fixed and only subject to encoding and transmission delays.
Unfortunately, networks have variable throughput, primarily due to congestion.</t>

<t>Attempting to deliver media encoded at a higher bitrate than the network can support causes queuing.
This queuing can occur anywhere in the path between the encoder and decoder.
For example: the application, the OS socket, a wifi router, within an ISP, or generally anywhere in transit.</t>

<t>If nothing is done, new frames will be appended to the end of a growing queue and will take longer to arrive than their predecessors, increasing latency.
Our job is to minimize the growth of this queue, and if necessary, bypass the queue entirely by dropping content.</t>

<t>The speed at which a media protocol can detect and respond to queuing determines the latency.
We can generally classify existing media protocols into two categories based on the underlying network protocol:</t>

<t><list style="symbols">
  <t>TCP-based media protocols (ex. RTMP, HLS, DASH) are popular due to their simplicity.
Media is served/consumed in decode order while any networking is handled by the TCP layer.
However, these protocols primarily see usage at higher latency targets due to their relatively slow detection and response to queuing.</t>
  <t>UDP-based media protocols (ex. RTP, WebRTC, SRT) can side-step the issues with TCP and provide lower latency with better queue management.
However the media protocol is now responsible for fragmentation, congestion control, retransmissions, receiver feedback, reassembly, and more.
This added complexity significantly raises the implementation difficulty and hurts interoperability.</t>
</list></t>

<t>A goal of this draft is to get the best of both worlds: a simple protocol that can still rapidly detect and respond to congestion.
This is possible with the emergence of QUIC, designed to fix the shortcomings of TCP.</t>

</section>
<section anchor="universal"><name>Universal</name>
<t>The media protocol ecosystem is fragmented; each protocol has it's own niche.
Specialization is often a good thing, but we believe there's enough overlap to warrant consolidation.</t>

<t>For example, a service might simultaneously ingest via WebRTC, SRT, RTMP, and/or a custom UDP protocol depending on the broadcaster.
The same service might then simultaneously distribute via WebRTC, LL-HLS, HLS, (or the DASH variants) and/or a custom UDP protocol depending on the viewer.</t>

<t>These media protocols are often radically different and not interoperable; requiring transcoding or transmuxing.
This cost is further increased by the need to maintain separate stacks with different expertise requirements.</t>

<t>A goal of this draft is to cover a large spectrum of use-cases. Specifically:</t>

<t><list style="symbols">
  <t>Consolidated contribution and distribution.
The primary difference between the two is the ability to fanout.
How does a CDN know how to forward media to N consumers and how does it reduce the encoded bitrate during congestion?
A single protocol can cover both use-cases provided relays are informed on how to forward and drop media.</t>
  <t>A configurable latency versus quality trade-off.
The producer (broadcaster) chooses how to encode and transmit media based on the desired user experience.
Each consumer (viewer) chooses how long to wait for media based on their desired user experience and network.
We want an experience that can vary from real-time and lossy for one viewer, to delayed and loss-less for another viewer, without separate encodings or protocols.</t>
</list></t>

<t>A related goal is to not reinvent how media is encoded.
The same codec bitstream and container should be usable between different protocols.</t>

</section>
<section anchor="relays"><name>Relays</name>
<t>The prevailing belief is that UDP-based protocols are more expensive and don't "scale".
While it's true that UDP is more difficult to optimize than TCP, QUIC itself is proof that it is possible to reach performance parity.
In fact even some TCP-based protocols (ex. RTMP) don't "scale" either and are exclusively used for contribution as a result.</t>

<t>The ability to scale a media protocol actually depends on relay support: proxies, caches, CDNs, SFUs, etc.
The success of HTTP-based media protocols is due to the ability to leverage traditional HTTP CDNs.</t>

<t>It's difficult to build a CDN for media protocols that were not designed with relays in mind.
For example, an relay has to parse the underlying codec to determine which RTP packets should be dropped first, and the decision is not deterministic or consistent for each hop.
This is the fatal flaw of many UDP-based protocols.</t>

<t>A goal of this draft is to treat relays as first class citizens.
Any identification, reliability, ordering, prioritization, caching, etc is written to the wire in a header that is easy to parse.
This ensures that relays can easily route/fanout media to the final destination.
This also ensures that congestion response is consistent at every hop based on the preferences of the media producer.</t>

</section>
</section>
<section anchor="objects"><name>Objects</name>
<t>Warp works by splitting media into objects that can be transferred over QUIC streams.</t>

<t><list style="symbols">
  <t>The encoder determines how to fragment the encoded bitstream into objects (<xref target="media"/>).</t>
  <t>Objects are assigned an intended delivery order that should be obeyed during congestion (<xref target="delivery-order"/>)</t>
  <t>The decoder receives each objects and skips any objects that do not arrive in time (<xref target="decoder"/>).</t>
</list></t>

<section anchor="media"><name>Media</name>
<t>An encoder produces one or more codec bitstreams for each track.
The decoder processes the codec bitstreams in the same order they were produced, with some possible exceptions based on the encoding.
See the appendix for an overview of media encoding (<xref target="appendix.encoding"/>).</t>

<t>Warp works by fragmenting the bitstream into objects that can be transmitted somewhat independently.
Depending on how the objects are fragmented, the decoder has the ability to safely drop media during congestion.
See the appendix for fragmentation examples (<xref target="appendix.examples"/>)</t>

<t>A media object:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> contain a single track.</t>
  <t><bcp14>MUST</bcp14> be in decode order. This means an increasing DTS.</t>
  <t><bcp14>MAY</bcp14> contain any number of frames/samples.</t>
  <t><bcp14>MAY</bcp14> have gaps between frames/samples.</t>
  <t><bcp14>MAY</bcp14> overlap with other objects. This means timestamps may be interleaved between objects.</t>
</list></t>

<t>Media objects are encoded using a specified container (<xref target="containers"/>).</t>

</section>
<section anchor="delivery-order"><name>Delivery Order</name>
<t>Media is produced with an intended order, both in terms of when media should be presented (PTS) and when media should be decoded (DTS).
As stated in motivation (<xref target="latency"/>), the network is unable to maintain this ordering during congestion without increasing latency.</t>

<t>The encoder determines how to behave during congestion by assigning each object a numeric delivery order.
The delivery order <bcp14>SHOULD</bcp14> be followed when possible to ensure that the most important media is delivered when throughput is limited.
Note that the contents within each object are still delivered in order; this delivery order only applies to the ordering between objects.</t>

<t>A sender <bcp14>MUST</bcp14> send each object over a dedicated QUIC stream.
The QUIC library should support prioritization (<xref target="prioritization"/>) such that streams are transmitted in delivery order.</t>

<t>A receiver <bcp14>MUST NOT</bcp14> assume that objects will be received in delivery order for a number of reasons:</t>

<t><list style="symbols">
  <t>Newly encoded objects <bcp14>MAY</bcp14> have a smaller delivery order than outstanding objects.</t>
  <t>Packet loss or flow control <bcp14>MAY</bcp14> delay the delivery of individual streams.</t>
  <t>The sender might not support QUIC stream prioritization.</t>
</list></t>

</section>
<section anchor="decoder"><name>Decoder</name>
<t>The decoder will receive multiple objects in parallel and out of order.</t>

<t>Objects arrive in delivery order, but media usually needs to be processed in decode order.
The decoder <bcp14>SHOULD</bcp14> use a buffer to reassmble objects into decode order and it <bcp14>SHOULD</bcp14> skip objects after a configurable duration.
The amount of time the decoder is willing to wait for an object (buffer duration) is what ultimately determines the end-to-end latency.</t>

<t>Objects <bcp14>MUST</bcp14> synchronize frames within and between tracks using presentation timestamps within the container.
Objects are NOT <bcp14>REQUIRED</bcp14> to be aligned and the decoder <bcp14>MUST</bcp14> be prepared to skip over any gaps.</t>

</section>
</section>
<section anchor="quic"><name>QUIC</name>

<section anchor="establishment"><name>Establishment</name>
<t>A connection is established using WebTransport <xref target="WebTransport"/>.</t>

<t>To summarize:
The client issues a HTTP CONNECT request with the intention of establishing a new WebTransport session.
The server returns an 200 OK response if the WebTransport session has been established, or an error status otherwise.</t>

<t>A WebTransport session exposes the basic QUIC service abstractions.
Specifically, either endpoint may create independent streams which are reliably delivered in order until canceled.</t>

<t>WebTransport can currently operate via HTTP/3 and HTTP/2, using QUIC or TCP under the hood respectively.
As mentioned in the motivation (<xref target="motivation"/>) section, TCP introduces head-of-line blocking and will result in a worse experience.
It is <bcp14>RECOMMENDED</bcp14> to use WebTransport over HTTP/3.</t>

</section>
<section anchor="authentication"><name>Authentication</name>
<t>The application <bcp14>SHOULD</bcp14> use the WebTransport CONNECT request for authentication.
For example, including an authentication token in the path.</t>

<t>An endpoint <bcp14>SHOULD</bcp14> terminate the connection with an error (<xref target="termination"/>) if the peer attempts an unauthorized action.
For example, attempting to use a different role than pre-negotated (<xref target="role"/>) or using an invalid broadcast URI (<xref target="message-catalog"/>).</t>

</section>
<section anchor="streams"><name>Streams</name>
<t>Warp endpoints communicate over QUIC streams. Every stream is a sequence of messages, framed as described in <xref target="messages"/>.</t>

<t>The first stream opened is a client-initiated bidirectional stream where the peers exchange SETUP messages (<xref target="message-setup"/>). The subsequent streams <bcp14>MAY</bcp14> be either unidirectional and bidirectional. For exchanging media, an application would typically send a unidirectional stream containing a single OBJECT message (<xref target="message-object"/>).</t>

<t>Messages <bcp14>SHOULD</bcp14> be sent over the same stream if ordering is desired.
Some messages <bcp14>MUST</bcp14> be sent over the same stream, for example SUBSCRIBE messages (<xref target="message-subscribe"/>) with the same broadcast URI.</t>

</section>
<section anchor="prioritization"><name>Prioritization</name>
<t>Warp utilizes stream prioritization to deliver the most important content during congestion.</t>

<t>The producer may assign a numeric delivery order to each object (<xref target="delivery-order"/>)
This is a strict prioritization scheme, such that any available bandwidth is allocated to streams in ascending priority order.
The sender <bcp14>SHOULD</bcp14> prioritize streams based on the delivery order.
If two streams have the same delivery order, they <bcp14>SHOULD</bcp14> receive equal bandwidth (round-robin).</t>

<t>QUIC supports stream prioritization but does not standardize any mechanisms; see Section 2.3 in <xref target="QUIC"/>.
In order to support prioritization, a QUIC library <bcp14>MUST</bcp14> expose a API to set the priority of each stream.
This is relatively easy to implement; the next QUIC packet should contain a STREAM frame for the next pending stream in priority order.</t>

<t>The sender <bcp14>MUST</bcp14> respect flow control even if means delivering streams out of delivery order.
It is <bcp14>OPTIONAL</bcp14> to prioritize retransmissions.</t>

</section>
<section anchor="cancellation"><name>Cancellation</name>
<t>A QUIC stream <bcp14>MAY</bcp14> be canceled at any point with an error code.
The producer does this via a <spanx style="verb">RESET_STREAM</spanx> frame while the consumer requests cancellation with a <spanx style="verb">STOP_SENDING</spanx> frame.</t>

<t>When using <spanx style="verb">order</spanx>, lower priority streams will be starved during congestion, perhaps indefinitely.
These streams will consume resources and flow control until they are canceled.
When nearing resource limits, an endpoint <bcp14>SHOULD</bcp14> cancel the lowest priority stream with error code 0.</t>

<t>The sender <bcp14>MAY</bcp14> cancel streams in response to congestion.
This can be useful when the sender does not support stream prioritization.</t>

</section>
<section anchor="relays-1"><name>Relays</name>
<t>Warp encodes the delivery information for a stream via OBJECT headers (<xref target="message-object"/>).</t>

<t>A relay <bcp14>SHOULD</bcp14> prioritize streams (<xref target="prioritization"/>) based on the delivery order.
A relay <bcp14>MAY</bcp14> change the delivery order, in which case it <bcp14>SHOULD</bcp14> update the value on the wire for future hops.</t>

<t>A relay that reads from a stream and writes to stream in order will introduce head-of-line blocking.
Packet loss will cause stream data to be buffered in the QUIC library, awaiting in order delivery, which will increase latency over additional hops.
To mitigate this, a relay <bcp14>SHOULD</bcp14> read and write QUIC stream data out of order subject to flow control limits.
See section 2.2 in <xref target="QUIC"/>.</t>

</section>
<section anchor="congestion-control"><name>Congestion Control</name>
<t>As covered in the motivation section (<xref target="motivation"/>), the ability to prioritize or cancel streams is a form of congestion response.
It's equally important to detect congestion via congestion control, which is handled in the QUIC layer <xref target="QUIC-RECOVERY"/>.</t>

<t>Bufferbloat is caused by routers queueing packets for an indefinite amount of time rather than drop them.
This latency significantly reduces the ability for the application to prioritize or drop media in response to congestion.
Senders <bcp14>SHOULD</bcp14> use a congestion control algorithm that reduces this bufferbloat (ex. <xref target="BBR"/>).
It is <bcp14>NOT RECOMMENDED</bcp14> to use a loss-based algorithm (ex. <xref target="NewReno"/>) unless the network fully supports ECN.</t>

<t>Live media is application-limited, which means that the encoder determines the max bitrate rather than the network.
Most TCP congestion control algorithms will only increase the congestion window if it is full, limiting the upwards mobility when application-limited.
Senders <bcp14>SHOULD</bcp14> use a congestion control algorithm that is designed for application-limited flows (ex. GCC).
Senders <bcp14>MAY</bcp14> periodically pad the connection with QUIC PING frames to fill the congestion window.</t>

</section>
<section anchor="termination"><name>Termination</name>
<t>The WebTransport session can be terminated at any point with CLOSE_WEBTRANSPORT_SESSION capsule, consisting of an integer code and string message.</t>

<t>The application <bcp14>MAY</bcp14> use any error message and <bcp14>SHOULD</bcp14> use a relevant code, as defined below:</t>

<texttable>
      <ttcol align='right'>Code</ttcol>
      <ttcol align='left'>Reason</ttcol>
      <c>0x0</c>
      <c>Session Terminated</c>
      <c>0x1</c>
      <c>Generic Error</c>
      <c>0x2</c>
      <c>Unauthorized</c>
      <c>0x10</c>
      <c>GOAWAY</c>
</texttable>

<t><list style="symbols">
  <t>Session Terminated
No error occured, however the endpoint no longer desires to send or receive media.</t>
  <t>Generic Error
An unclassified error occured.</t>
  <t>Unauthorized:
The endpoint breached an agreement, which <bcp14>MAY</bcp14> have been pre-negotiated by the application.</t>
  <t>GOAWAY:
The endpoint successfully drained the session after a GOAWAY was initiated (<xref target="message-goaway"/>).</t>
</list></t>

</section>
</section>
<section anchor="messages"><name>Messages</name>
<t>Both unidirectional and bidirectional Warp streams are sequences of length-deliminated messages.</t>

<figure title="Warp Message" anchor="warp-message-format"><artwork><![CDATA[
Warp Message {
  Message Type (i),
  Message Length (i),
  Message Payload (..),
}
]]></artwork></figure>

<t>The Message Length field contains the length of the Message Payload field in bytes.
A length of 0 indicates the message is unbounded and continues until the end of the stream.</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Messages</ttcol>
      <c>0x0</c>
      <c>OBJECT (<xref target="message-object"/>)</c>
      <c>0x1</c>
      <c>SETUP (<xref target="message-setup"/>)</c>
      <c>0x2</c>
      <c>CATALOG (<xref target="message-catalog"/>)</c>
      <c>0x3</c>
      <c>SUBSCRIBE (<xref target="message-subscribe"/>)</c>
      <c>0x10</c>
      <c>GOAWAY (<xref target="message-goaway"/>)</c>
</texttable>

<section anchor="message-setup"><name>SETUP</name>

<t>The <spanx style="verb">SETUP</spanx> message is the first message that is exchanged by the client and the server; it allows the peers to establish the mutually supported version and agree on the initial configuration. It is a sequence of key-value pairs called <em>SETUP parameters</em>; the semantics and the format of individual parameter values <bcp14>MAY</bcp14> depend on what party is sending it.</t>

<t>The wire format of the SETUP message is as follows:</t>

<figure title="Warp SETUP Message" anchor="warp-setup-format"><artwork><![CDATA[
SETUP Parameter {
  Parameter Key (i),
  Parameter Value Length (i),
  Parameter Value (..),
}

Client SETUP Message Payload {
  Number of Supported Versions (i),
  Supported Version (i) ...,
  SETUP Parameters (..) ...,
}

Server SETUP Message Payload {
  Selected Version (i),
  SETUP Parameters (..) ...,
}
]]></artwork></figure>

<t>The Parameter Value Length field indicates the length of the Parameter Value.</t>

<t>The client offers the list of the protocol versions it supports; the server <bcp14>MUST</bcp14> reply with one of the versions offered by the client. If the server does not support any of the versions offered by the client, or the client receives a server version that it did not offer, the corresponding peer <bcp14>MUST</bcp14> close the connection.</t>

<t>The SETUP parameters are described in the <xref target="setup-parameters"/> section.</t>

</section>
<section anchor="message-object"><name>OBJECT</name>
<t>A OBJECT message contains a single media object associated with a specified track, as well as associated metadata required to deliver, cache, and forward it.</t>

<t>The format of the OBJECT message is as follows:</t>

<figure title="Warp OBJECT Message" anchor="warp-object-format"><artwork><![CDATA[
OBJECT Message {
  Broadcast URI (b)
  Track ID (i),
  Object ID (i),
  Object Delivery Order (i),
  Object Payload (b),
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Broadcast URI:
The broadcast URI as declared in CATALOG (<xref target="message-catalog"/>).</t>
  <t>Track ID:
The track identifier as declared in CATALOG (<xref target="message-catalog"/>).</t>
  <t>Object ID:
A unique identifier for each object within the track.</t>
  <t>Object Delivery Order:
An integer indicating the object delivery order (<xref target="delivery-order"/>).</t>
  <t>Object Payload:
The format depends on the track container (<xref target="containers"/>).
This is a media bitstream intended for the decoder and <bcp14>SHOULD NOT</bcp14> be processed by a relay.</t>
</list></t>

</section>
<section anchor="message-catalog"><name>CATALOG</name>
<t>The sender advertises an available broadcast and its tracks via the CATALOG message.</t>

<t>The format of the CATALOG message is as follows:</t>

<figure title="Warp CATALOG Message" anchor="warp-catalog-format"><artwork><![CDATA[
CATALOG Message {
  Broadcast URI (b),
  Track Count (i),
  Track Descriptors (..)
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Broadcast URI:
A unique identifier <xref target="URI"/> for the broadcast within the session.</t>
  <t>Track Count:
The number of tracks in the broadcast.</t>
</list></t>

<t>For each track, there is a track descriptor with the format:</t>

<figure title="Warp Track Descriptor" anchor="warp-track-descriptor"><artwork><![CDATA[
Track Descriptor {
  Track ID (i),
  Container Format (i),
  Container Init Payload (b)
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Track ID:
A unique identifier for the track within the broadcast.</t>
  <t>Container Format:
The container format as defined in <xref target="containers"/>.</t>
  <t>Container Init Payload:
A container-specific payload as defined in <xref target="containers"/>.
This contains base information required to decode OBJECT messages, such as codec parameters.</t>
</list></t>

<t>An endpoint <bcp14>MUST NOT</bcp14> send multiple CATALOG messages with the same Broadcast URI.
A future draft will add the ability to add/remove/update tracks.</t>

</section>
<section anchor="message-subscribe"><name>SUBSCRIBE</name>
<t>After receiving a CATALOG message (<xref target="message-catalog"/>, the receiver sends a SUBSCRIBE message to indicate that it wishes to receive the indicated tracks within a broadcast.</t>

<t>The format of SUBSCRIBE is as follows:</t>

<figure title="Warp SUBSCRIBE Message" anchor="warp-subscribe-format"><artwork><![CDATA[
SUBSCRIBE Message {
  Broadcast URI (b),
  Track Count (i),
  Track IDs (..),
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Broadcast URI:
The broadcast URI as defined in CATALOG (<xref target="message-catalog"/>).</t>
  <t>Track Count:
The number of track IDs that follow.
This <bcp14>MAY</bcp14> be zero to unsubscribe to all tracks.</t>
  <t>Track IDs:
A list of varint track IDs.</t>
</list></t>

<t>Only the most recent SUBSCRIBE message for a broadcast is active.
SUBSCRIBE messages <bcp14>MUST</bcp14> be sent on the same QUIC stream to preserve ordering.</t>

</section>
<section anchor="message-goaway"><name>GOAWAY</name>
<t>The <spanx style="verb">GOAWAY</spanx> message is sent by the server to force the client to reconnect.
This is useful for server maintenance or reassignments without severing the QUIC connection.
The server <bcp14>MAY</bcp14> be a producer or consumer.</t>

<t>The server:</t>

<t><list style="symbols">
  <t><bcp14>MAY</bcp14> initiate a graceful shutdown by sending a GOAWAY message.</t>
  <t><bcp14>MUST</bcp14> close the QUIC connection after a timeout with the GOAWAY error code (<xref target="termination"/>).</t>
  <t><bcp14>MAY</bcp14> close the QUIC connection with a different error code if there is a fatal error before shutdown.</t>
  <t><bcp14>SHOULD</bcp14> wait until the <spanx style="verb">GOAWAY</spanx> message and any pending streams have been fully acknowledged, plus an extra delay to ensure they have been processed.</t>
</list></t>

<t>The client:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> establish a new WebTransport session to the provided URL upon receipt of a <spanx style="verb">GOAWAY</spanx> message.</t>
  <t><bcp14>SHOULD</bcp14> establish the connection in parallel which <bcp14>MUST</bcp14> use different QUIC connection.</t>
  <t><bcp14>SHOULD</bcp14> remain connected for two servers for a short period, processing objects from both in parallel.</t>
</list></t>

</section>
</section>
<section anchor="setup-parameters"><name>SETUP Parameters</name>

<t>The SETUP message (<xref target="message-setup"/>) allows the peers to exchange arbitrary parameters before any media is exchanged. It is the main extensibility mechanism of Warp. The peers <bcp14>MUST</bcp14> ignore unknown parameters. TODO: describe GREASE for those.</t>

<t>Every parameter <bcp14>MUST</bcp14> appear at most once within the SETUP message. The peers <bcp14>SHOULD</bcp14> verify that and close the connection if a parameter appears more than once.</t>

<t>The ROLE parameter is mandatory for the client. All of the other parameters are optional.</t>

<section anchor="role"><name>ROLE parameter</name>

<t>The ROLE parameter (key 0x00) allows the client to specify what roles it expects the parties to have in the Warp connection. It has three possible values:</t>

<dl>
  <dt>0x01:</dt>
  <dd>
    <t>Only the client is expected to send media on the connection. This is commonly referred to as <em>the ingestion case</em>.</t>
  </dd>
  <dt>0x02:</dt>
  <dd>
    <t>Only the server is expected to send media on the connection. This is commonly referred to as <em>the delivery case</em>.</t>
  </dd>
  <dt>0x03:</dt>
  <dd>
    <t>Both the client and the server are expected to send media.</t>
  </dd>
</dl>

<t>The client <bcp14>MUST</bcp14> send a ROLE parameter with one of the three values specified above. The server <bcp14>MUST</bcp14> close the connection if the ROLE parameter is missing, is not one of the three above-specified values, or it is different from what the server expects based on the application in question.</t>

</section>
</section>
<section anchor="containers"><name>Containers</name>
<t>The container format describes how the underlying codec bitstream is encoded.
This includes timestamps, metadata, and generally anything required to decode and display the media.</t>

<t>This draft currently specifies only a single container format.
Future drafts and extensions may specifiy additional formats.</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Container Format</ttcol>
      <c>0x0</c>
      <c>fMP4 (<xref target="fmp4"/>)</c>
</texttable>

<section anchor="fmp4"><name>fMP4</name>
<t>A fragmented MP4 container  <xref target="ISOBMFF"/>.</t>

<t>The "Container Init Payload" in a CATALOG message (<xref target="message-catalog"/>) <bcp14>MUST</bcp14> consist of a File Type Box (ftyp) followed by a Movie Box (moov).
This Movie Box (moov) consists of Movie Header Boxes (mvhd), Track Header Boxes (tkhd), Track Boxes (trak), followed by a final Movie Extends Box (mvex).
These boxes <bcp14>MUST NOT</bcp14> contain any samples and <bcp14>MUST</bcp14> have a duration of zero.
A Common Media Application Format Header <xref target="CMAF"/> meets all these requirements.</t>

<t>The "Object Payload" in an OBJECT message (<xref target="message-object"/>) <bcp14>MUST</bcp14> consist of a Segment Type Box (styp) followed by any number of media fragments.
Each media fragment consists of a Movie Fragment Box (moof) followed by a Media Data Box (mdat).
The Media Fragment Box (moof) <bcp14>MUST</bcp14> contain a Movie Fragment Header Box (mfhd) and Track Box (trak) with a Track ID (<spanx style="verb">track_ID</spanx>) matching a Track Box in the initialization fragment.
A Common Media Application Format Segment <xref target="CMAF"/> meets all these requirements.</t>

<t>Media fragments can be packaged at any frequency, causing a trade-off between overhead and latency.
It is <bcp14>RECOMMENDED</bcp14> that a media fragment consists of a single frame to minimize latency.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="resource-exhaustion"><name>Resource Exhaustion</name>
<t>Live media requires significant bandwidth and resources.
Failure to set limits will quickly cause resource exhaustion.</t>

<t>Warp uses QUIC flow control to impose resource limits at the network layer.
Endpoints <bcp14>SHOULD</bcp14> set flow control limits based on the anticipated media bitrate.</t>

<t>The media producer prioritizes and transmits streams out of order.
Streams might be starved indefinitely during congestion.
The producer and consumer <bcp14>MUST</bcp14> cancel a stream, preferably the lowest priority, after reaching a resource limit.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>TODO: fill out currently missing registries:
* Warp version numbers
* SETUP parameters
* Track format numbers
* Message types
* Object headers</t>

</section>
<section anchor="appendix.encoding"><name>Appendix A. Video Encoding</name>
<t>In order to transport media, we first need to know how media is encoded.
This section is an overview of media encoding.</t>

<section anchor="tracks"><name>Tracks</name>
<t>A broadcast consists of one or more tracks.
Each track has a type (audio, video, caption, etc) and uses a corresponding codec.
There may be multiple tracks, including of the same type for a number of reasons.</t>

<t>For example:</t>

<t><list style="symbols">
  <t>A track for each codec.</t>
  <t>A track for each resolution and bitrate.</t>
  <t>A track for each language.</t>
  <t>A track for each camera feed.</t>
</list></t>

<t>Tracks can be muxed together into a single container or stream.
The goal of Warp is to independently deliver tracks, and even parts of a track, so this is not allowed.
Each Warp object <bcp14>MUST</bcp14> contain a single track.</t>

</section>
<section anchor="appendix.init"><name>Init</name>
<t>Media codecs have a wide array of configuration options.
For example, the resolution, the color space, the features enabled, etc.</t>

<t>Before playback can begin, the decoder needs to know the configuration.
This is done via a short payload at the very start of the media file.
The initialization payload <bcp14>MAY</bcp14> be cached and reused between objects with the same configuration.</t>

</section>
<section anchor="appendix.video"><name>Video</name>
<t>Video is a sequence of pictures (frames) with a presentation timestamp (PTS).</t>

<t>An I-frame is a frame with no dependencies and is effectively an image file.
These frames are usually inserted at a frequent interval to support seeking or joining a live stream.
However they can also improve compression when used at scene boundaries.</t>

<t>A P-frame is a frame that references on one or more earlier frames.
These frames are delta-encoded, such that they only encode the changes (motion).
This result in a massive file size reduction for most content outside of few notorious cases (ex. confetti).</t>

<t>A common encoding structure is to only reference the previous frame, as it is simple and minimizes latency:</t>

<figure><artwork><![CDATA[
 I <- P <- P <- P   I <- P <- P <- P   I <- P ...
]]></artwork></figure>

<t>There is no such thing as an optimal encoding structure.
Encoders tuned for the best quality will produce a tangled spaghetti of references.
Encoders tuned for the lowest latency can avoid reference frames to allow more to be dropped.</t>

<section anchor="appendix.b-frame"><name>B-Frames</name>
<t>The goal of video codecs is to maximize compression.
One of the improvements is to allow a frame to reference later frames.</t>

<t>A B-frame is a frame that can reference one or more frames in the future, and any number of frames in the past.
These frames are more difficult to encode/decode as they require buffering and reordering.</t>

<t>A common encoding structure is to use B-frames in a fixed pattern.
Such a fixed pattern is not optimal, but it's simpler for hardware encoding:</t>

<figure><artwork><![CDATA[
    B     B         B     B         B
   / \   / \       / \   / \       / \
  v   v v   v     v   v v   v     v   v
 I <-- P <-- P   I <-- P <-- P   I <-- P ...
]]></artwork></figure>

</section>
<section anchor="timestamps"><name>Timestamps</name>
<t>Each frame is assigned a presentation timestamp (PTS), indicating when it should be shown relative to other frames.</t>

<t>The encoder outputs the bitstream in decode order, which means that each frame is output after its references.
This makes it easier for the decoder as all references are earlier in the bitstream and can be decoded immediately.</t>

<t>However, this causes problems with B-frames because they depend on a future frame, and some reordering has to occur.
In order to keep track of this, frames have a decode timestamp (DTS) in addition to a presentation timestamp (PTS).
A B-frame will have higher DTS value that its dependencies, while PTS and DTS will be the same for other frame types.</t>

<t>For the example above, this would look like:</t>

<figure><artwork><![CDATA[
     0 1 2 3 4 5 6 7 8 9 10
PTS: I B P B P I B P B P B
DTS: I   PB  PBI   PB  PB
]]></artwork></figure>

<t>B-frames add latency because of this reordering so they are usually not used for conversational latency.</t>

</section>
<section anchor="appendix.gop"><name>Group of Pictures</name>
<t>A group of pictures (GoP) is an I-frame followed by any number of frames until the next I-frame.
All frames <bcp14>MUST</bcp14> reference, either directly or indirectly, only the most recent I-frame.</t>

<figure><artwork><![CDATA[
        GoP               GoP            GoP
+-----------------+-----------------+---------------
|     B     B     |     B     B     |     B
|    / \   / \    |    / \   / \    |    / \
|   v   v v   v   |   v   v v   v   |   v   v
|  I <-- P <-- P  |  I <-- P <-- P  |  I <-- P ...
+-----------------+-----------------+--------------
]]></artwork></figure>

<t>This is a useful abstraction because GoPs can always be decoded independently.</t>

</section>
<section anchor="appendix.svc"><name>Scalable Video Coding</name>
<t>Some codecs support scalable video coding (SVC), in which the encoder produces multiple bitstreams in a hierarchy.
This layered coding means that dropping the top layer degrades the user experience in a configured way.
Examples include reducing the resolution, picture quality, and/or frame rate.</t>

<t>Here is an example SVC encoding with 3 resolutions:</t>

<figure><artwork><![CDATA[
      +-------------------------+------------------
   4k |  P <- P <- P <- P <- P  |  P <- P <- P ...
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+------------------
1080p |  P <- P <- P <- P <- P  |  P <- P <- P ...
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+------------------
 360p |  I <- P <- P <- P <- P  |  I <- P <- P ...
      +-------------------------+------------------
]]></artwork></figure>

</section>
</section>
<section anchor="appendix.audio"><name>Audio</name>
<t>Audio is dramatically simpler than video as it is not typically delta encoded.
Audio samples are grouped together (group of samples) at a configured rate, also called a "frame".</t>

<t>The encoder spits out a continuous stream of samples (S):</t>

<figure><artwork><![CDATA[
S S S S S S S S S S S S S ...
]]></artwork></figure>

</section>
</section>
<section anchor="appendix.examples"><name>Appendix B. Object Examples</name>
<t>Warp offers a large degree of flexibility on how objects are fragmented and prioritized.
There is no best solution; it depends on the desired complexity and user experience.</t>

<t>This section provides a summary of some options available.</t>

<section anchor="video"><name>Video</name>

<section anchor="group-of-pictures"><name>Group of Pictures</name>
<t>A group of pictures (GoP) is consists of an I-frame and all frames that directly or indirectly reference it (<xref target="appendix.gop"/>).
The tail of a GoP can be dropped without causing decode errors, even if the encoding is otherwise unknown, making this the safest option.</t>

<t>It is <bcp14>RECOMMENDED</bcp14> that each object consist of a single GoP.
For example:</t>

<figure><artwork><![CDATA[
     object 1        object 2     object 3
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
]]></artwork></figure>

<t>Depending on the video encoding, this approach may introduce unnecessary ordering and dependencies.
A better option may be available below.</t>

</section>
<section anchor="scalable-video-coding"><name>Scalable Video Coding</name>
<t>Some codecs support scalable video coding (SVC), in which the encoder produces multiple bitstreams in a hierarchy (<xref target="appendix.svc"/>).</t>

<t>When SVC is used, it is <bcp14>RECOMMENDED</bcp14> that each object consist of a single layer and GoP.
For example:</t>

<figure><artwork><![CDATA[
                object 3              object 6
      +-------------------------+---------------
   4k |  P <- P <- P <- P <- P  |  P <- P <- P
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+--------------

                object 2              object 5
      +-------------------------+---------------
1080p |  P <- P <- P <- P <- P  |  P <- P <- P
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+--------------

                object 1              object 4
      +-------------------------+---------------
 360p |  I <- P <- P <- P <- P  |  I <- P <- P
      +-------------------------+---------------
]]></artwork></figure>

</section>
<section anchor="frames"><name>Frames</name>
<t>With full knowledge of the encoding, the encoder <bcp14>MAY</bcp14> can split a GoP into multiple objects based on the frame.
However, this is highly dependent on the encoding, and the additional complexity might not improve the user experience.</t>

<t>For example, we could split our example B-frame structure (<xref target="appendix.b-frame"/>) into 13 objects:</t>

<figure><artwork><![CDATA[
      2     4           7     9           12
+--------+--------+--------+--------+-----------+
|     B  |  B     |     B  |  B     |     B     |
|-----+--+--+-----+-----+--+--+-----+-----+-----+
|  I  |  P  |  P  |  I  |  P  |  P  |  I  |  P  |
+-----+-----+-----+-----+-----+-----+-----+-----+
   1     3     5     6     8     10    11    13
]]></artwork></figure>

<t>Objects can be merged with their dependency to reduce the total number of objects.
QUIC streams will deliver each object in order so the QUIC library performs the reordering.</t>

<t>The same GoP structure can be represented using eight objects:</t>

<figure><artwork><![CDATA[
      2     3           5     6           8
+--------+--------+-----------------+------------
|     B  |  B     |     B  |  B     |     B     |
+--------+--------+--------+--------+-----------+
|  I     P     P  |  I     P     P  |  I     P
+-----------------+-----------------+------------
         1                 4              7
]]></artwork></figure>

<t>We can further reduce the number of objects by combining frames that don't depend on each other.
The only restriction is that frames can only reference frames earlier in the object.
For example, non-reference frames can have their own object so they can be prioritized or dropped separate from reference frames.</t>

<t>The same GoP structure can also be represented using six objects, although we've removed the ability to drop individual B-frames:</t>

<figure><artwork><![CDATA[
    object 2      object 4    object 6
+-------------+-------------+---------
|    B   B    |    B   B    |    B
+-------------+-------------+---------
|  I   P   P  |  I   P   P  |  I   P
+-------------+-------------+---------
    object 1      object 3    object 5
]]></artwork></figure>

</section>
<section anchor="init"><name>Init</name>
<t>Initialization data (<xref target="appendix.init"/>) is required to initialize the decoder.
Each object <bcp14>MAY</bcp14> start with initialization data although this adds overhead.</t>

<t>Instead, it is <bcp14>RECOMMENDED</bcp14> to create a init object.
Each media object can then depend on the init object to avoid the redundant overhead.
For example:</t>

<figure><artwork><![CDATA[
     object 2        object 3     object 5
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
|              init             |  init
+-------------------------------+---------
              object 1            object 4
]]></artwork></figure>

</section>
</section>
<section anchor="audio"><name>Audio</name>
<t>Audio (<xref target="appendix.audio"/>) is much simpler than video so there's fewer options.</t>

<t>The simplest configuration is to use a single object for each audio track.
This may seem inefficient given the ease of dropping audio samples.
However, the audio bitrate is low and gaps cause quite a poor user experience, when compared to video.</t>

<figure><artwork><![CDATA[
          object 1
+---------------------------
| S S S S S S S S S S S S S
+---------------------------
]]></artwork></figure>

<t>An improvement is to periodically split audio samples into separate objects.
This gives the consumer the ability to skip ahead during severe congestion or temporary connectivity loss.</t>

<figure><artwork><![CDATA[
     object 1        object 2     object 3
+---------------+---------------+---------
| S  S  S  S  S | S  S  S  S  S | S  S  S
+---------------+---------------+---------
]]></artwork></figure>

<t>This frequency of audio objects is configurable, at the cost of additional overhead.
It's <bcp14>NOT RECOMMENDED</bcp14> to create a object for each audio frame because of this overhead.</t>

<t>Since video can only recover from severe congestion with an I-frame, so there's not much point recovering audio at a separate interval.
It is <bcp14>RECOMMENDED</bcp14> to create a new audio object at each video I-frame.</t>

<figure><artwork><![CDATA[
     object 1        object 3     object 5
+---------------+---------------+---------
| S  S  S  S  S | S  S  S  S  S | S  S  S
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
     object 2        object 4     object 6
]]></artwork></figure>

</section>
<section anchor="appendix.delivery-order"><name>Delivery Order</name>
<t>The delivery order (<xref target="delivery-order"/> depends on the desired user experience during congestion:</t>

<t><list style="symbols">
  <t>if media should be skipped: delivery order = PTS</t>
  <t>if media should not be skipped: delivery order = -PTS</t>
  <t>if video should be skipped before audio: audio delivery order &lt; video delivery order</t>
</list></t>

<t>The delivery order may be changed if the content changes.
For example, switching from a live stream (skippable) to an advertisement (unskippable).</t>

</section>
</section>
<section numbered="false" anchor="contributors"><name>Contributors</name>

<t><list style="symbols">
  <t>Alan Frindell</t>
  <t>Charles Krasic</t>
  <t>Cullen Jennings</t>
  <t>James Hurley</t>
  <t>Jordi Cenzano</t>
  <t>Mike English</t>
  <t>Will Law</t>
  <t>Ali Begen</t>
</list></t>

</section>


  </middle>

  <back>


    <references title='Normative References'>





<reference anchor='QUIC' target='https://www.rfc-editor.org/info/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='QUIC-RECOVERY' target='https://www.rfc-editor.org/info/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='WebTransport'>
   <front>
      <title>WebTransport over HTTP/3</title>
      <author fullname='Alan Frindell' initials='A.' surname='Frindell'>
         <organization>Facebook</organization>
      </author>
      <author fullname='Eric Kinnear' initials='E.' surname='Kinnear'>
         <organization>Apple Inc.</organization>
      </author>
      <author fullname='Victor Vasiliev' initials='V.' surname='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'/>
   <format target='https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-03.txt' type='TXT'/>
</reference>



<reference anchor='URI' target='https://www.rfc-editor.org/info/rfc3986'>
<front>
<title>Uniform Resource Identifier (URI): Generic Syntax</title>
<author fullname='T. Berners-Lee' initials='T.' surname='Berners-Lee'><organization/></author>
<author fullname='R. Fielding' initials='R.' surname='Fielding'><organization/></author>
<author fullname='L. Masinter' initials='L.' surname='Masinter'><organization/></author>
<date month='January' year='2005'/>
<abstract><t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='66'/>
<seriesInfo name='RFC' value='3986'/>
<seriesInfo name='DOI' value='10.17487/RFC3986'/>
</reference>


<reference anchor="ISOBMFF" >
  <front>
    <title>Information technology — Coding of audio-visual objects — Part 12: ISO Base Media File Format</title>
    <author >
      <organization></organization>
    </author>
    <date year="2015" month="December"/>
  </front>
</reference>




<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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>



<reference anchor='RFC9000' target='https://www.rfc-editor.org/info/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>




    </references>

    <references title='Informative References'>

<reference anchor="CMAF" >
  <front>
    <title>Information technology -- Multimedia application format (MPEG-A) -- Part 19: Common media application format (CMAF) for segmented media</title>
    <author >
      <organization></organization>
    </author>
    <date year="2020" month="March"/>
  </front>
</reference>




<reference anchor='NewReno' target='https://www.rfc-editor.org/info/rfc6582'>
<front>
<title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
<author fullname='T. Henderson' initials='T.' surname='Henderson'><organization/></author>
<author fullname='S. Floyd' initials='S.' surname='Floyd'><organization/></author>
<author fullname='A. Gurtov' initials='A.' surname='Gurtov'><organization/></author>
<author fullname='Y. Nishida' initials='Y.' surname='Nishida'><organization/></author>
<date month='April' year='2012'/>
<abstract><t>RFC 5681 documents the following four intertwined TCP congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery.  RFC 5681 explicitly allows certain modifications of these algorithms, including modifications that use the TCP Selective Acknowledgment (SACK) option (RFC 2883), and modifications that respond to &quot;partial acknowledgments&quot; (ACKs that cover new data, but not all the data outstanding when loss was detected) in the absence of SACK.  This document describes a specific algorithm for responding to partial acknowledgments, referred to as &quot;NewReno&quot;.  This response to partial acknowledgments was first proposed by Janey Hoe.  This document obsoletes RFC 3782.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6582'/>
<seriesInfo name='DOI' value='10.17487/RFC6582'/>
</reference>


<reference anchor='BBR'>
   <front>
      <title>BBR Congestion Control</title>
      <author fullname='Neal Cardwell' initials='N.' surname='Cardwell'>
         <organization>Google</organization>
      </author>
      <author fullname='Yuchung Cheng' initials='Y.' surname='Cheng'>
         <organization>Google</organization>
      </author>
      <author fullname='Soheil Hassas Yeganeh' initials='S. H.' surname='Yeganeh'>
         <organization>Google</organization>
      </author>
      <author fullname='Ian Swett' initials='I.' surname='Swett'>
         <organization>Google</organization>
      </author>
      <author fullname='Van Jacobson' initials='V.' surname='Jacobson'>
         <organization>Google</organization>
      </author>
      <date day='7' month='March' year='2022'/>
      <abstract>
	 <t>   This document specifies the BBR congestion control algorithm.  BBR
   (&quot;Bottleneck Bandwidth and Round-trip propagation time&quot;) uses recent
   measurements of a transport connection&#39;s delivery rate, round-trip
   time, and packet loss rate to build an explicit model of the network
   path.  BBR then uses this model to control both how fast it sends
   data and the maximum volume of data it allows in flight in the
   network at any time.  Relative to loss-based congestion control
   algorithms such as Reno [RFC5681] or CUBIC [RFC8312], BBR offers
   substantially higher throughput for bottlenecks with shallow buffers
   or random losses, and substantially lower queueing delays for
   bottlenecks with deep buffers (avoiding &quot;bufferbloat&quot;).  BBR can be
   implemented in any transport protocol that supports packet-delivery
   acknowledgment.  Thus far, open source implementations are available
   for TCP [RFC793] and QUIC [RFC9000].  This document specifies version
   2 of the BBR algorithm, also sometimes referred to as BBRv2 or bbr2.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-cardwell-iccrg-bbr-congestion-control-02'/>
   <format target='https://www.ietf.org/archive/id/draft-cardwell-iccrg-bbr-congestion-control-02.txt' type='TXT'/>
</reference>




    </references>



  </back>

<!-- ##markdown-source:
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
Ihds0o3Mt0R2E2hoEYjC5cjRIfuZbTT7ctrpoECiS4N5eUrpbMHFU5QuT2dy
dfHqLHgWqzkxZRE0TZ9AoC6bUZ6rccJloC3vB7fPTXPJbIpHfv8VJYN3zvoY
u0of3B8cRBjgGThrjxt2ZeIw5JHi1teCLdi4mlUVouIs6KAZ0ADiA5cDowPX
1SCy3xTIG9ZwSG33nYh0RS1Rp23WFdn5UrTAL0WxGWeoUzC/3QmZtSgXZAf1
dn9Ikz+NJxdh8n9+cmeyB3M/o7kp8rbTfS6NRrrWEnsWfcFj2j7stqOQz0Jc
195jlY5BTdbW497ZuAvh625czohj9bV9xta0NMvAz8rLIJ8i51e0mrrfaTKI
rElxMMqVC8P7gIiUtikJf95Yst3WljIU60rct3qKBL6OqBcPnjuVl5iwGLvf
auMfNeTkxpudzcep6dVKqyX9Ebu2IL6USMFnpT5WvZPtzQ17LwMriaMawpHR
vYt57DLUJrrMgZvxPhh5DAKNWwb5Q3HFIIw4e335HIXSbLl6TiGth6JZHLzC
V3qj8AY2HMNvG+xauW/RFZE86raWH3FN06dYdHuugYAVHV+uWqSo9XF5nzye
1ZvVXuvKnNeghcjXy7Jcqw+t/XF0BwZ/+QP3W4FnsEBiuV5M9/pibMRf1bfB
V/pZld7u9Vtr4S4rPPoZIgDYpLyEtbnf05TiMY3g7POwtYFeZoMYRA9IxbDW
f+Li0WhCy1wufuSeAKOANAU9ZA/v3+MFkB8/AuwxRy/lPKPtznN0iLErkw+v
+JS6l46zu+aLJ4Ljs9vHF7VzYN6vWGelo1n8aesuE4b1S/1Sz3u2hSU0yCkG
A/gZYBx8IHqpZ8cQrYYWrbk8jsDzM8AQOjWHJIIiakV499o7sll/OT99twes
oZ5Ibah/MYvir1p/oQD4lKNX0H/q2b+OAa+JZHqToaaRzSqO+W76lA3K63at
7nyfABAgC83edSXIHUWMpOw9fL7CceV6rqBdsS9tRrXcANNGzfdEmsoTNKwk
okuq/dn9AhZNGXRBpqRAwoZ5p0GljHQx5Wx/4PNpljd8KSJWoHB6MbvF8EbK
W2w+TMnVLsHfuFm1nwy1uCYjJkpV5sKUMnxXhhfJrLmf0tH3zBUMal26qbuS
n1siHOPu2Sp1l8BqiqdwgLhdU5BTa6O+hLZdmCLZ81LSKH0FgqqLsLSiq/Lr
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
Zhfw589odL9K72iuLDk2c1P0/hdeFge87awAAA==

-->

</rfc>

