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

  1. 본질: TCP 헤더의 데이터 오프셋(Data Offset, 4비트) 필드는 길쭉하게 늘어났다 줄어들었다 하는 요물 같은 TCP 껍데기(헤더)가 정확히 몇 바이트짜리인지 알려주어, 수신자가 칼을 들고 "아! 여기까지가 포장지고, 여기서부터가 찐 알맹이 데이터(Payload)구나!"라고 정확히 잘라낼 수 있게 해주는 절취선 표지판이다.
  2. 곱하기 4의 마법 (워드 단위): 이 필드는 꼴랑 4개의 비트(0~15)밖에 공간이 없다. 그래서 숫자를 적을 때 바이트 단위가 아니라 **"4바이트(1 Word)를 한 덩어리로 묶은 덩어리의 개수"**를 적어 넣는 기막힌 수학적 압축 꼼수를 쓴다.
  3. 가변 길이 (20 ~ 60바이트): 옵션(SACK, 윈도우 스케일 등)이 전혀 안 붙은 생얼 기본 헤더면 20바이트니까 오프셋 값은 5(5 * 4=20)가 찍히고, 옵션이 꽉꽉 차서 60바이트까지 뚱뚱해지면 오프셋 값은 최대치인 15(15 * 4=60)가 찍힌다.

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

  • 개념: TCP 세그먼트 헤더의 길이를 32비트 워드(4바이트) 단위로 표시하여, 헤더가 끝나는 지점이자 실제 애플리케이션 데이터가 시작되는 지점(Offset)을 가리키는 4비트 필드.

  • 필요성: 8바이트짜리 UDP 헤더는 크기가 영원히 고정되어 있어서 수신자가 눈 감고 앞에서 8바이트만 가위로 쓱 자르면 그 안에 무조건 찐 데이터가 들어있다. 그런데 TCP는 옵션(Options)이라는 마법의 꼬리표가 상황에 따라 0바이트부터 40바이트까지 고무줄처럼 늘어났다 줄었다 한다. 수신자 입장에선 헤더가 어디서 끝나는지 도무지 감을 잡을 수 없다. "야, 내가 어디까지 가위질을 해야 네가 보낸 진짜 카카오톡 메시지가 나오는지 자를 위치(Offset)를 숫자로 박아놔라!"

  • 💡 비유: 데이터 오프셋은 택배 상자 겉면에 그어진 **"칼집 절취선 안내 화살표"**와 같습니다.

    • 택배기사가 박스 겉면(헤더)에 뽁뽁이나 옵션 스티커를 얼마나 많이 칭칭 감았는지 받는 사람은 알 수 없습니다.
    • 하지만 박스 모서리에 **"테이프 끝에서부터 5cm 지점이 뚜껑입니다 (오프셋=5)"**라고 적혀 있으면, 받는 사람은 그 화살표 지점에 커터칼을 찔러 넣어 한 번에 상자를 열고 내용물(데이터)을 쏙 빼낼 수 있습니다.

📢 섹션 요약 비유: Data Offset 필드는 장문의 편지를 쓸 때 머리말(인사, 안부)이 얼마나 긴지 미리 알려주는 **"본문 시작 페이지 번호"**입니다. 이 번호 덕분에 바쁜 사람은 머리말을 다 건너뛰고 정확히 본문이 시작되는 줄부터 곧바로 읽어 내려갈 수 있습니다.


Ⅱ. Data Offset의 4비트 수학과 옵션의 세계 (Deep Dive)

1. 4비트(Bit) 공간의 한계 극복 꼼수

데이터 오프셋 필드는 TCP 헤더 디자인상 단 4개의 비트만을 할당받았다.

  • 4비트로 표현할 수 있는 숫자는 0000 (0) 부터 1111 (15) 까지다.
  • 만약 이걸 그대로 바이트(Byte) 단위로 썼다면, TCP 헤더는 최대 15바이트까지만 커질 수 있다는 치명적 한계에 부딪힌다. (기본 뼈대만 20바이트인데 담을 수가 없다!).
  • 설계자의 천재적 꼼수: "야, 어차피 헤더 디자인할 때 무조건 가로 32비트(4바이트) 크기로 줄을 맞춰서 블록을 쌓잖아? 그럼 숫자를 적을 때 4바이트짜리 블록(Word)이 몇 개냐로 적자!"
    • 오프셋 필드에 십진수 5 (0101)가 적혀 있다 ──▶ $5 \times 4$바이트 = 헤더 크기 20바이트 (기본 뼈대만 있음)
    • 오프셋 필드에 십진수 15 (1111)가 적혀 있다 ──▶ $15 \times 4$바이트 = 헤더 크기 60바이트 (옵션 꽉 찬 비만 패킷)

2. 옵션(Options) 구역엔 무엇이 들어가는가?

TCP 헤더가 20바이트를 초과해서 늘어나게 만드는 요물들이다. 이 옵션들 덕분에 TCP는 수십 년이 지난 기가비트 인터넷 시대에도 속도를 뽐내며 왕좌를 유지한다.

  1. MSS (Maximum Segment Size): 통신을 시작할 때(SYN), "야 내 컴퓨터는 버퍼가 구려서 한 번에 1460바이트 크기로만 잘라서 보내줘!"라고 요구사항을 적을 때 쓴다.
  2. Window Scale (윈도우 스케일): 구형 TCP는 수신 윈도우 창고 크기가 64KB밖에 안 돼서 기가비트 다운로드가 불가능했다. "야, 내가 부르는 윈도우 사이즈에다가 $2^8$을 뻥튀기(곱하기)해서 엄청난 양의 데이터를 한 번에 쏴버려라!"라는 치트키 옵션.
  3. SACK (Selective ACK): 방금 전 장에서 배운 "중간에 이빨 빠진 패킷 딱 그놈 하나만 콕 집어서 다시 쏴줘!"라는 핀셋 재전송 요구를 적어두는 특수 메모장 구역.
 ┌─────────────────────────────────────────────────────────────┐
 │                TCP 패킷 분해 시 16진수 Data Offset 판독         │
 ├─────────────────────────────────────────────────────────────┤
 │                                                             │
 │   [ 와이어샤크(Wireshark)에서 헥사(16진수) 값으로 찍힌 모습 ]        │
 │                                                             │
 │   Offset 필드 주변의 바이트: `50 02 20 00`                     │
 │   - 맨 앞의 `5`가 바로 Data Offset 값이다! (`0101` = 5)      │
 │   - 5 * 4 = 20바이트.                                       │
 │   - 해독: "아! 이 패킷은 옵션이 하나도 안 붙은 아주 담백하고 날씬한       │
 │           가장 기본 20바이트짜리 순정 헤더를 달고 있구나!"          │
 │                                                             │
 │   ▶ "방화벽 엔지니어는 저 첫 번째 숫자가 5부터 F(15)까지 변할 수       │
 │      있다는 사실을 완벽히 꿰고 있어야 패킷 필터링 룰을 짤 수 있다."     │
 └─────────────────────────────────────────────────────────────┘

📢 섹션 요약 비유: Data Offset 값은 기차가 출발할 때 기관실 앞 유리에 적어놓은 **"이번 기차는 총 몇 량짜리입니다"**라는 알림판입니다. 5량짜리(기본 20바이트) 기본 열차인지, 뒤에 특수 화물칸(옵션)을 15량(60바이트)까지 잔뜩 이어 붙인 대형 열차인지 역장(수신자)이 미리 알고 화물을 깔끔하게 떼어낼 수(데이터 분리) 있게 돕습니다.