§7.19.

SUBSCRIBE_DONE

A publisher sends a SUBSCRIBE_DONE message to indicate it is done publishing Objects for that subscription. The Status Code indicates why the subscription ended, and whether it was an error. Because SUBSCRIBE_DONE is sent on the control stream, it is likely to arrive at the receiver before late-arriving objects, and often even late-opening streams. However, the receiver uses it as an indication that it should receive any late-opening streams in a relatively short time.

Note that some objects in the subscribed track might never be delivered, because a stream was reset, or never opened in the first place, due to the delivery timeout.

A sender MUST NOT send SUBSCRIBE_DONE until it has closed all streams it will ever open, and has no further datagrams to send, for a subscription. After sending SUBSCRIBE_DONE, the sender can immediately destroy subscription state, although stream state can persist until delivery completes. The sender might persist subscription state to enforce the delivery timeout by resetting streams on which it has already sent FIN, only deleting it when all such streams have received ACK of the FIN.

A sender MUST NOT destroy subscription state until it sends SUBSCRIBE_DONE, though it can choose to stop sending objects (and thus send SUBSCRIBE_DONE) for any reason.

A subscriber that receives SUBSCRIBE_DONE SHOULD set a timer of at least its delivery timeout in case some objects are still inbound due to prioritization or packet loss. The subscriber MAY dispense with a timer if it sent UNSUBSCRIBE or is otherwise no longer interested in objects from the track. Once the timer has expired, the receiver destroys subscription state once all open streams for the subscription have closed. A subscriber MAY discard subscription state earlier, at the cost of potentially not delivering some late objects to the application. The subscriber SHOULD send STOP_SENDING on all streams related to the subscription when it deletes subscription state.

The format of SUBSCRIBE_DONE is as follows:

SUBSCRIBE_DONE Message {
  Type (i) = 0xB,
  Length (i),
  Subscribe ID (i),
  Status Code (i),
  Stream Count (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
Figure 20: MOQT SUBSCRIBE_DONE Message
  • Subscribe ID: Subscription identifier as defined in Section 7.4.

  • Status Code: An integer status code indicating why the subscription ended.

  • Stream Count: An integer indicating the number of data streams the publisher opened for this subscription. The subscriber can remove all subscription state once the same number of streams have been processed.

  • Reason Phrase: Provides the reason for subscription error.

The application SHOULD use a relevant status code in SUBSCRIBE_DONE, as defined below:

Table 6
Code Reason
0x0 Internal Error
0x1 Unauthorized
0x2 Track Ended
0x3 Subscription Ended
0x4 Going Away
0x5 Expired
0x6 Too Far Behind

This is one section of the MoQT specification, rendered per-section for quick reference and citation. The authoritative text is draft-ietf-moq-transport-08 at the IETF.