TCP 흐름 제어 (Flow Control)
수신자가 처리할 수 있는 속도에 맞춰 송신자가 전송 속도를 조절하는 메커니즘
왜 필요한가?
[송신자] ── 1Gbps ──→ [수신자: 100Mbps]
→ 버퍼 오버플로우!
→ 패킷 유실!
수신자의 처리 능력을 초과하면 패킷 유실 → 재전송 → 성능 저하.
슬라이딩 윈도우
수신 윈도우(rwnd) = 수신 버퍼 여유 공간
[수신자] → ACK + rwnd=4000
"4000바이트까지 받을 수 있어"
[수신자] → ACK + rwnd=1000
"버퍼 거의 찼어, 1000만 보내"
[수신자] → ACK + rwnd=0
"멈춰! 버퍼 꽉 찼어"
흐름 제어 vs 혼잡 제어
| 구분 | 흐름 제어 | 혼잡 제어 |
|---|
| 목적 | 수신자 보호 | 네트워크 보호 |
| 윈도우 | rwnd (수신) | cwnd (혼잡) |
| 조절 | 수신자가 알려줌 | 송신자가 판단 |
| 트리거 | 수신 버퍼 상태 | 패킷 유실/지연 |
실제 전송 윈도우 = min(rwnd, cwnd)
혼잡 제어 알고리즘
cwnd
^
| /\
| / \ 타임아웃!
| / \__
| / \/\
| / Slow
| / Start
+------------------→ 시간
[지수증가] [선형증가] [절반복구]
- Slow Start: 1 → 2 → 4 → 8 (지수 증가)
- 혼잡 회피: 임계값 후 선형 증가
- 빠른 재전송: 3 중복 ACK → 즉시 재전송
- 빠른 복구: cwnd 절반 → 선형 증가
실무 연결
| 상황 | 흐름 제어 영향 |
|---|
| 대용량 파일 전송 | Slow Start로 초반 느림 |
| CDN 사용 | RTT 감소 → 윈도우 빠르게 확장 |
| HTTP/2 | 하나의 TCP 최대 활용 |
| 서버 튜닝 | rmem_max 버퍼 크기 조정 |
Q.TCP 흐름 제어와 혼잡 제어의 차이를 설명해주세요.
누구를 보호하는지가 다릅니다.
| 항목 | 흐름 제어 | 혼잡 제어 |
|---|
| 보호 대상 | 받는 쪽의 버퍼 | 네트워크 중간 구간 |
| 신호 | 상대가 알려주는 수신 윈도우 | 유실과 지연 증가를 스스로 관측 |
| 방식 | 상대가 받을 수 있는 만큼만 보낸다 | 조금씩 늘리다 문제가 보이면 줄인다 |
흐름 제어는 상대가 명시적으로 "이만큼 받을 수 있다"고 알려주므로 정확합니다. 혼잡 제어는 네트워크가 알려주지 않으므로 유실을 신호로 삼아 추측합니다.
실제 전송량은 둘 중 작은 쪽으로 정해집니다.
보낼 수 있는 양 = min(수신 윈도우, 혼잡 윈도우)
흔한 실수: 둘을 같은 것으로 설명하는 것. 받는 쪽이 여유가 넘쳐도 네트워크가 막히면 못 보내고, 반대도 마찬가지입니다.
Q.슬라이딩 윈도우 방식은 어떻게 동작하나요?
확인을 기다리지 않고 윈도우 크기만큼 미리 보내는 방식입니다.
윈도우 없이 하나씩 보내고 확인받으면
왕복 시간마다 1개씩 -> 편도 40ms 면 초당 12.5개
윈도우가 10개면
10개를 연달아 보내고 확인을 받으며 창을 옮긴다 -> 처리량이 10배
확인이 오면 창의 왼쪽이 그만큼 이동하고, 오른쪽이 따라 늘어 새 데이터를 보낼 자리가 생깁니다.
| 요소 | 역할 |
|---|
| 창 크기 | 확인 없이 보낼 수 있는 양 |
| 왼쪽 경계 | 확인받은 지점 |
| 오른쪽 경계 | 보낼 수 있는 마지막 지점 |
흔한 실수: 창 크기를 크게 하면 항상 빨라진다고 답하는 것. 대역폭과 왕복 시간의 곱이 상한이고, 그보다 크게 잡으면 중간 장비의 버퍼만 채워 지연이 늘어납니다.
Q.Slow Start와 혼잡 회피의 차이점은?
늘리는 속도가 다릅니다. 앞은 배로, 뒤는 하나씩 늘립니다.
| 단계 | 증가 방식 | 목적 |
|---|
| 느린 시작 | 확인마다 두 배 | 가용 대역폭을 빠르게 찾는다 |
| 혼잡 회피 | 왕복마다 1씩 | 한계 근처에서 조심스럽게 탐색 |
전환 시점은 임계치입니다. 유실이 관측되면 그 지점의 절반을 임계치로 기억하고, 다음부터는 그 값까지만 배로 늘리다 그 뒤로는 하나씩 늘립니다.
1 -> 2 -> 4 -> 8 (배로) 임계치 도달 -> 9 -> 10 -> 11 (하나씩) 유실 -> 줄인다
이름이 "느린 시작"이지만 증가 속도는 지수적입니다. 창이 1에서 시작한다는 뜻입니다.
흔한 실수: 느린 시작을 느리게 보내는 방식으로 설명하는 것. 시작점이 작다는 뜻이고, 증가 자체는 가장 빠른 구간입니다.
Q.실제 전송 윈도우 크기는 어떻게 결정되나요?
받는 쪽의 여유와 네트워크 상태 중 작은 쪽으로 정해집니다.
전송 윈도우는 두 값 중 작은 쪽으로 정해집니다.
| 값 | 누가 정하나 |
|---|
| 수신 윈도우 | 상대가 헤더로 알려준다. 상대 버퍼의 남은 공간 |
| 혼잡 윈도우 | 내가 유실과 지연을 보고 추정한다 |
그리고 이론적 상한이 있습니다.
대역폭 x 왕복 시간 = 한 번에 회선에 담을 수 있는 양
100Mbps, 왕복 80ms -> 약 1MB
이 값보다 창이 작으면 회선을 다 못 쓰고, 크면 중간 버퍼만 채워 지연이 늘어납니다. 그래서 장거리 고속 회선에서는 창 크기 확장 옵션이 필요합니다.
흔한 실수: 수신 윈도우만 보고 답하는 것. 상대가 여유를 넉넉히 알려도 네트워크가 막히면 그만큼 보낼 수 없습니다. 둘 중 작은 쪽이라는 점이 핵심입니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
네트워크 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.