From c1b89c784abbd58d2c24bc768e3097f9f26b7d05 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Fri, 18 Oct 2024 13:55:16 -0700 Subject: [PATCH 01/22] Rules for FIN, RESET_STREAM, RESET_STREAM_AT --- draft-ietf-moq-transport.md | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 975d33c7..b10fe8d2 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -1986,6 +1986,63 @@ The Object Status field is only sent if the Object Payload Length is zero. A publisher MUST NOT send an Object on a stream if its Object ID is less than a previously sent Object ID within a given group in that stream. +### Closing Subgroup Streams + +Subscribers will often need to know if they have received all objects in a +Subgroup, particularly if they serve as a relay or cache. QUIC and Webtransport +streams provide signals that can be used for this purpose. Closing Subgroups +promptly frees system resources and often unlocks flow control credit to open +more streams. + +If a sender has delivered all objects in a Subgroup, except any objects that +fall before the beginning of a subscription, it MUST close the stream +with a FIN. + +If a sender closes the stream before verifying it has delivered all such +objects when it , it MUST use a RESET_STREAM or RESET_STREAM_AT +{{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes early +termination of subscription due to an UNSUBSCRIBE message, a sender's +decision to abandon the subscription before the Group is complete, or a +SUBSCRIBE_UPDATE moving the end of the subscription to before the current +Group. + +If a sender does not deliver any objects from a Subgroup of a subscribed Group, +it MAY send a STREAM_HEADER_SUBGROUP on a new data stream, with no objects, and +then send RESET_STREAM_AT with a reliable_size equivalent to the length of the +stream header. This would explicitly tell the receiver that there are unsent +Subgroups in the Group. + +Since SUBSCRIBEs always end on a group boundary [TODO: Update SUBSCRIBE to +express this], an ending subscription can always cleanly close all its +subgroups. A sender that terminates a stream early for any other reason (e.g., +to handoff to a different sender MUST use RESET_STREAM or RESET_STREAM_AT. +Senders SHOULD terminate a stream on Group boundaries to avoid doing so. + +An Original Publisher MAY create EndOfSubgroup objects to provide further +indication that streams are OK to close. + +[TODO: Do we still need EndOfSubgroup objects?] + +An MoQT implementation that processes a stream FIN is assured it has received +all objects in a subgroup from the start of the subscription. If a relay, it +can forward stream FINs to its own subscribers once those objects have been +sent. A relay MAY use EndOfGroup, EndOfSubgroup, GroupDoesNotExist, and +EndOfTrack objects to close streams even if the FIN has not arrived, as further +objects on the stream would be a protocol violation. + +Processing a RESET_STREAM or RESET_STREAM_AT means that there might be other +objects in the Subgroup beyond the last one received. A relay might immediately +reset the corresponding downstream stream, or it might attempt to recover the +missing Objects in an effort to send FIN, presumably with some timeout. It also +might send RESET_STREAM_AT with reliable_size set to the last object it has, so +as to reliably deliver the objects it has while signaling that other objects +exist. + +A relay MAY also use EndOfGroup messages in a Subgroup stream to close streams +for other Subgroups in that Group, if it has received all Object IDs between the +highest Object ID in the subject Subgroup and the EndOfGroup object. This may be +complex to implement. + ## Examples Sending a track on one stream: From 5d6aef04c890efa20b6a9e7a98e91dde8d913a1f Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Fri, 18 Oct 2024 13:58:04 -0700 Subject: [PATCH 02/22] Mention STOP_SENDING --- draft-ietf-moq-transport.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index b10fe8d2..47e416a6 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2043,6 +2043,9 @@ for other Subgroups in that Group, if it has received all Object IDs between the highest Object ID in the subject Subgroup and the EndOfGroup object. This may be complex to implement. +A receiver MAY send a QUIC STOP_SENDING frame on a subgroup stream if the Group +is no longer of interest to it. + ## Examples Sending a track on one stream: From f21fc8a4ea88050fbc6a11310d715c4baf697f02 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Mon, 21 Oct 2024 10:27:36 -0700 Subject: [PATCH 03/22] Update draft-ietf-moq-transport.md Co-authored-by: ianswett --- draft-ietf-moq-transport.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 47e416a6..26a08679 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2043,8 +2043,8 @@ for other Subgroups in that Group, if it has received all Object IDs between the highest Object ID in the subject Subgroup and the EndOfGroup object. This may be complex to implement. -A receiver MAY send a QUIC STOP_SENDING frame on a subgroup stream if the Group -is no longer of interest to it. +A receiver MAY send a QUIC STOP_SENDING frame for a subgroup stream if the Group +or subgroup is no longer of interest to it. ## Examples From 6d76db4569d47653708db77964c968778c9ea279 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Mon, 21 Oct 2024 10:57:25 -0700 Subject: [PATCH 04/22] Ian comment --- draft-ietf-moq-transport.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 12cc430d..d7cf9827 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2196,12 +2196,12 @@ fall before the beginning of a subscription, it MUST close the stream with a FIN. If a sender closes the stream before verifying it has delivered all such -objects when it , it MUST use a RESET_STREAM or RESET_STREAM_AT -{{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes early -termination of subscription due to an UNSUBSCRIBE message, a sender's -decision to abandon the subscription before the Group is complete, or a -SUBSCRIBE_UPDATE moving the end of the subscription to before the current -Group. +objects, it MUST use a RESET_STREAM or RESET_STREAM_AT +{{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes an open +Group exceeding its Delivery Timeout, early termination of subscription due to +an UNSUBSCRIBE message, a sender's decision to abandon the subscription before +the Group is complete, or a SUBSCRIBE_UPDATE moving the end of the subscription +to before the current Group. If a sender does not deliver any objects from a Subgroup of a subscribed Group, it MAY send a STREAM_HEADER_SUBGROUP on a new data stream, with no objects, and From f276b03f8a4b1e3463ecc33817353f064036ba38 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Mon, 21 Oct 2024 14:14:20 -0700 Subject: [PATCH 05/22] Alan comments --- draft-ietf-moq-transport.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index d7cf9827..0e912b95 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2191,18 +2191,25 @@ streams provide signals that can be used for this purpose. Closing Subgroups promptly frees system resources and often unlocks flow control credit to open more streams. -If a sender has delivered all objects in a Subgroup, except any objects that -fall before the beginning of a subscription, it MUST close the stream -with a FIN. +If a sender has delivered all objects in a Subgroup to the QUIC stream, except +any objects that fall before the beginning of a subscription, it MUST close the +stream with a FIN. -If a sender closes the stream before verifying it has delivered all such -objects, it MUST use a RESET_STREAM or RESET_STREAM_AT +If a sender closes the stream before delivering all such objects to the QUIC +stream, it MUST use a RESET_STREAM or RESET_STREAM_AT {{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes an open -Group exceeding its Delivery Timeout, early termination of subscription due to +Subgroup exceeding its Delivery Timeout, early termination of subscription due to an UNSUBSCRIBE message, a sender's decision to abandon the subscription before -the Group is complete, or a SUBSCRIBE_UPDATE moving the end of the subscription +the Subgroup is complete, or a SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group. +A sender might deliver all objects in a Subgroup to the QUIC stream, including a +FIN, and then reset the stream because any retransmissions are unnecessary due +to any of the reset conditions above being met. In this case, the receiving +application would receive the FIN if and only if all objects were, in fact, +delivered. The application can therefore ignore a RESET_STREAM if it receives +FIN. + If a sender does not deliver any objects from a Subgroup of a subscribed Group, it MAY send a STREAM_HEADER_SUBGROUP on a new data stream, with no objects, and then send RESET_STREAM_AT with a reliable_size equivalent to the length of the From 39efb04d263af376c0de2a61eb76dd55526d789e Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:13:30 -0700 Subject: [PATCH 06/22] Alan comments --- draft-ietf-moq-transport.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 0e912b95..2a1ed310 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2234,6 +2234,11 @@ sent. A relay MAY use EndOfGroup, EndOfSubgroup, GroupDoesNotExist, and EndOfTrack objects to close streams even if the FIN has not arrived, as further objects on the stream would be a protocol violation. +Similarly, a relay MAY also use EndOfGroup messages in a Subgroup stream to +close streams for other Subgroups in that Group, if it has received all Object +IDs between the highest Object ID in the subject Subgroup and the EndOfGroup +object. This might be complex to implement. + Processing a RESET_STREAM or RESET_STREAM_AT means that there might be other objects in the Subgroup beyond the last one received. A relay might immediately reset the corresponding downstream stream, or it might attempt to recover the @@ -2242,13 +2247,15 @@ might send RESET_STREAM_AT with reliable_size set to the last object it has, so as to reliably deliver the objects it has while signaling that other objects exist. -A relay MAY also use EndOfGroup messages in a Subgroup stream to close streams -for other Subgroups in that Group, if it has received all Object IDs between the -highest Object ID in the subject Subgroup and the EndOfGroup object. This may be -complex to implement. - A receiver MAY send a QUIC STOP_SENDING frame for a subgroup stream if the Group -or subgroup is no longer of interest to it. +or Subgroup is no longer of interest to it. The sender SHOULD respond with +RESET_STREAM or RESET_STREAM_AT. If RESET_STREAM_AT, note that the receiver has +indicated no interest in the objects, so setting a reliable_size beyond the +stream header is of questionable utility. + +RESET_STREAM and STOP_SENDING on SUBSCRIBE data streams have no impact on other +Subgroups in the Group or the subscription at large, although in practice all +Subgroups in a Group will sometimes be canceled at once. ### Fetch Header {#fetch-header} From 518e3e455f40e6e8fbcb9a0aa9187ada593d2fb7 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:14:24 -0700 Subject: [PATCH 07/22] Update draft-ietf-moq-transport.md Co-authored-by: ianswett --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 2a1ed310..73aa1adb 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2192,7 +2192,7 @@ promptly frees system resources and often unlocks flow control credit to open more streams. If a sender has delivered all objects in a Subgroup to the QUIC stream, except -any objects that fall before the beginning of a subscription, it MUST close the +any objects before the beginning of a subscription, it MUST close the stream with a FIN. If a sender closes the stream before delivering all such objects to the QUIC From e1a2b79412ff63c72e753e4a89a07ad0ed2e640f Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:14:53 -0700 Subject: [PATCH 08/22] Update draft-ietf-moq-transport.md Co-authored-by: ianswett --- draft-ietf-moq-transport.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 73aa1adb..06a027f9 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2199,8 +2199,7 @@ If a sender closes the stream before delivering all such objects to the QUIC stream, it MUST use a RESET_STREAM or RESET_STREAM_AT {{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes an open Subgroup exceeding its Delivery Timeout, early termination of subscription due to -an UNSUBSCRIBE message, a sender's decision to abandon the subscription before -the Subgroup is complete, or a SUBSCRIBE_UPDATE moving the end of the subscription +an UNSUBSCRIBE message, a sender's decision to abandon the subscription, or a SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group. A sender might deliver all objects in a Subgroup to the QUIC stream, including a From 5387c5517adaacb328bf70f0170ebf05e022f620 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:16:11 -0700 Subject: [PATCH 09/22] Update draft-ietf-moq-transport.md Co-authored-by: ianswett --- draft-ietf-moq-transport.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 06a027f9..7401cde4 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2202,12 +2202,10 @@ Subgroup exceeding its Delivery Timeout, early termination of subscription due t an UNSUBSCRIBE message, a sender's decision to abandon the subscription, or a SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group. -A sender might deliver all objects in a Subgroup to the QUIC stream, including a -FIN, and then reset the stream because any retransmissions are unnecessary due -to any of the reset conditions above being met. In this case, the receiving -application would receive the FIN if and only if all objects were, in fact, -delivered. The application can therefore ignore a RESET_STREAM if it receives -FIN. +A sender might send all objects in a Subgroup and the FIN on a QUIC stream, +and then reset the stream. In this case, the receiving application would receive +the FIN if and only if all objects were sent. If the application receives all data on +the stream and the FIN, it can ignore any RESET_STREAM it receives. If a sender does not deliver any objects from a Subgroup of a subscribed Group, it MAY send a STREAM_HEADER_SUBGROUP on a new data stream, with no objects, and From f29b9dfb84c6424c2f62bb28b04ec004e820c295 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:16:28 -0700 Subject: [PATCH 10/22] Update draft-ietf-moq-transport.md Co-authored-by: ianswett --- draft-ietf-moq-transport.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 7401cde4..91c3506f 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2207,11 +2207,10 @@ and then reset the stream. In this case, the receiving application would receive the FIN if and only if all objects were sent. If the application receives all data on the stream and the FIN, it can ignore any RESET_STREAM it receives. -If a sender does not deliver any objects from a Subgroup of a subscribed Group, -it MAY send a STREAM_HEADER_SUBGROUP on a new data stream, with no objects, and -then send RESET_STREAM_AT with a reliable_size equivalent to the length of the -stream header. This would explicitly tell the receiver that there are unsent -Subgroups in the Group. +If a sender will not deliver any objects from a Subgroup, it MAY send +a STREAM_HEADER_SUBGROUP on a new stream, with no objects, and +then send RESET_STREAM_AT with a reliable_size equal to the length of the +stream header. This explicitly tells the receiver there is an unsent Subgroup. Since SUBSCRIBEs always end on a group boundary [TODO: Update SUBSCRIBE to express this], an ending subscription can always cleanly close all its From 9ff16c5740e33db9f16c7c5093f4302b8275fe3d Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:22:47 -0700 Subject: [PATCH 11/22] lint --- draft-ietf-moq-transport.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 91c3506f..6eb78c8d 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2199,13 +2199,13 @@ If a sender closes the stream before delivering all such objects to the QUIC stream, it MUST use a RESET_STREAM or RESET_STREAM_AT {{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes an open Subgroup exceeding its Delivery Timeout, early termination of subscription due to -an UNSUBSCRIBE message, a sender's decision to abandon the subscription, or a SUBSCRIBE_UPDATE moving the end of the subscription -to before the current Group. +an UNSUBSCRIBE message, a sender's decision to abandon the subscription, or a +SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group. A sender might send all objects in a Subgroup and the FIN on a QUIC stream, -and then reset the stream. In this case, the receiving application would receive -the FIN if and only if all objects were sent. If the application receives all data on -the stream and the FIN, it can ignore any RESET_STREAM it receives. +and then reset the stream. In this case, the receiving application would receive +the FIN if and only if all objects were received. If the application receives +all data on the stream and the FIN, it can ignore any RESET_STREAM it receives. If a sender will not deliver any objects from a Subgroup, it MAY send a STREAM_HEADER_SUBGROUP on a new stream, with no objects, and @@ -2230,10 +2230,10 @@ sent. A relay MAY use EndOfGroup, EndOfSubgroup, GroupDoesNotExist, and EndOfTrack objects to close streams even if the FIN has not arrived, as further objects on the stream would be a protocol violation. -Similarly, a relay MAY also use EndOfGroup messages in a Subgroup stream to -close streams for other Subgroups in that Group, if it has received all Object -IDs between the highest Object ID in the subject Subgroup and the EndOfGroup -object. This might be complex to implement. +Similarly, an EndOfGroup message indicates the total number of Objects in the +Group, so if all Objects in the Group have been received, a FIN can be sent on +any stream where the entire subgroup has been sent. This might be complex to +implement. Processing a RESET_STREAM or RESET_STREAM_AT means that there might be other objects in the Subgroup beyond the last one received. A relay might immediately From fad61e9f3c2f12180b5c5932ad40f61010816843 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:26:07 -0700 Subject: [PATCH 12/22] nit --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 6eb78c8d..f6ef826f 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2215,7 +2215,7 @@ stream header. This explicitly tells the receiver there is an unsent Subgroup. Since SUBSCRIBEs always end on a group boundary [TODO: Update SUBSCRIBE to express this], an ending subscription can always cleanly close all its subgroups. A sender that terminates a stream early for any other reason (e.g., -to handoff to a different sender MUST use RESET_STREAM or RESET_STREAM_AT. +to handoff to a different sender) MUST use RESET_STREAM or RESET_STREAM_AT. Senders SHOULD terminate a stream on Group boundaries to avoid doing so. An Original Publisher MAY create EndOfSubgroup objects to provide further From 899d194a50c3d98950d9471dc2f88c9ccbbc3761 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 11:27:35 -0700 Subject: [PATCH 13/22] Update draft-ietf-moq-transport.md Co-authored-by: ianswett --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index f6ef826f..becf53b5 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2238,7 +2238,7 @@ implement. Processing a RESET_STREAM or RESET_STREAM_AT means that there might be other objects in the Subgroup beyond the last one received. A relay might immediately reset the corresponding downstream stream, or it might attempt to recover the -missing Objects in an effort to send FIN, presumably with some timeout. It also +missing Objects in an effort send all the objects in the subgroups and the FIN. It also might send RESET_STREAM_AT with reliable_size set to the last object it has, so as to reliably deliver the objects it has while signaling that other objects exist. From 2079552bf27b6f1b2ba291f8502a03af189eeb18 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 14:40:20 -0700 Subject: [PATCH 14/22] Update draft-ietf-moq-transport.md Co-authored-by: afrind --- draft-ietf-moq-transport.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index becf53b5..470fe597 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2226,8 +2226,8 @@ indication that streams are OK to close. An MoQT implementation that processes a stream FIN is assured it has received all objects in a subgroup from the start of the subscription. If a relay, it can forward stream FINs to its own subscribers once those objects have been -sent. A relay MAY use EndOfGroup, EndOfSubgroup, GroupDoesNotExist, and -EndOfTrack objects to close streams even if the FIN has not arrived, as further +sent. A relay MAY treat receipt of EndOfGroup, EndOfSubgroup, GroupDoesNotExist, or +EndOfTrack objects as a signal to close corresponding streams even if the FIN has not arrived, as further objects on the stream would be a protocol violation. Similarly, an EndOfGroup message indicates the total number of Objects in the From 60dedc313e84b6325a3fc4a53c70a390822eee5c Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 14:45:46 -0700 Subject: [PATCH 15/22] Update draft-ietf-moq-transport.md Co-authored-by: afrind --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 470fe597..49df2d5b 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2241,7 +2241,7 @@ reset the corresponding downstream stream, or it might attempt to recover the missing Objects in an effort send all the objects in the subgroups and the FIN. It also might send RESET_STREAM_AT with reliable_size set to the last object it has, so as to reliably deliver the objects it has while signaling that other objects -exist. +might exist. A receiver MAY send a QUIC STOP_SENDING frame for a subgroup stream if the Group or Subgroup is no longer of interest to it. The sender SHOULD respond with From 443ead18040aad2c0fbaf4a1a07213966bd06ff1 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Tue, 22 Oct 2024 15:23:33 -0700 Subject: [PATCH 16/22] Alan's comment --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 49df2d5b..1ad6e796 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2230,7 +2230,7 @@ sent. A relay MAY treat receipt of EndOfGroup, EndOfSubgroup, GroupDoesNotExist, EndOfTrack objects as a signal to close corresponding streams even if the FIN has not arrived, as further objects on the stream would be a protocol violation. -Similarly, an EndOfGroup message indicates the total number of Objects in the +Similarly, an EndOfGroup message indicates the total maximum Object ID in the Group, so if all Objects in the Group have been received, a FIN can be sent on any stream where the entire subgroup has been sent. This might be complex to implement. From 15d1787faa0863ac960b9fb145b73cde5a2574db Mon Sep 17 00:00:00 2001 From: ianswett Date: Sat, 26 Oct 2024 09:58:04 -0400 Subject: [PATCH 17/22] Remove a TODO --- draft-ietf-moq-transport.md | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 10c66f4c..8bcc7a98 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2204,23 +2204,18 @@ a STREAM_HEADER_SUBGROUP on a new stream, with no objects, and then send RESET_STREAM_AT with a reliable_size equal to the length of the stream header. This explicitly tells the receiver there is an unsent Subgroup. -Since SUBSCRIBEs always end on a group boundary [TODO: Update SUBSCRIBE to -express this], an ending subscription can always cleanly close all its -subgroups. A sender that terminates a stream early for any other reason (e.g., -to handoff to a different sender) MUST use RESET_STREAM or RESET_STREAM_AT. -Senders SHOULD terminate a stream on Group boundaries to avoid doing so. - -An Original Publisher MAY create EndOfSubgroup objects to provide further -indication that streams are OK to close. - -[TODO: Do we still need EndOfSubgroup objects?] +Since SUBSCRIBEs always end on a group boundary, an ending subscription can +always cleanly close all its subgroups. A sender that terminates a stream +early for any other reason (e.g., to handoff to a different sender) MUST +use RESET_STREAM or RESET_STREAM_AT. Senders SHOULD terminate a stream on +Group boundaries to avoid doing so. An MoQT implementation that processes a stream FIN is assured it has received all objects in a subgroup from the start of the subscription. If a relay, it can forward stream FINs to its own subscribers once those objects have been sent. A relay MAY treat receipt of EndOfGroup, EndOfSubgroup, GroupDoesNotExist, or -EndOfTrack objects as a signal to close corresponding streams even if the FIN has not arrived, as further -objects on the stream would be a protocol violation. +EndOfTrack objects as a signal to close corresponding streams even if the FIN +has not arrived, as further objects on the stream would be a protocol violation. Similarly, an EndOfGroup message indicates the total maximum Object ID in the Group, so if all Objects in the Group have been received, a FIN can be sent on From 85ee258a7f35d57d6ffa1edc2ce024f983310251 Mon Sep 17 00:00:00 2001 From: ianswett Date: Sat, 26 Oct 2024 10:00:17 -0400 Subject: [PATCH 18/22] Update draft-ietf-moq-transport.md --- draft-ietf-moq-transport.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 8bcc7a98..7b5bedf3 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2237,8 +2237,8 @@ indicated no interest in the objects, so setting a reliable_size beyond the stream header is of questionable utility. RESET_STREAM and STOP_SENDING on SUBSCRIBE data streams have no impact on other -Subgroups in the Group or the subscription at large, although in practice all -Subgroups in a Group will sometimes be canceled at once. +Subgroups in the Group or the subscription, although applications might cancel all +Subgroups in a Group at once. ### Fetch Header {#fetch-header} From 3d6d4154b69c720209674b13d7c3da4e26ee37a8 Mon Sep 17 00:00:00 2001 From: ianswett Date: Sat, 26 Oct 2024 10:04:44 -0400 Subject: [PATCH 19/22] Use publisher and subscriber --- draft-ietf-moq-transport.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 7b5bedf3..298c0d23 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2230,10 +2230,10 @@ might send RESET_STREAM_AT with reliable_size set to the last object it has, so as to reliably deliver the objects it has while signaling that other objects might exist. -A receiver MAY send a QUIC STOP_SENDING frame for a subgroup stream if the Group -or Subgroup is no longer of interest to it. The sender SHOULD respond with -RESET_STREAM or RESET_STREAM_AT. If RESET_STREAM_AT, note that the receiver has -indicated no interest in the objects, so setting a reliable_size beyond the +A subscriber MAY send a QUIC STOP_SENDING frame for a subgroup stream if the Group +or Subgroup is no longer of interest to it. The publisher SHOULD respond with +RESET_STREAM or RESET_STREAM_AT. If RESET_STREAM_AT is sent, note that the receiver +has indicated no interest in the objects, so setting a reliable_size beyond the stream header is of questionable utility. RESET_STREAM and STOP_SENDING on SUBSCRIBE data streams have no impact on other From abf362ca483fa163cc40265393e0befe45ba5ef3 Mon Sep 17 00:00:00 2001 From: ianswett Date: Sat, 26 Oct 2024 10:06:09 -0400 Subject: [PATCH 20/22] Update draft-ietf-moq-transport.md --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 298c0d23..c882b776 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2191,7 +2191,7 @@ If a sender closes the stream before delivering all such objects to the QUIC stream, it MUST use a RESET_STREAM or RESET_STREAM_AT {{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes an open Subgroup exceeding its Delivery Timeout, early termination of subscription due to -an UNSUBSCRIBE message, a sender's decision to abandon the subscription, or a +an UNSUBSCRIBE message, a publisher's decision to end the subscription early, or a SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group. A sender might send all objects in a Subgroup and the FIN on a QUIC stream, From e5ac75542f848cf79fdf42ac8291e406a3c273ee Mon Sep 17 00:00:00 2001 From: ianswett Date: Sat, 26 Oct 2024 10:08:01 -0400 Subject: [PATCH 21/22] Update draft-ietf-moq-transport.md --- draft-ietf-moq-transport.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index c882b776..ccf2a023 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2192,7 +2192,8 @@ stream, it MUST use a RESET_STREAM or RESET_STREAM_AT {{!I-D.draft-ietf-quic-reliable-stream-reset}} frame. This includes an open Subgroup exceeding its Delivery Timeout, early termination of subscription due to an UNSUBSCRIBE message, a publisher's decision to end the subscription early, or a -SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group. +SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group +or the start after the current Group. A sender might send all objects in a Subgroup and the FIN on a QUIC stream, and then reset the stream. In this case, the receiving application would receive From 403bbebade8fd05e6445fb4727a0c823a1b23c98 Mon Sep 17 00:00:00 2001 From: ianswett Date: Sat, 26 Oct 2024 12:53:52 -0400 Subject: [PATCH 22/22] Update draft-ietf-moq-transport.md --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index ccf2a023..359573e2 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2218,7 +2218,7 @@ sent. A relay MAY treat receipt of EndOfGroup, EndOfSubgroup, GroupDoesNotExist, EndOfTrack objects as a signal to close corresponding streams even if the FIN has not arrived, as further objects on the stream would be a protocol violation. -Similarly, an EndOfGroup message indicates the total maximum Object ID in the +Similarly, an EndOfGroup message indicates the maximum Object ID in the Group, so if all Objects in the Group have been received, a FIN can be sent on any stream where the entire subgroup has been sent. This might be complex to implement.