|
| 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