한양과학기술고등학교

에듀테크 프로젝트 대시보드

TCP 흐름 제어 & 혼잡 제어

TCP 흐름 제어 & 혼잡 제어

TCP는 데이터를 "보낼 수 있는 만큼"만 보낸다. 받는 쪽이 감당할 양(흐름 제어)과 네트워크가 감당할 양(혼잡 제어)을 계속 재면서, 창(window) 크기를 늘렸다 줄였다 한다. 그 결과가 바로 유명한 톱니파(sawtooth) 그래프다.

왜 필요할까? 링크 속도도 모르고, 그 길을 몇 명이 같이 쓰는지도 모르는 채로 인터넷에 패킷을 쏟아붓는다고 생각해 보자. 너무 많이 보내면 라우터 큐가 넘쳐 패킷이 버려지고(혼잡 붕괴), 너무 적게 보내면 링크가 논다. TCP는 ACK가 돌아오는 속도를 신호로 삼아 스스로 적정 전송률을 찾아간다.

1. 두 개의 창: rwnd 와 cwnd

송신자가 ACK를 받지 않고 미리 보낼 수 있는 바이트 수를 전송 윈도우라 한다. 이 값은 두 제한의 최솟값이다.

이름누가 정하나막으려는 것
rwnd (수신 윈도우)수신자가 ACK 헤더에 담아 알려줌수신 버퍼 넘침 (흐름 제어)
cwnd (혼잡 윈도우)송신자가 스스로 추정네트워크 라우터 큐 넘침 (혼잡 제어)
보낼 수 있는 양 = min(rwnd, cwnd)
사용 중(in-flight) = 마지막에 보낸 바이트 − 마지막으로 ACK된 바이트
남은 여유 = min(rwnd, cwnd) − 사용 중

아래 데모는 네트워크가 병목이라고 보고 cwnd에 집중한다. 단위는 편의상 MSS(세그먼트) 개수로 센다.

2. 슬라이딩 윈도우 — 창이 미끄러진다

세그먼트를 왼쪽부터 순서대로 보낸다. 왼쪽 끝 세그먼트가 ACK되면 창 전체가 오른쪽으로 미끄러지며 새 세그먼트를 보낼 자리가 생긴다. 창 크기(cwnd)만큼만 "날아다니는" 상태로 유지된다.

ACK 완료 전송됨(대기) 현재 창 손실
「1 RTT 진행」을 눌러 창이 미끄러지는 모습을 보세요.

3. 혼잡 윈도우는 어떻게 변할까 Slow Start

TCP는 두 국면을 오간다.

손실이 감지되면(AIMD의 MD: Multiplicative Decrease):

4. AIMD 톱니파 그래프 직접 만들기

"1 RTT 진행"을 누를 때마다 규칙에 따라 cwnd가 자란다. 빨간 버튼으로 손실을 일으켜 창이 반토막 나는 걸 확인해 보자. 여러 번 반복하면 교과서에 나오는 그 톱니 모양이 그려진다.

cwnd 1
ssthresh 16
RTT # 0
국면 Slow Start

5. 의사코드 (TCP Reno)

# RTT마다 한 번 호출된다고 가정 (MSS 단위)
on_ack():
    if cwnd < ssthresh:
        cwnd += cwnd            # 느린 시작: ×2 (지수)
    else:
        cwnd += 1              # 혼잡 회피: +1 (선형)

on_triple_dup_ack():       # 가벼운 손실
    ssthresh = cwnd / 2
    cwnd     = ssthresh        # 절반으로, 회피 국면 유지

on_timeout():               # 심각한 손실
    ssthresh = cwnd / 2
    cwnd     = 1              # 바닥부터 다시 느린 시작

실제 커널은 바이트 단위로, ACK 하나하나마다 cwnd += MSS·MSS/cwnd 같은 식으로 잘게 쪼개 적용한다. 개념은 같다.

6. 왜 "더하기는 조금, 빼기는 확 " (AIMD) 일까?

여러 흐름이 한 링크를 나눠 쓸 때, 덧셈 증가 · 곱셈 감소는 대역폭을 공평하게 수렴시킨다. 많이 쓰던 흐름일수록 손실 때 더 많이(절대량으로) 깎이기 때문이다. 만약 둘 다 곱셈이거나 둘 다 덧셈이면 공평점으로 모이지 않는다. 이것이 인터넷이 지금까지 안 무너진 이유 중 하나다.

요즘은? 손실 기반 Reno/CUBIC 외에, 구글이 만든 BBR은 병목 대역폭과 RTT를 직접 추정해 큐가 차기 전에 속도를 조절한다. 유튜브·많은 CDN이 사용 중.

7. 어디서 작동하나

큰 파일 · 스트리밍

다운로드 속도가 처음엔 쭉 오르다(느린 시작) 중간에 툭툭 떨어지는 게 바로 손실 → cwnd 감소.

혼잡한 와이파이 · LTE

무선은 잡음으로도 패킷이 깨진다. TCP는 이를 "혼잡"으로 오해해 속도를 줄이기도 한다.

데이터센터

RTT가 μs 단위라 DCTCP처럼 ECN(라우터가 큐 상태를 표시)을 쓰는 특화 알고리즘을 적용.

초기 창(IW)

요즘 서버는 cwnd=10으로 시작해 작은 웹 페이지는 1 RTT에 다 받도록 한다.

이어서 보면 좋은 글: TCP 3-way Handshake · 로드 밸런싱 · OSI 7계층 모델