핵심 인사이트 (3줄 요약)
- 본질: 윈도우 스케일 옵션(Window Scale Option)은 1980년대 천재들이 TCP 헤더를 디자인할 때 윈도우 사이즈를 최대 64KB밖에 못 담게(16비트) 만들어놓은 치명적 실수를 메꾸기 위해, 기본 헤더 크기를 고치지 않고 곱하기(Scale) 치트키를 써서 윈도우를 최대 1GB까지 팽창시키는 기적의 마법 가루다.
- 작동 원리 (Shift 곱셈): 통신을 처음 맺을 때(SYN 패킷) 옵션 칸에
Shift Count = 8이라고 쓱 적어서 보낸다. 이러면 앞으로 통신할 때 헤더에 적힌 기본 윈도우 사이즈 값에 $2^8 (256배)$을 무조건 곱해서 해석하라는 합의가 이루어져, 한 번에 쏟아부을 수 있는 데이터양이 기가바이트 단위로 폭발한다.- LFN(Long Fat Network)의 구원자: 해저 케이블처럼 거리가 엄청나게 멀고(Long) 대역폭이 10Gbps로 미친 듯이 굵은(Fat) 최신 네트워크에서, 이 스케일 옵션이 없으면 64KB 쏘고 대답 올 때까지 핑 타임(200ms) 내내 숨을 참아야 해서 다운로드 속도가 2~3Mbps로 곤두박질치는 대재앙이 벌어진다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: TCP 헤더의 16비트 Window Size 필드가 가진 물리적 한계(65,535 바이트)를 확장하기 위해, TCP SYN 세그먼트의 Options 필드에 포함하여 윈도우 크기를 $2^N$ 배로 증폭시키는 확장 기술 (RFC 7323).
-
필요성: 1981년 TCP가 처음 나왔을 땐 모뎀을 썼다. 수신자 컴퓨터의 RAM 창고 크기가 64KB를 넘을 일이 평생 없을 줄 알고 Window Size 칸을 16비트(최대 65,535)로 만들어 놨다. 세월이 흘러 1Gbps 광랜 시대가 왔다. 수신자 PC의 램은 16GB다. "구글아 나 창고 엄청 크니까 100MB 한방에 쏴!"라고 헤더에 적으려는데, 적을 칸이 65535에서 막혀서 더 이상 큰 숫자가 안 써진다! 결국 1Gbps 선을 꽂아놓고도 구글은 64KB씩 찔끔찔끔 보내고 영수증(ACK)을 기다리는 미친 병목 현상이 발생했다. 기존 헤더를 안 부수고 이 한계를 뚫을 꼼수가 절실했다.
-
💡 비유: 윈도우 스케일 옵션은 무역 거래의 **"화폐 단위 절상(0 덧붙이기)"**과 같습니다.
- 구형 송장(TCP 16비트 헤더)에는 금액을 적는 칸이 5칸(최대 99,999원)밖에 없습니다.
- 물가가 올라서 천만 원짜리 물건을 사야 하는데 송장에 적을 수가 없습니다.
- 그래서 계약을 처음 맺을 때(SYN), 서류 맨 밑 빈칸(Options)에 특약 사항을 적습니다. "앞으로 이 송장에 적힌 숫자는 뒤에 무조건 0을 두 개(100배) 더 붙여서 읽읍시다(Window Scale)."
- 이제 송장에 "99,999"라고 적으면, 상대방은 그걸 "9,999,900원"으로 뻥튀기해서 해석합니다. 송장 칸을 안 늘리고도 천만 원 거래가 가능해집니다.
📢 섹션 요약 비유: 윈도우 스케일은 시골의 좁은 1차선 톨게이트(기본 16비트 헤더)를 부수지 않고도, **"지금부터 통과하는 차 한 대는 사실 트럭 256대가 하나로 압축된 캡슐 차다!"라는 마법의 주문(Shift 연산)**을 걸어 톨게이트 통과량을 256배로 늘려버리는 4차원 마법입니다.
Ⅱ. Window Scale의 수학적 메커니즘과 LFN의 비극 (Deep Dive)
1. Shift Count (비트 시프트 연산)
TCP 옵션 구역에 들어가는 스케일 값은 1, 2, 3 같은 숫자가 아니라 "비트를 왼쪽으로 몇 번 밀 것인가(Shift)"를 나타내는 $N$ 값이다. 최대 $N=14$까지 쓸 수 있다.
- 만약 SYN 패킷에
Window scale: 8이 적혀있다면? - $2^8 = 256$ 배 뻥튀기하겠다는 뜻이다.
- 통신 중에 패킷 겉면 16비트 헤더에
Window Size = 10,000이라고 적혀 날아왔다. - 수신자 운영체제 뇌구조: "오, 겉면에 1만 적혀있네? 아까 곱하기 256 하기로 했지? 10,000 x 256 = 2,560,000 바이트 (약 2.5MB) 쏠 수 있네! 쏴라!"
2. LFN (Long Fat Network)의 악몽
스케일 옵션이 없으면 왜 망하는지 계산해 보자. 한국에서 미국 서버로 1Gbps(Fat) 회선을 깔았다. 핑 타임(RTT)은 무려 200ms(Long)가 걸린다. 이것이 LFN이다.
- 스케일 옵션이 없으면 내가 한 번에 쏠 수 있는 최대 창문 크기는 64KB다.
- 나는 64KB를 0.0001초 만에 냅다 쏘고, 미국에서 "잘 받았어(ACK)"라는 대답이 올 때까지 창문이 닫혀서 200ms 동안 멍하니 숨을 참고 대기해야 한다.
- 대답이 오면 또 64KB 쏘고 200ms 대기한다.
- 1초에 고작 5번(1000ms / 200ms) 쏠 수 있다.
- 초당 전송량 = 64KB * 5 = 고작 320KB/s (약 2.5Mbps).
- 나는 1Gbps 선을 샀는데, TCP의 64KB 룰 때문에 실효 속도가 2.5Mbps로 박살이 난 것이다!
- 해결: Window Scale을 켜서 창문 크기를 1GB로 늘려버리면, 대답(ACK)이 200ms 걸리든 10초가 걸리든 닥치고 1GB를 풀악셀로 때려 넣을 수 있으므로 1Gbps 선로 속도를 100% 뽑아낼 수 있다.
┌─────────────────────────────────────────────────────────────┐
│ 와이어샤크(Wireshark)에서 분석한 Window Scale │
├─────────────────────────────────────────────────────────────┤
│ │
│ [ 1단계: 연결 수립 (SYN 패킷 내부) ] │
│ Options: (12 bytes) │
│ - Window scale: 8 (multiply by 256) ◀─ "우리 256배 하자!" │
│ │
│ [ 2단계: 실제 데이터 통신 (ACK 패킷 내부) ] │
│ Window size value: 500 ◀─ 낡은 16비트 헤더에 강제로 적힌 좁은 숫자│
│ [Calculated window size: 128000] ◀─ 와이어샤크가 똑똑하게 계산해줌 │
│ (500 * 256 = 128,000) │
│ │
│ ▶ "스케일 협상은 오직 SYN 패킷에서만 1번 일어난다. 중간에 바꿀 수 없다!"│
└─────────────────────────────────────────────────────────────┘
3. 실무 T/S 포인트 (방화벽의 방해)
오래된 구형 방화벽이나 멍청한 로드밸런서는 SYN 패킷이 지나갈 때 "어? TCP 기본 뼈대 말고 꼬리(옵션)가 더 붙어 있네? 해킹 아니야?" 라며 Window Scale 옵션 꼬리를 가위로 싹둑 잘라버리고(Strip) 넘기는 만행을 저지른다. 결국 양쪽 PC는 스케일 협상을 못 해서 64KB 지옥에 빠지고, "사장님! 우리 10기가 전용선 깔았는데 파일 다운로드가 2Mbps 나와요!"라는 클레임이 터지게 된다.
📢 섹션 요약 비유: 윈도우 스케일은 자동차 계기판의 **"RPM 다이얼 꼼수"**입니다. 계기판 바늘이 1, 2, 3, 4(16비트 한계)까지만 표시되어 있지만, 계기판 구석에 작게 **"x 1000 RPM (Scale Option)"**이라고 적어두어, 바늘이 4를 가리키면 4가 아니라 4,000 RPM으로 엔진을 돌려버리는 숨겨진 치트키입니다.