Skip to content

Interactive simulator

Watch a network connection decide how fast to go.

Nobody tells it. It has to guess.

Move a slider and every packet is re-simulated: the sender speeds up, the queue at the slow point fills, and when it overflows the rate collapses. Nothing here is drawn from a formula.

Runs in your browser. Nothing to install.

Congestion windowQueue depthPackets dropped

20.0 Mbps · Base RTT 50.0 ms · RENO · 30 s

That run, one cycle at a time

Every number below is read out of the run in the chart above — not an illustration of it. Follow it once and the rest of the site is the same loop under different conditions.

  1. 010 s

    The sender starts with 10 segments in flight — 14.1 KiB. It has no idea what the link can take, and nothing will tell it.

  2. 02141 ms

    So it doubles every round trip — 10, 20, 40 — and after 3 round trips it is at 40 segments. That is "slow start", and it is only slow for the first moment.

  3. 0386 + 86

    Two limits it cannot see. The wire itself holds 86 segments (122.1 KiB, the BDP) — that is capacity × round trip, and it is how much can be in transit at once. Past that, packets wait in the bottleneck's buffer, which holds another 86. Nothing is lost yet; the queue just gets longer, and so does the round trip.

  4. 048310 ms

    The buffer is full, so the next packet to arrive is thrown away. This is the only message the network ever sends back, and it is a silence rather than a message.

  5. 058412 ms

    The sender does not find out until 102 ms later. That is one round trip as it stands right then — 50.0 ms of wire plus about 51.9 ms waiting in the queue it just filled — because the loss is inferred from duplicate ACKs, which cannot come back sooner. A fuller buffer makes this feedback slower, which is the whole case against big buffers. Then it cuts: 174 segments down to 87, roughly half. Everything it knows about the network is this stale.

  6. 06× 4

    From there it climbs by one segment per round trip until it overshoots again. That happened 4 times in 30 seconds, and those are the teeth. Nobody designed the shape — it is this loop, plotted. Segment counts are exact here only because every segment in this model is one MSS; a real stack varies.

New to this?

How a connection finds its speed

sendersends as fast as it daresbufferthe rest wait heredropped — the only signal backforwards only this fastbottleneckreceiverACK
  1. 01

    Send a little, then more

    A new connection starts cautiously and doubles how much it sends every round trip. Within a second it is going far faster than it began — and usually faster than the link can take.

  2. 02

    The slow point fills up

    Somewhere on the path is the narrowest link. Packets arriving faster than it can forward them wait in a queue. The queue is why your latency climbs while a download runs.

  3. 03

    A packet is dropped, and that is the message

    When the queue is full the next packet is thrown away. The sender notices the gap and cuts its rate — usually in half. That drop is the only feedback the network gives, and the whole system is built on it.

  4. 04

    Climb, drop, climb, drop

    Nobody designed the shape that comes out. Repeat the loop and the rate traces a sawtooth, forever hunting a ceiling it is never told. Everything else on this site is a consequence of it.

How to read the chart

Four measurements of the same run, stacked on one shared timeline. Read straight down at any moment and you see why the connection did what it did: the window climbs, the queue fills under it, the round trip rises with the queue, and a red line marks the instant a packet was dropped — once, across all four.

Congestion window
How much the sender is willing to have in flight at once
Queue depth
How many bytes are waiting their turn at the bottleneck
Throughput
How much data is actually getting through
RTT
How long a round trip takes — the wire, plus the wait
Packets dropped
A red vertical line, drawn once across all four series at the instant a packet was thrown away. On this site red means loss and never anything else.

Where to go

Roughly in order. Each page answers one question and shows the run it used to answer it.

Scenarios

Each one is a configuration that demonstrates a single named phenomenon.

The words

The networking terms stay in English throughout, because that is how every article and every RFC you meet next will name them. Here is what each one means. Anywhere they appear on the site, the dotted underline gives you this definition again.

flow
One connection. One download, one video stream, one upload — one sender talking to one receiver.
bottleneck
The slowest link on the path. It is the only one that matters: it sets the speed, and it is where the queue forms.
segment
One packet of data, as TCP counts them. Windows and queues are measured in these as often as in bytes, because what matters is how many separate things are in flight.In this model every segment is exactly one MSS, which a real stack does not guarantee.
MSS
The largest amount of data one packet can carry — 1,448 bytes here. It is the unit the window grows in: "one more segment per round trip" means one more of these.Maximum segment size. Set by the path's smallest link; 1,448 bytes is typical Ethernet minus headers.
ACK
The receiver saying "got it". Every acknowledgement that comes back is also the sender's permission to send one more — so the rhythm of packets going out is a copy of the rhythm of ACKs coming in, which is a copy of the rhythm the slow point allowed. Nobody measures anything; the connection paces itself.Acknowledgement. Three duplicate ACKs in a row is how a sender infers that one packet went missing.
buffer
The waiting room at the slow point of the path. When packets arrive faster than the link can send them, they queue here instead of being thrown away — until it is full.Always shown here as a multiple of BDP, because the byte count alone predicts nothing.
RTT
How long a packet takes to get there and be acknowledged back. This is what you feel as lag.Round-trip time. Base RTT is the wire alone; anything above it is time spent waiting in a queue.
BDP
How much data fits inside the wire itself. A fast, long link is a long pipe: you can have a lot in flight before the first byte has arrived anywhere.Bandwidth-delay product: capacity × round-trip time. The right amount to keep in flight.
packet loss
A packet that never arrived. On a wired path it almost never means damage — it means a queue was full. That is why TCP treats loss as the signal to slow down.
congestion window
The sender’s own guess at how much it is allowed to have in flight at once. Nobody tells it the answer, so it raises the guess while things go well and cuts it when a packet is lost.Written cwnd. This is the quantity drawn in teal, and the reason the trace has a sawtooth in it.
ssthresh
The line between the two growth rules. Below it the window doubles every round trip; above it it adds one segment per round trip. A loss sets it to half the current window — which is why the climb out of a drop is a straight line and the very first climb is a curve.Slow-start threshold. Drawn as the dashed grey line in the window panel.
slow start
How a connection begins: send a little, and double it every round trip until something breaks. It is slow for a moment and then very fast, which is how it overshoots.
AIMD
The rule that makes the sawtooth: climb by a fixed step when things go well, halve when a packet is lost. Climb slowly, back off hard.Additive increase, multiplicative decrease. It is also what makes competing flows converge on a fair split.
sawtooth
The shape a TCP connection traces out over time: climb, drop, climb, drop. Nobody designed the shape — it is what AIMD looks like when you plot it.
throughput
How much data actually gets through per second.
goodput
Throughput with the retransmissions taken out — the data that arrived and counted. A run can be busy and still deliver little, if it keeps sending the same packets twice.
utilisation
How much of the link was actually used. Below 100% the wire sat idle at some point, usually because the sender had just cut its window after a loss.
bufferbloat
A buffer so big that it hides the congestion instead of signalling it. Nothing is lost, so the sender keeps pushing, the queue stays permanently full, and every packet waits behind it. The download finishes at the same speed and everything else on the connection feels broken.
AQM
A queue that drops a packet early, on purpose, before it is full — so the sender is told to slow down while the waiting room is still mostly empty.Active queue management. RED and CoDel are the two modelled here.
queue discipline
The rule the waiting room uses to decide which packet to throw away, and when.
timeout
The expensive kind of loss. No acknowledgement came back at all, so the sender waits, gives up, and starts again almost from scratch. One timeout costs more than several ordinary drops.
Jain's fairness index
One number for how evenly the link was shared. 1.00 is a dead-even split; 0.50 between two flows means one of them got essentially everything.
seed
Which set of random numbers this run used. Same seed, same settings, byte-identical result — so a link you share shows exactly what you saw.

Why the shapes on this site can be believed

Anyone can draw a convincing sawtooth. This one is produced by scheduling, queueing, dropping and acknowledging individual packets on a virtual clock — and then checked against four predictions published independently of it, before any of it is shown to you.

Mathis throughput

Simulated Reno throughput tracks MSS·√1.5/(RTT·√p) across a sweep of five loss rates and four RTTs, within the ±25% the 1997 paper claims against measured data.

Buffer size versus utilisation

Steady-state utilisation matches the AIMD sawtooth derivation within 1% across nine buffer sizes from 0.05 to 2 BDP, and the RTT matches base + buffer/capacity.

RTT unfairness

Two Reno flows split the link between the first and second power of the RTT ratio they actually experienced — the range Floyd's analysis and the Mathis form bracket.

AIMD convergence

Identical flows reach Jain's index above 0.95, and a flow arriving twenty seconds late converges from 0.75 to above 0.9 within forty seconds. Chiu & Jain, 1989.

Mathis, 1997 — plotted, not asserted

Every point is one run of this simulator against what the paper predicts for the same loss rate and round trip. On the diagonal they agree exactly; the dashed lines are the ±25% the paper itself claims against measured data. Both axes are Mbps, log-scaled, because the sweep spans an order of magnitude. The runs happen when this page is built — the same nine configurations the test suite gates the deploy on, read from the same module, so this figure cannot show agreement while that suite fails.

225510102020Mathis predicts (Mbps)this simulator measured (Mbps)
five loss rates at 50 msfour round trips at p = 0.001±25%

Worst disagreement across the nine runs: 13.6%. Nothing here is fitted — the prediction knows only segment size, round trip and loss rate, and the simulator knows nothing of the prediction.

These are other people’s results, not self-checks. A simulator that reproduces four of them is one whose surprising outputs can be trusted — and the surprising outputs are the reason to build it.