TCP의 혼잡제어 Congestion control

hi2li·2026년 5월 13일

network

목록 보기
10/19
  • 혼잡제어란 네트워크 내부의 혼잡(congestion)을 방지하거나 완화하기 위해 송신 측의 전송 속도를 조절하는 기법이다.
  • 네트워크가 감당할 수 있는 처리량보다 많은 데이터가 전송되면 라우터 버퍼 overflow, 패킷 손실, 지연 증가 등의 혼잡 현상이 발생할 수 있다.
  • 흐름제어가 송신자와 수신자 사이의 처리 속도를 조절하는 것이라면, 혼잡제어는 네트워크 내부의 혼잡 상태를 고려하여 송신 측의 전송 속도를 조절하는 기법이다.

한 라우터에 데이터가 몰리게 되면 오버 플로우로 데이터 손실이 발생할 수 있다.

이를 해결하기 위해 데이터 전송속도를 강제로 줄이게 되는데 이러한 작업이 혼잡제어이다.

혼잡제어 흐름의 구성요소들

먼저 용어 정의

cwnd : TCP 송신 측이 네트워크 혼잡 상태를 고려하여 한 번에 전송할 수 있는 데이터 양

ssthresh : Slow Start를 종료하고 Congestion Avoidance로 전환하는 기준값이다.

1. AIMD

  • cwnd=1부터 시작해서 RTT당 약 +1 MSS 한다.
  • 혼잡발생시 cwnd = cwnd / 2로 절반감소한다.

→ 너무 느림 → SS필요성

2. Slow Start

  • ACK를 받을 때마다 cwnd를 증가시키며, 결과적으로 RTT마다 cwnd가 약 2배씩 증가하는 지수적 증가 방식을 사용한다.
  • 혼잡 발생시 ssthesh= cwnd/2로 설정하고 cwnd를 다시 1로 감소시킨다.
  • 만약 cwnd가 sstresh를 넘어가는 순간부터는 AIMD로 동작한다.

3. Fast Retransmission (빠른 재전송)

  • 특정 패킷에 대한 중복 ACK가 3개가 되는 순간, 즉시 재전송
  • TCP에서 수신자는 중간 세그먼트가 빠진 상태에서 뒤의 세그먼트를 받으면, 자신이 마지막으로 연속해서 정상 수신한 위치를 계속 ACK로 보낸다.
  • 예를들어,
    • 송신자가 1, 2, 3, 4, 5를 보냈는데 3이 손실되었다고 하면, 수신자는 4, 5를 받아도 아직 3이 없기 때문에 “ACK 3”(3번 주세요) 을 계속해서 송신자게에 보낸다.
    • 송신자가 같은 ack3을 3번 중복해서 받으면 3번 세그먼트가 손실됐다고 판단하고 time out가 관계없이 즉시 3을 재전송한다.

4. Fast recovery

  • Fast Retransmission 이후에 전송 속도를 너무 크게 낮추지 않고 회복하는 방식이다. →
  • 원래는 패킷 손실이 발생하면 TCP는 혼잡이 발생했다고 판단하고 cwnd를 줄인다.
  • Fast Recovery에서는 패킷 손실이 발생하더라도 네트워크가 완전히 혼잡한 상태는 아니라고 판단하여, cwnd를 1까지 줄이지 않고 절반 정도로만 감소시킨다.

혼잡제어 흐름

  • 실제 TCP에서는 보통 위의 4개가 하나의 혼잡제어 흐름 안에서 함께 동작한다.
기능역할
Slow Start초기 cwnd를 지수적으로 빠르게 증가
Congestion Avoidance (AIMD)ssthresh 이후 선형 증가, 혼잡 발생 시 cwnd를 절반 감소
Fast Retransmit중복 ACK 3개 발생 시 즉시 재전송
Fast Recoverycwnd를 1로 줄이지 않고 절반 수준에서 빠르게 회복
[전체 요약]

연결 시작
→ Slow Start
→ ssthresh 도달
→ Congestion Avoidance(AIMD)
→ 혼잡 감지

혼잡 감지 방식 1: 중복 ACK 3개
→ Fast Retransmit
→ Fast Recovery
→ Congestion Avoidance 복귀

혼잡 감지 방식 2: Timeout
→ cwnd = 1
→ Slow Start 재시작
→ Congestion Avoidance 복귀
  • 케이스별 흐름
[정상 시작]

연결 시작
→ cwnd = 1
→ Slow Start
→ ACK를 받을 때마다 cwnd 지수 증가
→ cwnd >= ssthresh
→ Congestion Avoidance(AIMD)
→ cwnd 선형 증가

[Case 1. 혼잡 없음]

Congestion Avoidance
→ ACK 정상 수신
→ cwnd 조금씩 증가
→ 계속 전송

[Case 2. 중복 ACK 3개로 손실 감지]

패킷 일부 손실
→ 수신자가 같은 ACK를 반복 전송
→ 송신자가 중복 ACK 3개 수신
→ Fast Retransmit
→ 손실 세그먼트 즉시 재전송
→ ssthresh = cwnd / 2
→ cwnd를 절반 수준으로 감소
→ Fast Recovery
→ Congestion Avoidance로 복귀

[Case 3. Timeout으로 손실 감지]

패킷 손실
→ ACK가 일정 시간 동안 오지 않음
→ Timeout 발생
→ 손실이 더 심각한 혼잡이라고 판단
→ ssthresh = cwnd / 2
→ cwnd = 1
→ Slow Start 다시 시작
→ cwnd가 ssthresh에 도달
→ Congestion Avoidance로 전환

image.png

profile
Easy come , Easy go

0개의 댓글