💡 핵심 인사이트
흐름 제어(Flow Control)는 송신 측 컴퓨터의 속도(초당 100개 발사)가 수신 측 컴퓨터의 데이터 처리 속도(초당 10개 소화)보다 압도적으로 빠를 때, 수신 측의 메모리(버퍼)가 꽉 차서 데이터가 바닥에 쏟아져 버리는 '오버플로우(Overflow) 참사'를 막기 위해, 수신기가 송신기의 '발사 속도'를 목줄 쥐듯 통제하는 기술입니다.


Ⅰ. 흐름 제어가 필요한 이유 (속도의 불균형)

  • 송신자 (최신형 서버): CPU가 빵빵해서 데이터를 초당 1GB씩 랜선으로 밀어냅니다.
  • 수신자 (구형 스마트폰): CPU가 구려서 랜선으로 들어온 데이터를 분석하고 하드디스크에 저장하는 데 하루 종일 걸립니다.
  • 병목 발생 (버퍼 오버플로우): 수신기의 랜카드에는 데이터를 잠시 쌓아두는 '버퍼(Buffer, 양동이)'가 있습니다. 스마트폰이 양동이에서 물을 한 바가지 푸기도 전에 서버가 폭포수처럼 물을 쏟아부으면, 양동이가 넘쳐흐르면서(오버플로우) 아까운 데이터가 공중으로 증발(Drop)해 버립니다.
  • 데이터가 유실되면 재전송을 해야 하고, 재전송하면 양동이는 더 넘치는 지옥의 악순환이 시작됩니다.

Ⅱ. 흐름 제어의 2가지 대표 기법

수신기는 이 사태를 막기 위해 송신기의 멱살을 잡고 속도를 제어해야 합니다.

1. 정지-대기 (Stop-and-Wait) - "하나 줬으니 기다려!"

  • 방식: 앞서 ARQ에서 배운 그 방식입니다. 송신기가 딱 1개의 박스(프레임)를 보내면, 수신기가 그걸 뜯어보고 "나 이거 소화 다 했어! 다음 거 줘도 돼(ACK)!"라고 허락할 때까지 송신기를 멈춰 세웁니다.
  • 장점/단점: 절대로 양동이가 넘칠 일이 없는 완벽하고 안전한 제어법이지만, 송신기가 멍때리는 시간이 너무 길어 속도가 개판이 됩니다.

2. 슬라이딩 윈도우 (Sliding Window) - "내 양동이 남은 공간만큼만 쏴!"

  • 방식: 현대 통신(TCP)의 지배적인 흐름 제어 방식입니다.
  • 송신기는 ACK를 안 기다리고 데이터를 막 쏠 수 있습니다. 하지만 수신기가 정해준 '윈도우 크기(Window Size, 양동이의 빈 공간 크기)' 한도 내에서만 쏠 수 있습니다.
  • 동작:
    • 수신기: "야, 내 양동이에 지금 박스 5개(윈도우 사이즈=5) 더 들어갈 수 있어."
    • 송신기: "오케이, 다다다닥 5개 쏠게." (이 이상은 쏘고 싶어도 멈춤).
    • 수신기: (박스 2개를 소화함) "어! 방금 2개 치워서 이제 빈 공간 7개(윈도우 7로 팽창)로 늘어났어! 더 쏴!"
  • 이처럼 수신기의 현재 남은 체력(버퍼 용량)을 송신기에 실시간으로 알려주어, 송신기가 그 빈 공간만큼만 유연하게 데이터를 밀어 넣는 스마트한 속도 조절 방식입니다.

Ⅲ. 혼잡 제어(Congestion Control)와의 결정적 차이

시험에서 이 둘을 헷갈리면 100% 틀립니다.

  • 흐름 제어 (Flow Control): 내 데이터를 받는 '수신기(End-to-End)' 1대의 양동이가 터질까 봐 속도를 줄여주는 것입니다. (1:1 배려).
  • 혼잡 제어 (Congestion Control): 수신기는 쌩쌩한데, 중간에 있는 인터넷 **'고속도로(Router, 통신망 전체)'**에 차가 너무 막혀서(트래픽 잼) 도로가 터질까 봐 송신기가 스스로 속도를 줄여주는 것입니다. (도로 상황 배려).

📢 섹션 요약 비유: 흐름 제어는 엄마가 갓난아기에게 **'이유식 먹이는 속도 조절'**입니다. 엄마(송신기)가 숟가락으로 미친 듯이 밥을 퍼 넣으면, 아기(수신기)의 입(버퍼)이 꽉 차서 밥을 바닥에 다 뱉어버립니다(오버플로우). 엄마는 반드시 아기가 입을 오물오물 씹어서 꼴깍 삼킨 것(ACK/빈 윈도우 발생)을 눈으로 확인한 뒤에야, 다음 숟가락의 크기를 조절해 가며 밥을 떠먹여야만 안전하게 밥을 먹일 수 있습니다.