We have all experienced it: a download that raced along suddenly slows to a trickle. The more people connect, the worse everything seems to run. That behaviour is not a fault in your provider: it is the consequence of an unwritten law that governs every network. At the centre of that law sits a mechanism called TCP congestion control, and it is the underlying reason why the Internet does not drown when millions of connections compete for the same cable.
A network sharing a resource it does not know how big it is
To understand it, you must break a widespread belief: when you send data, there is no reserved call between your computer and the server. What exists is a chain of routers that forward packets toward their destination, and they all share the same physical links. It is like a system of canals where each boat carries a note and no central manager controls how many boats enter at once.
The only thing the network has to regulate itself is a very crude signal: when a router saturates and its waiting queue fills up, it discards the packets it cannot handle. That is the so-called tail drop queueing policy. And that discard, which looks like a mistake, is in fact the signal the whole system relies on. There are no traffic lights: the traffic light is the loss of packets.
A window that opens and closes little by little
This is where the key piece comes in: TCP keeps a variable called cwnd (congestion window), which indicates how many bytes the sender can have “in flight” without waiting for an acknowledgement. The larger the window, the faster the connection flows. The problem is that the sender does not know in advance how much it can send: the available bandwidth changes every instant.
That is why TCP starts from a small value and grows with a strategy called slow start. Each round, if the expected acknowledgements arrive, it doubles the window: 1, 2, 4, 8… an exponential growth that finds the limit quickly. When it approaches a threshold (ssthresh, slow start threshold), it switches to additive growth: it increases the window by one packet per round. It climbs like a staircase, not a rocket.
Halving at the first sign of choking
The moment a packet is lost, TCP interprets that the network is congested and applies the most important rule of all: the multiplicative decrease. Instead of starting over from zero, it divides the window in half. If it keeps losing, it divides again. It is slow to rise and fast to fall: the asymmetric behaviour that stops every sender from flooding at once.
This pair of rules, rising additively and falling multiplicatively, is known as AIMD (Additive Increase Multiplicative Decrease). It is the mathematical basis that guarantees something called fairness: if two connections share a link, they tend to split the bandwidth evenly, because both rise slowly until one trips and backs off, leaving room for the other. There is no referee: competition and the fear of discard reach equilibrium on their own.
From Reno to BBR: the algorithms that fill the window
Over time, basic AIMD was refined into variants with their own names. TCP Reno and its successor NewReno recover individual losses well. TCP CUBIC, Linux’s default algorithm for years, uses a cubic function to grow aggressively on high-performance networks without punishing the others: it is the standard choice on most servers today.
The most interesting leap came with BBR, developed by Google. Instead of using losses as the signal, BBR continually tries to measure two parameters: the available bandwidth and the minimum round-trip time (RTT). It keeps the sending rate at the point where it estimates the pipe is full but without a stuck queue. It is a different philosophy: predict rather than react, and on many routes it fills the connection far sooner than CUBIC.
The price of waiting: latency and the silent jam
Not everything is raw speed. A router queue that is too large introduces something called bufferbloat: even when the link is saturated, packets queue up for hundreds of milliseconds, so the connection seems slow and jittery even when it is “full”. The modern solution is a family of mechanisms that mark packets instead of discarding them: ECN (Explicit Congestion Notification) writes a mark in the header to warn the sender it is approaching the limit before it is too late.
Next time a video call gets blurry or a download slows down at peak hour, remember that behind it there is no conspiracy: there are tens of thousands of connections dancing to the same algorithm, rising prudently and backing off with discipline. It is the silent pulse that keeps alive the largest network humanity has ever built.





