TCP 혼잡 윈도우(cwnd)는 어떻게 변화할까? 네트워크 효율을 결정하는 핵심 알고리즘
우리가 인터넷에서 대용량 파일을 다운로드하거나 고화질 영상을 스트리밍할 때, 전송 속도가 처음에는 느리게 시작했다가 어느 순간 급격히 빨라지고, 또 네트워크가 불안정해지면 다시 느려지는 현상을 경험하곤 합니다. 이러한 변화의 중심에는 바로 TCP의 혼잡 윈도우(Congestion Window, 이하 cwnd)가 있습니다. 본 포스팅에서는 네트워크의 상태에 따라 cwnd가 어떻게 유기적으로 변화하며 최적의 전송 속도를 찾아가는지, 그 내밀한 동작 원리를 단계별로 심도 있게 파헤쳐 보겠습니다.
1. 혼잡 윈도우(cwnd)란 무엇인가?
TCP 통신에서 송신측이 한 번에 보낼 수 있는 데이터 양은 크게 두 가지 윈도우에 의해 결정됩니다. 하나는 수신측의 버퍼 상태를 나타내는 수신 윈도우(rwnd)이고, 다른 하나가 바로 네트워크의 혼잡 상태를 반영하는 혼잡 윈도우(cwnd)입니다. 실제 데이터 전송량은 LastByteSent - LastByteAcked ≤ min(cwnd, rwnd) 공식을 따르며, 네트워크 경로상의 병목 현상을 방지하는 결정적인 역할을 수행합니다.
2. cwnd 변화의 4단계 알고리즘: TCP Tahoe와 Reno 중심
TCP의 혼잡 제어는 네트워크의 상태를 탐색하고, 한계점에 도달하면 속도를 줄였다가 다시 회복하는 과정을 반복합니다. 주요 4단계 변화 과정은 다음과 같습니다.
2.1 느린 시작 (Slow Start)
연결 초기에는 네트워크의 가용 대역폭을 알 수 없으므로 매우 조심스럽게 시작합니다.
- 초기 cwnd 값은 보통 1 MSS(Maximum Segment Size)로 시작합니다.
- 확인 응답(ACK)이 도착할 때마다 cwnd를 1씩 증가시킵니다.
- 결과적으로 매 RTT(Round Trip Time)마다 cwnd가 2배씩 지수 함수적으로 증가하며 대역폭을 빠르게 탐색합니다.
2.2 혼잡 회피 (Congestion Avoidance)
cwnd가 사전에 설정된 임계치(ssthresh)에 도달하면, 패킷 손실 가능성을 고려하여 신중하게 속도를 올립니다.
- 지수적 증가를 멈추고 선형적으로 증가(매 RTT마다 1 MSS씩 증가)합니다.
- 이를 통해 네트워크가 포화 상태에 이르기 전까지 최대한 대역폭에 근접하게 접근합니다.
2.3 빠른 재전송 (Fast Retransmit)
타임아웃(Timeout)이 발생하기 전이라도, 수신측으로부터 동일한 ACK가 3번 연속 도착하면 패킷 유실로 판단하고 즉시 해당 패킷을 재전송합니다. 이는 cwnd 변화의 급격한 변곡점이 됩니다.
2.4 빠른 회복 (Fast Recovery)
패킷 유실이 발생했을 때 cwnd를 1로 초기화하지 않고, 현재의 절반 수준으로만 줄인 뒤 다시 선형적으로 증가시키는 방식입니다. 현대 TCP 알고리즘의 핵심으로, 네트워크 처리량을 일정 수준 이상 유지하게 해줍니다.
3. cwnd 변화 시나리오 비교 분석
네트워크 장애 유형에 따라 cwnd가 어떻게 다르게 반응하는지 비교해 보았습니다.
| 구분 | 타임아웃(Timeout) 발생 시 | 3개 중복 ACK 발생 시 |
|---|---|---|
| 네트워크 판단 | 심각한 혼잡 상황으로 간주 | 경미한 패킷 손실로 간주 |
| cwnd 변화 | 1 MSS로 급격히 초기화 | 현재 cwnd의 1/2로 감소 |
| ssthresh 변화 | 현재 cwnd의 1/2로 설정 | 현재 cwnd의 1/2로 설정 |
| 다음 단계 | Slow Start 단계로 회귀 | Fast Recovery / Congestion Avoidance |
4. 최신 TCP 알고리즘의 cwnd 제어 트렌드
과거의 TCP(Tahoe, Reno)가 패킷 손실(Loss-based)을 기준으로 cwnd를 조절했다면, 현대의 알고리즘은 더욱 지능화되었습니다.
- TCP CUBIC: 현재 리눅스 및 안드로이드의 기본 알고리즘으로, 손실이 발생했던 시점의 cwnd를 기억하여 3차 함수 곡선 형태로 빠르게 회복합니다.
- Google BBR: 패킷 손실이 아닌 지연 시간(Delay)과 대역폭(Bandwidth)을 직접 측정하여 cwnd를 조절합니다. 패킷 손실이 잦은 불안정한 망에서도 압도적인 성능을 보여줍니다.
결론: 효율적 전송을 위한 끊임없는 조율
TCP 혼잡 윈도우(cwnd)의 변화는 마치 살아있는 생명체처럼 네트워크의 숨소리에 반응합니다. 초기에는 과감하게(Slow Start), 임계점 근처에서는 신중하게(Congestion Avoidance), 위기 상황에서는 유연하게(Fast Recovery) 변화하며 최적의 균형점을 찾아갑니다. 이러한 메커니즘을 깊이 이해하는 것은 네트워크 엔지니어뿐만 아니라 고성능 웹 서비스를 설계하는 개발자에게도 필수적인 역량입니다. 여러분의 서비스 환경에 맞는 적절한 TCP 혼잡 제어 알고리즘을 선택하고 튜닝하는 것만으로도 사용자 경험을 획기적으로 개선할 수 있습니다.
단순히 cwnd 크기를 키우는 것이 정답은 아닙니다. 버퍼블로트 현상으로 인해 오히려 지연 시간이 늘어날 수 있으므로, 자신의 인프라 상황에 맞는 적절한 ssthresh 값을 업데이트 할 수 있는 능력이 필요합니다.