967. TCP 슬라이딩 윈도우 - 흐름 제어 (Flow Control) 송수신 버퍼 윈도우 크기 동적 조절 랙/버퍼 마비 회피 전송 성능 극대화 에러 제어 파이프라인 통신
핵심 인사이트: 철수는 타자기가 100타, 영희는 타자기가 10타다. 철수가 영희에게 100개의 데이터를 1초 만에 기관총처럼 갈겨버리면, 영희 컴퓨터는 받다가 뇌정지가 와서 90개의 데이터를 땅바닥에 줄줄 흘리며 다 버려버린다(수신 버퍼 초과). "야 철수! 영희가 받아먹을 수 있는 '위장(버퍼) 크기'가 딱 10개라고 카톡을 보냈잖아! 그러면 답장을 안 기다리고 한방에 연사로 갈길 수 있는 패킷의 개수(파이프 길이)를 무조건 딱 10개로만 맞춰서 쏴! 영희가 소화하면 그 소화한 만큼만 창문을 스르륵 밀어서(슬라이딩) 다음 빵을 던져줘!" 송신자와 수신자의 그릇 크기를 기가 막히게 조율해 낭비를 막는 위대한 흐름 제어, 슬라이딩 윈도우다.
Ⅰ. TCP 흐름 제어(Flow Control)의 존재 이유
- 딜레마: 송신자 컴퓨터(최신형 10기가 랜카드)가 수신자 컴퓨터(낡은 구형 폰)로 데이터를 쏠 때 속도(스피드)의 격차가 끔찍하게 납니다.
- 송신자가 너무 빨리 쏘면 수신자 램(RAM)의 임시 저장소(수신 버퍼)가 꽉 차서 넘쳐흐르고, 결국 패킷이 공중 분해되어 다시 쏴야 하는(재전송 트래픽 폭주) 악순환이 터집니다. 수신자가 감당할 수 있는 속도만큼만 송신자의 목줄을 조이는 기술이 흐름 제어입니다.
Ⅱ. 구식 방식의 답답함: Stop-and-Wait
- 949번 문서에서 배웠듯, 택배 박스 1개를 쏘고 수신자가 "잘 받았어(ACK)!" 할 때까지 멍때리며 기다립니다.
- 오버헤드나 손실은 전혀 없지만, 1초면 10,000개를 보낼 수 있는 1Gbps 광케이블 고속도로에서 1개씩 찔끔찔끔 보내고 있으니 대역폭 효율(속도)이 지옥 수준으로 떨어집니다.
Ⅲ. TCP 슬라이딩 윈도우 (Sliding Window)의 마법 🌟 핵심 🌟
이 답답함을 박살 내고 파이프를 데이터로 꽉 채우는 '연사(Pipelining)' 기술입니다.
1. 윈도우 크기 (Window Size)의 합의 🌟
- 영희(수신자)가 철수와 처음 연결을 맺을 때 자기 뱃속(수신 버퍼)의 남은 여유 공간을 잽니다. "내 빈 공간이 딱 5개(바이트/패킷 단위)네!"
- 영희가 철수에게 보내는 응답 패킷(TCP 헤더) 안에 **
Window Size = 5**라고 쾅 박아서 알려줍니다. - 이 숫자는 철수에게 **"철수야, 나한테 내 답장(ACK) 안 기다리고 그냥 막 연속으로 쏴도 되는 허락된 개수가 5개야!"**라는 절대 명령(송신 윈도우 크기)이 됩니다.
2. 슬라이딩 (Sliding, 창문 밀기) 동작 원리 🌟
송신자(철수) 앞에 5칸짜리 투명한 네모 창문(Window)이 떠 있다고 상상해 봅니다.
- 철수가 1, 2, 3, 4, 5번 패킷을 창문 크기만큼 답장을 기다리지 않고 기관총처럼 한방에 연사로 확 쏴버립니다.
- 이제 창문이 꽉 차서(윈도우 0) 철수는 전송을 멈추고 기다려야 합니다.
- 잠시 후 영희가 "야! 1번, 2번 패킷 잘 받았고 내 뱃속에서 소화시켰어!(ACK 3 보냄)"라고 답장을 날립니다.
- 마법의 슬라이딩: 철수는 이 응답을 듣는 순간, 앞쪽의 1, 2번 공간이 비었다는 걸 깨닫고 네모난 창문 틀을 오른쪽으로 2칸 스르륵 밀어(슬라이딩) 버립니다!
- 창문이 오른쪽으로 밀리면서, 뒤에 갇혀있던 새로운 6, 7번 패킷이 창문 안으로 쏙 들어옵니다. 철수는 신나서 6, 7번을 또 기관총처럼 연사로 쏴버립니다.
3. 영희의 목 조르기 (동적 조절, Zero Window)
- 영희 컴퓨터가 CPU 과부하가 걸려 뱃속 소화가 아예 멈췄습니다.
- 영희는 긴급하게 철수에게
Window Size = 0이라는 끔찍한 패킷을 날립니다. - 철수의 네모난 창문이 완전히 찌그러져 닫혀버립니다. 철수는 전송을 즉각 멈추고 숨죽이며 엎드립니다. 나중에 영희가 뱃속이 비어서 윈도우를 다시 늘려줄 때까지 절대 쏘지 않아 패킷 드랍을 완벽하게 0%로 통제해 냅니다.
Ⅳ. 흐름 제어 vs 혼잡 제어 (시험 단골 함정)
- 흐름 제어 (슬라이딩 윈도우): 딱 너(철수)와 나(영희) 둘 사이의 그릇 크기(단말기 수신 버퍼) 격차를 조율하는 개인적인 1:1 대화.
- 혼잡 제어 (969번 혼잡 윈도우): 우리 둘 사이의 문제가 아니라, 중간에 거쳐 가는 **대한민국 고속도로망 전체 라우터의 톨게이트 막힘 상태(네트워크 전체 교통체증)**를 눈치채고 속도를 줄이는 전 지구적 통제.
📢 섹션 요약 비유: TCP의 슬라이딩 윈도우는 극강의 '회전초밥집 컨베이어 벨트 통제 시스템'입니다. 요리사(송신자)가 초밥 1개 쥐고 손님이 다 씹어 먹을 때까지 가만히 서서 기다리는 건 최악의 레스토랑(Stop-and-wait)입니다. 그래서 손님(수신자)이 처음 자리에 앉을 때 요리사에게 접시(윈도우 사이즈)를 줍니다. "아저씨, 내 위장 크기는 한 번에 초밥 5접시니까, 5접시는 씹는 거 안 기다리고 컨베이어 벨트 위로 쫙 깔아주세요(파이프라인 전송)!" 요리사는 1초 만에 5접시를 쫙 올립니다. 손님이 2접시를 꿀꺽 소화하면 요리사에게 "나 2접시 먹었어!(ACK)"라고 소리칩니다. 요리사는 즉시 2개의 빈 접시 공간(슬라이딩)이 났다는 걸 알고 새로운 초밥 2개를 쓱 밀어 넣어 빈자리를 채워 넣습니다. 만약 손님이 배가 터질 것 같으면 "그만! 빈 접시 0개요!(Window=0)"라고 소리쳐 요리사의 칼질을 완벽하게 멈춰 세우는(패킷 드랍 0% 보장), 송수신자 간의 텔레파시 초밥 배급 메커니즘입니다.