핵심 인사이트 (3줄 요약)
- 본질: 혼잡 윈도우(CWND, Congestion Window)는 수신자가 정해주는 RWND(수신 윈도우)와 달리, 송신자(내 PC)가 "지금 인터넷 도로 상황이 요 정도니까 한 번에 이만큼만 쏴야지"라고 자기 스스로 머리를 굴려 매초마다 크기를 늘였다 줄였다 하는 '가상의 자동차 배기량(전송 속도)' 제한기다.
- 보이지 않는 한계선: TCP는 패킷을 보낼 때 절대
RWND(상대방 빈 공간)와CWND(도로의 빈 공간) 중 **더 작은 값(Minimum)**을 넘어서 패킷을 발사하지 않는 철저한 겸손함을 발휘하여, 상대방이 체하거나 인터넷망이 터지는 두 가지 재앙을 동시에 완벽히 틀어막는다.- 탐침과 팽창: 처음에 CWND는 고작 패킷 1개(1 MSS)로 옹졸하게 시작하지만, 상대방으로부터 "잘 받았어(ACK)!"라는 영수증이 도착할 때마다 "오! 길이 뚫려있네?"라며 CWND 크기를 2배, 3배로 팍팍 팽창시켜 미친 듯이 속도를 끌어올린다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: 송신 측 운영체제 커널 내부에 유지되는 동적 상태 변수. 네트워크의 혼잡 상태를 유추하여, 수신 측의 확인 응답(ACK) 없이 한 번에 전송할 수 있는 최대 데이터의 양을 바이트(또는 MSS) 단위로 제한한다.
-
필요성: 수신자가 나한테 "내 램(RWND)이 엄청 크니까 1GB 한 번에 보내!"라고 했다. 구형 TCP는 이 말만 믿고 1GB를 냅다 쐈다. 근데 중간 통신사(KT) 라우터는 10MB짜리 똥라우터였다. 라우터가 1GB를 다 받아내지 못하고 990MB를 뱉어버렸다(망 붕괴). "아! 수신자 말만 믿으면 안 되겠다. 수신자가 허락한 창문(RWND)과 별개로, 내가 직접 인터넷 길거리를 찔러보면서 유동적으로 조절할 나만의 비밀 창문(CWND)을 하나 더 파야겠다!"
-
💡 비유: CWND는 고속도로 톨게이트 진입로의 **"초록불 진입 통제기"**와 같습니다.
- RWND: 목적지 리조트 주인이 "우리 주차장에 차 100대 댈 수 있어요!"라고 허락한 대수.
- CWND: 내가 톨게이트에 서서 눈치껏 본 고속도로 상황. "오케이, 리조트는 100대 허락했지만, 지금 고속도로가 꽉 막혀서 한 번에 5대(CWND)밖에 못 들어가겠어. 일단 5대만 톨게이트 열어줘!"
- 차가 무사히 도착해서 리조트 주인이 전화(ACK)를 주면, "오 길 좀 뚫리나 본데? 이번엔 10대(CWND 증가) 들여보내자!"라고 내가 스스로 진입 대수를 조절합니다.
📢 섹션 요약 비유: CWND는 시각 장애인이 짚고 걷는 **"안테나 지팡이의 길이"**입니다. 처음엔 짧게(1 MSS) 쥐고 걷다가, 앞이 뻥 뚫려있다는 감(ACK)이 오면 지팡이를 쭉 길게 뽑아(CWND 팽창) 보폭을 크게 넓혀 쾌속 질주를 시작합니다.
Ⅱ. CWND의 메커니즘과 통제 방정식 (Deep Dive)
1. 절대 방정식: MIN(RWND, CWND)
이 공식이 현대 인터넷 통신의 핵심을 지배한다. 실제 송신 창문 크기 (Send Window) = MIN (수신 윈도우, 혼잡 윈도우)
[ 시나리오 A: 똥컴 수신자 vs 빵빵한 인터넷망 ]
- 수신자 램 여유 (RWND) = 10 KB
- 인터넷망 상태 (CWND) = 100 KB (오 뻥 뚫렸네!)
- 내 PC의 결정: MIN(10, 100) = 10 KB만 발사!
- (인터넷은 쌩쌩하지만 수신자가 체할까 봐 배려함).
[ 시나리오 B: 슈퍼컴 수신자 vs 막혀터진 인터넷망 ]
- 수신자 램 여유 (RWND) = 1 GB (우주 끝까지 받을 수 있음!)
- 인터넷망 상태 (CWND) = 14 KB (명절 귀성길 수준 꽉 막힘!)
- 내 PC의 결정: MIN(1GB, 14KB) = 14 KB만 찔끔 발사!
- (수신자는 넉넉하지만 인터넷 톨게이트가 박살 날까 봐 억제함).
2. CWND는 어떻게 숫자를 늘릴까? (ACK 기반 팽창)
내 PC는 CWND 값을 어떻게 계산할까? 철저하게 상대방의 영수증(ACK)이 돌아오는 속도에 비례해서 숫자를 키운다. (이걸 Self-Clocking이라 부른다).
- 시작:
CWND = 1(상자 1개, 1460 바이트). 택배 하나를 던진다. - 영수증 도착! "오! 1개 잘 갔네?" ──▶
CWND = 2(상자 2개 쏠 수 있음). - 2개 던짐. 영수증 2개 도착! "오 2개도 소화하네?" ──▶
CWND = 4(상자 4개 발사!). - 4개 던짐. 영수증 4개 도착! "길 완벽히 뚫림!!" ──▶
CWND = 8 - 이런 식으로 ACK가 무사히 돌아올 때마다 내 CWND 창문은 풍선처럼 미친 듯이 팽창한다.
┌─────────────────────────────────────────────────────────────┐
│ CWND 팽창과 수축의 드라마틱한 인생 그래프 │
├─────────────────────────────────────────────────────────────┤
│ │
│ CWND 크기 (패킷 개수) │
│ 16 | /| /| │
│ 14 | / | / | │
│ 12 | / | / | │
│ 10 | / | / | │
│ 8 | / | / | │
│ 4 | / | | │
│ 2 |/ | | │
│ 1 *──(성장기)──* (절망) * ──(다시 성장) │
│ │
│ * 성장기: ACK가 제깍제깍 돌아와서 기분 좋게 CWND 창문을 마구 늘림. │
│ * 절망(Drop): 갑자기 영수증이 안 옴! "앗! 톨게이트 막혀서 다 터졌나 봐!"│
│ ──▶ CWND 창문을 즉시 1로 박살 냄(수축). │
│ ▶ "이 CWND 크기를 늘리고 깎는 타이밍 기술이 곧 TCP의 혼잡 알고리즘이다!"│
└─────────────────────────────────────────────────────────────┘
3. 실무 T/S: 왜 다운로드 초반엔 속도가 느릴까?
파일을 다운받을 때 처음에 몇백 KB/s 로 시작했다가 1초 뒤에 몇십 MB/s 로 치솟는 경험을 해봤을 것이다. 이것이 바로 내 PC의 CWND가 1에서 시작했다가 영수증(ACK)을 받으며 기하급수적으로 창문을 팽창시키고 있는 워밍업 시간 때문이다. (다음 장에서 배울 Slow Start).
📢 섹션 요약 비유: CWND는 엑셀 페달 밑에 깔아둔 **"가상의 나무토막"**입니다. 처음엔 안전을 위해 나무토막을 꽉 채워(CWND=1) 악셀이 거의 안 밟히게 하다가, 길이 뻥 뚫린 게 눈으로 확인되면(ACK 수신) 나무토막을 하나씩 빼서(CWND 팽창) 시속 200km까지 밟을 수 있게 허락해 주는 스마트한 족쇄입니다.