← Back to Labs

TCP Congestion Control

Follow one sender as ACKs grow `cwnd`, a queue fills, loss triggers recovery, and modern algorithms choose different ways to probe the same bottleneck.

SenderBottleneckReceiverslow startqueue mostly emptyACKs returning cleanlydata pathACK return path12345678Queue depthACK clock returns pacing informationCurrent congestion signalnew flow, no congestion signal yet
cwnd
10 MSS
ssthresh
32 MSS
in flight
8 MSS
RTT
14 ms
delivery rate
12 Mb/s
Mechanism notesWhat the controller is doing
limit = min(rwnd, cwnd)
startup goal: learn path capacity safely
Reading the queueWhy the RTT changed
queue fill: 1 / 12 MSS
short queue: lower latency, less risk of drop
full queue: high delay first, packet loss or ECN later
Step 1 / 7A new flow starts with a small window

The sender has no idea how much capacity the path can handle, so it begins with a small congestion window. The goal is to probe upward without blasting the bottleneck immediately.

Arrow keys to navigate · R to reset

Tap dots to jump to any step

Read the full article →Take the quiz →