Network · 완벽 가이드 Ch.2 Section 3
TCP 흐름 제어와 혼잡 제어의 차이를 설명해주세요
Sliding Window·rwnd·cwnd부터 Slow Start·Congestion Avoidance·Fast Retransmit까지 — TCP가 수신자와 네트워크를 동시에 보호하는 원리를 인터랙티브 시각화로 완전히 이해합니다.
2026년 3월 29일 · 약 12분 읽기
Q. "TCP 흐름 제어와 혼잡 제어의 차이를 설명하고, cwnd와 rwnd가 어떻게 연관되는지 말씀해주세요."
예상 꼬리질문
답변 가이드
"TCP 흐름 제어는 수신자의 버퍼 오버플로를 방지하는 메커니즘으로, 수신자가 자신의 버퍼 여유(rwnd)를 ACK에 실어 전송자에게 전달합니다.혼잡 제어는 네트워크 경로 전체를 보호하기 위해 전송자 내부에서 cwnd를 관리합니다."
"실제 전송 가능량은 min(cwnd, rwnd)로 결정됩니다. 두 윈도우 중 작은 값이 상한선입니다."
"혼잡 제어는 Slow Start(지수 증가) → Congestion Avoidance(선형 증가) 순으로 동작하며, 패킷 손실 시 3중복 ACK는 Fast Recovery, 타임아웃은 cwnd=1 Slow Start 재시작으로 처리합니다."
인터넷에서 데이터를 빠르게 전송하려면 두 가지 문제를 동시에 해결해야 합니다. 수신자가 처리할 수 있는 속도를 넘으면 수신 버퍼가 넘쳐 데이터가 유실되고, 네트워크 경로 전체가 감당할 수 있는 속도를 넘으면 중간 라우터의 큐가 포화되어 패킷이 드롭됩니다.
TCP는 이 두 문제를 흐름 제어(Flow Control)와 혼잡 제어(Congestion Control)로 각각 해결합니다. 두 메커니즘은 이름이 비슷해서 혼동하기 쉽지만, 보호 대상과 작동 원리가 완전히 다릅니다.
1. 흐름 제어 — Sliding Window로 수신자를 보호한다
꼬리질문: "TCP 흐름 제어(Flow Control)란 무엇인가요?"
TCP의 흐름 제어(Flow Control)는 전송자가 수신자의 처리 능력을 초과하지 않도록 전송 속도를 조절하는 메커니즘입니다. 수신자는 자신의 수신 버퍼 여유 공간을 rwnd(Receive Window)라 하며, 매 ACK 패킷의 Window Size 필드에 실어 전송자에게 전달합니다.
전송자는 ACK를 받지 못한 in-flight 데이터의 양이 rwnd를 초과하지 않도록 제한합니다. 수신자가 데이터를 애플리케이션으로 넘기면 rwnd가 커지고, 더 많은 데이터를 요청할 수 있게 됩니다. 이처럼 윈도우가 앞으로 이동하는 방식을 Sliding Window라 합니다.
수신 버퍼가 가득 차면 rwnd=0이 되어 전송자는 전송을 멈춥니다. 이 상태를 Zero Window라 하며, 전송자는 주기적으로 1바이트 Window Probe 패킷을 보내 수신자가 버퍼를 비웠는지 확인합니다.
아래 시뮬레이션에서 수신자 처리 속도를 조절하며 rwnd와 전송 가능량 변화를 확인해 보세요.
수신자 버퍼 여유(rwnd)에 따라 전송 가능 패킷 수가 결정됩니다
패킷 상태
cwnd (혼잡 윈도우)
6 MSS
네트워크 상태 추정
rwnd (수신 윈도우)
4 MSS
수신자 버퍼 여유
실제 전송 상한
min(6,4) = 4
in-flight: 0 MSS
2. 혼잡 제어 — Slow Start부터 Fast Recovery까지
꼬리질문: "Slow Start와 Congestion Avoidance를 설명해주세요"
혼잡 제어(Congestion Control)는 수신자가 아닌 네트워크 경로 전체를 보호하는 메커니즘입니다. 전송자는 cwnd(Congestion Window)를 내부적으로 유지하며, 패킷 손실 신호를 감지하면 전송량을 줄입니다.
Slow Start: cwnd=1 MSS에서 시작, ACK를 받을 때마다 +1 MSS씩 증가합니다. RTT당 cwnd가 2배 증가하는 지수 성장 구간입니다. ssthresh(Slow Start Threshold)에 도달하면 선형 증가 구간인 Congestion Avoidance로 전환됩니다.
Fast Retransmit: 3중복 ACK를 수신하면 타임아웃(RTO) 없이 즉시 재전송합니다. 3중복 ACK는 해당 세그먼트만 손실되고 이후 세그먼트는 수신됐음을 의미하므로, 재전송 타임아웃을 기다릴 필요가 없습니다.
타임아웃은 더 심각한 혼잡 신호입니다. cwnd를 1 MSS로 초기화하고 Slow Start를 처음부터 재시작합니다.
버튼으로 손실 이벤트를 발생시키며 cwnd 변화를 차트에서 확인해 보세요.
Slow Start에서 지수 증가, ssthresh 도달 후 선형 증가
3. cwnd와 rwnd의 관계 — 실제 전송량은 어떻게 결정되나
꼬리질문: "cwnd와 rwnd의 차이는 무엇인가요?"
흐름 제어(rwnd)와 혼잡 제어(cwnd)는 각각 독립적으로 작동하지만, 실제 전송 가능한 데이터량은 두 윈도우 중 작은 값이 결정합니다.
rwnd는 수신자가 "나 이만큼 받을 수 있어"라고 알리는 것이고, cwnd는 전송자 스스로 "네트워크가 이만큼 감당할 수 있을 것 같아"라고 추정하는 것입니다. 두 값 중 작은 것이 병목이 됩니다.
슬라이더로 cwnd와 rwnd를 조절하며 병목이 어디서 발생하는지 확인해 보세요.
실제 전송 가능량 = min(cwnd, rwnd) — 두 윈도우 중 작은 값이 상한선
4. 핵심 비교표 — 흐름 제어 vs 혼잡 제어
꼬리질문: "흐름 제어와 혼잡 제어의 차이는 무엇인가요?"
두 개념의 핵심 차이는 누가, 무엇을 보호하기 위해 윈도우를 결정하느냐입니다. 흐름 제어는 수신자 보호, 혼잡 제어는 네트워크 보호입니다.
각 항목을 클릭하면 상세 설명이 펼쳐집니다.
각 행을 클릭하면 상세 설명이 펼쳐집니다
면접 체크리스트
이 항목들을 자신 있게 설명할 수 있다면 TCP 흐름/혼잡 제어 질문은 준비 완료입니다.
- - 흐름 제어: rwnd 기반, 수신자 보호, Sliding Window — "수신자가 ACK에 버퍼 여유를 실어 전달"
- - 혼잡 제어: cwnd 기반, 네트워크 보호, Slow Start / CA / Fast Recovery — "전송자가 패킷 손실로 혼잡 추정"
- - min(cwnd, rwnd): 실제 전송 상한, 두 윈도우 중 작은 값이 병목
- - Slow Start: cwnd < ssthresh, ACK마다 +1 MSS (RTT당 ×2, 지수 증가)
- - Congestion Avoidance: cwnd ≥ ssthresh, RTT마다 +1 MSS (선형 증가)
- - 3중복 ACK: Fast Retransmit + Fast Recovery (cwnd 절반, ssthresh 갱신)
- - 타임아웃: cwnd=1 + Slow Start 재시작 (더 심각한 손실 신호)
참고 자료
- RFC 5681 — TCP Congestion Control — Slow Start, Congestion Avoidance, Fast Retransmit, Fast Recovery 표준 명세
- High Performance Browser Networking — Building Blocks of TCP — 흐름 제어·혼잡 제어를 웹 성능 관점에서 정밀하게 설명
- RFC 7323 — TCP Extensions for High Performance (Window Scaling) — rwnd를 최대 1GB까지 확장하는 Window Scaling 옵션 명세
의견을 들려주세요
서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.