Skip to content

Commit 347db21

Browse files
authored
Add Extension Headers to PUBLISH, SUBSCRIBE_OK, and FETCH_OK (#1374)
Fixes #781
2 parents b429515 + 07fdbeb commit 347db21

File tree

1 file changed

+69
-44
lines changed

1 file changed

+69
-44
lines changed

draft-ietf-moq-transport.md

Lines changed: 69 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,29 @@ ways, for example:
605605
3. Use TRACK_STATUS or similar mechanism to query the previous state to
606606
determine the largest published Group ID.
607607

608+
## Extension Headers {#extension-headers}
609+
610+
Tracks and Objects can have additional relay-visible fields, known as Extension
611+
Headers, which do not require negotiation, and can be used to alter
612+
MoQT Object distribution.
613+
614+
Extension Headers are defined in {{moqt-extension-headers}} as well as external
615+
specifications and are registered in an IANA table {{iana}}. These
616+
specifications define the type and value of the header, along with any rules
617+
concerning processing, modification, caching and forwarding.
618+
619+
If unsupported by the relay, Extension Headers MUST NOT be modified, MUST be
620+
cached as part of the Track or Object and MUST be forwarded by relays.
621+
622+
If supported by the relay and subject to the processing rules specified in the
623+
definition of the extension, Extension Headers MAY be modified, added, removed,
624+
and/or cached by relays.
625+
626+
Extension Headers are serialized as Key-Value-Pairs (see {{moq-key-value-pair}}).
627+
628+
Header types are registered in the IANA table 'MOQ Extension Headers'.
629+
See {{iana}}.
630+
608631
# Sessions {#session}
609632

610633
## Session establishment {#session-establishment}
@@ -1331,7 +1354,7 @@ fields that can be updated are the following:
13311354

13321355
1. Object can transition from existing to not existing in cases where the
13331356
object is no longer available.
1334-
2. Object Header Extensions can be added, removed or updated, subject
1357+
2. Object Extension Headers can be added, removed or updated, subject
13351358
to the constraints of the specific header extension.
13361359

13371360
An endpoint that receives a duplicate Object with a different Forwarding
@@ -1535,12 +1558,18 @@ new relay instead of the old Relay. Once Objects are going to the new Relay, the
15351558
published namespaces and subscriptions to the old relay can be withdrawn or
15361559
terminated.
15371560

1561+
## Relay Track Handling
1562+
1563+
A relay MUST include all Extension Headers associated with a Track when sending any PUBLISH,
1564+
SUBSCRIBE_OK, TRACK_STATUS_OK or FETCH_OK, unless allowed by the extension's
1565+
specification (see {{extension-headers}}).
1566+
15381567
## Relay Object Handling
15391568

15401569
MOQT encodes the delivery information via Object headers
1541-
({{message-object}}). A relay MUST NOT modify Object properties when
1542-
forwarding, except for Object Extension Headers as specified in
1543-
{{object-extensions}}.
1570+
({{message-object}}). A relay MUST NOT modify Object properties
1571+
when forwarding, except for Object Extension Headers as specified in
1572+
{{extension-headers}}.
15441573

15451574
A relay MUST treat the object payload as opaque. A relay MUST NOT
15461575
combine, split, or otherwise modify object payloads. A relay SHOULD
@@ -2365,7 +2394,8 @@ SUBSCRIBE_OK Message {
23652394
Request ID (i),
23662395
Track Alias (i),
23672396
Number of Parameters (i),
2368-
Parameters (..) ...
2397+
Parameters (..) ...,
2398+
Track Extensions (..),
23692399
}
23702400
~~~
23712401
{: #moq-transport-subscribe-ok format title="MOQT SUBSCRIBE_OK Message"}
@@ -2381,6 +2411,8 @@ SUBSCRIBE_OK Message {
23812411

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

2414+
* Track Extensions : A sequence of Extension Headers. See {{extension-headers}}.
2415+
23842416
## SUBSCRIBE_UPDATE {#message-subscribe-update}
23852417

23862418
A subscriber sends a SUBSCRIBE_UPDATE to a publisher to modify an existing
@@ -2475,7 +2507,8 @@ PUBLISH Message {
24752507
Track Name (..),
24762508
Track Alias (i),
24772509
Number of Parameters (i),
2478-
Parameters (..) ...
2510+
Parameters (..) ...,
2511+
Track Extensions (..),
24792512
}
24802513
~~~
24812514
{: #moq-transport-publish-format title="MOQT PUBLISH Message"}
@@ -2494,6 +2527,8 @@ PUBLISH Message {
24942527

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

2530+
* Track Extensions : A sequence of Extension Headers. See {{extension-headers}}.
2531+
24972532
A subscriber receiving a PUBLISH for a Track it does not wish to receive SHOULD
24982533
send REQUEST_ERROR with error code `UNINTERESTED`, and abandon reading any
24992534
publisher initiated streams associated with that subscription using a
@@ -2827,6 +2862,7 @@ FETCH_OK Message {
28272862
End Location (Location),
28282863
Number of Parameters (i),
28292864
Parameters (..) ...
2865+
Track Extensions (..),
28302866
}
28312867
~~~
28322868
{: #moq-transport-fetch-ok format title="MOQT FETCH_OK Message"}
@@ -2858,6 +2894,9 @@ FETCH_OK Message {
28582894

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

2897+
* Track Extensions : A sequence of Extension Headers. See {{extension-headers}}.
2898+
2899+
28612900
## FETCH_CANCEL {#message-fetch-cancel}
28622901

28632902
A subscriber sends a FETCH_CANCEL message to a publisher to indicate it is no
@@ -3124,11 +3163,8 @@ according to its `Object Forwarding Preference`.
31243163
* Object Status: An enumeration used to indicate whether the Object is a normal Object
31253164
or mark the end of a group or track. See {{object-status}} below.
31263165

3127-
* Object Extension Length: The total length of the Object Extension Headers
3128-
block, in bytes.
3129-
3130-
* Object Extensions : A sequence of Object Extension Headers. See
3131-
{{object-extensions}} below.
3166+
* Object Extensions : A sequence of Extensions associated with the object. See
3167+
{{object-extensions}}.
31323168

31333169
* Object Payload: An opaque payload intended for an End Subscriber and SHOULD
31343170
NOT be processed by a relay. Only present when 'Object Status' is Normal (0x0).
@@ -3158,45 +3194,29 @@ Any other value SHOULD be treated as a protocol error and the session SHOULD
31583194
be closed with a `PROTOCOL_VIOLATION` ({{session-termination}}).
31593195
Any object with a status code other than zero MUST have an empty payload.
31603196

3161-
#### Object Extension Header {#object-extensions}
3162-
3163-
Any Object with status Normal can have extension headers. If an endpoint
3164-
receives extension headers on Objects with status that is not Normal, it MUST close
3165-
the session with a `PROTOCOL_VIOLATION`.
3166-
3167-
Object Extension Headers are visible to relays and allow the transmission of
3168-
future metadata relevant to MOQT Object distribution. Any Object metadata never
3169-
intended to be accessed by the transport or Relays SHOULD be serialized as part
3170-
of the Object payload and not as an extension header.
3171-
3172-
Extension Headers are defined in external specifications and registered in an
3173-
IANA table {{iana}}. These specifications define the type and value of the
3174-
header, as well as the rules for processing, modification, caching and
3175-
forwarding. All such specifications MUST specify whether multiple values of the
3176-
same extension are allowed on a single Object. A relay that enforces these
3177-
rules is considered to "support" the extension. If a Relay does not support an
3178-
extension header, it MUST assume multiple values are allowed.
3197+
#### Object Extension Headers {#object-extensions}
31793198

3180-
If unsupported by the relay, Extension Headers MUST NOT be modified, MUST be
3181-
cached as part of the Object and MUST be forwarded by relays.
3199+
Any Object with status Normal can have extension headers ({{extension-headers}}).
3200+
If an endpoint receives extension headers on Objects with status that is
3201+
not Normal, it MUST close the session with a `PROTOCOL_VIOLATION`.
31823202

3183-
If supported by the relay and subject to the processing rules specified in the
3184-
definition of the extension, Extension Headers MAY be modified, added, removed,
3185-
and/or cached by relays.
3203+
Object Extension Headers are visible to relays and are intended to be relevant
3204+
to MOQT Object distribution. Any Object metadata never intended to be accessed
3205+
by the transport or Relays SHOULD be serialized as part of the Object payload
3206+
and not as an extension header.
31863207

3187-
Object Extension Headers are serialized as Key-Value-Pairs (see
3188-
{{moq-key-value-pair}}), prefixed by the length of the serialized
3189-
Key-Value-Pairs, in bytes.
3208+
Object Extension Headers are serialized as a length in bytes followed by
3209+
Key-Value-Pairs (see {{moq-key-value-pair}}).
31903210

31913211
~~~
31923212
Extensions {
31933213
Extension Headers Length (i),
3194-
Extension headers (..),
3214+
Extension Headers (..),
31953215
}
31963216
~~~
31973217

3198-
Header types are registered in the IANA table 'MOQ Extension Headers'.
3199-
See {{iana}}.
3218+
Object Extension Header types are registered in the IANA table
3219+
'MOQ Extension Headers'. See {{iana}}.
32003220

32013221
## Datagrams
32023222

@@ -3689,15 +3709,16 @@ SUBGROUP_HEADER {
36893709

36903710
~~~
36913711

3692-
# Extension Headers
3712+
# Extension Headers {#moqt-extension-headers}
36933713

3694-
The following Object Extension Headers are defined in MOQT.
3714+
The following Extension Headers are defined in MOQT. Each Extension Header
3715+
specifies whether it can be used with Tracks, Objects, or both.
36953716

36963717
## Immutable Extensions
36973718

36983719
The Immutable Extensions (Extension Header Type 0xB) contains a sequence of
3699-
Key-Value-Pairs (see {{moq-key-value-pair}}) which are also Object Extension
3700-
Headers of the Object.
3720+
Key-Value-Pairs (see {{moq-key-value-pair}}) which are also Track or Object
3721+
Extension Headers.
37013722

37023723
~~~
37033724
Immutable Extensions {
@@ -3741,6 +3762,8 @@ An Object MUST NOT contain more than one instance of this extension header.
37413762

37423763
## Prior Group ID Gap
37433764

3765+
Prior Group ID Gap only applies to Objects, not Tracks.
3766+
37443767
Prior Group ID Gap (Extension Header Type 0x3C) is a variable length integer
37453768
containing the number of Groups prior to the current Group that do not and will
37463769
never exist. For example, if the Original Publisher is publishing an Object in
@@ -3773,6 +3796,8 @@ An Object MUST NOT contain more than one instance of this extension header.
37733796

37743797
## Prior Object ID Gap
37753798

3799+
Prior Object ID Gap only applies to Objects, not Tracks.
3800+
37763801
Prior Object ID Gap (Extension Header Type 0x3E) is a variable length integer
37773802
containing the number of Objects prior to the current Object that do not and
37783803
will never exist. For example, if the Original Publisher is publishing Object

0 commit comments

Comments
 (0)