지식

[Network] 네트워크 기초 이론 16강 — IP 헤더 형식과 의미: 20바이트의 해부, TTL과 단편화

네트워크 기초 이론 시리즈 정리 — 16강. 참고: 널널한 개발자 TV, IP 헤더 형식과 의미 요약 (재생목록)

14강에서 패킷을 해부하며 IP 헤더는 "옵션이 없으면 20바이트"라고만 하고 지나갔다. 이번에는 그 20바이트를 실제로 열어 본다. 필드 하나하나를 외우는 것이 목적이 아니다 — 어떤 정보가 헤더에 실려 다니는지, 그래서 패킷이 인터넷을 흘러갈 때 무슨 일이 벌어지는지를 잡는 것이 목적이다.

헤더를 읽는 법 — 단위는 비트, 한 줄은 32비트

IPv4 헤더 구조도는 어디서 보든 이렇게 생겼다(위키피디아의 표준 그림과 같은 구성이다).

 0                   8                   16                          31 (비트)
├─────────┬─────────┼───────────────────┼─────────────────────────────┤
│ Version │   IHL   │       ToS         │        Total Length         │
├─────────┴─────────┼───────┬───────────┼─────┬───────────────────────┤
│    Identification                     │Flags│    Fragment Offset    │
├───────────────────┬───────────────────┼─────┴───────────────────────┤
│       TTL         │     Protocol      │       Header Checksum       │
├───────────────────┴───────────────────┴─────────────────────────────┤
│                       Source IP Address                             │
├─────────────────────────────────────────────────────────────────────┤
│                     Destination IP Address                          │
├─────────────────────────────────────────────────────────────────────┤
│                       Options (0 ~ 40바이트)                        │
└─────────────────────────────────────────────────────────────────────┘

읽기 전에 단위부터. 이 그림의 눈금은 비트이고, 가로 한 줄이 32비트 = 4바이트다. 옵션 없이 다섯 줄이면 5 × 4 = 20바이트 — 14강에서 쓴 그 값이 여기서 나온다.

첫 줄 — Version, IHL, 그리고 패킷의 전체 길이

  • Version(4비트) — IP의 버전. IPv4라면 값은 4다.
  • IHL(Internet Header Length, 4비트) — 헤더 자체의 길이. 단위가 바이트가 아니라 4바이트 워드라는 게 함정이다. 값이 5면 5 × 4 = 20바이트 — "옵션 없는 보통의 헤더"다. 옵션은 최대 40바이트까지 붙을 수 있지만 실제로는 거의 쓰이지 않아서, IP 헤더는 대부분 20바이트로 계산하면 된다.
  • ToS(Type of Service, 8비트) — 트래픽의 서비스 품질(QoS), 대역폭 품질 관리에 쓰이는 자리다. 지금은 "그런 용도의 필드가 있다"까지만.
  • Total Length(16비트) — 헤더를 포함한 패킷 전체의 길이. 16비트이므로 이론상 패킷은 2¹⁶ = 65,536바이트, 즉 64KB까지 커질 수 있다.

여기서 잠깐. 이론상 64KB인데 왜 14강에서는 패킷 최대 크기를 1500바이트(MTU)라고 했을까 — 오늘날의 인터넷이 여전히 MTU 1500으로 운용되기 때문이다. 한 번에 큰 상자로 보낼 수 있으면 좋겠지만, 현실의 표준 유통 규격은 1500이다. 이론값과 운용값의 이 간극은 기억해 둘 만하다.

둘째 줄 — 단편화(Fragmentation)

Identification, Flags, Fragment Offset은 셋이 한 몸으로 단편화를 담당한다.

내 쪽 MTU는 1500인데 경로상 어딘가의 MTU가 1400이라면? 1500짜리 패킷을 그대로 보내면 상대가 수신하지 못한다. 그래서 보내는 쪽이 패킷을 1400보다 작은 조각 둘로 쪼개어 보낸다 — 이것이 단편화다. 조각들은 어느 패킷에서 나왔는지(Identification), 몇 번째 조각인지(Fragment Offset)를 이 필드들에 담고, 받는 쪽은 그걸 보고 재조립한다.

안 그래도 작은 패킷이 더 잘게 쪼개지고, 수신 측은 조립 비용까지 문다 — 단편화는 일어나지 않는 것이 가장 좋다. 네트워크 설계에서 MTU를 신경 쓰는 이유가 이 필드들에 새겨져 있는 셈이다.

셋째 줄 — TTL, Protocol, Checksum

TTL(Time To Live, 8비트) — 이 헤더에서 가장 이야깃거리가 많은 필드다. 3강에서 네트워크는 스위치의 집합체라고 했는데, 그 관점으로 보면 인터넷은 라우터라는 스위치들의 거대한 집합체이고, 라우터들이 하는 일은 패킷의 유통이다. 그런데 유통 과정에서 패킷이 목적지를 못 찾고 헤매는 일이 생길 수 있다. 그래서 안전장치를 둔다 — 라우터를 하나 지날 때마다 TTL이 1씩 줄고, 0이 되는 순간 그 라우터가 패킷을 버린다. 8비트이므로 최댓값은 255. 미아가 된 패킷이 인터넷을 영원히 떠돌지 못하게 하는 수명 카운터다.

Protocol(8비트) — 페이로드를 어떻게 해석할지를 알려 준다. 이 값이 6이면 헤더 뒤에 TCP 헤더가 이어진다는 뜻이고, 17이면 UDP다. 받는 쪽은 이 값을 보고 다음 계층의 파서를 고른다.

Header Checksum(16비트) — 전송 중 헤더에 오류가 생겼는지 확인하기 위한 검사값이다. 계산 규칙이 따로 있지만 여기서는 용도만 잡아 둔다.

넷째·다섯째 줄 — 출발지와 목적지

마지막으로 Source IP / Destination IP, 각 32비트. 192.168.0.108.8.8.8로 보낸다면 그 두 주소가 여기 실린다. 14강의 택배 비유로 돌아가면 — 송장에서 가장 중요한 "보낸 이 / 받는 이" 칸이 바로 이 두 줄이다.

16진수로 읽어 보기

이 구조가 손에 붙었는지는 패킷 덤프를 16진수로 읽을 수 있는가로 확인된다. Wireshark 같은 도구로 패킷을 잡으면 원문이 16진수로 나오는데, 첫 바이트가 45라면 —

0x45  →  0100 0101  →  Version 4, IHL 5 (= 헤더 20바이트)

한 바이트 안에 Version과 IHL이 4비트씩 나눠 들어 있는 것이다. 조금 더 가서 Protocol 자리가 06이면 뒤는 TCP고, TCP 헤더에서 목적지 포트가 00 50이면 10진수로 80 — HTTP다. 이런 식으로 16진수 덤프에서 "IPv4에 헤더 20바이트, TCP고, 80번 포트로 가는 패킷"까지 읽어내는 감각이 네트워크 실무의 기본기가 된다.

그래서 네트워크를 제대로 하려면 두 가지와 친해져야 한다.

  1. 16진수 — 패킷의 원문은 16진수로 나타난다. 두려워하면 곤란하다.
  2. Wireshark — 패킷을 잡아 이 헤더를 눈으로 확인하는 필수 도구다. 잘 쓰려면 캡처 필터와 디스플레이 필터, 그리고 그 필터를 다루는 정규표현식까지 이어진다. Wireshark 자체의 구조와 작동 원리는 다음 강에서 다룬다.

정리

  • IPv4 헤더 구조도는 비트 단위, 한 줄 32비트(4바이트) 로 읽는다. 옵션 없는 표준 헤더는 다섯 줄 = 20바이트(IHL 5 × 4바이트), 옵션은 최대 40바이트까지지만 거의 쓰이지 않는다.
  • Total Length가 16비트라 패킷은 이론상 64KB까지 가능하지만, 현실 인터넷의 운용값은 여전히 MTU 1500이다.
  • 단편화 — 경로상 MTU가 더 작으면 패킷을 쪼개 보내고 수신 측이 재조립한다. Identification·Flags·Fragment Offset이 담당하며, 일어나지 않는 것이 최선이다.
  • TTL — 라우터를 하나 지날 때마다 1 감소, 0이 되면 폐기. 미아 패킷이 인터넷(라우터의 거대한 집합체)을 영원히 떠돌지 못하게 하는 수명 카운터다.
  • Protocol은 페이로드의 해석 방법(6=TCP, 17=UDP), Checksum은 헤더 오류 검출, 마지막 두 줄이 출발지·목적지 IP 주소다.
  • 첫 바이트 0x45 = Version 4 + IHL 5 — 16진수 덤프에서 헤더를 읽어내는 감각이 기본기다. 그 감각을 길러 주는 도구가 Wireshark이고, 다음 강의 주제다.
조회 1댓글 0

댓글

아직 댓글이 없습니다. 첫 댓글을 남겨보세요.