At some point the capacity of the internet can be reached, and an intermediate router will start discarding packets. This tells the sender that its congestion window has gotten too large. Early implementations performed slow start only if the other end was on a different network. Current implementations always perform slow start. Congestion can also occur when multiple input streams arrive at a router whose output capacity is less than the sum of the inputs.
Congestion avoidance is a way to deal with lost packets.
Congestion avoidance and slow start are independent algorithms with different objectives. But when congestion occurs TCP must slow down its transmission rate of packets into the network, and then invoke slow start to get things going again. In practice they are implemented together. Initialization for a given connection sets cwnd to one segment and ssthresh to 65535 bytes. The TCP output routine never sends more than the minimum of cwnd and the receiver's advertised window.