AIMD와 톱니파
TCP 혼잡 제어의 핵심 아이디어는 하나의 원칙으로 요약됩니다. 문제가 없으면 조금씩 속도를 높이고, 문제가 생기면 확 줄인다. 이 원칙을 AIMD(Additive Increase, Multiplicative Decrease)라고 부릅니다. 더할 때는 선형으로, 뺄 때는 곱셈으로.
혼잡 윈도우
TCP는 흐름 제어를 위해 수신 윈도우를 봅니다. 혼잡 제어를 위해서는 혼잡 윈도우(cwnd, Congestion Window)라는 내부 변수를 따로 관리합니다. 실제로 한 번에 보낼 수 있는 데이터 양은 수신 윈도우와 혼잡 윈도우 중 작은 값으로 결정됩니다.
처음에 cwnd는 아주 작게 시작합니다. 보통 1~10 세그먼트 정도입니다. 네트워크 상태를 모르는 채로 처음부터 전속력으로 달리다가 혼잡을 일으키면 안 되기 때문입니다.
슬로 스타트
처음 연결 직후 단계를 슬로 스타트(Slow Start)라고 부릅니다. 이름과 달리 실제 속도는 빠르게 증가합니다. ACK 하나를 받을 때마다 cwnd를 1씩 늘리는데, ACK는 보낸 패킷 수만큼 오므로 결과적으로 매 왕복(RTT)마다 cwnd가 두 배씩 커집니다. 지수 증가입니다.
슬로 스타트는 임계값(ssthresh, Slow Start Threshold)에 도달할 때까지 계속됩니다. 임계값을 넘으면 혼잡 회피 단계로 전환됩니다.
혼잡 회피와 AIMD의 톱니파
혼잡 회피 단계에서는 RTT마다 cwnd를 1씩만 늘립니다. 선형 증가입니다. 조금씩 속도를 높이면서 혼잡이 생기는 지점을 조심스럽게 찾아갑니다.
그러다 패킷 손실이 감지되면 어떻게 될까요. 타임아웃으로 손실이 감지되면 cwnd를 1로 확 줄이고 슬로 스타트부터 다시 시작합니다. 3번 중복 ACK로 감지되면(빠른 재전송) cwnd를 절반으로 줄이고 혼잡 회피로 바로 전환합니다.
선형으로 올라가다가, 손실이 생기면 절반(또는 바닥)으로 떨어지고, 다시 선형으로 올라가는 패턴이 반복됩니다. 그래프로 그리면 톱니 모양이 됩니다. 그래서 톱니파(Sawtooth Wave)라고 부릅니다.
cwnd
│ /\ /\
│ / \ / \
│ / \ / \
│ / \ / \
│ / \/ \
│─────/
└────────────────────────── 시간
이 톱니파는 인터넷의 자기 조절 메커니즘입니다. 모든 TCP 참여자가 이 방식으로 동작하면 혼잡이 생겼을 때 자연스럽게 모두가 속도를 줄여 네트워크에 여유를 만들고, 여유가 생기면 다시 조금씩 올라가는 평형이 유지됩니다.
다음 절에서는 이 기본 원리 위에 발전한 세 가지 알고리즘 Reno, CUBIC, BBR을 살펴봅니다.