📚 네트워크 · 패킷 분석 › 01. TCP/IP 구조 이해 — 08편
이전 글: 07. IP Address란 무엇인가 · 다음 글: 09. IPv6 기초 — 관제에서 놓치기 쉬운 두 번째 주소 체계
IPv4 주소는 32비트(4바이트) 길이의 숫자입니다. 사람이 읽기 쉽도록 8비트씩 네 덩어리로 나누고, 각 덩어리를 10진수로 바꿔 점(.)으로 이어 씁니다. 이 표기를 점 10진 표기(Dotted Decimal Notation), 각 덩어리를 옥텟(Octet) 이라고 부릅니다.
192.168.10.25를 2진수로 분해하면 다음과 같습니다.
10진 표기 192 . 168 . 10 . 25
↓ ↓ ↓ ↓
2진수 11000000 10101000 00001010 00011001
↓ (네 옥텟을 이어 붙임)
32비트 11000000101010000000101000011001
↓ (하나의 정수로 보면)
10진 정수 3232238105 = 192×2^24 + 168×2^16 + 10×2^8 + 25
각 비트 위치의 값은 왼쪽부터 128, 64, 32, 16, 8, 4, 2, 1입니다. 예를 들어 168 = 128 + 32 + 8 이므로 10101000입니다.
32비트 중 앞쪽 몇 비트가 네트워크 부분, 나머지가 호스트 부분입니다. 그 경계는 주소 자체가 아니라 함께 설정된 서브넷 마스크(프리픽스 길이) 가 정합니다. 경계를 계산하는 방법은 12. Subnet Mask란 무엇인가와 13. Network Address와 Host Address에서 다룹니다.
패킷 안에서 IPv4 주소는 IP 헤더의 출발지 주소(12~15바이트 위치)와 목적지 주소(16~19바이트 위치) 필드에 각각 4바이트로 들어갑니다. 헤더 필드 전체는 115. IP 헤더 분석 — TTL·Flags·Fragment·Checksum 필드 읽는 법(03 영역)에서 다룹니다.
① 과거에는 클래스(Class)로 네트워크 크기를 정했습니다. 첫 옥텟의 앞 비트로 클래스를 구분했으며, 1993년 CIDR 도입 이후 클래스 방식(Classful)은 주소 할당에 쓰이지 않습니다. 다만 용어와 멀티캐스트 대역 구분에는 여전히 흔적이 남아 있습니다.
| 클래스 | 첫 비트 | 첫 옥텟 범위 | 기본 네트워크 부분 | 용도 |
|---|---|---|---|---|
| A | 0 | 0~127 | 8비트 | 대규모 네트워크 |
| B | 10 | 128~191 | 16비트 | 중규모 네트워크 |
| C | 110 | 192~223 | 24비트 | 소규모 네트워크 |
| D | 1110 | 224~239 | — | 멀티캐스트 |
| E | 1111 | 240~255 | — | 예약(실험용) |
② 특수 용도 주소가 있습니다. (사설 대역은 10편, 전체 특수 대역 표는 14. IPv4 주소와 서브넷(CIDR) — 같은 네트워크인지 판단하는 법에서 다룸)
| 주소·대역 | 의미 |
|---|---|
0.0.0.0 | "지정되지 않음" — DHCP 요청 전 출발지, 서버의 "모든 인터페이스에서 대기" |
127.0.0.0/8 | 루프백 — 자기 자신 (127.0.0.1) |
169.254.0.0/16 | 링크 로컬 — DHCP 실패 시 자동 설정(APIPA) |
224.0.0.0/4 | 멀티캐스트 |
255.255.255.255 | 제한 브로드캐스트 — 같은 링크 전체 |
③ 표기 방식이 하나가 아닙니다. 많은 소프트웨어가 IPv4 주소를 32비트 정수로 처리하기 때문에, 점 10진 표기 외에도 같은 주소를 가리키는 형태가 존재합니다.
실습 예시 — Python 표준 라이브러리 ipaddress로 주소 구조 확인 (Rocky·Ubuntu 모두 python3 기본 제공)
python3 - <<'EOF'
import ipaddress
a = ipaddress.ip_address("192.168.10.25")
print(int(a)) # 32비트 정수
print(format(int(a), "032b")) # 2진수 32자리
print(a.is_private, a.is_loopback, a.is_multicast)
EOF
# 출력 예시(값은 환경마다 다름)
3232238105
11000000101010000000101000011001
True False False
같은 주소를 가리킬 수 있는 변형 표기 예시(이론적으로 확인할 수 있는 방법):
| 표기 | 값 | 비고 |
|---|---|---|
| 점 10진 | 192.168.10.25 | 표준 표기 |
| 10진 정수 | 3232238105 | 일부 브라우저·라이브러리가 해석 |
| 16진 정수 | 0xC0A80A19 | 일부 파서가 해석 |
| 옥텟별 16진 | 0xC0.0xA8.0x0A.0x19 | 일부 파서가 해석 |
어떤 표기를 받아들이는지는 소프트웨어마다 다릅니다. 특히 010처럼 앞에 0이 붙은 옥텟을 8진수(=8)로 해석하는 파서도 있어, 같은 문자열이 도구마다 다른 주소로 해석될 수 있습니다.
127.0.0.0/8, 0.0.0.0/8, 사설 대역인 패킷은 정상적으로 들어올 수 없으므로 위조 트래픽의 신호가 됩니다(Bogon 필터링).169.254.x.x가 보이면 DHCP 실패를, 0.0.0.0 출발지는 DHCP 요청 과정을 먼저 떠올립니다.관제자가 확인할 질문은 다음과 같습니다.
⚠️ 오탐 주의: SIEM 필드가 IP 타입이 아닌 문자열로 저장되어 있으면 192.168.10.25와 192.168.010.025가 다른 값으로 취급되어 매칭이 누락될 수 있습니다. 반대로 정수 표기 요청이 모두 악성인 것도 아니므로 목적지와 맥락을 함께 봐야 합니다.
0.0.0.0, 127.0.0.0/8, 169.254.0.0/16, 255.255.255.255 등 특수 주소의 의미를 알아야 합니다.