Skip to content

Commit 0b10ea6

Browse files
kixelatedclaude
andcommitted
Add draft-lcurley-moq-probe extension for MoQ Transport
Defines a PROBE bidirectional stream extension for bandwidth estimation. Subscribers request a target bitrate, publishers respond with measured bitrate and elapsed timestamps. Supports QUIC PING+PADDING or datagram fallback for padding. Addresses the application-limited problem where congestion controllers underestimate bandwidth for ABR media delivery. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3460143 commit 0b10ea6

1 file changed

Lines changed: 215 additions & 0 deletions

File tree

draft-lcurley-moq-probe.md

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
---
2+
title: "MoQ Probe Extension"
3+
abbrev: "moq-probe"
4+
category: info
5+
6+
docname: draft-lcurley-moq-probe-latest
7+
submissiontype: IETF # also: "independent", "editorial", "IAB", or "IRTF"
8+
number:
9+
date:
10+
v: 3
11+
area: wit
12+
workgroup: moq
13+
14+
author:
15+
-
16+
fullname: Luke Curley
17+
email: kixelated@gmail.com
18+
19+
normative:
20+
moqt: I-D.ietf-moq-transport
21+
22+
informative:
23+
24+
--- abstract
25+
26+
This document defines a PROBE extension for MoQ Transport {{moqt}}.
27+
A subscriber opens a bidirectional PROBE stream to request that the publisher pad the connection up to a target.
28+
The publisher periodically responds with the measured bitrate and an elapsed timestamp, enabling the subscriber to estimate the available bandwidth.
29+
30+
--- middle
31+
32+
# Conventions and Definitions
33+
{::boilerplate bcp14-tagged}
34+
35+
36+
# Introduction
37+
Bandwidth estimation is essential for adaptive bitrate media delivery.
38+
A subscriber needs to know the available bandwidth in order to select appropriate media tracks and qualities.
39+
40+
## Application-Limited
41+
Many MoQ applications are application-limited: the average bitrate of the media is less than the available bandwidth.
42+
Most congestion control algorithms only grow the congestion window or bandwidth estimate when fully utilized.
43+
This means the available bandwidth is often underestimated, and the subscriber has no way to know if it can safely switch to a higher quality track.
44+
45+
This is particularly problematic for adaptive bitrate (ABR) algorithms.
46+
A viewer may get stuck at a low quality rendition indefinitely because the congestion window never grows to reflect the true link capacity.
47+
If the viewer does attempt to switch to a higher rendition without first probing, they risk buffering — either because the congestion window has not been warmed up to support the higher bitrate, or because the network genuinely cannot sustain it.
48+
Without probing, the subscriber cannot distinguish between these two cases.
49+
50+
{{moqt}} Section 3.7.2 suggests subscribing to additional tracks at low priority to fill the congestion window during probing intervals.
51+
However, this is difficult in practice because the subscriber does not know when probing is needed or by how much.
52+
The congestion window and bandwidth estimate are internal to the sender's congestion controller and are not exposed to the application, let alone the remote peer.
53+
The subscriber cannot distinguish between "the network has more capacity" and "the congestion controller is already fully utilizing the link".
54+
It also requires the publisher to have pre-encoded padding tracks and the subscriber to manage extra subscriptions.
55+
56+
## Hop-by-Hop
57+
MoQ is designed to work end-to-end via relays.
58+
Each hop may have different network conditions, so bandwidth estimation must be performed per-hop rather than end-to-end.
59+
A subscriber needs to know the capacity of its immediate connection, not the capacity of the origin.
60+
61+
Using a wire-level extension ensures that PROBE measurements are scoped to a single hop.
62+
A relay terminates the PROBE stream and does not forward it upstream, avoiding incorrect measurements that reflect intermediate link capacity.
63+
64+
## This Extension
65+
This extension provides a simple mechanism for bandwidth estimation.
66+
The subscriber opens a PROBE stream and requests that the publisher pad the connection to a target.
67+
The publisher responds with periodic measurements, allowing the subscriber to adjust its subscriptions accordingly.
68+
69+
70+
# Setup Negotiation
71+
The PROBE extension is negotiated during the SETUP exchange as defined in {{moqt}} Section 9.4.
72+
73+
Both endpoints indicate support by including the following Setup Option:
74+
75+
~~~
76+
PROBE Setup Option {
77+
Option Key (vi64) = 0xPROBE_TODO
78+
Option Value Length (vi64) = 0
79+
}
80+
~~~
81+
82+
If both endpoints include this option, the PROBE extension is available for the session.
83+
If a peer receives a PROBE stream without having negotiated the extension, it MUST close the session with a PROTOCOL_VIOLATION.
84+
85+
86+
# PROBE Stream
87+
The PROBE extension uses a new bidirectional stream type.
88+
89+
~~~
90+
STREAM_TYPE = 0xPROBE_TODO
91+
~~~
92+
93+
The stream type is sent at the beginning of the stream, encoded as a variable-length integer, consistent with {{moqt}} stream type framing.
94+
95+
A subscriber (stream opener) sends PROBE_REQUEST messages on the stream.
96+
The publisher (responder) sends PROBE_RESPONSE messages on the stream.
97+
Either endpoint MAY close or reset the stream at any time.
98+
99+
100+
## PROBE_REQUEST
101+
A subscriber sends a PROBE_REQUEST to indicate the target the publisher should attempt to reach.
102+
103+
~~~
104+
PROBE_REQUEST {
105+
Message Length (vi64)
106+
Target Bitrate (vi64)
107+
}
108+
~~~
109+
110+
**Target Bitrate**:
111+
The desired bitrate in kilobits per second.
112+
The publisher SHOULD pad the connection to attempt to reach this rate.
113+
A value of 0 indicates no padding is needed; the publisher SHOULD only send media data but MUST continue sending PROBE_RESPONSE messages.
114+
This is useful for passively monitoring the current bitrate without actively probing for more bandwidth.
115+
Either endpoint MAY close or reset the stream to stop receiving updates entirely.
116+
117+
The subscriber MAY send multiple PROBE_REQUEST messages on the same stream.
118+
Each new PROBE_REQUEST supersedes the previous one.
119+
The publisher MUST use the most recently received target.
120+
121+
122+
## PROBE_RESPONSE
123+
The publisher periodically sends PROBE_RESPONSE messages containing the measured bitrate and the elapsed time since the last response.
124+
125+
~~~
126+
PROBE_RESPONSE {
127+
Message Length (vi64)
128+
Measured Bitrate (vi64)
129+
Elapsed (vi64)
130+
}
131+
~~~
132+
133+
**Measured Bitrate**:
134+
The current measured bitrate in kilobits per second across all streams on the connection.
135+
This includes media, padding, and any other data sent by the publisher.
136+
137+
**Elapsed**:
138+
The number of milliseconds since the previous PROBE_RESPONSE on this stream.
139+
For the first PROBE_RESPONSE, this is the number of milliseconds since the corresponding PROBE_REQUEST was received.
140+
This allows the subscriber to assess the freshness of the measurement and detect stale updates caused by network delays.
141+
142+
The publisher SHOULD send PROBE_RESPONSE messages at regular intervals while probing is active.
143+
The interval is implementation-defined but a value between 100ms and 1000ms is RECOMMENDED.
144+
145+
146+
# Padding
147+
Padding is optional and depends on the capabilities of the QUIC implementation.
148+
A publisher that does not support padding MUST still send PROBE_RESPONSE messages based on the actual sending rate.
149+
150+
## QUIC-Level Padding
151+
The preferred method is for the QUIC implementation to send PING+PADDING frames.
152+
PADDING frames alone MUST NOT be used, as they are not ack-eliciting and can cause starvation of the congestion controller.
153+
PING+PADDING is transparent to the application and does not consume application-level flow control.
154+
155+
## Datagram Padding
156+
If the QUIC implementation does not expose a padding API, the publisher MAY send QUIC datagrams as a fallback.
157+
Datagrams are unreliable and do not consume stream-level flow control, making them suitable for padding.
158+
159+
A PROBE datagram is identified by a well-known datagram type:
160+
161+
~~~
162+
PROBE Datagram {
163+
Datagram Type (vi64) = 0xPROBE_TODO
164+
Padding (..)
165+
}
166+
~~~
167+
168+
The contents of the Padding field are arbitrary and MUST be discarded by the receiver.
169+
The receiver MUST NOT interpret the contents as application data.
170+
171+
## General Requirements
172+
Padding SHOULD be sent at the lowest priority to avoid interfering with media delivery.
173+
174+
The publisher MUST NOT exceed the target with padding alone.
175+
If media traffic already meets or exceeds the target, no additional padding is necessary.
176+
177+
The publisher MUST respect the QUIC congestion controller.
178+
Padding that would cause the congestion window to be exceeded MUST NOT be sent.
179+
The goal is to fill unused capacity, not to cause congestion.
180+
181+
182+
# Security Considerations
183+
A malicious subscriber could request an excessively high target to waste publisher resources or cause network congestion.
184+
Implementations SHOULD enforce reasonable limits on the target and MAY ignore or cap requests that exceed these limits.
185+
186+
A publisher SHOULD rate-limit the amount of padding it sends to avoid being used as an amplification vector.
187+
188+
189+
# IANA Considerations
190+
191+
This document requests the following registrations:
192+
193+
## MOQT Setup Option Type
194+
195+
This document registers the following entry in the "MoQ Setup Option Types" registry:
196+
197+
| Value | Name | Reference |
198+
|:------|:-----|:----------|
199+
| 0xPROBE_TODO | PROBE | This Document |
200+
201+
## MOQT Stream Type
202+
203+
This document registers the following entry in the "MoQ Stream Types" registry:
204+
205+
| Value | Name | Reference |
206+
|:------|:-----|:----------|
207+
| 0xPROBE_TODO | PROBE | This Document |
208+
209+
210+
--- back
211+
212+
# Acknowledgments
213+
{:numbered="false"}
214+
215+
This document was drafted with the assistance of Claude, an AI assistant by Anthropic.

0 commit comments

Comments
 (0)