학습 목표
흐름 제어(flow control) 와 혼잡 제어(congestion control) 의 목적 차이를 설명할 수 있다.
수신 윈도(rwnd) · 슬라이딩 윈도 로 수신 측 버퍼를 보호하는 방식을 설명할 수 있다.
slow start·congestion avoidance 와 cwnd 변화의 개념을 설명할 수 있다.
RTT·RTO 추정이 재전송 타이밍에 쓰이는 이유를 설명할 수 있다.
문제 상황
- 빠른 서버가 느린 클라이언트에 대용량을 쏟아붓으면 버퍼가 넘친다
- 흐름 제어 없으면 수신 측 드롭 — TCP가 막아야 한다
- 링크가 포화인데 송신자가 계속 빠르게 보낸다
- 혼잡 제어 — 네트워크 전체를 보호 (수신 버퍼와 다른 문제)
- 같은 API인데 처음엔 빠르다가 점점 느려진다
- cwnd가 올랐다 혼잡 이벤트 후 줄었을 수 있다
- Wireshark에서 재전송이 타임아웃 직전에 일어난다
- RTO가 RTT 추정에서 나온다 — 11편 재전송의 타이머 쪽
handshake·seq/ACK까지 봤다. 얼마나·얼마나 빨리 보낼지 — 흐름·혼잡 제어와 RTT다.
1. 두 종류의 “얼마나 보낼까”
TCP 송신자는 동시에 in-flight(ACK 안 받은) 데이터 양을 제한한다. 제한값은 두 가지 중 작은 값에 묶인다.
| 흐름 제어 | 혼잡 제어 | |
|---|---|---|
| 보호 대상 | 수신자 버퍼 | 네트워크(라우터·링크) |
| 신호 | ACK 헤더 rwnd | 패킷 유실·지연·ECN 등 |
| 변수 | Receive window | Congestion window (cwnd) |
| 증상 | Recv-Q 쌓임, 앱 read 지연 |
전역 손실·지연·throughput 하락 |
effective window = min(cwnd, rwnd)
bytes in flight ≤ effective window
- rwnd — 상대가 “지금 이만큼 더 받을 수 있음” (바이트)
- cwnd — 송신 TCP가 “네트워크가 이만큼 감당 가능”이라 스스로 조절
- 둘 다 슬라이딩 윈도 안에서만 새 세그먼트 전송
2. 흐름 제어와 슬라이딩 윈도
수신 앱이 recv()를 늦게 하면 수신 버퍼가 찬다. TCP는 ACK에 rwnd를 실어 송신자에게 알린다.

| 개념 | 설명 |
|---|---|
| LastByteAcked | ACK까지 확인된 마지막 바이트 |
| LastByteSent | 보냈지만 아직 ACK 안 된 구간 포함 |
| 슬라이딩 윈도 | ACK·rwnd에 따라 전송 허용 구간이 오른쪽으로 이동 |
| Zero window | rwnd=0 → 송신 정지 — persist timer로 윈도 갱신 probe |
- 수신 버퍼 가득 → rwnd=0 → 송신 멈춤 — 수신자 보호
- Nagle 알고리즘, 윈도 스케일 옵션(대역폭·지연 product) — 구현·튜닝 주제
ss -tnRecv-Q가 크면 앱이 읽기 느리거나 rwnd가 작은 상황 단서
3. 혼잡 제어 (개념)
혼잡 — 라우터 큐·링크가 포화되어 손실·큰 지연이 생기는 상태. TCP는 cwnd로 전송 속도를 네트워크에 맞춘다.

| 단계 | 동작 (개념) |
|---|---|
| Slow start | 연결 초·손실 후 — cwnd 지수 증가 (1→2→4→8 … MSS) |
| Congestion avoidance | cwnd ≥ ssthresh — RTT마다 cwnd +1 MSS (선형) |
| 손실 감지 | timeout 또는 3 duplicate ACK |
| 반응 | ssthresh 줄임, cwnd 과감히 축소 (예: timeout 시 1 MSS, dup ACK 시 절반) |
- AIMD — 증가는 조심, 감소는 과감 — 공정성·안정성
- TCP Reno / CUBIC 등 알고리즘마다 세부 상수 다름 — 원리는 동일
- BBR 등은 cwnd 대신 대역폭·지연 추정 — 최신 Linux 경로
# Linux cwnd 등 (iproute2)
ss -ti | head -20
# cwnd:10 rto:204 ...
- 흐름 제어는 “상대 버퍼”, 혼잡 제어는 “중간 네트워크” — 둘 다 min()에 들어감
4. RTT와 재전송 타임아웃 (RTO)
ACK가 늦게 오면 유실인지 지연인지 모른다. TCP는 RTT를 측정해 RTO를 잡고, 그 전까지 기다렸다 재전송한다.

| 용어 | 의미 |
|---|---|
| SampleRTT | 세그먼트 전송 → 해당 ACK 수신 경과 시간 |
| EstimatedRTT | (1-α)·EstimatedRTT + α·SampleRTT (지수 가중 이동 평균) |
| DevRTT | RTT 변동(지터) 추정 |
| RTO | EstimatedRTT + 4 × DevRTT (개념식) |
- Karn 알고리즘 — 재전송된 세그먼트의 ACK는 SampleRTT에 넣지 않음 (모호함)
- RTO 너무 짧음 → 불필요 재전송, 너무 김 → 유실 복구 지연
- Fast retransmit — dup ACK 3개면 RTO 전 재전송 — 11편과 연결
5. Fast recovery와 dup ACK (개요)
| 이벤트 | 흔한 반응 (Reno 계열) |
|---|---|
| 3 duplicate ACK | Fast retransmit — 유실 1개 추정, cwnd 절반 등 |
| Timeout | cwnd 1 MSS로, slow start 재진입 |
| SACK (옵션) | 누적 ACK만으로 모호할 때 구간별 ACK — 재전송 효율 ↑ |
- dup ACK는 “같은 ACK 번호 반복” — 중간 세그먼트 유실 힌트
- Wireshark 18편에서 재전송·dup ACK 열로 확인
6. 처리량·지연과의 관계
처리량(throughput) 은 대략 min(cwnd, rwnd) / RTT 근처에서 결정된다 (단순화).
| 요인 | 영향 |
|---|---|
| 높은 RTT | 같은 cwnd도 초당 세그먼트 적음 — “멀리 있는 서버가 느림” |
| 작은 rwnd | 수신·앱 병목 — 송신 side가 아무리 cwnd 커도 한계 |
| 혼잡 손실 | cwnd 축소 → throughput 일시 하락 |
| 대역폭·지연 product (BDP) | 파이프를 채우려면 cwnd ≥ BDP 필요 — WAN·고속망 |
- HTTP Keep-Alive — handshake 줄이지만 TCP 혼잡·흐름은 그대로
- CDN·엣지는 RTT↓ → 체감 속도 ↑
7. 관측
# 연결별 큐·타이머 (Linux)
ss -ti state established '( dport = :443 )'
# ping RTT vs TCP (다른 층·다른 의미)
ping -c 3 api.example.com
ss -ticwnd, rto, rtt (커널·버전에 따라 필드명 다름)- Recv-Q / Send-Q — 흐름 병목 vs 네트워크 병목 구분에 사용
- pcap에서는 ACK rwnd, 재전송, dup ACK 필터 — 18편
8. 정리
- 흐름 제어 — rwnd, 수신 버퍼 보호 · 혼잡 제어 — cwnd, 네트워크 보호
- effective window = min(cwnd, rwnd) — 슬라이딩 윈도 안에서만 전송
- slow start → congestion avoidance — 손실 시 cwnd 축소
- EstimatedRTT·RTO — 재전송 타이밍 — dup ACK는 더 빠른 복구
다음에 다룰 것
- IP와 라우팅
- IPv4 주소, 서브넷, CIDR, 라우터 역할
해당 내용은 Computer Networking: A Top-Down Approach, 8/E (James Kurose, Keith Ross) 의 내용을 기반으로 합니다.