| Internet-Draft | MOQT FETCH Pacing | August 2026 |
| Law, et al. | Expires 4 February 2027 | [Page] |
This draft defines an extension to MOQT to enable the paced delivery of content returned in response to a FETCH message.¶
This note is to be removed before publishing as an RFC.¶
Status information for this document may be found at https://datatracker.ietf.org/doc/draft-wilaw-moq-fetch-pacing/.¶
Discussion of this document takes place on the Media Over QUIC Working Group mailing list (mailto:moq@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/moq/. Subscribe at https://www.ietf.org/mailman/listinfo/moq/.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 4 February 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
Standard congestion control algorithms attempt to download data as quickly as possible. Because throughput between a relay and client is typically much higher than the encoded rate of the content, data retrieved via a FETCH message in MOQT can arrive in bursts far exceeding what is needed for playback. This burstiness contributes to buffer bloat and packet loss on the intermediary network. A better goal for a delivery system is not to download as fast as possible, but to download as fast as needed. In the context of Adaptive Bitrate Switching (ABR), "as needed" means a rate that avoids triggering unnecessary downward bitrate switches while still delivering enough data to allow the client to switch up when appropriate. Delivering data at this pace, rather than as fast as possible, has been shown to improve throughput and reduce retransmissions and Round-Trip-Time (RTT) [SAMMY].¶
This draft defines a mechanism for a client to negotiate support for a pacing extension during SETUP, and to activate that behavior via a new parameter accompanying a FETCH message.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This draft defines a new MOQT extension, FETCH PACING, negotiated per [MOQT] Section 3.2. Support for the extension is advertised via a new Boolean Setup Option, FETCH_PACING_SUPPORTED, included in the SETUP message. An endpoint that implements this specification MUST include FETCH_PACING_SUPPORTED in its SETUP message; an endpoint that omits it MUST be treated as not supporting the extension. Once both peers have sent and received SETUP, each endpoint determines whether FETCH Pacing is part of the negotiated feature set: the extension is considered active for the session only if both the client and the peer serving the FETCH included FETCH_PACING_SUPPORTED.¶
Once negotiated, a client activates pacing on a FETCH message by including a new Message Parameter, PACING_RATE. The value of PACING_RATE is a varint as defined by [MOQT] Sect 1.4.1. Variable-Length Integers. This rate signal is an integer in the range (0-126). A value outside of that range MUST result in the publisher rejecting the FETCH with a REQUEST_ERROR message.¶
The rate signal is interpreted as defined in SCONE [SCONE] Section 5.1. The rate follows a logarithmic scale defined as:¶
Base rate (b_min) = 100 Kbps¶
Bitrate at value n = b_min * 10^(n/20)¶
where n is an integer between 0 and 126 represented by the value of the PACING_RATE parameter.¶
An endpoint that receives a FETCH message containing PACING_RATE from a client with which the extension was negotiated MUST pace delivery of the requested Objects at approximately the indicated rate. The timebase of this pacing SHOULD be at least the Group duration of the track being paced. Different relays will offer slightly different behavior and clients SHOULD NOT depend on precise pacing for their application success.¶
If the PACING_RATE parameter is absent, the endpoint MUST deliver Objects using its default, unpaced behavior. A client MUST NOT send PACING_RATE unless FETCH Pacing was successfully negotiated in SETUP; per Section 3.3 of [MOQT], sending an unnegotiated Message Parameter risks session termination.¶
The PACING_RATE parameter does not persist across FETCH instances and MUST be repeated with each new FETCH message in which pacing is required. Since FETCH provides no update mechanism, the pacing rate cannot be modified or removed once set. A client wishing to modify the pacing rate MUST cancel their FETCH request and issue a new FETCH message with the updated pacing value.¶
A relay MAY propagate a pacing parameter upstream only if it is assured that its downstream clients will FETCH that track at that rate or lower.¶
Table 1 lists some example values for rate signals and the corresponding bitrate for each.¶
| n | Bitrate (Mbps) |
|---|---|
| 0 | 0.10 |
| 1 | 0.11 |
| 3 | 0.14 |
| 10 | 0.32 |
| 20 | 1.00 |
| 25 | 1.78 |
| 30 | 3.16 |
| 35 | 5.62 |
| 40 | 10.00 |
| 45 | 17.78 |
| 50 | 31.62 |
| 55 | 56.23 |
| 60 | 100.00 |
Pacing signals are client provided and therefore might be abused by malicious clients. These clients can only send values in the range 0-126 as values outside this range will result in a REQUEST_ERROR, so range-based attacks are limited.¶
If a client sets a pacing rate far below the encoded bitrate of the track, for example setting a 100kbps limit on an hour of content encoded at 10Mbps, then there will be two consequences:¶
An edge relay will pull the content to the edge with an upstream fetch, cache it and then release it slowly to the client. This can result in increased cache space pressure on the edge relay.¶
The relay will spend more time delivering content than it otherwise would have, consuming additional resources.¶
These scenarios are similar to a client SUBSCRIBING to content with forward=0 and can be mitigated by general protective measures. For example, a relay could terminate a FETCH that is taking too long to drain with a REQUEST_ERROR.¶
Additionally, if the mechanism by which the relay paces the content is inefficient, then a client can cause additional work for the relay by activating pacing on FETCH requests. Relays that cannot offer efficient pacing might choose to not offer pacing during SETUP.¶
This document requests that IANA add two new entries to registries defined in [MOQT].¶
IANA is requested to add the following entry to the "Setup Options" registry (Section 15.4 of [MOQT]):¶
| Type | Name | Specification |
|---|---|---|
| TBD1 | FETCH_PACING_SUPPORTED | This document |
FETCH_PACING_SUPPORTED is a boolean Setup Option (see Section 3) that an endpoint includes in its SETUP message to indicate support for the FETCH Pacing extension defined in this document.¶
IANA is requested to add the following entry to the "Message Parameters" registry (Section 15.7 of [MOQT]):¶
| Parameter Type | Parameter Name | Specification |
|---|---|---|
| TBD2 | PACING_RATE | This document |
PACING_RATE is a Message Parameter (see Section 4) that a client includes in a FETCH message to activate pacing for that request, once FETCH_PACING_SUPPORTED has been successfully negotiated per Section 3.2 of [MOQT].¶