핵심 인사이트 (3줄 요약)

  1. 본질: 영 윈도우(Zero Window) 상태는 수신자의 램(버퍼)이 100% 꽉 차서 송신자에게 "나 터지기 일보 직전이니까 당분간 1바이트도 보내지 말고 통신 완전 정지(STOP)해!!"라고 발령하는 최후의 흐름 제어(Flow Control) 비상사태다.
  2. 데드락(교착 상태)의 공포: 수신자가 창고를 비우고 "나 자리 났어! 다시 보내!(Window Update)"라고 엽서를 보냈는데, 그 엽서가 하필 태평양 바다에 빠져 증발해 버리면, 송신자는 평생 0인 줄 알고 안 쏘고, 수신자는 쐈는데 왜 안 주냐고 평생 기다리는 무한 대기(Deadlock) 지옥에 빠진다.
  3. 지속 타이머 (Persist Timer)의 구원: 이 데드락을 박살 내기 위해, 송신자는 영 윈도우 통보를 받으면 얌전히 기다리지 않고, 주기적으로 "야, 너 아직도 버퍼 꽉 찼냐? 빈자리 안 났냐?"라며 1바이트짜리 깡통 패킷(Zero Window Probe)을 찔러보는 끈질긴 알람 시계(Persist Timer)를 가동한다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: 수신 측의 버퍼 오버플로우로 인해 수신 윈도우 크기가 0이 된 상태(Zero Window)에서, 송신 측이 수신 측의 윈도우 갱신(Window Update) ACK 유실로 인한 교착 상태(Deadlock)를 방지하기 위해 가동하는 타이머와 탐침(Probe) 패킷 메커니즘.

  • 필요성: 똥컴으로 영화를 다운받다 보면 컴퓨터가 뻗어서 윈도우 창이 하얗게 변할 때가 있다. 이때 OS의 수신 버퍼는 꽉 차버리고 구글 서버에 Window=0을 날린다. 구글은 착하게 패킷 발사를 멈춘다. 1분 뒤 내 똥컴이 정신을 차리고 버퍼를 비웠다. Window=64000 영수증을 구글에 던졌다. 그런데 하필 이 영수증이 공유기 렉으로 유실됐다. 구글 뇌구조: "아직도 Window=0이겠지? 기다리자." 내 똥컴 뇌구조: "아까 공간 났다고 보냈는데 왜 안 보내지? 기다리자." "아니, 둘 다 멍청하게 기다리면 인터넷이 영원히 마비되잖아! 송신자가 수신자 멱살을 잡고 '너 아직도 꽉 찼냐?'라고 계속 물어보게 만들어!!"

  • 💡 비유: Zero Window와 Persist Timer는 **"만차 주차장과 눈치 보는 차주"**와 같습니다.

    • 주차장에 자리가 꽉 찼습니다. 주차 관리요원(수신자)이 **"만차(Zero Window) 표지판"**을 입구에 세워둡니다. 차들(송신자)은 진입을 멈춥니다.
    • 차가 한 대 빠져나갔습니다. 요원이 "들어오세요!"라고 손짓(Window Update)했는데, 차주가 딴 데 보느라 못 봤습니다(패킷 유실).
    • 둘 다 멀뚱멀뚱 서 있습니다(Deadlock).
    • 차주는 이렇게 멍청하게 기다리지 않습니다. 차주는 1분마다 창문을 내리고 **"아저씨! 아직도 만차예요? 자리 안 났어요? (Zero Window Probe 찔러보기)"**라고 계속 물어봅니다(Persist Timer). 아저씨가 "오 자리 났어요!" 하면 그때 쑥 들어갑니다.

📢 섹션 요약 비유: 영 윈도우 프로브(Probe) 패킷은 꽉 닫힌 문 틈새로 찔러 넣는 **"막대기 찌르기"**입니다. 상대가 문을 잠그고 묵묵부답일 때, 상대가 문을 열어줄 때까지 하염없이 기다리는 게 아니라, 주기적으로 문을 똑똑 두드리며 문이 열렸는지 확인하는 훌륭한 생존 본능입니다.


Ⅱ. 지속 타이머의 핑퐁 동작과 타이머 뻥튀기 (Deep Dive)

1. 프로브(Probe) 패킷의 정체

송신자가 수신자를 찔러보는 이 패킷(Zero Window Probe)은 와이어샤크(Wireshark)에서 잡힌다.

  • 데이터 알맹이는 1바이트짜리 쓰레기 문자(더미) 하나만 들어있다.
  • 1바이트를 억지로 밀어 넣음으로써 수신자 OS가 억지로라도 강제 대답(ACK)을 하게 만든다.
  • 수신자 OS는 이 1바이트를 받고 "아 나 아직 자리 없다고 ㅆㅂ!!" 화를 내며 Window=0을 다시 적어서 튕겨내거나, "오, 아까 자리 났어!" 라며 Window=64000을 적어서 보낸다. 이렇게 데드락이 뚫린다.

2. 타이머 뻥튀기 (Exponential Backoff)의 자비로움

송신자가 "자리 났냐?"고 찔러볼 때 1초마다 계속 찌르면 어떻게 될까? 수신자 CPU가 그 찔러보기 쳐내느라 더 터진다. 그래서 여기에도 칸(Karn) 알고리즘처럼 타이머를 배수로 뻥튀기하는 꼼수를 쓴다.

  1. 수신자가 Win=0을 때림. 통신 멈춤.
  2. 송신자 5초 대기 후 1차 프로브 발송 -> 대답 Win=0.
  3. 송신자 10초(2배) 대기 후 2차 프로브 발송 -> 대답 Win=0.
  4. 송신자 20초(2배) 대기 후 3차 프로브 발송 -> 대답 Win=0.
  5. 이렇게 대기 시간(Persist Timer)을 5, 10, 20, 40, 80초로 미친 듯이 늘려가면서 수신자 CPU를 귀찮게 하지 않고 넉넉하게 기다려준다. (최대 한계 시간은 보통 60초 정도로 고정한다).
 ┌─────────────────────────────────────────────────────────────┐
 │                Zero Window Deadlock 방어 핑퐁 시각화             │
 ├─────────────────────────────────────────────────────────────┤
 │                                                             │
 │   [ 구글 (송신자) ]                              [ 내 똥컴 (수신자) ] │
 │                                          (버퍼 100% 꽉 참!!)   │
 │   "오케이 발사 정지" ◀─────── (Window=0 전송) ───────── │
 │                                                             │
 │      (내 똥컴이 드디어 버퍼를 비우고 Window=64000 엽서를 보냄!)      │
 │           ❌ ◀───────── (바다에 빠져서 엽서 유실됨 ㅠㅠ) ─── │
 │                                                             │
 │   * 데드락 발생 위기: 서로 평생 기다림.                             │
 │                                                             │
 │   구글: "참다 못해 내가 찔러본다. 야 빈자리 났냐?" (ZWP 발사)          │
 │       ─────────────────────────────────────────▶ │
 │   내 똥컴: "어? 아까 자리 났다고 보냈는데 못 받았어? 옛다 다시!"          │
 │       ◀────── (Window=64000 재전송!!) ────────────── │
 │                                                             │
 │   ▶ 결과: 구글이 멈췄던 다운로드를 기가 막히게 재개하며 인터넷이 살아남! │
 └─────────────────────────────────────────────────────────────┘

3. 실무 T/S: 해커의 Zero Window 공격 방어

해커들은 이 영 윈도우를 악용한다. 해커가 내 웹서버에 접속해 놓고, 고의로 Window=0만 주구장창 보낸다. 내 웹서버는 "오 손님이 버퍼가 꽉 찼네" 하고 해커에게 던져줄 데이터를 자기 램(송신 버퍼)에 평생 쥐고 기다려준다. 해커 10만 명이 이렇게 물고 늘어지면 내 웹서버의 메모리가 터져 죽는다. (Slowloris 공격의 친척뻘이다). 그래서 현대 방화벽은 **"Window=0 상태로 60초 이상 뻐팅기는 놈은 그냥 해커로 간주하고 TCP 세션의 목을 가차 없이 잘라버려라(RST)!"**라는 보호 룰을 켜둔다.

📢 섹션 요약 비유: Persist Timer는 수화기 너머로 잠든 친구를 깨우는 **"주기적인 '여보세요' 외침"**입니다. 친구가 조용해졌을 때(Win=0), 나도 가만히 숨죽이고 있는 게 아니라, 5초 뒤에 "여보세요?", 10초 뒤에 "야 자냐?", 20초 뒤에 "야 일어나!!"라고 계속 찔러보면서 통화가 영원히 정적(Deadlock)에 빠지는 걸 막는 필사적인 시도입니다.