Skip to content
Merged
Changes from 20 commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
619a6ec
Joining Fetch
englishm Nov 27, 2024
4525f9d
Fix client/peer in GOAWAY Timeout
englishm Dec 4, 2024
8e1e9ca
Normalize case
englishm Dec 4, 2024
7f19b5e
Normalize case
englishm Dec 4, 2024
921f4c4
Normalize case
englishm Dec 4, 2024
c285647
Normalize case
englishm Dec 4, 2024
8fa9be8
Remove extra space
englishm Dec 4, 2024
e1093ad
spelling: s/Groupe/Group/
englishm Dec 4, 2024
1522ab7
Update with a more verbose algorithm for clarity
englishm Dec 18, 2024
0a00c36
Simplify algorithm w/ intermediate resolved values
englishm Dec 18, 2024
e0e649e
Previous Group -> Preceding Group Offset
englishm Dec 18, 2024
07e93ce
Fetch error rather than closing session
englishm Dec 18, 2024
d01b841
Fix Resolved Subscribe Start Object (LatestGroup)
englishm Dec 18, 2024
dbc9f9a
Clarify empty fetch case
englishm Dec 18, 2024
204437e
Guidance for certain cases
englishm Dec 18, 2024
578b567
Update draft-ietf-moq-transport.md
englishm Dec 19, 2024
6dae36d
Update draft-ietf-moq-transport.md
englishm Dec 20, 2024
9fa2429
Incorporate feedback
englishm Jan 22, 2025
a50b040
Brief motivating example for Suhas
englishm Jan 22, 2025
6c0790f
Nit: spacing
englishm Jan 22, 2025
eb20e67
fix phrasing nit
englishm Jan 24, 2025
7d4a99d
Cleanup - remove duplicate paragraph
englishm Jan 24, 2025
450b4d7
Clarify properties apply to Fetch and Subscribe
englishm Jan 24, 2025
7db23b5
Group Order for all Fetch Types
englishm Jan 24, 2025
86ec7ff
Remove unnecessary/redundant definitions
englishm Jan 24, 2025
094d800
Merge branch 'main' into me/joining-fetch
ianswett Jan 29, 2025
5b1ec66
Reflow some long lines
ianswett Jan 30, 2025
9cbde3c
Reflow and minor editorial updates
ianswett Jan 30, 2025
e5a2868
Shorten some descriptions
ianswett Jan 30, 2025
d7e8648
Merge branch 'main' into me/joining-fetch
ianswett Jan 30, 2025
f408e38
Update draft-ietf-moq-transport.md
englishm Jan 30, 2025
46f2124
Merge branch 'main' into me/joining-fetch
ianswett Jan 31, 2025
6076f68
Merge branch 'main' into me/joining-fetch
ianswett Feb 3, 2025
df48071
Merge branch 'main' into me/joining-fetch
ianswett Feb 3, 2025
a70455e
Limit Joining Fetch to Latest Object Subscribes
englishm Feb 3, 2025
411d42e
Clarify resulting FETCH/SUBSCRIBE independence
englishm Feb 4, 2025
c3442de
Remove redundant text
englishm Feb 4, 2025
cc7de8d
Update draft-ietf-moq-transport.md
ianswett Feb 7, 2025
648dbc4
Separate out the IDs of the Joining Fetch and prior subscription
ianswett Feb 11, 2025
801fb4b
Update draft-ietf-moq-transport.md
ianswett Feb 11, 2025
d9e2731
Update draft-ietf-moq-transport.md
ianswett Feb 11, 2025
3bc9c52
Simplify some text based on Suhas suggestions
ianswett Feb 11, 2025
3a45e97
Minor editorial update
ianswett Feb 11, 2025
913c9d7
Update draft-ietf-moq-transport.md
ianswett Feb 11, 2025
5945077
Merge branch 'main' into me/joining-fetch
ianswett Feb 11, 2025
e3fe1a2
Merge branch 'main' into me/joining-fetch
ianswett Feb 11, 2025
2529140
Subtract 1 from EndGroup if EndObject is 0
ianswett Feb 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 90 additions & 14 deletions draft-ietf-moq-transport.md
Original file line number Diff line number Diff line change
Expand Up @@ -1415,6 +1415,23 @@ objects within a track. The publisher responding to a FETCH is responsible for r
all available Objects. If there are gaps between Objects, the publisher omits them from the
fetch response. All omitted objects have status Object Not Available.

**Fetch Types**

There are two types of Fetch messages:

Standalone Fetch (0x1) : A Fetch of Objects performed independently of any Subscribe.

Joining Fetch (0x2) : A Fetch joined together with a Subscribe. A Joining Fetch
shares the same Subscribe ID as an already-sent Subscribe. A publisher receiving a Joining
Fetch should use properties of the associated Subscribe to determine the Track Namespace,
Track, StartGroup, StartObject, EndGroup, and EndObject for the Joining Fetch such that it is
contiguous with the associated Subscribe and begins Preceding Group Offset prior.

A Subscriber can use a Joining Fetch to, for example, fill a playback buffer with a certain
number of groups prior to the live edge of a track.

A Fetch Type other than the above MUST be treated as an error.

A publisher responds to a FETCH request with either a FETCH_OK or a FETCH_ERROR
message. If it responds with FETCH_OK, the publisher creates a new unidirectional
stream that is used to send the Objects. A relay MAY start sending objects immediately
Expand All @@ -1434,34 +1451,47 @@ FETCH Message {
Type (i) = 0x16,
Length (i),
Subscribe ID (i),
Track Namespace (tuple),
Track Name Length (i),
Track Name (..),
Subscriber Priority (8),
Group Order (8),
StartGroup (i),
StartObject (i),
EndGroup (i),
EndObject (i),
Fetch Type (i),
[Track Namespace (tuple),
Track Name Length (i),
Track Name (..),
Group Order (8),
StartGroup (i),
StartObject (i),
EndGroup (i),
EndObject (i),]
[Preceding Group Offset (i),]
Number of Parameters (i),
Parameters (..) ...
}
~~~
{: #moq-transport-fetch-format title="MOQT FETCH Message"}

Fields common to all Fetch Types:

* Subscribe ID: The Subscribe ID identifies a given fetch request. Subscribe ID
is a variable length integer that MUST be unique and monotonically increasing
within a session.
within a session. For a Standalone Fetch a new Subscribe ID MUST be used. For
a Joining Fetch, the Subscribe ID MUST correspond to a Subscribe which has already
been sent. If a publisher receives a Joining Fetch with a Subscribe ID that does
not correspond to an existing Subscribe, it MUST respond with a Fetch Error.

* Subscriber Priority: Specifies the priority of a fetch request relative to
other subscriptions or fetches in the same session. Lower numbers get higher
priority. See {{priorities}}.

* Fetch Type: Identifies the type of Fetch, whether joining or standalone.

* Parameters: The parameters are defined in {{version-specific-params}}.

Fields present only for Standalone Fetch (0x1):

* Track Namespace: Identifies the namespace of the track as defined in
({{track-name}}).

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

* Subscriber Priority: Specifies the priority of a fetch request relative to
other subscriptions or fetches in the same session. Lower numbers get higher
priority. See {{priorities}}.

* Group Order: Allows the subscriber to request Objects be delivered in
Ascending (0x1) or Descending (0x2) order by group. See {{priorities}}.
A value of 0x0 indicates the original publisher's Group Order SHOULD be
Expand All @@ -1476,8 +1506,9 @@ used. Values larger than 0x2 are a protocol error.
* EndObject: The end Object ID, plus 1. A value of 0 means the entire group is
requested.

* Parameters: The parameters are defined in {{version-specific-params}}.
Field present only for Joining Fetch (0x2):

* Preceding Group Offset: The group offset for the Fetch prior and relative to the StartGroup of the corresponding Subscribe

Objects that are not yet published will not be retrieved by a FETCH.
The latest available Object is indicated in the FETCH_OK, and is the last
Expand All @@ -1495,6 +1526,51 @@ A publisher MUST send fetched groups in group order, either ascending or
descending. Within each group, objects are sent in Object ID order;
subgroup ID is not used for ordering.

### Calculating the Range of a Joining Fetch

A publisher which receives a Fetch message with a Fetch Type of 0x2 must treat it as a Fetch
with a range dynamically determined by the Preceding Group Offset (PGO) field and values derived
from to the corresponding Subscribe message (hereafter "the Subscribe").

The following values are used:

* Resolved Subscribe Start Group:
* For Subscribes with Filter Type Latest Object or Latest Group, this is equal to Largest Group ID.
* For Subscribes with Filter Type AbsoluteStart or AbsoluteRange, this is equal to the StartGroup field of the Subscribe message
* Resolved Subscribe Start Object:
* For Subscribes with Filter Type Latest Object, this is equal to Largest Object ID.
* For Subscribes with Filter Type Latest Group, this is 0
* For Subscribes with Filter Type AbsoluteStart or AbsoluteRange, this is equal to the StartObject field of the Subscribe message
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section seems to repeat the text to some extent in subscribe section. When PR #652 lands, some of these values may not match exactly especially when subscription filters are in the past to the live edge.

My proposal would be to refer to Subscribe section for these filter types and not repeat the text.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I first wrote this with the relevant details collapsed into the below section and it was very verbose and hard to follow. I split it out by defining these intermediate "Resolved" values for clarity. I see your point about duplication, and you're right that #652 may also need to touch this, but I still prefer to state these things explicitly here to avoid confusion about how Joining Fetch values should be determined. Maybe @ianswett can weigh in as both editor and author of #652.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My only concern is #652 will invalidate some of the resolved values as it is defined in this PR. Given we had general agreement that Susbcribe needs updates if we add Joining Fetch, it would be nice to land these two PRs around the same time to keep things unambiguous.

* Preceding Group Offset: A field in the Joining Fetch message indicating the relative offset from the start of the Subscribe

The Resolved Subscribe Start values for a Joining Fetch MUST correspond to the referenced Subscribe within the same session so that the Objects delivered across the Fetch and Subscribe are contiguous and non-overlapping.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure that we can guarantee "contigous" property but we can say it will be non-overlapping though

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Joining Fetch it's important that the ranges of the Fetch and Subscribe portions at least be both contiguous and non-overlapping. Actual delivery of objects will of course be subject to whatever Fetch and Subscribe each provide. Perhaps I could reword slightly to keep this scoped to the properties we care about for Joining Fetch and not overstate anything with regard to delivery?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By contiguous, if we mean groups will be in sequence with no gaps, we cannot guarantee that for variety of reasons. Am I misunderstanding it ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I think maybe we're focusing on different things here and I think it may relate to some of your other comments, too. I'm thinking of this primarily in terms of what is being requested - we can make our requests contiguous and non-overlapping, even if the way the objects are published and delivered means there could be gaps. What actually gets delivered will be subject to whatever limitations any other Subscribe and Fetch are subject to. I updated this line of the text to clarify that, too.

If a relay answers the referenced Subscribe with a `SUBSCRIBE_OK` that has ContentExists set to 0, it MUST respond to the Joining Fetch with a `FETCH_ERROR`.

Using that information and the following algorithm, these values are computed:

* Fetch Start Group: The StartGroup for the Fetch
* Fetch Start Object: The StartObject for the Fetch (always 0)
* Fetch End Group: The EndGroup for the Fetch
* Fetch End Object: The EndObject for the Fetch (represented as 1 more than the end Object ID
or a value of 0 indicating that the entire group is requested)

The publisher receiving a Joining Fetch computes the fetch range as follows:

* Fetch Start Group: Resolved Subscribe Start Group - Preceding Group Offset
* Fetch Start Object: 0

If Resolved Subscribe Start Object is 0:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/Resolved Subscribe Start Object is 0/ Subscribe FilterType is LatestGroup

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's not the only case here. This can also be true if the StartObject field of a Subscribe with Filter Type of AbsoluteStart or AbsoluteRange is 0. This is an example of why I'd prefer to retain that above section defining "Resolved Subscribe..." values rather than just referring directly to the Subscribe section's definitions.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am fine with having the section on Resolved subscribes , but seems bit incorrect to compute those absolute values given those are filters and may not map to the exact values that we mention here

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As above, I'm thinking of this in terms of computing an absolute value for the requested range so we can delineate which portion would be provided by a Fetch (subject to whatever limitations a standalone Fetch is subject to) and which portion would be provided by a Subscribe (subject to whatever limitations a Subscribe is subject to).

* Fetch End Group: Resolved Subscribe Start Group - 1
* Fetch End Object: 0 (all objects in the group)

Else, if Resolved Subscribe Start Object is 1 or more:
* Fetch End Group: Resolved Subscribe Start Group
* Fetch End Object: Resolved Subscribe Start Object

If Fetch End Group < Fetch Start Group respond with a Fetch Error.

A Joining Fetch MUST be sent in ascending group order.

## FETCH_CANCEL {#message-fetch-cancel}

A subscriber issues a `FETCH_CANCEL` message to a publisher indicating it is no
Expand Down
Loading