Open vasilvv opened 8 months ago
There definitely are differences in the accuracy of bandwidth signals and Victor pointed out a few.
None of these are perfect, but possibly it'd be useful to know if the bandwidth was estimated to be the full bandwidth or a minimum of what's been observed?
Responses received at IETF #118 WebTransport session.
Not much support or feedback for the suggested signals of application limited, slows start and max/min/avg. Some consistent feedback received around providing rate estimates over different timeframes. Also suggestion to align with work being done in WebRTC in this regard.
- Has there ever been a bandwidth sample that is not application-limited?
- Is the connection out of slow start?
I'm no CC expert but these two properties of the UA's congestion algorithm seem like signals an application might put to good use. e.g. as another stat. cc @jesup thoughts?
For API surface, we can add directly to WebTransportConnectionStats dictionary, or if we anticipate many additional sendRate qualifiers (such as min/avg/max) then we could create a new EstimatedSendRateStats dictionary to encapsulate them
partial dictionary WebTransportConnectionStats {
unsigned long long estimatedSendRate;
boolean estimatedSendRateApplicationLimited;
boolean estimatedSendRateInSlowStart;
};
or
partial dictionary WebTransportConnectionStats {
EstimatedSendRateStats rateEstimate;
};
dictionary EstimatedSendRateStats {
unsigned long long estimatedSendRate;
boolean estimatedSendRateApplicationLimited;
boolean estimatedSendRateInSlowStart;
};
Meeting:
"applicationLimited" sounds like it's from the viewpoint of implementers. Maybe invert it to "networkLimited" to match the pov of web developers?
Application limited is a congestion control artifice that expresses a lack of data to send. The effect is that the network layer cannot drive the network to capacity, which means that the congestion controller cannot be confident that it is increasing throughput, hence it doesn't increase its estimate of path throughput. So "data limited" or similar would be accurate, or even "throughput rate increases capped" would reflect the effect of the switch, but this is not reflective of the state of the network.
Meeting:
Application limited is a congestion control artifice that expresses a lack of data to send. The effect is that the network layer cannot drive the network to capacity, which means that the congestion controller cannot be confident that it is increasing throughput, hence it doesn't increase its estimate of path throughput. So "data limited" or similar would be accurate, or even "throughput rate increases capped" would reflect the effect of the switch, but this is not reflective of the state of the network.
"Data limited" works for me. Or we could have a term indicating what it means, like "Full bandwidth measured"?
My understanding is that "data limited" does not mean that the application can send (much) more. For example, in WebRTC, if a simulcast layer is dropped due to loss, and available bandwidth recovers, the BWE will be "data limited" unless the CC algorithm (e.g. Google CC) has a mechanism to "probe" (e.g. to determine what bandwidth availability really is). This is not something that the Application can do on its own; if it sent its own "probes" they would potentially be queued and not treated the same as equivalents originated by the CC algorithm on its own.
That leaves me wondering what an application can do with "data limited" except perhaps to wait for the CC algorithm to leave that regime and provide a better (and higher) estimate.
My understanding is that "data limited" does not mean that the application can send (much) more. For example, in WebRTC, if a simulcast layer is dropped due to loss, and available bandwidth recovers, the BWE will be "data limited" ...
Unlike WebTransport, WebRTC makes decisions on behalf of the sending app, altering what is sent. A multi-chef problem.
Dropping a simulcast layer would be an application decision in WebTransport. So I'd say does mean it can send more. Unless I'm missing something.
Running with "data limited" to explore API, would it be a boolean? E.g.
const {estimatedSendRate, rateIsDataLimited} = await wt.getStats();
Meeting:
Meeting:
To prepare for future fields, we may want to encapsulate all sendRate specific data within their own object
const stats = await wt.getStats();
const estimate = stats.sendRate.estimatedRate;
const limited = stats.sendRate.isDataLimited;
const slow = stats.sendRate.inSlowStart;
const mIncrease = stats.sendRate.inMultiplicativeDecrease;
We could add isDataLimited for now and then add others in the future if strong use-cases warrant.
Meeting:
stats.estimatedSendRate
to stats.sendRate.estimatedRate
isDataLimited
inSlowStart
might not be relevant in every CC algorithm (absent or false?)stats.estimatedSendRate
is implementedstats.send.estimatedRate
? Ship may have sailed (bytesSent etc)isDataLimited
?inSlowStart
seems easystats.isSendDataLimited
and stats.inSlowStart
?Meeting:
There might be utility in exposing some kind of "quality" indication of a bandwidth estimate, indicating how close it is to the "real" bandwidth of the channel.
There are few signals that congestion controller could expose as an API that I can think of:
cc @ianswett