w3c / webtransport

WebTransport is a web API for flexible data transport
https://w3c.github.io/webtransport/
Other
820 stars 51 forks source link

Quality of a bandwidth estimate #559

Open vasilvv opened 8 months ago

vasilvv commented 8 months ago

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

ianswett commented 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?

wilaw commented 7 months ago

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.

jan-ivar commented 7 months ago
  • 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?

wilaw commented 7 months ago

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;
};
jan-ivar commented 7 months ago

Meeting:

jan-ivar commented 6 months ago

"applicationLimited" sounds like it's from the viewpoint of implementers. Maybe invert it to "networkLimited" to match the pov of web developers?

martinthomson commented 6 months ago

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.

jan-ivar commented 6 months ago

Meeting:

ianswett commented 6 months ago

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

aboba commented 4 months ago

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.

jan-ivar commented 3 months ago

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();
jan-ivar commented 2 months ago

Meeting:

jan-ivar commented 2 months ago

Meeting:

wilaw commented 2 months ago

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.

jan-ivar commented 1 month ago

Meeting:

jan-ivar commented 1 month ago

Meeting: