The problem
If every sender blasts data as fast as it can, shared links overflow, routers drop packets, and throughput collapses. Congestion control is how TCP discovers a safe sending rate and adapts as conditions change.
The core mechanism
TCP maintains a congestion window, the amount of unacknowledged data it allows in flight. It grows the window while things go well and shrinks it on signs of congestion.
- Slow start grows the window exponentially until it reaches a threshold or sees loss.
- Congestion avoidance then grows it linearly, probing gently for more bandwidth.
- A loss event signals congestion and triggers a sharp reduction.
Loss versus delay
Classic algorithms treat packet loss as the congestion signal. Newer ones like BBR instead model the bottleneck bandwidth and round trip time directly, aiming to keep queues short rather than waiting for loss. The goal in all cases is fairness, so competing flows converge to roughly equal shares of a link.
Key idea
Congestion control tunes how much data is in flight, growing it cautiously and backing off when the network signals overload.