Skip to content

Conversation

@afrind
Copy link
Collaborator

@afrind afrind commented Oct 6, 2025

A strawman that could address #1278

  1. Make unknown message params a PROTOCOL_VIOLATION
  2. Make all subscriber message params hop-by-hop
  3. Define publisher message parameter scope case-by-case:

e2e:
PUBLISHER_PRIORITY
MAX_CACHE_DURATION
DELIVERY_TIMEOUT
[GROUP_ORDER]
[DYNAMIC_GROUPS]

hbh:
AUTH_TOKEN
EXPIRES
[LARGEST_OBJECT]
[FORWARD]

A strawman that could address #1278 

1. Make unknown message params a PROTOCOL_VIOLATION
2. Make all subscriber message params hop-by-hop
3. Define publisher message parameter scope case-by-case:

e2e: 
PUBLISHER_PRIORITY
MAX_CACHE_DURATION
DELIVERY_TIMEOUT
[GROUP_ORDER]
[DYNAMIC_GROUPS]

hbh:
AUTH_TOKEN
EXPIRES
[LARGEST_OBJECT]
[FORWARD]
@afrind afrind added the Design Issues or PRs that change how MoQ works including the wire format. label Oct 6, 2025
@afrind afrind requested a review from ianswett as a code owner October 6, 2025 23:07
@fluffy
Copy link
Collaborator

fluffy commented Oct 8, 2025

I think we should allow unknown messages that are passed between end subscriber and publisher but that seems a different issue. Perhaps we need a separate issue for this part of it.

Comment on lines +1569 to +1571
as noted in the parameter definition. End-to-End Parameters sent in PUBLISH,
SUBSCRIBE_OK, TRACK_STATUS_OK or FETCH_OK MUST be cached by Relays and included
in future downstream subscriptions or fetches for that Track.
Copy link
Contributor

@michalhosna michalhosna Oct 8, 2025

Choose a reason for hiding this comment

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

Are the parameters immutable for the lifetime of a given track?

If parameters are mutable, how should the caching work? Only the last one is valid? What should existing connections see?

What about multi-publishers? Must all of them send the same values for e2e params?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Oh this is a good question. Can a publisher send REQUEST_UPDATE and change either parameters or extensions/track properties, or the properties are immutable?

Copy link
Collaborator

Choose a reason for hiding this comment

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

Ian and I were proposing that if you get a new one if a message, it overrides whatever was in cache before for that property. And when downstreams requests, it gets latest in cache with no upstream check to see if the cache i fresh.

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 think mutability makes sense for some of these but not others, so it might be on a case-by-case what you are allowed to change (with unknown=allow). I do worry a little bit about how that intersects our immutable Track model and what the edge cases might be.

Copy link
Collaborator

@fluffy fluffy left a comment

Choose a reason for hiding this comment

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

I think we need to get our extensibility story agreed on before we can do this part of it.

@afrind afrind added the Needs Discussion Tags for issues which need discussion, ideally at an interim or IETF meeting. label Oct 20, 2025
Copy link
Collaborator

@ianswett ianswett left a comment

Choose a reason for hiding this comment

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

Thanks Alan, I took a closer look at this after the WG discussion in Montreal, and I think it's fairly close.

elements.
Some messages include a Parameters field that encodes optional message elements.
All parameters included in a message MUST be defined in the negotiated version
of MOQT or negotiated via Setup Parameters. An endpoint that receives an
Copy link
Collaborator

Choose a reason for hiding this comment

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

There's one wrinkle I realize, which is that we are using Parameters in Setup to negotiate which Parameters are supported, but we need to allow for unknown Parameters in Setup.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Hmm I think I was trying to distinguish "message" params from "setup" params, but might need to be more crisp.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Alternatively, we could decide that Setup Messages use Extension Headers of some sort, but that feels odd somehow.

Some messages include a Parameters field that encodes optional message elements.
All parameters included in a message MUST be defined in the negotiated version
of MOQT or negotiated via Setup Parameters. An endpoint that receives an
unknown message parameters MUST close the session with `PROTOCOL_VIOLATION`.
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
unknown message parameters MUST close the session with `PROTOCOL_VIOLATION`.
unknown Parameter MUST close the session with `PROTOCOL_VIOLATION`.

After sending a NEW_GROUP_REQUEST upstream, the request is considered
outstanding until the Largest Group increases.

When sent by a publisher, this parameter is not End-To-End (see
Copy link
Collaborator

Choose a reason for hiding this comment

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

Isn't this sent by a Subscriber?

Objects have expired from cache, their state becomes unknown, and a relay that
handles a downstream request that includes those Objects re-requests them.

When sent by a publisher, this parameter is End-To-End (see
Copy link
Collaborator

Choose a reason for hiding this comment

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

Nit: This is correct, but given the Publisher is the only one who sends it, how about:

Suggested change
When sent by a publisher, this parameter is End-To-End (see
MAX CACHE DURATION is only sent by a publisher, and is End-To-End (see


Message Parameters sent by the subscriber are always intended for the peer
endpoint and are not forwarded by Relays. Some message parameters sent by the
publisher are intended for the peer endpoint and are not forwarded by Relays,
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
publisher are intended for the peer endpoint and are not forwarded by Relays,
publisher are scoped to the Session and are not forwarded by Relays,

Copy link
Collaborator Author

@afrind afrind Nov 9, 2025

Choose a reason for hiding this comment

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

With #1374 I assume all publisher parameters are scoped to a message, while "Extension Headers" (eg: properties) are end-to-end.

@ianswett ianswett added the Extensibility Related to extensions, upgrades and greasing label Nov 9, 2025
elements.
Some messages include a Parameters field that encodes optional message elements.
All parameters included in a message MUST be defined in the negotiated version
of MOQT or negotiated via Setup Parameters. An endpoint that receives an
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Hmm I think I was trying to distinguish "message" params from "setup" params, but might need to be more crisp.


Message Parameters sent by the subscriber are always intended for the peer
endpoint and are not forwarded by Relays. Some message parameters sent by the
publisher are intended for the peer endpoint and are not forwarded by Relays,
Copy link
Collaborator Author

@afrind afrind Nov 9, 2025

Choose a reason for hiding this comment

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

With #1374 I assume all publisher parameters are scoped to a message, while "Extension Headers" (eg: properties) are end-to-end.

Comment on lines +1569 to +1571
as noted in the parameter definition. End-to-End Parameters sent in PUBLISH,
SUBSCRIBE_OK, TRACK_STATUS_OK or FETCH_OK MUST be cached by Relays and included
in future downstream subscriptions or fetches for that Track.
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Oh this is a good question. Can a publisher send REQUEST_UPDATE and change either parameters or extensions/track properties, or the properties are immutable?

Comment on lines 1926 to 1928
When sent by a publisher, this parameter is not End-To-End (see
{{parameter-scope}}).

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Suggested change
When sent by a publisher, this parameter is not End-To-End (see
{{parameter-scope}}).

Copy link
Collaborator

@fluffy fluffy left a comment

Choose a reason for hiding this comment

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

Mostly look good but I have one big concern. Making what we called properties in the presentation just be a type of parameter ( that is an end-to-end parameter ) seem like it will make it hard to describe all the way that they don't follow the rules of normal parameters. I think we should call them properties.

Message Parameters sent by the subscriber are always intended for the peer
endpoint and are not forwarded by Relays. Some message parameters sent by the
publisher are intended for the peer endpoint and are not forwarded by Relays,
while others relate to the Track or subscription and are considered End-to-End,
Copy link
Collaborator

Choose a reason for hiding this comment

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

I don't love End-to-end as the name here. The point of these is you do not have to negotiation support for them in the setup and unknown ones are allowed. That is going to make the text really hard for the non end to end parameters. The issue is they only flow one way and end-to-end might suggest they can flow both ways. I did like separating them totally from parameters (other than same code point space) and calling them properties. I think that makes it easier to understand how they are different. Another option might be "track properties" but then I don't want to have to refer to the other ones as "non track propties" everywhere we use them.

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 agree it will be easier to explain and conceptualize if we don't call everything "parameters" and have this distinction between end-to-end and not.

Comment on lines +1569 to +1571
as noted in the parameter definition. End-to-End Parameters sent in PUBLISH,
SUBSCRIBE_OK, TRACK_STATUS_OK or FETCH_OK MUST be cached by Relays and included
in future downstream subscriptions or fetches for that Track.
Copy link
Collaborator

Choose a reason for hiding this comment

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

Ian and I were proposing that if you get a new one if a message, it overrides whatever was in cache before for that property. And when downstreams requests, it gets latest in cache with no upstream check to see if the cache i fresh.


When sent by a publisher, this parameter is End-To-End (see
{{parameter-scope}}).

Copy link
Collaborator

Choose a reason for hiding this comment

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

This just high lights that we should have two separate things of subscriber group order and publisher group order.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

We tried spitting it that way and the PR was incredibly awkward, so we let it roll with the current spelling. Perhaps as this group of extensibility PRs comes into focus we can take another swing at splitting this.

Copy link
Collaborator

Choose a reason for hiding this comment

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

I'd still love to get rid of Group Order, but that's TBD.

Copy link
Collaborator

@ianswett ianswett left a comment

Choose a reason for hiding this comment

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

I think this is close enough, but happy to refine it.

@afrind
Copy link
Collaborator Author

afrind commented Nov 13, 2025

I think we should land #1374 first, then rework this one to use Track Extensions instead of "end-to-end" parameters.

@afrind afrind added the Parked Issue we may discuss later or close as OBE label Nov 13, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Design Issues or PRs that change how MoQ works including the wire format. Extensibility Related to extensions, upgrades and greasing Needs Discussion Tags for issues which need discussion, ideally at an interim or IETF meeting. Parked Issue we may discuss later or close as OBE

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants