네트워크 기초

TCP 심화

meellon 2026. 6. 29. 05:10

학습 목표

흐름 제어(flow control)혼잡 제어(congestion control)목적 차이를 설명할 수 있다.

수신 윈도(rwnd) · 슬라이딩 윈도 로 수신 측 버퍼를 보호하는 방식을 설명할 수 있다.

slow start·congestion avoidancecwnd 변화의 개념을 설명할 수 있다.

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 -tn Recv-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 -ti cwnd, 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) 의 내용을 기반으로 합니다.

'네트워크 기초' 카테고리의 다른 글

ICMP과 진단  (0) 2026.07.01
IP와 라우팅  (0) 2026.06.30
TCP 기초  (0) 2026.06.28
UDP  (0) 2026.06.27
전송 계층 역할  (0) 2026.06.26