Every time your browser fetches a page, your operating system is quietly negotiating how fast it can push data. Too fast and packets pile up, routers drop them, and the whole network chokes. Too slow and you waste capacity you paid for. The algorithm in the middle is TCP congestion control.
The classic answer, TCP Reno (early 1990s), uses additive increase, multiplicative decrease (AIMD): grow the congestion window by one segment per round-trip time (RTT), and halve it on loss. That linear ramp works fine on a dial-up modem, but on a modern 10 Gbps link with 50 ms of latency, you need tens of thousands of in-flight packets just to fill the pipe — and AIMD spends enormous time crawling back up after every loss.
TCP CUBIC (Sangtae Ha, Injong Rhee, and Lisong Xu, 2008; Linux default since kernel 2.6.19 in 2006) replaces that linear ramp with a cubic polynomial. After a loss event, the window grows as a function of elapsed time since the last loss, not of RTTs:
where is the window at the last loss, is a scaling constant, is chosen so that (the window right after loss), and is the time elapsed since that loss. The cubic shape means growth is fast far from and gentle near it — exactly where you want to probe carefully to avoid triggering another loss.
Crucially, the formula uses wall-clock time, not RTT count. A connection with a 5 ms RTT and one with a 200 ms RTT both grow at the same wall-clock rate — making CUBIC RTT-fair across very different paths.
Comments
Loading comments...