The endpoints of a TCP connection do not know the path's available capacity when they begin sending. The path may include a fast local network, a slow access link, a busy router, a rate limiter, or several bottlenecks shared with other traffic.
Sending too slowly leaves usable capacity idle. Sending too quickly creates queues, increases latency, and eventually causes packets to be marked or dropped. Retransmitting those losses adds still more traffic.
TCP congestion control continuously searches for a safe sending rate. It uses feedback from acknowledgments, loss, delay, and—in some algorithms—an explicit model of the path. The sender increases its traffic when the path appears able to carry more and reduces it when congestion signals appear.
This chapter builds that control loop from the classic algorithms to modern CUBIC and BBR.