Skip to content

Commit 2706491

Browse files
authored
Add Priority and Group Send Order to SUBSCRIBE, clarify Publisher Priority (#470)
Adds a SUBSCRIBER_PRIORITY param that can be specified in SUBSCRIBE or SUBSCRIBE_UPDATE to indicate subscriber priority. Adds Group Order to SUBSCRIBE to allow indicating Ascending or Descending. Cleans up the existing priorities section and how Original Subscriber driven priorities are used. Fixes #326 Fixes #396 Fixes #403 Fixes #419 Closes #445
2 parents 36ff04b + fd21a0d commit 2706491

File tree

1 file changed

+99
-113
lines changed

1 file changed

+99
-113
lines changed

draft-ietf-moq-transport.md

Lines changed: 99 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,7 @@ discovery and subscription.
8585

8686
* {{session}} covers aspects of setting up a MOQT session.
8787

88-
* {{priority-congestion}} covers protocol considerations on
89-
prioritization schemes and congestion response overall.
88+
* {{priorities}} covers mechanisms for prioritizing subscriptions.
9089

9190
* {{relays-moq}} covers behavior at the relay entities.
9291

@@ -534,100 +533,71 @@ expects more OBJECTs to be delivered. The server closes the session with a
534533
'GOAWAY Timeout' if the client doesn't close the session quickly enough.
535534

536535

537-
# Prioritization and Congestion Response {#priority-congestion}
538-
539-
TODO: This is a placeholder section to capture details on how the MOQT
540-
protocol deals with prioritization and congestion overall.
541-
542-
This section is expected to cover details on:
543-
544-
- Prioritization Schemes.
545-
- Congestion Algorithms and impacts.
546-
- Mapping considerations for one object per stream vs multiple objects
547-
per stream.
548-
- Considerations for merging multiple streams across domains onto single
549-
connection and interactions with specific prioritization schemes.
550-
551-
## Order Priorities and Options
552-
553-
At the point of this writing, the working group has not reached
554-
consensus on several important goals, such as:
555-
556-
* Ensuring that objects are delivered in the order intended by the
557-
emitter
558-
* Allowing nodes and relays to skip or delay some objects to deal with
559-
congestion
560-
* Ensuring that emitters can accurately predict the behavior of relays
561-
* Ensuring that when relays have to skip and delay objects belonging to
562-
different tracks that they do it in a predictable way if tracks are
563-
explicitly coordinated and in a fair way if they are not.
564-
565-
The working group has been considering two alternatives: marking objects
566-
belonging to a track with an explicit "send order"; and, defining
567-
algorithms combining tracks, priorities and object order within a
568-
group. The two proposals are listed in {{send-order}} and
569-
{{ordering-by-priorities}}. We expect further work before a consensus
570-
is reached.
571-
572-
### Proposal - Send Order {#send-order}
573-
574-
Media is produced with an intended order, both in terms of when media
575-
should be presented (PTS) and when media should be decoded (DTS). As
576-
stated in the introduction, the network is unable to maintain this
577-
ordering during congestion without increasing latency.
578-
579-
The encoder determines how to behave during congestion by assigning each
580-
object a numeric send order. The send order SHOULD be followed when
581-
possible, to ensure that the most important media is delivered when
582-
throughput is limited. Note that the contents within each object are
583-
still delivered in order; this send order only applies to the ordering
584-
between objects.
585-
586-
A publisher MUST send each object over a dedicated stream. The library
587-
should support prioritization ({{priority-congestion}}) such that
588-
streams are transmitted in send order.
589-
590-
A subscriber MUST NOT assume that objects will be received in send order,
591-
for the following reasons:
592-
593-
* Newly encoded objects can have a smaller send order than outstanding
594-
objects.
595-
* Packet loss or flow control can delay the send of individual streams.
596-
* The publisher might not support stream prioritization.
597-
598-
TODO: Refer to Congestion Response and Prioritization Section for
599-
further details on various proposals.
600-
601-
### Proposal - Ordering by Priorities {#ordering-by-priorities}
602-
603-
Media is produced as a set of layers, such as for example low definition
604-
and high definition, or low frame rate and high frame rate. Each object
605-
belonging to a track and a group has two attributes: the object-id, and
606-
the priority (or layer).
607-
608-
When nodes or relays have to choose which object to send next, they
609-
apply the following rules:
610-
611-
* within the same group, objects with a lower priority number (e.g. P1)
612-
are always sent before objects with a numerically greater priority
613-
number (e.g., P2)
614-
* within the same group, and the same priority level, objects with a
615-
lower object-id are always sent before objects with a higher
616-
object-id.
617-
* objects from later groups are normally always sent before objects of
618-
previous groups.
619-
620-
The latter rule is generally agreed as a way to ensure freshness, and to
621-
recover quickly if queues and delays accumulate during a congestion
622-
period. However, there may be cases when finishing the transmission of
623-
an ongoing group results in better user experience than strict adherence
624-
to the freshness rule. We expect that that the working group will
625-
eventually reach consensus and define meta data that controls this
626-
behavior.
627-
628-
There have been proposals to allow emitters to coordinate the allocation
629-
of layer priorities across multiple coordinated tracks. At this point,
630-
these proposals have not reached consensus.
536+
# Priorities {#priorities}
537+
538+
MoQ priorities allow a subscriber and original publisher to influence
539+
the transmission order of Objects within a session in the presence of
540+
congestion.
541+
542+
Given the critical nature of control messages and their relatively
543+
small size, the control stream SHOULD be prioritized higher than all
544+
subscribed Objects.
545+
546+
The subscriber indicates the priority of a subscription via the
547+
Subscriber Priority field and the original publisher indicates priority
548+
in every stream or datagram header. As such, the subscriber's priority is a
549+
property of the subscription and the original publisher's priority is a
550+
property of the Track and the Objects it contains. In both cases, a lower
551+
value indicates a higher priority, with 0 being the highest priority.
552+
553+
The Subscriber Priority is considered first when selecting a subscription
554+
to send data on within a given session. When two or more subscriptions
555+
have equal subscriber priority, the original publisher priority is considered
556+
next and can change within the track, so subscriptions are prioritized based
557+
on the highest priority data available to send. For example, if the subscription
558+
had data at priority 6 and priority 10 to send, the subscription priority would
559+
be 6. When both the subscriber and original publisher priorities for a
560+
subscription are equal, how much data to send from each subscription is
561+
implementation-dependent, but the expectation is that all subscriptions will
562+
be able to send some data.
563+
564+
The subscriber's priority can be changed via a SUBSCRIBE_UPDATE message.
565+
This updates the priority of all unsent data within the subscription,
566+
though the details of the reprioitization are implementation-specific.
567+
568+
Subscriptions have a Group Order of either 'Ascending' or 'Descending',
569+
which indicates whether the lowest or highest Group Id SHOULD be sent first
570+
when multiple Groups are available to send. A subscriber can specify either
571+
'Ascending' or 'Descending' in the SUBSCRIBE message or they can specify they
572+
want to use the Original Publisher's Group Order, which is indicated in
573+
the corresponding SUBSCRIBE_OK.
574+
575+
Within the same Group, and the same priority level,
576+
Objects with a lower Object Id are always sent before objects with a
577+
higher Object Id, regardless of the specified Group Order. If the priority
578+
varies within a Group, higher priority Objects are sent before lower
579+
priority Objects.
580+
581+
The Group Order cannot be changed via a SUBSCRIBE_UPDATE message, and
582+
instead an UNSUBSCRIBE and SUBSCRIBE can be used.
583+
584+
Relays SHOULD respect the subscriber and original publisher's priorities.
585+
Relays SHOULD NOT directly use Subscriber Priority or Group Order
586+
from incoming subscriptions for upstream subscriptions. Relays use of
587+
Subscriber Priority for upstream subscriptions can be based on
588+
factors specific to it, such as the popularity of the
589+
content or policy, or relays can specify the same value for all
590+
upstream subscriptions.
591+
592+
MoQ Sessions can span multiple namespaces, and priorities might not
593+
be coordinated across namespaces. The subscriber's priority is
594+
considered first, so there is a mechanism for a subscriber to fix
595+
incompatibilities between different namespaces prioritization schemes.
596+
Additionally, it is anticipated that when multiple namespaces
597+
are present within a session, the namespaces could be coordinating,
598+
possibly part of the same application. In cases when pooling among
599+
namespaces is expected to cause issues, multiple MoQ sessions, either
600+
within a single connection or on multiple connections can be used.
631601

632602

633603
# Relays {#relays-moq}
@@ -638,6 +608,8 @@ similar in functionality to Content Delivery Networks
638608
(CDNs). Additionally, relays serve as policy enforcement points by
639609
validating subscribe and publish requests at the edge of a network.
640610

611+
Relays can cache Objects, but are not required to.
612+
641613
## Subscriber Interactions
642614

643615
Subscribers interact with the Relays by sending a SUBSCRIBE
@@ -746,12 +718,6 @@ fields, such as priority order and other metadata properties in the
746718
OBJECT message header. Unless determined by congestion response, Relays
747719
MUST forward the OBJECT message to the matching subscribers.
748720

749-
## Congestion Response at Relays
750-
751-
TODO: Refer to {{priority-congestion}}. Add details to describe relay
752-
behavior when merging or splitting streams and interactions with
753-
congestion response.
754-
755721
## Relay Object Handling
756722

757723
MOQT encodes the delivery information for a stream via OBJECT headers
@@ -760,8 +726,7 @@ forwarding.
760726

761727
A relay MUST treat the object payload as opaque. A relay MUST NOT
762728
combine, split, or otherwise modify object payloads. A relay SHOULD
763-
prioritize streams ({{priority-congestion}}) based on the send
764-
order/priority.
729+
prioritize sending Objects based on {{priorities}}.
765730

766731
A publisher SHOULD begin sending incomplete objects when available to
767732
avoid incurring additional latency.
@@ -1039,6 +1004,8 @@ SUBSCRIBE Message {
10391004
Track Alias (i),
10401005
Track Namespace (b),
10411006
Track Name (b),
1007+
Subscriber Priority (8),
1008+
Group Order (8),
10421009
Filter Type (i),
10431010
[StartGroup (i),
10441011
StartObject (i)],
@@ -1068,6 +1035,15 @@ close the session with a Duplicate Track Alias error ({{session-termination}}).
10681035

10691036
* Track Name: Identifies the track name as defined in ({{track-name}}).
10701037

1038+
* Subscriber Priority: Specifies the priority of a subscription relative to
1039+
other subscriptions in the same session. Lower numbers get higher priority.
1040+
See {{priorities}}.
1041+
1042+
* Group Order: Allows the subscriber to request Objects be delivered in
1043+
Ascending (0x1) or Descending (0x2) order by group. See {{priorities}}.
1044+
A value of 0x0 indicates the original publisher's Group Order SHOULD be
1045+
used. Values larger than 0x2 are a protocol error.
1046+
10711047
* Filter Type: Identifies the type of filter, which also indicates whether
10721048
the StartGroup/StartObject and EndGroup/EndObject fields will be present.
10731049
See ({{sub-filter}}).
@@ -1118,6 +1094,7 @@ SUBSCRIBE_UPDATE Message {
11181094
StartObject (i),
11191095
EndGroup (i),
11201096
EndObject (i),
1097+
Subscriber Priority (8),
11211098
Number of Parameters (i),
11221099
Subscribe Parameters (..) ...
11231100
}
@@ -1137,6 +1114,10 @@ open-ended.
11371114
* EndObject: The end Object ID, plus 1. A value of 0 means the entire group is
11381115
requested.
11391116

1117+
* Subscriber Priority: Specifies the priority of a subscription relative to
1118+
other subscriptions in the same session. Lower numbers get higher priority.
1119+
See {{priorities}}.
1120+
11401121
* Subscribe Parameters: The parameters are defined in {{version-specific-params}}.
11411122

11421123
## UNSUBSCRIBE {#message-unsubscribe}
@@ -1252,8 +1233,8 @@ A canonical MoQ Object has the following information:
12521233
IDs starts at 0, increasing sequentially for each object within the
12531234
group.
12541235

1255-
* Object Send Order: An integer indicating the object send order
1256-
{{send-order}} or priority {{ordering-by-priorities}} value.
1236+
* Publisher Priority: An 8 bit integer indicating the publisher's priority for
1237+
the Object {{priorities}}.
12571238

12581239
* Object Forwarding Preference: An enumeration indicating how a publisher sends
12591240
an object. The preferences are Track, Group, Object and Datagram. An Object
@@ -1334,7 +1315,7 @@ OBJECT_STREAM Message {
13341315
Track Alias (i),
13351316
Group ID (i),
13361317
Object ID (i),
1337-
Object Send Order (i),
1318+
Publisher Priority (8),
13381319
Object Status (i),
13391320
Object Payload (..),
13401321
}
@@ -1371,7 +1352,7 @@ OBJECT_DATAGRAM Message {
13711352
Track Alias (i),
13721353
Group ID (i),
13731354
Object ID (i),
1374-
Object Send Order (i),
1355+
Publisher Priority (8),
13751356
Object Status (i),
13761357
Object Payload (..),
13771358
}
@@ -1403,7 +1384,7 @@ stream header.
14031384
STREAM_HEADER_TRACK Message {
14041385
Subscribe ID (i)
14051386
Track Alias (i),
1406-
Object Send Order (i),
1387+
Publisher Priority (8),
14071388
}
14081389
~~~
14091390
{: #stream-header-track-format title="MOQT STREAM_HEADER_TRACK Message"}
@@ -1442,8 +1423,8 @@ have the `Object Send Order` specified in the stream header.
14421423
STREAM_HEADER_GROUP Message {
14431424
Subscribe ID (i),
14441425
Track Alias (i),
1445-
Group ID (i)
1446-
Object Send Order (i)
1426+
Group ID (i),
1427+
Publisher Priority (8),
14471428
}
14481429
~~~
14491430
{: #stream-header-group-format title="MOQT STREAM_HEADER_GROUP Message"}
@@ -1478,7 +1459,7 @@ Sending a track on one stream:
14781459
STREAM_HEADER_TRACK {
14791460
Subscribe ID = 1
14801461
Track Alias = 1
1481-
Object Send Order = 0
1462+
Publisher Priority = 0
14821463
}
14831464
{
14841465
Group ID = 0
@@ -1504,7 +1485,7 @@ STREAM_HEADER_GROUP {
15041485
Subscribe ID = 2
15051486
Track Alias = 2
15061487
Group ID = 0
1507-
Object Send Order = 0
1488+
Publisher Priority = 0
15081489
}
15091490
{
15101491
Object ID = 0
@@ -1540,6 +1521,7 @@ SUBSCRIBE_OK
15401521
{
15411522
Subscribe ID (i),
15421523
Expires (i),
1524+
Group Order (8),
15431525
ContentExists (f),
15441526
[Largest Group ID (i)],
15451527
[Largest Object ID (i)]
@@ -1554,6 +1536,10 @@ longer valid. A value of 0 indicates that the subscription does not expire
15541536
or expires at an unknown time. Expires is advisory and a subscription can
15551537
end prior to the expiry time or last longer.
15561538

1539+
* Group Order: Indicates the subscription will be delivered in
1540+
Ascending (0x1) or Descending (0x2) order by group. See {{priorities}}.
1541+
Values of 0x0 and those larger than 0x2 are a protocol error.
1542+
15571543
* ContentExists: 1 if an object has been published on this track, 0 if not.
15581544
If 0, then the Largest Group ID and Largest Object ID fields will not be
15591545
present.

0 commit comments

Comments
 (0)