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

  1. 본질: TCP 세그먼트(Segment) 헤더는 상대방에게 데이터를 순서대로, 1바이트도 유실 없이 완벽하게 전달하기 위해 순서 번호(Seq), 수신 확인(ACK), 윈도우 사이즈 등 통신 제어에 필요한 온갖 도장과 꼬리표를 꽉꽉 채워 넣은 최소 20바이트짜리 초정밀 배송 송장이다.
  2. 가변적 길이 (20~60 Bytes): 평소에는 딱 20바이트의 기본 헤더만으로 돌아가지만, 속도를 끌어올리기 위한 Window Scale이나 SACK 같은 '옵션(Options)' 덩어리들을 꼬리에 이어 붙일 수 있어서 최대 60바이트까지 뚱뚱해질 수 있는 가변 길이 구조를 띤다.
  3. 세그먼트(Segment)의 의미: 애플리케이션 계층(L7)에서 내려온 1GB짜리 거대한 통짜 파일을 네트워크 선로(MTU) 크기에 맞춰 적당한 크기(MSS, 예: 1460바이트)로 토막(Segment) 내어 TCP 헤더를 씌운 조각 덩어리를 4계층에서는 '세그먼트'라고 부른다.

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

  • 개념: 전송 계층에서 신뢰성 있는 바이트 스트림 통신을 위해 데이터 청크(Chunk) 앞에 부착하는 제어 정보 블록. 기본 크기는 20바이트이고 옵션에 따라 최대 60바이트까지 증가한다.

  • 필요성: 8바이트짜리 UDP 헤더는 포트 번호 말고는 들어있는 게 없었다. 그걸로는 데이터가 중간에 날아갔는지, 1번보다 2번이 먼저 도착했는지(순서 섞임), 상대방 컴퓨터 메모리가 꽉 찼는지 도저히 알 길이 없었다. "이 모든 악조건을 통제하려면, 택배 겉면에 '이건 1번 박스다', '난 2번 박스까지 잘 받았다', '내 창고 여유 공간은 10개 남았다'라는 세세한 상태 정보를 적어 보낼 촘촘한 기입란(헤더)이 필수적이다!"

  • 💡 비유: TCP 세그먼트 헤더는 대기업 간의 **"물품 인수 인계증(송장)"**과 같습니다.

    • 박스가 몇 번째 박스인지 일련번호가 적혀 있습니다 (Sequence Number).
    • 지난번에 몇 번 박스까지 무사히 받았는지 확인 서명을 해줍니다 (ACK Number).
    • 우리 창고에 빈자리가 몇 평 남았으니 다음번엔 몇 박스까지만 보내라고 적어줍니다 (Window Size).
    • 이 깐깐한 송장 덕분에 수만 개의 박스가 태평양을 건너도 단 하나의 분실이나 뒤섞임 없이 완벽하게 조립됩니다.

📢 섹션 요약 비유: TCP 헤더는 짐(데이터)을 묶어두는 단순한 끈이 아니라, 짐의 순서, 온도, 파손 여부, 배송 기사의 스케줄까지 몽땅 통제하고 관리하는 **"디지털 스마트 블랙박스 센서"**입니다.


Ⅱ. TCP 20바이트 기본 헤더의 구조 해부 (Deep Dive)

이 구조를 머릿속에 그릴 수 있어야 와이어샤크(Wireshark) 패킷 분석이 가능하다.

1. [ 0 ~ 4 Byte ]: 포트 번호 (가장 기본)

  • Source Port (16비트): 보내는 놈의 방 번호 (내 크롬 브라우저 탭 번호 50123).
  • Destination Port (16비트): 받는 놈의 방 번호 (네이버 웹서버 80 또는 443).

2. [ 4 ~ 12 Byte ]: 시퀀스 번호와 ACK 번호 (신뢰성의 코어)

TCP의 1바이트 낱알 세기 철학이 담긴 공간이다.

  • Sequence Number (32비트): 내가 지금 쏘는 데이터 덩어리의 첫 번째 바이트 고유 번호다. (예: 1000). 패킷 덩어리 개수가 아니라 '바이트' 단위로 숫자가 올라간다.
  • Acknowledgment Number (32비트): "나 방금 네가 보낸 거 1000번까지 완벽하게 잘 받았어! 이제 다음으로 1001번 바이트부터 보내주면 돼!"라고 요구하는 누적 확인 응답 번호다.

3. [ 12 ~ 16 Byte ]: 오프셋, 플래그, 윈도우 사이즈

  • Data Offset (4비트): TCP 헤더 길이가 20바이트인지 옵션이 붙어 60바이트인지 알려준다. (그래야 수신자가 어디서부터가 진짜 데이터 시작인지 칼로 자를 수 있다).
  • Reserved (3비트): 나중에 쓸려고 남겨둔 빈칸 (000).
  • Control Flags (9비트): 통신의 성격을 결정하는 스위치들. (가장 중요한 건 URG, ACK, PSH, RST, SYN, FIN 6개다).
  • Window Size (16비트): 흐름 제어의 핵심. "내 램 버퍼에 빈 공간이 64,000바이트 남았으니까 한 번에 그만큼만 쏴!"라고 상대방에게 브레이크를 거는 수치다.

4. [ 16 ~ 20 Byte ]: 체크섬과 긴급 포인트

  • Checksum (16비트): 가다가 비트가 0에서 1로 깨졌는지 수학적으로 검사하는 도장.
  • Urgent Pointer (16비트): Control Flag에 URG 불이 켜져 있을 때만 쓴다. "이 패킷 안에 폭탄 해체 암호(긴급 데이터)가 들어있는데, 그 암호가 정확히 어디쯤(포인터) 박혀있는지 알려줄게!"라는 핀셋 지시자다.
 ┌─────────────────────────────────────────────────────────────┐
 │                TCP 세그먼트 헤더 구조 (그림 암기)                 │
 ├─────────────────────────────────────────────────────────────┤
 │                                                             │
 │   0                   15 16                 31 (Bits)       │
 │   +-----------------------+-----------------------+         │
 │   | Source Port (16)      | Destination Port (16) |         │
 │   +-----------------------+-----------------------+         │
 │   | Sequence Number (32)                          |         │
 │   +-----------------------------------------------+         │
 │   | Acknowledgment Number (32)                    |         │
 │   +-------+---+-----------+-----------------------+         │
 │   | Offset|Res| Flags(9)  | Window Size (16)      |         │
 │   +-------+---+-----------+-----------------------+         │
 │   | Checksum (16)         | Urgent Pointer (16)   |         │
 │   +-----------------------+-----------------------+         │
 │   | Options (가변 0 ~ 40 Bytes)                     |         │
 │   +-----------------------------------------------+         │
 │                                                             │
 │   ▶ "이 20바이트 뼈대를 완벽히 이해해야 보안 방화벽 룰을 짤 수 있다!"    │
 └─────────────────────────────────────────────────────────────┘

📢 섹션 요약 비유: TCP 헤더는 종합병원의 **"환자 차트(Chart)"**입니다. 차트 안에는 환자의 인적 사항(포트 번호), 오늘 맞아야 할 주사의 순서(Seq), 지난번 진료 기록 확인(ACK), 현재 환자의 남은 체력(Window Size)이 빼곡히 적혀 있어, 의사(운영체제)가 단 한 치의 오차도 없이 처방을 내릴 수 있게 돕습니다.