In a nutshell
Nothing tells TCP the link speed, so it probes with a congestion window (cwnd) — how much unacknowledged data it allows. Slow start doubles cwnd each round trip until a threshold; then congestion avoidance adds one per round trip. A loss signals congestion, so cwnd is halved. This AIMD loop makes a sawtooth that hovers near capacity.