In October 1986, a Berkeley network link fell from 32 kbit/s to about 40 bit/s. Router queues overflowed, senders resent the dropped packets, and the resends jammed the queues further. This is called congestion collapse.
Congestion control is TCP's fix: each sender caps its congestion window (cwnd), the data it may have sent but not yet seen acknowledged. About one window goes out per round trip (RTT), so rate ≈ cwnd ÷ RTT.
The sender can't see the routers, so it guesses from what comes back. Steady ACKs mean there is room, so it grows the window. A missing packet usually means some router's queue overflowed, so it shrinks the window.
How the internet works · 3 of 102 / 3
TCP congestion control
Real-life use case
Google runs its own algorithm, BBR, for YouTube and Google Search
Every TCP connection you open runs congestion control, and the operating system picks the algorithm. Linux and Android default to CUBIC, which regrows the window after a loss along a cubic curve.
In 2016, Google put its own algorithm, BBR, on google.com and YouTube. BBR doesn't wait for loss. It measures the bottleneck bandwidth and the shortest RTT, then sends at about that rate, which keeps router queues short.
How the internet works · 3 of 103 / 3
TCP congestion control
How it helps
Each sender speeds up slowly, then halves when a packet goes missing
A new connection starts small (10 packets on modern systems) and uses slow start: it doubles the window every RTT, so it finds the available speed in a few round trips.
After a loss, or once it passes a set threshold, it switches to AIMD (additive increase, multiplicative decrease): add one packet per RTT, halve on loss. If ACKs stop entirely and a timeout fires, it restarts slow start from a tiny window.
Halving drains a full queue fast and makes senders share fairly. Flows at 30 and 10 packets halve to 15 and 5, then both regrow at +1 per RTT. Their gap shrinks from 20 to 10, so repeated cycles even them out.
What it’s forSets how much a TCP sender may have in flight, one round trip at a time (AIMD).
each RTT without loss: cwnd ← cwnd + 1; on loss: cwnd ← cwnd ÷ 2
cwnd
congestion window: packets sent but not yet acknowledged, e.g. 10–100
RTT
round-trip time: a packet's trip there plus its ACK's trip back, e.g. 50 ms
loss
a packet the sender sees went missing, usually from duplicate ACKs
What it givesA window that slowly probes for spare capacity and backs off sharply when the network is full.
cwnd = 21, three loss-free RTTs: 22, 23, 24
A loss is detected: 24 ÷ 2 = 12
At RTT 100 ms with 1500-byte packets: 12 × 1500 ÷ 0.1 s = 180 kB/s