핵심 인사이트 (3줄 요약)

  1. 본질: 슬로우 스타트(Slow Start)는 TCP가 통신을 막 시작했을 때 인터넷 도로 상태가 어떤지 전혀 모르므로 섣불리 풀악셀을 밟지 않고 패킷을 딱 1개만 쏘며 조심스레 출발하지만, 영수증(ACK)이 돌아오면 1개->2개->4개->8개 순으로 윈도우 크기를 미친 듯이 뻥튀기(지수적 증가)하며 초광속으로 속도를 끌어올리는 극단적 가속 알고리즘이다.
  2. 이름의 배신 (절대 느리지 않다): 이름은 'Slow(천천히)'지만 실제로는 단 몇 번의 왕복(RTT)만 거치면 기가바이트 속도를 뚫어버리는 가장 폭발적인 로켓 가속 엔진이다. 단지 **"처음 시작을 1개부터 조심스럽게(Slow) 시작한다"**는 의미일 뿐이다.
  3. 임계점 (ssthresh)과의 만남: 영원히 배수로 뻥튀기하면 금방 라우터가 터지므로, 사전에 정해둔 '임계점(ssthresh)' 선에 도달하는 순간 이 로켓 엔진(지수 증가)을 강제 종료시키고, 1개씩 찔끔찔끔 늘어나는 안정적인 정속 주행(혼잡 회피 모드)으로 기어를 변속한다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: TCP 혼잡 제어의 첫 번째 단계로, CWND(Congestion Window)를 1 MSS로 시작하여 수신된 ACK마다 1 MSS씩 증가시켜 RTT당 윈도우 크기가 $2^N$으로 기하급수적(Exponential) 성장하는 대역폭 탐색 메커니즘.

  • 필요성: 1980년대 컴퓨터는 연결을 맺자마자 지가 쏠 수 있는 1,000개의 패킷을 허공에 무자비하게 던졌다(Full Throttle). 10개밖에 못 받는 낡은 라우터는 990개를 버리며 피를 토했다. "야! 네비도 안 켜고 냅다 시속 200km로 밟지 마! 처음 가는 길은 무조건 시속 10km(1개)로 출발해. 대신 길이 뚫린 게 확인되면 20, 40, 80으로 미친 듯이 속도를 올려도 좋아!" 이것이 밴 제이콥슨(Van Jacobson)이 인터넷 붕괴를 구원하기 위해 발명한 슬로우 스타트다.

  • 💡 비유: 슬로우 스타트는 낯선 빙판길을 달리는 **"테스트 브레이킹과 풀악셀"**과 같습니다.

    • 처음 차를 탔을 때 빙판길인지 몰라서 조심스레 엑셀을 아주 살짝 1번 밟아봅니다. (Slow Start 시작: CWND=1)
    • 오? 안 미끄러지네? 자신감이 붙어 이번엔 엑셀을 2배 세게 밟습니다. (CWND=2)
    • 오? 또 멀쩡하네? 이번엔 4배 세게 콱 밟습니다! (CWND=4)
    • 눈 깜짝할 새에 차는 시속 100km에 도달해 미친 듯이 질주합니다 (지수적 팽창).

📢 섹션 요약 비유: 슬로우 스타트는 다단계 피라미드 판매의 **"기하급수적 인원 모집"**과 똑같습니다. 처음 내가 1명을 포섭하면, 그 1명이 2명을 데려오고, 2명이 4명을, 4명이 8명을 데려오며 눈사태(Snowball)처럼 불어나, 단 몇 턴 만에 엄청난 덩치(속도)의 피라미드 왕국이 완성되는 공포스러운 팽창력입니다.


Ⅱ. 슬로우 스타트의 팽창 공식과 기어 변속 (Deep Dive)

1. $2^N$ 지수적 증가(Exponential Growth)의 수학

ACK가 1개 돌아올 때마다 송신자 뇌구조(CWND)는 1씩 증가한다. 이게 왜 기하급수적으로 늘어날까?

  • 1라운드 (RTT 1): CWND=1. 패킷을 딱 1개 쏜다.
    • (잠시 후) 영수증(ACK) 1개가 왔다.
    • CWND = 1 + 1 = 2가 된다.
  • 2라운드 (RTT 2): 내 창문 크기가 2가 됐으니 패킷 2개를 쏜다.
    • (잠시 후) 영수증이 2장 연달아 온다.
    • CWND = 2(원래) + 1 + 1 = 4가 된다.
  • 3라운드 (RTT 3): 창문이 4가 됐으니 패킷 4개를 쏜다.
    • 영수증 4장이 온다.
    • CWND = 4(원래) + 4 = 8이 된다.
  • 결과: 1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 64. 단 6번의 핑퐁 만에 한 번에 64개의 상자를 들이붓는 미친 화력이 완성된다.

2. 브레이크 제어선: ssthresh (Slow Start Threshold)

계속 배수로 뻥튀기하다간 100만 개를 쏘며 라우터를 부숴버릴 것이다. 그래서 **"안전 커트라인(ssthresh)"**을 정해둔다. 보통 초기값은 65535바이트(창문 최대치)다.

  • 1 -> 2 -> 4 -> 8 -> 16으로 막 신나게 뻥튀기하며 달리다가, 내 CWND 숫자가 ssthresh (예: 16) 숫자에 딱 부딪혔다!
  • 기어 변속: "헉, 커트라인 넘었다! 이제부터는 배수(x2)로 올리면 너무 위험해! 기어 변속!"
  • 슬로우 스타트 엔진이 꺼지고, 그다음부터는 영수증이 100개가 와도 CWND를 1라운드(RTT)에 딱 1개씩만 찔끔찔끔 올리는 혼잡 회피(Congestion Avoidance: 17 -> 18 -> 19) 모드로 돌입한다. (안정적인 정속 주행).
 ┌─────────────────────────────────────────────────────────────┐
 │                TCP 혼잡 윈도우(CWND) 그래프의 예술적 변화          │
 ├─────────────────────────────────────────────────────────────┤
 │ CWND 크기                                                     │
 │ 16 | (ssthresh선)  * ─ * ─ * ─ * ◀─ 혼잡 회피 (1씩 찔끔찔끔 증가) │
 │    |             /                                          │
 │  8 |           /   ◀─ 슬로우 스타트 구간 (미친듯한 가파른 곡선 상승)   │
 │    |         /                                              │
 │  4 |       /                                                │
 │  2 |     /                                                  │
 │  1 |  *                                                     │
 │    |____________________________________ 시간(RTT)            │
 │                                                             │
 │   ▶ "이름은 슬로우 스타트지만, 그래프의 기울기를 보면 사실 이 구간이       │
 │      TCP 전체 생애를 통틀어 가장 가파르고 폭력적으로 속도가 오르는 구간이다!"│
 └─────────────────────────────────────────────────────────────┘

3. 통신 장애(Drop) 시 슬로우 스타트의 부활

순조롭게 달리다가 라우터가 꽉 차서 패킷이 짤려 나갔다(Timeout 발생). 내 PC의 판단: "아 씨, 길 막혀서 죽었네! 싹 다 엎어!"

  1. 다음번 목표인 안전 커트라인(ssthresh)을 현재 창문 크기의 **절반(1/2)**으로 훅 깎아내린다. (너 아까 20 쏘다 죽었지? 다음엔 10까지만 뛰어라).
  2. CWND를 무자비하게 **1**로 곤두박질치게 리셋해버린다.
  3. 그리고 다시 눈물겨운 **슬로우 스타트(1->2->4...)**를 바닥부터 다시 시작하여 조심스레 복구를 노린다.

📢 섹션 요약 비유: 슬로우 스타트는 팽팽한 고무풍선에 **"에어펌프로 공기 넣기"**입니다. 처음엔 펌프질 한 번에 풍선이 두 배, 네 배로 훅훅 커지지만(Slow Start), 풍선이 터지기 직전 크기(ssthresh)에 다다르면 바늘로 숨을 불어 넣듯 아주 조금씩(혼잡 회피) 크기를 키워 풍선이 터지는 대형 사고를 막습니다.