970. 슬로우 스타트 (Slow Start) - TCP 혼잡 윈도우 초기 1 패킷 탐색 지수적(Exponential) 증가 임계값(Threshold) 타임아웃 회피 알고리즘 최적 속도 탐색 모델망
핵심 인사이트: 어두컴컴한 고속도로(인터넷망)에 처음 들어섰다. 이 길이 100대가 한 번에 달릴 수 있는 광케이블 뻥 뚫린 길인지, 아니면 10대만 가도 터지는 진흙탕(모뎀) 길인지 알 방법이 없다. 무식하게 처음부터 100대를 확 밀어 넣었다가 진흙탕이면 다 터져서 멸망한다. "야! 무조건 쫄보처럼 1대만 먼저 슬쩍 쏴봐(Slow Start)! 어? 잘 갔네? 그럼 자신감 얻어서 2대 쏴! 어 잘 가네? 4대! 8대! 16대! 이렇게 2배씩 뻥튀기(지수 증가)하면서 미친 듯이 늘려가다가, 톨게이트가 막혀서 1대가 에러 나는 순간 팍 멈춰! 거기가 이 도로의 한계 속도(임계값)다!" 인터넷의 숨은 속도를 10초 만에 완벽하게 찔러서 찾아내는 눈치 게임, 슬로우 스타트다.
Ⅰ. TCP 혼잡 윈도우(CWND)의 출발점
- 969번 문서에서 혼잡 윈도우(CWND)가 고속도로 체증을 막는 '송신 억제 창문'이라고 배웠습니다.
- 딜레마: 연결을 방금 막 맺은 첫 순간, 내 컴퓨터는 저 멀리 미국 넷플릭스 서버까지 이어지는 중간 도로망의 대역폭 한계(혼잡도)를 전혀 모릅니다. 그래서 처음부터 CWND 크기를 무작정 크게 잡는 건 미친 짓(자폭)입니다.
Ⅱ. 슬로우 스타트 (Slow Start)의 개념과 동작 🌟
- 개념: TCP 연결 초기나 치명적인 타임아웃 에러가 났을 때, 네트워크의 수용량을 조심스럽게 탐색하기 위해 혼잡 윈도우(CWND)의 크기를 아주 작은 값(보통 1)에서 시작하되, 패킷이 정상 도착할 때마다 그 크기를 '지수 함수적(Exponentially)'으로 두 배씩 빠르게 뻥튀기하여 최적의 통신 속도에 순식간에 도달하게 하는 혼잡 제어 초기화 알고리즘입니다.
동작 원리 (지수 폭발의 마법) 🌟
"슬로우" 스타트라는 이름은 1부터 시작한다는 뜻이지, 커지는 속도는 우주 최강입니다.
- 시작 (CWND = 1): 철수가 1개의 패킷을 조심스럽게 쏩니다.
- 영희가 "1번 잘 받았어!(ACK)" 답장을 줍니다.
- 2배 뻥튀기 (CWND = 2): 철수는 자신감을 얻고 창문을 2로 늘려, 패킷 2개를 연사로 갈깁니다.
- 영희가 2, 3번에 대한 답장(ACK 2개)을 줍니다.
- 지수 증가 (CWND = 4 ➜ 8 ➜ 16 ➜ 32): 답장(ACK)을 받을 때마다 CWND에 +1을 더해주기 때문에, 왕복 한 턴(RTT)이 돌 때마다 윈도우 크기가 $1 \to 2 \to 4 \to 8 \to 16$ 으로 무시무시한 기하급수적(Exponential) 곱빼기 폭발을 일으킵니다.
Ⅲ. 임계값(Threshold)과 혼잡 회피 (Congestion Avoidance)로의 전환 🌟 핵심 🌟
언제까지 2배로 뻥튀기할까요? 끝없이 하면 결국 도로가 터집니다.
- ssthresh (Slow Start Threshold, 임계 한계선):
- 송신자 마음속에 "아무리 뻥튀기해도 대충 이 숫자(예: 64)쯤 오면 슬슬 길이 막힐 텐데 조심해야지"라고 정해둔 경계선입니다.
- 혼잡 회피 (Congestion Avoidance) 페이즈 진입:
- 지수 증가를 하며 16, 32, 64까지 빵빵 터지며 올라왔습니다.
- CWND가 딱 이 **임계값(ssthresh=64)**에 도달하거나 넘는 순간! 철수는 브레이크를 밟습니다.
- "오케이, 여기까지가 한계 속도에 근접한 거다. 지금부터 2배 뻥튀기(지수 증가)는 중단하고, 쫄리니까 **답장이 올 때마다 창문 크기를 1씩만 더해주는(64 ➜ 65 ➜ 66) 소심한 더하기 모드(선형 증가, Linear)**로 전환하자!"
- 이 소심하게 1씩 더하는 구간이 바로 '혼잡 회피' 알고리즘 구간입니다. 과부하를 아슬아슬하게 피하며 최고 속도에 주차하는 예술적 컨트롤입니다.
Ⅳ. 타임아웃의 절망 (원점으로 추락)
- 혼잡 회피로 1씩 살금살금 늘리다가 80개쯤 쐈는데, 결국 라우터가 뻗어서 패킷이 증발(타임아웃 발생)해버렸습니다!
- 철수는 식겁하여 즉시 벌칙을 내립니다.
- 새로운 임계값 설정: "아, 80에서 터졌으니 다음엔 조심하게 한계선(ssthresh)을 절반인 40으로 확 낮춰!"
- CWND 바닥으로 추락: "창문 크기(CWND)는 다시 태초 마을인 1로 찌그러뜨리고, 슬로우 스타트부터 다시 처음부터 2배씩 뻥튀기해서 기어 올라와!" (네트워크 리셋)
📢 섹션 요약 비유: 슬로우 스타트 알고리즘은 안대(네트워크 블라인드)를 쓰고 100M 달리기를 하는 '장님 스프린터'의 전략입니다. 앞이 안 보이는데 처음부터 100km/h 전력 질주를 하면 벽(라우터 마비)에 부딪혀 대가리가 깨집니다. 그래서 **슬로우 스타트(Slow Start)**를 합니다. 처음엔 조심스럽게 딱 한 발짝(CWND=1)만 내딛습니다. 부딪히는 게 없네? 그다음엔 용기를 내어 두 발짝을 뜁니다. 안 부딪히네? 네 발짝! 여덟 발짝! 스퍼트를 지수 함수로 미친 듯이 올려붙이며 달립니다. 그러다 내가 미리 조심하자고 그어둔 '노란색 경계선(Threshold 임계값)'을 밟는 순간, 달리기 방식을 싹 바꿉니다. "여기부턴 벽이 나올지 모르니 곱빼기로 뛰지 말고, 한 번에 한 발짝씩(선형 증가, 혼잡 회피)만 찔끔찔끔 늘리면서 앞을 더듬어가자!" 그러다 벽에 '쾅' 하고 부딪히면(타임아웃), 그 부딪힌 지점의 절반 지점에 새 경계선을 그어두고, 다시 출발선(CWND=1)으로 돌아와 1발짝부터 다시 곱빼기로 뛰어 올라가는 궁극의 안전 속도 탐색 메커니즘입니다.