핵심 인사이트 (3줄 요약)
- 본질: TCP의 꽃이라 불리는 혼잡 제어(Congestion Control)는 내 컴퓨터(수신자) 버퍼가 아니라, 패킷이 굴러가는 '인터넷망 전체(KT 라우터들)'가 꽉 막혀서 패킷이 우수수 터져 죽는 것을 막기 위해, 송신자 PC 스스로가 눈치껏 속도를 줄이고 늦추는 이타적인 거시적 브레이크 시스템이다.
- 흐름 제어와의 완벽한 차이: 흐름 제어가 "상대방 폰(수신자) 용량"이 터질까 봐 속도를 줄이는 개인적인 배려라면, 혼잡 제어는 "고속도로(네트워크)" 자체가 꽉 막혔을 때 나 혼자 이기적으로 풀악셀 밟다가 다 같이 사고 나는 걸 막는 공공의 질서 유지 규칙이다.
- 패킷 유실 = 혼잡의 증거: 인터넷이 막혔다는 걸 내 PC가 어떻게 알까? 내 PC가 쏜 패킷에 대해 "영수증(ACK)이 안 오거나(Timeout), 같은 영수증이 3번 연속(3 Dup-ACK) 날아오면", 내 PC는 아! 톨게이트 꽉 차서 내 패킷 짤렸구나! 라고 기막히게 눈치채고 즉각 혼잡 제어 브레이크를 콱 밟아버린다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: 네트워크 내의 트래픽 양이 처리 가능한 대역폭(Bandwidth)을 초과하여 라우터의 큐 오버플로우로 인한 패킷 유실이 발생할 때, 송신 측이 전송 윈도우 크기를 동적으로 조절하여 혼잡을 완화하는 알고리즘.
-
필요성: 1980년대 초, TCP는 흐름 제어(수신자 눈치 보기)밖에 몰랐다. 수신자가 "나 1GB 받을 수 있어!"라고 하면, 송신자는 그냥 냅다 1GB를 풀악셀로 때려 박았다. 문제는 이 둘을 이어주는 중간 통신사 라우터의 성능이 고작 10MB였다는 거다. 라우터는 쏟아지는 패킷을 감당 못 하고 다 쓰레기통에 버렸다(Drop). 패킷이 버려지니 송신자는 빡쳐서 1GB를 또 재전송했다. 라우터는 더 죽어났다. 전 세계의 모든 PC가 이기적으로 재전송을 갈겨대자 1986년 10월, 인터넷망 전체의 속도가 32Kbps에서 40bps로 추락하는 인터넷 대붕괴(Congestion Collapse) 사태가 터졌다. "안 되겠다! 수신자 눈치만 보지 말고, 도로(네트워크)가 꽉 막힌 거 같으면 우리 스스로 속도를 확 줄여주는 자제력(혼잡 제어)을 코딩해 넣자!!" 반 雅各브슨(Van Jacobson)의 이 천재적인 패치가 인터넷을 구원했다.
-
💡 비유: 혼잡 제어는 고속도로 톨게이트 전방의 **"가변 속도 제한 시스템"**과 같습니다.
- 흐름 제어: 목적지 펜션 주인(수신자)이 "우리 펜션 주차장 3자리 남았어"라고 해서 차를 3대만 보내는 겁니다.
- 혼잡 제어: 펜션 주차장은 100자리가 비어있지만, 명절이라 경부고속도로(인터넷 망) 전체가 주차장이 되었습니다. 차들이 가다가 서다를 반복합니다. 내비게이션(TCP)이 이걸 눈치채고 "야! 고속도로 꽉 막혔어! 시속 100km로 밟지 말고 시속 20km로 천천히 가!"라며 도로 전체의 붕괴를 막는 공공의 브레이크입니다.
📢 섹션 요약 비유: 혼잡 제어는 뷔페에서 음식(데이터)을 쓸어 담으려는 손님에게, "당신 배(수신 버퍼)가 아무리 고파도, 지금 요리사(라우터)들이 파업 직전이니까 당장 접시 내려놓고 5분에 1개씩만 집어가라!"고 제지하는 식당 매니저의 위기관리 능력입니다.
Ⅱ. 혼잡의 탐지와 CWND의 탄생 (Deep Dive)
혼잡 제어가 돌아가는 큰 그림을 머릿속에 잡아야 다음 장의 알고리즘들이 이해된다.
1. 송신자의 뇌구조 (2개의 창문)
송신자는 데이터를 쏠 때 두 개의 눈치를 동시에 봐야 한다.
- RWND (Receive Window): 수신자가 "나 이만큼 비었어"라고 헤더에 적어 보낸 빈 공간. (흐름 제어).
- CWND (Congestion Window): "내가 찔러보니까 인터넷 도로 상태가 요 정도 되네?"라고 내 PC가 스스로 짐작하고 계산한 가상의 창문 크기. (혼잡 제어).
- 절대 규칙: 송신자는 패킷을 쏠 때, 무조건 **
RWND와CWND중에서 "더 작은 값"**을 기준으로 삼아서 쏜다. 수신자 램이 100GB가 비어있어도, 도로가 1MB밖에 못 견딘다고 CWND가 계산되면 나는 눈물을 머금고 1MB씩만 찔끔찔끔 보내야 한다.
2. 인터넷이 막혔다는 걸 어떻게 알까? (혼잡 징후 탐지)
내 PC는 라우터가 아니니까 라우터 속을 들여다볼 수 없다. 오직 '영수증(ACK)'이 오는 꼴을 보고 눈치껏 때려 맞춘다.
- 완벽한 타임아웃 (RTO Expiration) - "심정지 상태"
- 내가 패킷을 쐈는데, 정해진 시간(Retransmission TimeOut)이 훌쩍 지나도록 아무 대답도 안 온다.
- 내 PC의 판단: "헐, 길이 완전히 아작나서 패킷이 형체도 없이 터졌구나! 최악의 혼잡 상황이다! 속도 0으로 곤두박질 쳐라!!"
- 3 중복 ACK (3 Dup-ACKs) - "가벼운 접촉 사고"
- 영수증은 제깍제깍 오는데,
ACK 300,ACK 300,ACK 300이렇게 똑같은 번호가 3번 연속으로 날아온다. - 내 PC의 판단: "음, 대답이 오긴 오니까 길이 아예 꽉 막힌 건 아니네. 근데 300번 패킷 딱 한 놈만 가다가 옆 차선 차랑 부딪혀서(유실) 드랍됐나 보네. 가벼운 정체 상황이군! 속도를 절반으로만 깎자!"
- 영수증은 제깍제깍 오는데,
┌─────────────────────────────────────────────────────────────┐
│ 혼잡 제어(Congestion Control)의 거시적 사이클 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 출발! (Slow Start) │
│ - 도로가 어떤지 모르니까 아주 천천히 1개 쏘고, 2개 쏘고 조심조심 출발.│
│ │
│ 2. 가속! (Congestion Avoidance) │
│ - 오? 뻥 뚫렸네? 영수증 잘 오네? 액셀 밟자! 속도 서서히 증가! │
│ │
│ 3. 사고 발생! (Packet Drop 감지) │
│ - 앗 ㅆ... 톨게이트 꽉 차서 내 패킷 죽음! 영수증이 안 오거나 징징댐! │
│ │
│ 4. 급브레이크! (Window Size 삭감) │
│ - 타임아웃 났어?! ──▶ 속도 1로 완전 초기화! 찌그러져 있자... │
│ - 3 Dup-ACK 났어?! ──▶ 속도 절반으로만 줄이자! (Fast Recovery) │
│ │
│ ▶ "이 짓을 평생 반복하며 톱니바퀴 모양(Sawtooth) 그래프를 그린다." │
└─────────────────────────────────────────────────────────────┘
3. 왜 이게 위대한가?
누가 시키지도 않았는데 전 세계 50억 대의 컴퓨터가 각자 자기 패킷이 유실될 때마다 스스로 브레이크를 밟아준다(Distributed Control). 이 거대한 분산 통제 이타주의 덕분에 우리는 지금 넷플릭스와 유튜브를 끊김 없이 보고 있는 것이다.
📢 섹션 요약 비유: TCP 혼잡 제어는 시각장애인이 **"지팡이(패킷)로 앞을 두드리며 걷는 것"**과 같습니다. 툭탁툭탁 두드려보고 걸림돌이 없으면 걸음을 재촉(속도 증가)하지만, 지팡이가 돌부리(패킷 유실)에 부딪히는 순간 즉각 걸음을 멈추고 웅크려서(속도 반토막) 자신이 낭떠러지로 떨어지는 것을 스스로 막아냅니다.