Expand description
BBR-style passive path model: bottleneck bandwidth, round-trip propagation delay, and the bandwidth-delay product, all recovered from the ACK stream the reliable-UDP sender already drives - no probe traffic.
The model follows the two-filter structure of BBR (Cardwell, Cheng, Gunn,
Yeganeh, Jacobson, BBR: Congestion-Based Congestion Control, ACM Queue
2016) and its delivery-rate estimator (Cheng, Cardwell, Yeganeh, Jacobson,
Delivery Rate Estimation, draft-cheng-iccrg-delivery-rate-estimation):
BtlBwis a windowed maximum of the delivery rate. A bottleneck queue can delay delivery but cannot make data arrive faster than the link carries it, so the peak delivery rate over a window of round-trips is the true bottleneck capacity. The max filter rejects the under-estimates a filling or draining queue injects.RTpropis a windowed minimum of the round-trip time. A queue inflates RTT, so the minimum over a long window is the queue-free propagation delay.
Because a queue moves the two estimates in opposite directions (it lifts
RTT but never lifts the delivery rate), the max-rate / min-RTT pair
separates capacity from delay from a single passive ACK stream. Their
product is the bandwidth-delay product BDP = BtlBw * RTprop, the
in-flight window that keeps the bottleneck busy without standing queue.
The estimator is fed connection-level samples: each ACK reports the
cumulative delivered count and the time, and the rate sample is the
delivered delta over the time delta (the ack_elapsed rate of the
delivery-rate draft). The window for BtlBw tracks ~10 round-trips of the
current RTprop, BBR’s round-counted bandwidth window, clamped to a sane
range so a brief idle does not discard the estimate.
It is a pure model: PathModel::on_ack takes the cumulative delivered
count, a timestamp, and an RTT, so a synthetic ACK trace exercises it
deterministically and the live sender feeds it from real feedback.
Structs§
- Path
Model - Passive BBR path model. Holds the windowed
BtlBw/RTpropestimates and exposes them plus the derived BDP. Sized in blocks ofblock_bytesso the sender can read the BDP directly as a flow-window target.