Congestion window packets
Round-trip time seconds
Router queue packets
Goodput packets / s
How it works
The network
One or two senders push packets through an access link into a router whose output link is the bottleneck: each packet takes longer to serialize there, which is why packets stretch on that link. Packets that arrive while the router's buffer is full are dropped. The receiver answers every packet with an ACK that travels back along the arc.
The propagation round-trip time is fixed by the speed of light. Everything above it in the RTT chart is time spent waiting in the router queue — bufferbloat in miniature.
Idealizations
- Loss is signaled to the sender the moment the router drops a packet (no duplicate-ACK or timeout delay), and nothing is retransmitted: a loss only shrinks the window.
- NewReno and CUBIC leave slow start only on loss (no HyStart++), so a deep buffer makes the first overshoot large.
- BBR's min-RTT filter spans 20 round trips instead of 10 s, so PROBE_RTT recurs about every 34 s; PROBE_BW starts in a fixed phase and the initial window is 4 packets.
- Every packet is acknowledged individually; there is no delayed ACK.
- Time runs in slow motion: one round trip is about 1.7 simulated seconds.
- CUBIC measures time in round trips rather than seconds so its curve keeps its shape at this timescale.
Things to try
- CUBIC vs BBR with two senders and a 32-packet buffer: who fills the queue, and who wins?
- Bufferbloat: any loss-based algorithm with a 100-packet buffer. Watch the RTT.
- Shallow buffers: BBR with a 4-packet buffer. BBR v1 ignores loss — count the drops.
- Keyboard: Space play/pause, R reset, + / − faster / slower, 1 normal speed.