| Internet-Draft | moq-transport | July 2024 |
| Curley, et al. | Expires 9 January 2025 | [Page] |
This document defines the core behavior for Media over QUIC Transport(MOQT), a media transport protocol designed to operate over QUIC andWebTransport, which have similar functionality. MOQT allows a producer ofmedia to publish data and have it consumed via subscription by amultiplicity of endpoints. It supports intermediate content distributionnetworks and is designed for high scale and low latency distribution.¶
This note is to be removed before publishing as an RFC.¶
Discussion of this document takes place on the Media Over QUIC Working Group mailing list (moq@ietf.org), which is archived athttps://mailarchive.ietf.org/arch/browse/moq/.¶
Source for this draft and an issue tracker can be found athttps://github.com/moq-wg/moq-transport.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is athttps://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 9 January 2025.¶
Copyright (c) 2024 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
Media Over QUIC Transport (MOQT) is a protocol that is optimizedfor the QUIC protocol[QUIC], either directly or via WebTransport[WebTransport], for the dissemination of media. MOQT utilizes apublish/subscribe workflow in which producers of media publish data inresponse to subscription requests from a multiplicity of endpoints. MOQTsupports wide range of use-cases with different resiliency and latency(live, interactive) needs without compromising the scalability and costeffectiveness associated with content delivery networks.¶
MOQT is a generic protocol is designed to work in concert with multipleMoQ Streaming Formats. These MoQ Streaming Formats define how content isencoded, packaged, and mapped to MOQT objects, along with policies fordiscovery and subscription.¶
The development of MOQT is driven by goals in a number of areas -specifically latency, the robustness of QUIC, workflow efficiency andrelay support.¶
HTTP Adaptive Streaming (HAS) has been successful at achieving scalealthough often at the cost of latency. Latency is necessary to correctfor variable network throughput. Ideally live content is consumed at thesame bitrate it is produced. End-to-end latency would be fixed and onlysubject to encoding and transmission delays. Unfortunately, networkshave variable throughput, primarily due to congestion. Attempting todeliver content encoded at a higher bitrate than the network can supportcauses queuing along the path from producer to consumer. The speed atwhich a protocol can detect and respond to queuing determines theoverall latency. TCP-based protocols are simple but are slow to detectcongestion and suffer from head-of-line blocking. Protocols utilizingUDP directly can avoid queuing, but the application is then responsiblefor the complexity of fragmentation, congestion control, retransmissions,receiver feedback, reassembly, and more. One goal of MOQT is to achievethe best of both these worlds: leverage the features of QUIC to create asimple yet flexible low latency protocol that can rapidly detect andrespond to congestion.¶
The parallel nature of QUIC streams can provide improvements in the faceof loss. A goal of MOQT is to design a streaming protocol to leveragethe transmission benefits afforded by parallel QUIC streams as wellexercising options for flexible loss recovery. Applying[QUIC] to HASvia HTTP/3 has not yet yielded generalized improvements inthroughput. One reason for this is that sending segments down a singleQUIC stream still allows head-of-line blocking to occur.¶
Internet delivered media today has protocols optimized for ingest andseparate protocols optimized for distribution. This protocol switch inthe distribution chain necessitates intermediary origins whichre-package the media content. While specialization can have itsbenefits, there are gains in efficiency to be had in not having tore-package content. A goal of MOQT is to develop a single protocol whichcan be used for transmission from contribution to distribution. Arelated goal is the ability to support existing encoding and packagingschemas, both for backwards compatibility and for interoperability withthe established content preparation ecosystem.¶
An integral feature of a protocol being successful is its ability todeliver media at scale. Greatest scale is achieved when third-partynetworks, independent of both the publisher and subscriber, can beleveraged to relay the content. These relays must cache content fordistribution efficiency while simultaneously routing content anddeterministically responding to congestion in a multi-tenant network. Agoal of MOQT is to treat relays as first-class citizens of the protocoland ensure that objects are structured such that information necessaryfor distribution is available to relays while the media content itselfremains opaque and private.¶
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 asdescribed in BCP 14[RFC2119][RFC8174] when, and only when, theyappear in all capitals, as shown here.¶
The party initiating a MoQ transport session.¶
The party accepting an incoming transport session.¶
A Client or Server.¶
An endpoint that handles subscriptions by sending requested Objects from the requested track.¶
An endpoint that subscribes to and receives tracks.¶
The initial publisher of a given track.¶
A subscriber that initiates a subscription and does not send the data on to other subscribers.¶
An entitly that is both a Publisher and a Subscriber, but not the OriginalPublisher or End Subscriber.¶
In the direction of the Original Publisher¶
In the direction of the End Subscriber(s)¶
A raw QUIC connection or a WebTransport session.¶
Packet loss and queuing caused by degraded or overloaded networks.¶
A temporal sequence of objects. A group represents a join point in atrack. See (Section 2.2).¶
An object is an addressable unit whose payload is a sequence ofbytes. Objects form the base element in the MOQT model. See(Section 2.1).¶
An encoded bitstream. Tracks contain a sequential series of one ormore groups and are the subscribable entity with MOQT.See (Section 2.3).¶
This document uses the conventions detailed in ([RFC9000],Section 1.3)when describing the binary encoding.¶
As a quick reference, the following list provides a non normative summaryof the parts of RFC9000 field syntax that are used in this specification.¶
Indicates that x is L bits long¶
Indicates that x holds an integer value using the variable-lengthencoding as described in ([RFC9000],Section 16)¶
Indicates that x can be any length including zero bits long. Values in this format always end on a byte boundary.¶
Indicates that x is optional and has a length of L¶
Indicates that x is repeated zero or more times and that each instancehas a length of L¶
This document extends the RFC9000 syntax and with the additional field types:¶
Indicates that x consists of a variable length integer encoding asdescribed in ([RFC9000],Section 16), followed by that many bytesof binary data¶
Indicates that x is a flag and is encoded as a single byte with thevalue 0 or 1. A value of 0 indicates the flag is false or off, while avalue of 1 indicates the flag is true or on. Any other value is aprotocol error andSHOULD terminate the session with a ProtocolViolation (Section 3.5).¶
To reduce unnecessary use of bandwidth, variable length integersSHOULDbe encoded using the least number of bytes possible to represent therequired value.¶
MOQT has a hierarchical object model for data, comprised of objects,groups and tracks.¶
The basic data element of MOQT is an object. An object is anaddressable unit whose payload is a sequence of bytes. All objectsbelong to a group, indicating ordering and potentialdependencies.Section 2.2 An object is uniquely identified byits track namespace, track name, group ID, and object ID, and must be anidentical sequence of bytes regardless of how or where it is retrieved.An Object can become unavailable, but it's contentsMUST NOT change overtime.¶
Objects are comprised of two parts: metadata and a payload. The metadata isnever encrypted and is always visible to relays. The payload portion may beencrypted, in which case it is only visible to the Original Publisher and EndSubscribers. The application is solely responsible for the content of the objectpayload. This includes the underlying encoding, compression, any end-to-endencryption, or authentication. A relayMUST NOT combine, split, or otherwisemodify object payloads.¶
A group is a collection of objects and is a sub-unit of a track(Section 2.3). Objects within a groupSHOULD NOT depend on objectsin other groups. A group behaves as a join point for subscriptions.A new subscriber might not want to receive the entire track, and mayinstead opt to receive only the latest group(s). The publisher thenselectively transmits objects based on their group membership.¶
A track is a sequence of groups (Section 2.2). It is the entityagainst which a subscriber issues a subscription request. A subscribercan request to receive individual tracks starting at a group boundary,including any new objects pushed by the publisher while the track isactive.¶
In MOQT, every track has a track name and a track namespace associatedwith it. A track name identifies an individual track within thenamespace.¶
A MOQT scope is a set of servers (as identified by their connectionURIs) for which the tuple of Track Name and Track Namespace areguaranteed to be unique and identify a specific track. It is up tothe application using MOQT to define how broad or narrow the scope is.An application that deals with connections between deviceson a local network may limit the scope to a single connection; bycontrast, an application that uses multiple CDNs to serve media mayrequire the scope to include all of those CDNs.¶
Because the tuple of Track Namespace and Track Name are unique within anMOQT scope, they can be used as a cache key.MOQT does not provide any in-band content negotiation methods similar tothe ones defined by HTTP ([RFC9110],Section 10); if, at a givenmoment in time, two tracks within the same scope contain different data,they have to have different names and/or namespaces.¶
In this specification, both the Track Namespace and the Track Name arenot constrained to a specific encoding. They carry a sequence ofbytes and comparison between two Track Namespaces or Track Names isdone by exact comparison of the bytes. Specifications that use MoQ Transportmay constrain the information in these fields, for example by restrictingthem to UTF-8. Any specification that does needs to specify thecanonicalization into the bytes in the Track Namespace or Track Namesuch that exact comparison works.¶
Each trackMAY have one or more associated connection URLs specifyingnetwork hosts through which a track may be accessed. The syntax of theConnection URL and the associated connection setup procedures arespecific to the underlying transport protocol usageSection 3.¶
This document defines a protocol that can be used interchangeably bothover a QUIC connection directly[QUIC], and over WebTransport[WebTransport]. Both provide streams and datagrams with similarsemantics (see[I-D.ietf-webtrans-overview],Section 4); thus, themain difference lies in how the servers are identified and how theconnection is established. When using QUIC, datagramsMUST besupported via the [QUIC-DATAGRAM] extension, which is already arequirement for WebTransport over HTTP/3.¶
There is no definition of the protocol over other transports,such as TCP, and applications using MoQ might need to fallback toanother protocol when QUIC or WebTransport aren't available.¶
A MOQT server that is accessible via WebTransport can be identifiedusing an HTTPS URI ([RFC9110],Section 4.2.2). A MOQT session can beestablished by sending an extended CONNECT request to the host and thepath indicated by the URI, as described in[WebTransport],Section 3.¶
A MOQT server that is accessible via native QUIC can be identified by aURI with a "moq" scheme. The "moq" URI scheme is defined as follows,using definitions from[RFC3986]:¶
moq-URI = "moqt" "://" authority path-abempty [ "?" query ]¶
Theauthority portionMUST NOT contain a non-emptyhost portion.Themoq URI scheme supports the/.well-known/ path prefix defined in[RFC8615].¶
This protocol does not specify any semantics on thepath-abempty andquery portions of the URI. The contents of those are left up to theapplication.¶
The client can establish a connection to a MoQ server identified by agiven URI by setting up a QUIC connection to the host and portidentified by theauthority section of the URI. Thepath-abemptyandquery portions of the URI are communicated to the server using thePATH parameter (Section 6.2.2.2) which is sent in the CLIENT_SETUP message at thestart of the session. The ALPN value[RFC7301] used by the protocolismoq-00.¶
Endpoints use the exchange of Setup messages to negotiate the MOQT version andany extensions to use.¶
The client indicates the MOQT versions it supports in the CLIENT_SETUP message(seeSection 6.2). It also includes the union of all Setup ParametersSection 6.2.2 required for a handshake by any of those versions.¶
Within any MOQT version, clients request the use of extensions by adding Setupparameters corresponding to that extension. No extensions are defined in thisdocument.¶
The server replies with a SERVER_SETUP message that indicates the chosenversion, includes all parameters required for a handshake in that version, andparameters for every extension requested by the client that it supports.¶
New versions of MOQTMUST specify which existing extensions can be used withthat version. New extensionsMUST specify the existing versions with which theycan be used.¶
If a given parameter carries the same information in multiple versions,but might have different optimal values in those versions, thereSHOULD beseparate Setup parameters for that information in each version.¶
The first stream opened is a client-initiated bidirectional control stream wherethe peers exchange Setup messages (Section 6.2). All messages defined inthis draft except OBJECT and OBJECT_WITH_LENGTH are sent on the control streamafter the Setup message. Control messagesMUST NOT be sent on any other stream,and a peer receiving a control message on a different stream closes the sessionas a 'Protocol Violation'. ObjectsMUST NOT be sent on the control stream, and apeer receiving an Object on the control stream closes the session as a 'ProtocolViolation'.¶
This draft only specifies a single use of bidirectional streams. Objects aresent on unidirectional streams. Because there are no other uses ofbidirectional streams, a peerMAY currently close the session as a'Protocol Violation' if it receives a second bidirectional stream.¶
The control streamMUST NOT be abruptly closed at the underlying transportlayer. Doing so results in the session being closed as a 'Protocol Violation'.¶
Streams aside from the control streamMAY be canceled due to congestionor other reasons by either the publisher or subscriber. Early termination of astream does not affect the MoQ application state, and therefore has noeffect on outstanding subscriptions.¶
The transport session can be terminated at any point. When native QUICis used, the session is closed using the CONNECTION_CLOSE frame([QUIC],Section 19.19). When WebTransport is used, the session isclosed using the CLOSE_WEBTRANSPORT_SESSION capsule ([WebTransport],Section 5).¶
The applicationMAY use any error message andSHOULD use a relevantcode, as defined below:¶
| Code | Reason |
|---|---|
| 0x0 | No Error |
| 0x1 | Internal Error |
| 0x2 | Unauthorized |
| 0x3 | Protocol Violation |
| 0x4 | Duplicate Track Alias |
| 0x5 | Parameter Length Mismatch |
| 0x10 | GOAWAY Timeout |
No Error: The session is being terminated without an error.¶
Internal Error: An implementation specific error occurred.¶
Unauthorized: The endpoint breached an agreement, whichMAY have been pre-negotiated by the application.¶
Protocol Violation: The remote endpoint performed an action that wasdisallowed by the specification.¶
Duplicate Track Alias: The endpoint attempted to use a Track Aliasthat was already in use.¶
GOAWAY Timeout: The session was closed because the client took too long toclose the session in response to a GOAWAY (Section 6.3) message.See session migration (Section 3.6).¶
MoqTransport requires a long-lived and stateful session. However, a serviceprovider needs the ability to shutdown/restart a server without waiting for allsessions to drain naturally, as that can take days for long-form media.MoqTransport avoids this via the GOAWAY message (Section 6.3).¶
The server sends a GOAWAY message, signaling that the client should establish anew session and migrate any active subscriptions. The GOAWAY message may containa new URI for the new session, otherwise the current URI is reused. The serverSHOULD terminate the session with 'GOAWAY Timeout' after a sufficient timeout ifthere are still open subscriptions on a connection.¶
The GOAWAY message does not immediately impact subscription state. A subscriberSHOULD individually UNSUBSCRIBE for each existing subscription, while apublisherMAY reject new SUBSCRIBEs while in the draining state. When the serveris a subscriber, itSHOULD send a GOAWAY message prior to any UNSUBSCRIBEmessages.¶
After the client receives a GOAWAY, it'sRECOMMENDED that the client waits untilthere are no more active subscriptions before closing the session with NO_ERROR.Ideally this is transparent to the application using MOQT, which involvesestablishing a new session in the background and migrating active subscriptionsand announcements. The client can choose to delay closing the session if itexpects more OBJECTs to be delivered. The server closes the session with a'GOAWAY Timeout' if the client doesn't close the session quickly enough.¶
MoQ priorities allow a subscriber and original publisher to influencethe transmission order of Objects within a session in the presence ofcongestion.¶
Given the critical nature of control messages and their relativelysmall size, the control streamSHOULD be prioritized higher than allsubscribed Objects.¶
The subscriber indicates the priority of a subscription via theSubscriber Priority field and the original publisher indicates priorityin every stream or datagram header. As such, the subscriber's priority is aproperty of the subscription and the original publisher's priority is aproperty of the Track and the Objects it contains. In both cases, a lowervalue indicates a higher priority, with 0 being the highest priority.¶
The Subscriber Priority is considered first when selecting a subscriptionto send data on within a given session. When two or more subscriptionshave equal subscriber priority, the original publisher priority is considerednext and can change within the track, so subscriptions are prioritized basedon the highest priority data available to send. For example, if the subscriptionhad data at priority 6 and priority 10 to send, the subscription priority wouldbe 6. When both the subscriber and original publisher priorities for asubscription are equal, how much data to send from each subscription isimplementation-dependent, but the expectation is that all subscriptions willbe able to send some data.¶
The subscriber's priority can be changed via a SUBSCRIBE_UPDATE message.This updates the priority of all unsent data within the subscription,though the details of the reprioitization are implementation-specific.¶
Subscriptions have a Group Order of either 'Ascending' or 'Descending',which indicates whether the lowest or highest Group IdSHOULD be sent firstwhen multiple Groups are available to send. A subscriber can specify either'Ascending' or 'Descending' in the SUBSCRIBE message or they can specify theywant to use the Original Publisher's Group Order, which is indicated inthe corresponding SUBSCRIBE_OK.¶
Within the same Group, and the same priority level,Objects with a lower Object Id are always sent before objects with ahigher Object Id, regardless of the specified Group Order. If the priorityvaries within a Group, higher priority Objects are sent before lowerpriority Objects.¶
The Group Order cannot be changed via a SUBSCRIBE_UPDATE message, andinstead an UNSUBSCRIBE and SUBSCRIBE can be used.¶
RelaysSHOULD respect the subscriber and original publisher's priorities.RelaysSHOULD NOT directly use Subscriber Priority or Group Orderfrom incoming subscriptions for upstream subscriptions. Relays use ofSubscriber Priority for upstream subscriptions can be based onfactors specific to it, such as the popularity of thecontent or policy, or relays can specify the same value for allupstream subscriptions.¶
MoQ Sessions can span multiple namespaces, and priorities might notbe coordinated across namespaces. The subscriber's priority isconsidered first, so there is a mechanism for a subscriber to fixincompatibilities between different namespaces prioritization schemes.Additionally, it is anticipated that when multiple namespacesare present within a session, the namespaces could be coordinating,possibly part of the same application. In cases when pooling amongnamespaces is expected to cause issues, multiple MoQ sessions, eitherwithin a single connection or on multiple connections can be used.¶
Relays are leveraged to enable distribution scale in the MoQarchitecture. Relays can be used to form an overlay delivery network,similar in functionality to Content Delivery Networks(CDNs). Additionally, relays serve as policy enforcement points byvalidating subscribe and publish requests at the edge of a network.¶
Relays can cache Objects, but are not required to.¶
Subscribers interact with the Relays by sending a SUBSCRIBE(Section 6.4) control message for the tracks ofinterest. RelaysMUST ensure subscribers are authorized to access thecontent associated with the track. The authorizationinformation can be part of subscription request itself or part of theencompassing session. The specifics of how a relay authorizes a user areoutside the scope of this specification.¶
The subscriber making the subscribe request is notified of the result ofthe subscription, via SUBSCRIBE_OK (Section 6.12) or theSUBSCRIBE_ERRORSection 6.13 control message.The entity receiving the SUBSCRIBEMUST send only a single response toa given SUBSCRIBE of either SUBSCRIBE_OK or SUBSCRIBE_ERROR.¶
For successful subscriptions, the publisher maintains a list ofsubscribers for each track. Each new OBJECT belonging to thetrack within the subscription range is forwarded to each activesubscriber, dependent on the congestion response. A subscriptionremains active until the publisher of the track terminates thetrack with a SUBSCRIBE_DONE (seeSection 6.14).¶
ObjectsMUST NOT be sent for unsuccessful subscriptions, and if a subscriberreceives a SUBSCRIBE_ERROR after receiving objects, itMUST close the sessionwith a 'Protocol Violation'.¶
A relayMUST not reorder or drop objects received on a multi-object stream whenforwarding to subscribers, unless it has application specific information.¶
RelaysMAY aggregate authorized subscriptions for a given track whenmultiple subscribers request the same track. Subscription aggregationallows relays to make only a single forward subscription for thetrack. The published content received from the forward subscriptionrequest is cached and shared among the pending subscribers.¶
The applicationSHOULD use a relevant error code in SUBSCRIBE_ERROR,as defined below:¶
| Code | Reason |
|---|---|
| 0x0 | Internal Error |
| 0x1 | Invalid Range |
| 0x2 | Retry Track Alias |
The applicationSHOULD use a relevant status code inSUBSCRIBE_DONE, as defined below:¶
| Code | Reason |
|---|---|
| 0x0 | Unsubscribed |
| 0x1 | Internal Error |
| 0x2 | Unauthorized |
| 0x3 | Track Ended |
| 0x4 | Subscription Ended |
| 0x5 | Going Away |
| 0x6 | Expired |
Publishing through the relay starts with publisher sending ANNOUNCEcontrol message with aTrack Namespace (Section 2.3).¶
RelaysMUST ensure that publishers are authorized by:¶
Verifying that the publisher is authorized to publish the contentassociated with the set of tracks whose Track Namespace matches theannounced namespace. Specifics of where the authorization happens,either at the relays or forwarded for further processing, depends onthe way the relay is managed and is application specific (typicallybased on prior business agreement).¶
Relays respond with an ANNOUNCE_OK or ANNOUNCE_ERROR control messageproviding the result of announcement. The entity receiving theANNOUNCEMUST send only a single response to a given ANNOUNCE ofeither ANNOUNCE_OK or ANNOUNCE_ERROR. When a publisher wants to stopnew subscriptions for an announced namespace it sends an UNANNOUNCE.A subscriber indicates it will no longer route subscriptions for anamespace it previously responded ANNOUNCE_OK to by sending anANNOUNCE_CANCEL.¶
A relay manages sessions from multiple publishers and subscribers,connecting them based on the track namespace. ThisMUST use an exactmatch on track namespace unless otherwise negotiated by the application.For example, a SUBSCRIBE namespace=foobar message will be forwarded tothe session that sent ANNOUNCE namespace=foobar.¶
OBJECT message headers carry a short hop-by-hopTrack Alias that maps tothe Full Track Name (seeSection 6.12). Relays use theTrack Alias of an incoming OBJECT message to identify its track and findthe active subscribers for that track. RelaysMUST NOT depend on OBJECTpayload content for making forwarding decisions andMUST only depend on thefields, such as priority order and other metadata properties in theOBJECT message header. Unless determined by congestion response, RelaysMUST forward the OBJECT message to the matching subscribers.¶
MOQT encodes the delivery information for a stream via OBJECT headers(Section 6.11). A relayMUST NOT modify Object properties whenforwarding.¶
A relayMUST treat the object payload as opaque. A relayMUST NOTcombine, split, or otherwise modify object payloads. A relaySHOULDprioritize sending Objects based onSection 4.¶
A publisherSHOULD begin sending incomplete objects when available toavoid incurring additional latency.¶
A relay that reads from a stream and writes to stream in order willintroduce head-of-line blocking. Packet loss will cause stream data tobe buffered in the library, awaiting in order delivery, which willincrease latency over additional hops. To mitigate this, a relaySHOULDread and write stream data out of order subject to flow controllimits. See section 2.2 in[QUIC].¶
Unidirectional streams and datagrams contain Objects and all othermessages are sent on a bidirectional stream.¶
An endpoint that receives an unknown message typeMUST close the session.¶
MOQT Message { Message Type (i), Message Payload (..),}| ID | Messages |
|---|---|
| 0x0 | OBJECT_STREAM (Section 6.11.2) |
| 0x1 | OBJECT_DATAGRAM (Section 6.11.2) |
| 0x2 | SUBSCRIBE_UPDATE (Section 6.5) |
| 0x3 | SUBSCRIBE (Section 6.4) |
| 0x4 | SUBSCRIBE_OK (Section 6.12) |
| 0x5 | SUBSCRIBE_ERROR (Section 6.13) |
| 0x6 | ANNOUNCE (Section 6.15) |
| 0x7 | ANNOUNCE_OK (Section 6.7) |
| 0x8 | ANNOUNCE_ERROR (Section 6.8) |
| 0x9 | UNANNOUNCE (Section 6.16) |
| 0xA | UNSUBSCRIBE (Section 6.6) |
| 0xB | SUBSCRIBE_DONE (Section 6.14) |
| 0xC | ANNOUNCE_CANCEL (Section 6.9) |
| 0xD | TRACK_STATUS_REQUEST (Section 6.10) |
| 0xE | TRACK_STATUS (Section 6.17) |
| 0x10 | GOAWAY (Section 6.3) |
| 0x40 | CLIENT_SETUP (Section 6.2) |
| 0x41 | SERVER_SETUP (Section 6.2) |
| 0x50 | STREAM_HEADER_TRACK (Section 6.11.3) |
| 0x51 | STREAM_HEADER_GROUP (Section 6.11.3) |
Some messages include a Parameters field that encode optional messageelements. They contain a type, length, and value.¶
SendersMUST NOT repeat the same parameter type in a message. ReceiversSHOULD check that there are no duplicate parameters and close the sessionas a 'Protocol Violation' if found.¶
Receivers ignore unrecognized parameters.¶
The format of Parameters is as follows:¶
Parameter { Parameter Type (i), Parameter Length (i), Parameter Value (..),}Parameter Type is an integer that indicates the semantic meaning of theparameter. Setup message parameters use a namespace that is constant across allMoQ Transport versions. All other messages use a version-specific namespace. Forexample, the integer '1' can refer to different parameters for Setup messagesand for all other message types.¶
SETUP message parameter types are defined inSection 6.2.2. Version-specific parameter types are defined inSection 6.1.1.¶
The Parameter Length field of the String Parameter encodes the lengthof the Parameter Value field in bytes.¶
Each parameter description will indicate the data type in the Parameter Valuefield. If a receiver understands a parameter type, and the parameter lengthimplied by that type does not match the Parameter Length field, the receiverMUST terminate the session with error code 'Parameter Length Mismatch'.¶
Each version-specific parameter definition indicates the message types in whichit can appear. If it appears in some other type of message, itMUST be ignored.Note that since Setup parameters use a separate namespace, it is impossible forthese parameters to appear in Setup messages.¶
AUTHORIZATION INFO parameter (key 0x02) identifies a track's authorizationinformation in a SUBSCRIBE or ANNOUNCE message. This parameter is populated forcases where the authorization is required at the track level. The value is anASCII string.¶
TheCLIENT_SETUP andSERVER_SETUP messages are the first messages exchangedby the client and the server; they allows the peers to establish the mutuallysupported version and agree on the initial configuration before any objects areexchanged. It is a sequence of key-value pairs called Setup parameters; thesemantics and format of which can vary based on whether the client or server issending. To ensure future extensibility of MOQT, the peersMUST ignore unknownsetup parameters. TODO: describe GREASE for those.¶
The wire format of the Setup messages are as follows:¶
CLIENT_SETUP Message Payload { Number of Supported Versions (i), Supported Version (i) ..., Number of Parameters (i) ..., Setup Parameters (..) ...,}SERVER_SETUP Message Payload { Selected Version (i), Number of Parameters (i) ..., Setup Parameters (..) ...,}The available versions and Setup parameters are detailed in the next sections.¶
MoQ Transport versions are a 32-bit unsigned integer, encoded as a varint.This version of the specification is identified by the number 0x00000001.Versions with the most significant 16 bits of the version number cleared arereserved for use in future IETF consensus documents.¶
The client offers the list of the protocol versions it supports; theserverMUST reply with one of the versions offered by the client. If theserver does not support any of the versions offered by the client, orthe client receives a server version that it did not offer, thecorresponding peerMUST close the session.¶
[[RFC editor: please remove the remainder of this section beforepublication.]]¶
The version number for the final version of this specification (0x00000001), isreserved for the version of the protocol that is published as an RFC.Version numbers used to identify IETF drafts are created by adding the draftnumber to 0xff000000. For example, draft-ietf-moq-transport-13 would beidentified as 0xff00000D.¶
The ROLE parameter (key 0x00) allows each endpoint to independently specify whatfunctionality they support for the session. It has three possible values,which are of type varint:¶
The endpoint can process subscriptions and send objects, but not subscribe.The endpointMUST NOT send a SUBSCRIBE message and an ANNOUNCEMUST NOT besent to it.¶
The endpoint can send subscriptions and receive objects, but not publish.The endpointMUST NOT send an ANNOUNCE message and a SUBSCRIBEMUST NOT besent to it.¶
The endpoint can act as a publisher or subscriber, and can send or processany message type.¶
Both endpointsMUST send a ROLE parameter with one of the three valuesspecified above. Both endpointsMUST close the session if the ROLEparameter is missing or is not one of the three above-specified values.¶
The PATH parameter (key 0x01) allows the client to specify the path ofthe MoQ URI when using native QUIC ([QUIC]). ItMUST NOT be used bythe server, or when WebTransport is used. If the peer receives a PATHparameter from the server, or when WebTransport is used, itMUST closethe connection. It follows the URI formatting rules[RFC3986].¶
When connecting to a server using a URI with the "moq" scheme, theclientMUST set the PATH parameter to thepath-abempty portion of theURI; ifquery is present, the clientMUST concatenate?, followed bythequery portion of the URI to the parameter.¶
The server sends aGOAWAY message to initiate session migration(Section 3.6) with an optional URI.¶
The serverMUST terminate the session with a Protocol Violation(Section 3.5) if it receives a GOAWAY message. The clientMUSTterminate the session with a Protocol Violation (Section 3.5) if itreceives multiple GOAWAY messages.¶
GOAWAY Message { New Session URI (b)}New Session URI: The clientMUST use this URI for the new session if provided.If the URI is zero bytes long, the current URI is reused instead. The newsession URISHOULD use the same scheme as the current URL to ensurecompatibility.¶
The subscriber specifies a filter on the subscription to allowthe publisher to identify which objects need to be delivered.¶
There are 4 types of filters:¶
Latest Group (0x1) : Specifies an open-ended subscription with objectsfrom the beginning of the current group.¶
Latest Object (0x2): Specifies an open-ended subscription beginning fromthe current object of the current group.¶
AbsoluteStart (0x3): Specifies an open-ended subscription beginningfrom the object identified in the StartGroup and StartObject fields.¶
AbsoluteRange (0x4): Specifies a closed subscription starting at StartObjectin StartGroup and ending at EndObject in EndGroup. The start and end of therange are inclusive. EndGroup and EndObjectMUST specify the same or a laterobject than StartGroup and StartObject.¶
A filter type other than the aboveMUST be treated as error.¶
A subscriber issues a SUBSCRIBE to a publisher to request a track.¶
The format of SUBSCRIBE is as follows:¶
SUBSCRIBE Message { Subscribe ID (i), Track Alias (i), Track Namespace (b), Track Name (b), Subscriber Priority (8), Group Order (8), Filter Type (i), [StartGroup (i), StartObject (i)], [EndGroup (i), EndObject (i)], Number of Parameters (i), Subscribe Parameters (..) ...}Subscribe ID: The subscription identifier that is unique within the session.Subscribe ID is a monotonically increasing variable length integer whichMUST not be reused within a session.Subscribe ID is used by subscribers andthe publishers to identify a given subscription. Subscribers specify theSubscribe ID and it is included in the corresponding SUBSCRIBE_OK orSUBSCRIBE_ERROR messages.¶
Track Alias: A session specific identifier for the track.Messages that reference a track, such as OBJECT (Section 6.11),reference this Track Alias instead of the Track Name and Track Namespace toreduce overhead. If the Track Alias is already in use, the publisherMUSTclose the session with a Duplicate Track Alias error (Section 3.5).¶
Track Namespace: Identifies the namespace of the track as defined in(Section 2.3.1).¶
Track Name: Identifies the track name as defined in (Section 2.3.1).¶
Subscriber Priority: Specifies the priority of a subscription relative toother subscriptions in the same session. Lower numbers get higher priority.SeeSection 4.¶
Group Order: Allows the subscriber to request Objects be delivered inAscending (0x1) or Descending (0x2) order by group. SeeSection 4.A value of 0x0 indicates the original publisher's Group OrderSHOULD beused. Values larger than 0x2 are a protocol error.¶
Filter Type: Identifies the type of filter, which also indicates whetherthe StartGroup/StartObject and EndGroup/EndObject fields will be present.See (Section 6.4.1).¶
StartGroup: The start Group ID. Only present for "AbsoluteStart" and"AbsoluteRange" filter types.¶
StartObject: The start Object ID. Only present for "AbsoluteStart" and"AbsoluteRange" filter types.¶
EndGroup: The end Group ID. Only present for the "AbsoluteRange" filter type.¶
EndObject: The end Object ID, plus 1. A value of 0 means the entire group isrequested. Only present for the "AbsoluteRange" filter type.¶
Subscribe Parameters: The parameters are defined inSection 6.1.1.¶
On successful subscription, the publisherMUST reply with a SUBSCRIBE_OK,allowing the subscriber to determine the start group/object when not explicitlyspecified and the publisherSHOULD start delivering objects.¶
If a publisher cannot satisfy the requested start or end for the subscription itMAY send a SUBSCRIBE_ERROR with code 'Invalid Range'. A publisherMUST NOT sendobjects from outside the requested start and end.¶
A subscriber issues a SUBSCRIBE_UPDATE to a publisher to request a change toa prior subscription. Subscriptions can only become more narrower, not wider,because an attempt to widen a subscription could fail. If Objects before thestart or after the end of the current subscription are needed, a separatesubscription can be made. The start ObjectMUST NOT decrease and when it increases,there is no guarantee that a publisher will not have already sent Objects beforethe new start Object. The end ObjectMUST NOT increase and when it decreases,there is no guarantee that a publisher will not have already sent Objects afterthe new end Object. A publisherSHOULD close the Session as a 'Protocol Violation'if the SUBSCRIBE_UPDATE violates either rule or if the subscriber specifies aSubscribe ID that does not exist within the Session.¶
Unlike a new subscription, SUBSCRIBE_UPDATE can not cause an Object to bedelivered multiple times. Like SUBSCRIBE, EndGroup and EndObjectMUST specify thesame or a later object than StartGroup and StartObject.¶
The format of SUBSCRIBE_UPDATE is as follows:¶
SUBSCRIBE_UPDATE Message { Subscribe ID (i), StartGroup (i), StartObject (i), EndGroup (i), EndObject (i), Subscriber Priority (8), Number of Parameters (i), Subscribe Parameters (..) ...}Subscribe ID: The subscription identifier that is unique within the session.ThisMUST match an existing Subscribe ID.¶
StartGroup: The start Group ID.¶
StartObject: The start Object ID.¶
EndGroup: The end Group ID, plus 1. A value of 0 means the subscription isopen-ended.¶
EndObject: The end Object ID, plus 1. A value of 0 means the entire group isrequested.¶
Subscriber Priority: Specifies the priority of a subscription relative toother subscriptions in the same session. Lower numbers get higher priority.SeeSection 4.¶
Subscribe Parameters: The parameters are defined inSection 6.1.1.¶
A subscriber issues aUNSUBSCRIBE message to a publisher indicating it is nolonger interested in receiving media for the specified track and Objectsshould stop being sent as soon as possible. The publisher sends aSUBSCRIBE_DONE to acknowledge the unsubscribe was successful and indicatethe final Object.¶
The format ofUNSUBSCRIBE is as follows:¶
UNSUBSCRIBE Message { Subscribe ID (i)}Subscribe ID: Subscription Identifier as defined inSection 6.4.¶
The subscriber sends an ANNOUNCE_OK control message to acknowledge thesuccessful authorization and acceptance of an ANNOUNCE message.¶
ANNOUNCE_OK{ Track Namespace (b),}Track Namespace: Identifies the track namespace in the ANNOUNCEmessage for which this response is provided.¶
The subscriber sends an ANNOUNCE_ERROR control message for tracks thatfailed authorization.¶
ANNOUNCE_ERROR{ Track Namespace (b), Error Code (i), Reason Phrase (b),}The subscriber sends anANNOUNCE_CANCEL control message toindicate it will stop sending new subscriptions for trackswithin the provided Track Namespace.¶
If a publisher receives new subscriptions for that namespace afterreceiving an ANNOUNCE_CANCEL, itSHOULD close the session as a'Protocol Violation'.¶
ANNOUNCE_CANCEL Message { Track Namespace (b),}Track Namespace: Identifies a track's namespace as defined in(Section 2.3.1).¶
A potential subscriber sends a 'TRACK_STATUS_REQUEST' message on the controlstream to obtain information about the current status of a given track.¶
A TRACK_STATUS messageMUST be sent in response to each TRACK_STATUS_REQUEST.¶
TRACK_STATUS_REQUEST Message { Track Namespace (b), Track Name (b),}An OBJECT message contains a range of contiguous bytes from from thespecified track, as well as associated metadata required to deliver,cache, and forward it. Objects are sent by publishers.¶
A canonical MoQ Object has the following information:¶
Track Namespace and Track Name: The track this object belongs to.¶
Group ID: The object is a member of the indicated group IDSection 2.2 within the track.¶
Object ID: The order of the object within the group. TheIDs starts at 0, increasing sequentially for each object within thegroup.¶
Publisher Priority: An 8 bit integer indicating the publisher's priority forthe ObjectSection 4.¶
Object Forwarding Preference: An enumeration indicating how a publisher sendsan object. The preferences are Track, Group, Object and Datagram. An ObjectMUST be sent according to itsObject Forwarding Preference, described below.¶
Object Status: As enumeration used to indicate missingobjects or mark the end of a group or track. SeeSection 6.11.1.1 below.¶
Object Payload: An opaque payload intended for an End Subscriber andSHOULD NOT be processed by a relay. Only present when 'Object Status' is Normal (0x0).¶
The Object Status informs subscribers what objects will not be receivedbecause they were never produced, are no longer available, or because theyare beyond the end of a group or track.¶
Status can have following values:¶
0x0 := Normal object. The payload is array of bytes and can be empty.¶
0x1 := Indicates Object does not exist. Indicates that this object does not exist at any publisher and it will not be published in the future. ThisSHOULD be cached.¶
0x2 := Indicates Group does not exist. Indicates that objects with this GroupID do not exist at any publisher and they will not be published in the future. ThisSHOULD be cached.¶
0x3 := Indicates end of Group. ObjectId is one greater that the largest object produced in the group identified by the GroupID. This is sent right after the last object in the group. ThisSHOULD be cached.¶
0x4 := Indicates end of Track and Group. GroupID is one greater than the largest group produced in this track and the ObjectId is one greater than the largest object produced in that group. This is sent right after the last object in the track. ThisSHOULD be cached.¶
Any other valueSHOULD be treated as a protocol error and terminate thesession with a Protocol Violation (Section 3.5).Any object with a status code other than zeroMUST have an empty payload.¶
Though some status information could be inferred from QUIC stream state,that information is not reliable and cacheable.¶
In most cases, messages with a non zero status code are sent on the samestream that an object with that GroupID would have been sent on. Theexception to this is when that stream has been reset; in that case theyare sent on a new stream. This is to avoid the status message being lostin cases such as a relay dropping a group and reseting the stream thegroup is being sent on.¶
Every Track has a single 'Object Forwarding Preference' and the OriginalPublisherMUST NOT mix different forwarding preferences within a single track.If a subscriber receives different forwarding preferences for a track, itSHOULD close the session with an error of 'Protocol Violation'.¶
Object Stream Message¶
AnOBJECT_STREAM message carries a single object on a stream. There is noexplicit length of the payload; it is determined by the end of the stream. AnOBJECT_STREAM messageMUST be the first and only message on a unidirectionalstream.¶
An Object received in anOBJECT_STREAM message has anObject ForwardingPreference =Object.¶
To send an Object withObject Forwarding Preference =Object, open a stream,serialize object fields below, and terminate the stream.¶
OBJECT_STREAM Message { Subscribe ID (i), Track Alias (i), Group ID (i), Object ID (i), Publisher Priority (8), Object Status (i), Object Payload (..),}Subscribe ID: Subscription Identifier as defined inSection 6.4.¶
Track Alias: Identifies the Track Namespace and Track Name as defined inSection 6.4.¶
If the Track Namespace and Track Name identified by the Track Alias aredifferent from those specified in the subscription identified by Subscribe ID,the subscriberMUST close the session with a Protocol Violation.¶
Other fields: As described inSection 6.11.1.¶
Object Datagram Message¶
AnOBJECT_DATAGRAM message carries a single object in a datagram.There is no explicit length of the payload; it is determined by thelength of the datagram.¶
An Object received in anOBJECT_DATAGRAM message has anObjectForwarding Preference =Datagram. To send an Object withObjectForwarding Preference =Datagram, determine the length of the fields andpayload and send the Object as datagram. In certain scenarios where the objectsize can be larger than maximum datagram size for the session, the Objectwill be dropped.¶
OBJECT_DATAGRAM Message { Subscribe ID (i), Track Alias (i), Group ID (i), Object ID (i), Publisher Priority (8), Object Status (i), Object Payload (..),}When multiple objects are sent on a stream, the stream begins with a streamheader message and is followed by one or more sets of serialized object fields.If a stream ends gracefully in the middle of a serialized Object, terminate thesession with a Protocol Violation.¶
A publisherSHOULD NOT open more than one multi-object stream at a time with thesame stream header message type and fields.¶
TODO: figure out how a relay closes these streams¶
Stream Header Track¶
When a stream begins withSTREAM_HEADER_TRACK, all objects on the streambelong to the track requested in the Subscribe message identified bySubscribeID. All objects on the stream have theObject Send Order specified in thestream header.¶
STREAM_HEADER_TRACK Message { Subscribe ID (i) Track Alias (i), Publisher Priority (8),}All Objects received on a stream opened with STREAM_HEADER_TRACK have anObjectForwarding Preference =Track.¶
To send an Object withObject Forwarding Preference =Track, find the openstream that is associated with the subscription, or open a new one and send theSTREAM_HEADER_TRACK if needed, then serialize the following object fields.The Object Status field is only sent if the Object Payload Length is zero.¶
{ Group ID (i), Object ID (i), Object Payload Length (i), [Object Status (i)], Object Payload (..),}Stream Header Group¶
A publisherMUST NOT send an Object on a stream if its Group ID is less than apreviously sent Group ID on that stream, or if its Object ID is less than orequal to a previously sent Object ID within a given group on that stream.¶
When a stream begins withSTREAM_HEADER_GROUP, all objects on the streambelong to the track requested in the Subscribe message identified bySubscribeID and the group indicated byGroup ID. All objects on the streamhave theObject Send Order specified in the stream header.¶
STREAM_HEADER_GROUP Message { Subscribe ID (i), Track Alias (i), Group ID (i), Publisher Priority (8),}All Objects received on a stream opened withSTREAM_HEADER_GROUP have anObject Forwarding Preference =Group.¶
To send an Object withObject Forwarding Preference =Group, find the openstream that is associated with the subscription,Group ID andObjectSend Order, or open a new one and send theSTREAM_HEADER_GROUP if needed,then serialize the following fields.The Object Status field is only sent if the Object Payload Length is zero.¶
{ Object ID (i), Object Payload Length (i), [Object Status (i)], Object Payload (..),}A publisherMUST NOT send an Object on a stream if its Object ID is less than apreviously sent Object ID within a given group in that stream.¶
Sending a track on one stream:¶
STREAM_HEADER_TRACK { Subscribe ID = 1 Track Alias = 1 Publisher Priority = 0}{ Group ID = 0 Object ID = 0 Object Payload Length = 4 Payload = "abcd"}{ Group ID = 1 Object ID = 0 Object Payload Length = 4 Payload = "efgh"}¶Sending a group on one stream, with a unordered object in the group appearingon its own stream.¶
Stream = 2STREAM_HEADER_GROUP { Subscribe ID = 2 Track Alias = 2 Group ID = 0 Publisher Priority = 0}{ Object ID = 0 Object Payload Length = 4 Payload = "abcd"}{ Object ID = 1 Object Payload Length = 4 Payload = "efgh"}Stream = 6OBJECT_STREAM { Subscribe ID = 3 Track Alias = 3 Group ID = 0 Object ID = 1 Object Send Order = 0 Payload = "moqrocks"}¶A publisher sends a SUBSCRIBE_OK control message for successfulsubscriptions.¶
SUBSCRIBE_OK{ Subscribe ID (i), Expires (i), Group Order (8), ContentExists (f), [Largest Group ID (i)], [Largest Object ID (i)]}Subscribe ID: Subscription Identifier as defined inSection 6.4.¶
Expires: Time in milliseconds after which the subscription is nolonger valid. A value of 0 indicates that the subscription does not expireor expires at an unknown time. Expires is advisory and a subscription canend prior to the expiry time or last longer.¶
Group Order: Indicates the subscription will be delivered inAscending (0x1) or Descending (0x2) order by group. SeeSection 4.Values of 0x0 and those larger than 0x2 are a protocol error.¶
ContentExists: 1 if an object has been published on this track, 0 if not.If 0, then the Largest Group ID and Largest Object ID fields will not bepresent.¶
Largest Group ID: the largest Group ID available for this track. This fieldis only present if ContentExists has a value of 1.¶
Largest Object ID: the largest Object ID available within the largest Group IDfor this track. This field is only present if ContentExists has a value of 1.¶
A publisher sends a SUBSCRIBE_ERROR control message in response to afailed SUBSCRIBE.¶
SUBSCRIBE_ERROR{ Subscribe ID (i), Error Code (i), Reason Phrase (b), Track Alias (i),}Subscribe ID: Subscription Identifier as defined inSection 6.4.¶
Error Code: Identifies an integer error code for subscription failure.¶
Reason Phrase: Provides the reason for subscription error.¶
Track Alias: When Error Code is 'Retry Track Alias', the subscriberSHOULD re-issue theSUBSCRIBE with this Track Alias instead. If this Track Alias is already in use,the subscriberMUST close the connection with a Duplicate Track Alias error(Section 3.5).¶
A publisher sends aSUBSCRIBE_DONE message to indicate it is done publishingObjects for that subscription. The Status Code indicates why the subscription ended,and whether it was an error.¶
The format ofSUBSCRIBE_DONE is as follows:¶
SUBSCRIBE_DONE Message { Subscribe ID (i), Status Code (i), Reason Phrase (b), ContentExists (f), [Final Group (i)], [Final Object (i)],}Subscribe ID: Subscription identifier as defined inSection 6.4.¶
Status Code: An integer status code indicating why the subscription ended.¶
Reason Phrase: Provides the reason for subscription error.¶
ContentExists: 1 if an object has been published for this subscription, 0 ifnot. If 0, then the Final Group and Final Object fields will not be present.¶
Final Group: The largest Group ID sent by the publisher in an OBJECTmessage in this track.¶
Final Object: The largest Object ID sent by the publisher in an OBJECTmessage in theFinal Group for this track.¶
The publisher sends the ANNOUNCE control message to advertise where thereceiver can route SUBSCRIBEs for tracks within the announcedTrack Namespace. The receiver verifies the publisher is authorized topublish tracks under this namespace.¶
ANNOUNCE Message { Track Namespace (b), Number of Parameters (i), Parameters (..) ...,}Track Namespace: Identifies a track's namespace as defined in(Section 2.3.1)¶
Parameters: The parameters are defined inSection 6.1.1.¶
The publisher sends theUNANNOUNCE control message to indicateits intent to stop serving new subscriptions for trackswithin the provided Track Namespace.¶
UNANNOUNCE Message { Track Namespace (b),}Track Namespace: Identifies a track's namespace as defined in(Section 2.3.1).¶
A publisher sends a 'TRACK_STATUS' message on the control stream in responseto a TRACK_STATUS_REQUEST message.¶
TRACK_STATUS Message { Track Namespace (b), Track Name (b), Status Code (i), Last Group ID (i), Last Object ID (i),}The 'Status Code' field provides additional information about the status of thetrack. ItMUST hold one of the following values. Any other value is a malformedmessage.¶
0x00: The track is in progress, and subsequent fields contain the highest groupand object ID for that track.¶
0x01: The track does not exist. Subsequent fieldsMUST be zero, and any othervalue is a malformed message.¶
0x02: The track has not yet begun. Subsequent fieldsMUST be zero. Any othervalue is a malformed message.¶
0x03: The track has finished, so there is no "live edge." Subsequent fieldscontain the highest Group and object ID known.¶
0x04: The publisher is a relay that cannot obtain the current track status fromupstream. Subsequent fields contain the largest group and object ID known.¶
Any other value in the Status Code field is a malformed message.¶
When a relay is subscribed to a track, it can simply return the highest groupand object ID it has observed, whether or not that object was cached orcompletely delivered. If not subscribed, a relaySHOULD send aTRACK_STATUS_REQUEST upstream to obtain updated information.¶
Alternatively, the relayMAY subscribe to the track to obtain the sameinformation.¶
If a relay cannot or will not do either, it should return its best availableinformation with status code 0x04.¶
The receiver of multiple TRACK_STATUS messages for a track uses the informationfrom the latest arriving message, as they are delivered in order on a singlestream.¶
TODO: Expand this section, including subscriptions.¶
Live content requires significant bandwidth and resources. Failure toset limits will quickly cause resource exhaustion.¶
MOQT uses stream limits and flow control to impose resource limits atthe network layer. EndpointsSHOULD set flow control limits based on theanticipated bitrate.¶
EndpointsMAY impose a MAX STREAM count limit which would restrict thenumber of concurrent streams which a MOQT Streaming Format could have inflight.¶
The publisher prioritizes and transmits streams out of order. Streamsmight be starved indefinitely during congestion. The publisher andsubscriberMUST cancel a stream, preferably the lowest priority, afterreaching a resource limit.¶
TODO: fill out currently missing registries:¶
MOQT version numbers¶
Setup parameters¶
Subscribe parameters¶
Subscribe Error codes¶
Announce Error codes¶
Message types¶
TODO: register the URI scheme and the ALPN¶
TODO: the MOQT spec should establish the IANA registration table for MoQStreaming Formats. Each MoQ streaming format can then register its typein that table. The MoQ Streaming Format typeMUST be carried as theleading varint in catalog track objects.¶
draft-ietf-moq-transport-05
| Document | Document type | This is an older version of an Internet-Draft whose latest revision state is "Active". | |
|---|---|---|---|
| Select version | |||
| Compare versions | |||
| Authors | Luke Curley,Kirill Pugin,Suhas Nandakumar,Victor Vasiliev,Ian Swett | ||
| RFC stream | |||
| Other formats | |||
| Additional resources | Mailing list discussion |