TCP의 흐름 제어가 수신 노드의 처리 능력에 맞춰 속도를 조절한다면, TCP Congestion Control은 수신 노드가 아니라 그 사이 네트워크의 혼잡 상태에 맞춰 송신 속도를 조절한다 — 라우터의 버퍼가 넘쳐 세그먼트가 유실되면 재전송이 뒤따르고, 그 재전송이 트래픽을 더 늘려 혼잡을 심화시키는 상황을 막기 위해서다. 이 절차는 slow start·congestion avoidance·fast retransmit·fast recovery 네 알고리즘으로 규정된다[1].
재전송 판단: Timeout과 Fast Retransmit
TCP는 두 가지 방법으로 세그먼트 유실을 감지한다. 하나는 재전송 타이머(RTO)가 만료될 때까지 확인응답이 오지 않는 경우이고, 다른 하나는 같은 확인응답 번호가 담긴 중복 ACK가 연달아 3개 도착하는 경우다 — 후자를 fast retransmit이라 하며, 타임아웃을 기다리지 않고 곧바로 해당 세그먼트를 재전송한다[1].
Slow Start와 Congestion Avoidance
송신 측은 congestion window(cwnd)라는 값으로 확인응답 없이 보낼 수 있는 데이터 양을 스스로 제한한다. 연결 초기나 타임아웃 직후에는 slow start 단계로 들어가 cwnd를 1세그먼트부터 시작해 확인응답을 받을 때마다 늘려 나가는데, 그 결과 cwnd는 사실상 RTT마다 두 배씩 지수적으로 커지다가 ssthresh(slow start threshold)에 이르면 congestion avoidance 단계로 전환되어 이후로는 RTT마다 약 1세그먼트씩만 더하는 선형 증가로 속도를 보수적으로 높인다[1].
AIMD와 Fast Recovery
유실이 감지되면 송신 측은 속도를 낮추는데, 이렇게 완만히 늘리고 크게 줄이는 패턴을 AIMD(Additive Increase/Multiplicative Decrease)라 부른다. 다만 감소 폭은 감지 방법에 따라 다르다 — 타임아웃으로 감지됐다면 cwnd를 최소값인 1세그먼트로 되돌려 slow start부터 다시 시작한다[1].
반면 fast retransmit로 감지됐다면 fast recovery로 넘어가 cwnd를 절반으로 줄인 뒤 congestion avoidance를 이어간다 — 중복 ACK가 도착했다는 것은 세그먼트가 실제로는 네트워크를 빠져나가고 있다는 뜻이므로, slow start로 되돌아가지 않고 줄어든 cwnd로 전송을 곧바로 재개한다[1].