IPv4 주소 체계
데이터 링크 계층에서 MAC 주소로 같은 네트워크 내의 장치를 식별한다는 것을 배웠습니다. 하지만 서울에 있는 컴퓨터가 미국 서버에 데이터를 보내려면 MAC 주소만으로는 부족합니다. 전 세계 네트워크를 횡단하며 목적지를 찾아가려면, 논리적 주소 체계가 필요합니다.
그것이 바로 IP(Internet Protocol) 주소입니다.
IP 주소의 구조
IPv4 주소는 32비트로 구성됩니다. 8비트씩 4개로 나누어 점으로 구분하는 점 십진 표기법(Dotted Decimal Notation)을 사용합니다.
IPv4 주소 구조
192 . 168 . 1 . 100
┌────────┬────────┬────────┬────────┐
│11000000│10101000│00000001│01100100│
└────────┴────────┴────────┴────────┘
8비트 8비트 8비트 8비트
(옥텟1) (옥텟2) (옥텟3) (옥텟4)
각 옥텟: 0 ~ 255 (2^8 = 256가지)
총 주소 수: 2^32 = 4,294,967,296 (약 43억)IP 주소는 두 부분으로 나뉩니다.
192.168.1.100 / 서브넷 마스크 255.255.255.0
┌──────────────────────┬─────────┐
│ 네트워크부 (24비트) │ 호스트부│
│ 192.168.1 │ .100 │
│ "어느 네트워크?" │ "누구?" │
└──────────────────────┴─────────┘네트워크부(Network Part)는 해당 장치가 속한 네트워크를 식별합니다. 라우터는 이 부분만 보고 어떤 네트워크로 보낼지 결정합니다. 호스트부(Host Part)는 해당 네트워크 내에서 특정 장치를 식별합니다.
클래스 기반 주소 체계
초기 인터넷에서는 IP 주소를 다섯 개의 클래스(Class)로 나누어 관리했습니다.
클래스별 IP 구조
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Class A: 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
│네트워크│ 호스트 (24비트) │
1.0.0.0 ~ 126.255.255.255
Class B: 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
│ 네트워크 (16비트) │ 호스트 (16비트)│
128.0.0.0 ~ 191.255.255.255
Class C: 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
│ 네트워크 (24비트) │호스트(8)│
192.0.0.0 ~ 223.255.255.255
Class D: 1110xxxx — 멀티캐스트 (224~239)
Class E: 1111xxxx — 실험용 (240~255)| 클래스 | 첫 비트 | 범위 | 네트워크 수 | 호스트/네트워크 | 서브넷 마스크 |
|---|---|---|---|---|---|
| A | 0 | 1~126 | 126 | 16,777,214 | 255.0.0.0 (/8) |
| B | 10 | 128~191 | 16,384 | 65,534 | 255.255.0.0 (/16) |
| C | 110 | 192~223 | 2,097,152 | 254 | 255.255.255.0 (/24) |
이 클래스 체계는 오늘날에는 거의 사용되지 않습니다. 클래스 A 하나에 1,600만 개의 주소가 할당되는데, 대부분의 기관이 그만큼 사용하지 않아 엄청난 주소 낭비가 발생했기 때문입니다.
사설 IP와 공인 IP
| 구분 | 공인 IP (Public) | 사설 IP (Private) |
|---|---|---|
| 범위 | IANA가 관리 | RFC 1918 정의 |
| 인터넷 라우팅 | 가능 | 불가능 |
| 고유성 | 전 세계 유일 | 내부 네트워크 내 유일 |
| 비용 | ISP 임대 필요 | 무료 |
| 직접 접속 | 가능 | NAT 필요 |
RFC 1918 사설 IP 대역
| 대역 | 범위 | CIDR | 호스트 수 | 용도 |
|---|---|---|---|---|
| 10.x.x.x | 10.0.0.0 ~ 10.255.255.255 | /8 | ~1,677만 | 대규모 기업, 클라우드 VPC |
| 172.16~31.x.x | 172.16.0.0 ~ 172.31.255.255 | /12 | ~100만 | 중규모 기업 |
| 192.168.x.x | 192.168.0.0 ~ 192.168.255.255 | /16 | ~65,534 | 가정, 소규모 사무실 |
"""IP 주소의 종류를 분류"""
import ipaddress
def classify_ip(ip_str):
"""IP 주소를 분류하여 정보 출력"""
ip = ipaddress.ip_address(ip_str)
info = {
"주소": str(ip),
"이진수": format(int(ip), "032b"),
"사설 IP": ip.is_private,
"루프백": ip.is_loopback,
"멀티캐스트": ip.is_multicast,
"링크 로컬": ip.is_link_local,
}
# 클래스 판별 (역사적 분류)
first_octet = int(ip_str.split(".")[0])
if first_octet <= 126:
info["클래스"] = "A"
elif first_octet <= 191:
info["클래스"] = "B"
elif first_octet <= 223:
info["클래스"] = "C"
elif first_octet <= 239:
info["클래스"] = "D (멀티캐스트)"
else:
info["클래스"] = "E (실험용)"
for k, v in info.items():
print(f" {k}: {v}")
print()
test_ips = [
"192.168.1.100",
"10.0.0.1",
"8.8.8.8",
"172.16.0.1",
"127.0.0.1",
"224.0.0.1",
"169.254.1.1",
]
for ip in test_ips:
classify_ip(ip)특수 주소
| 주소 | 의미 | 사용 상황 |
|---|---|---|
| 0.0.0.0/0 | 기본 경로 (Default Route) | 라우팅 테이블의 마지막 수단 |
| 0.0.0.0 | 모든 인터페이스 | 서버 바인딩 시 전체 수신 |
| 127.0.0.0/8 | 루프백 | localhost (자기 자신) |
| 169.254.0.0/16 | 링크 로컬 (APIPA) | DHCP 실패 시 자동 할당 |
| 255.255.255.255 | 제한 브로드캐스트 | 같은 네트워크 전체 |
| 네트워크.255 | 지정 브로드캐스트 | 특정 서브넷 전체 |
| 네트워크.0 | 네트워크 주소 | 서브넷 자체를 지칭 |
# 자신의 IP 주소 확인
ip addr show # Linux
ipconfig # Windows
# 공인 IP 확인
curl -s ifconfig.me
# 기본 게이트웨이 확인
ip route | grep default # Linux
route print # Windows
# IP 주소 관련 문제 진단
# APIPA(169.254.x.x)가 할당되었다면 → DHCP 서버 문제
# 공인 IP가 안 나온다면 → NAT/프록시 환경IP 헤더 주요 필드
IPv4 헤더 구조 (20바이트 기본)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├───────┬───────┬───────────────┬───────────────────────────────┤
│Version│ IHL │ ToS/DSCP │ Total Length │
├───────┴───────┴───────────────┼──────┬────────────────────────┤
│ Identification │Flags │ Fragment Offset │
├───────────────┬───────────────┼──────┴────────────────────────┤
│ TTL │ Protocol │ Header Checksum │
├───────────────┴───────────────┴───────────────────────────────┤
│ Source IP Address │
├───────────────────────────────────────────────────────────────┤
│ Destination IP Address │
└───────────────────────────────────────────────────────────────┘| 필드 | 크기 | 핵심 역할 |
|---|---|---|
| Version | 4비트 | IP 버전 (4) |
| IHL | 4비트 | 헤더 길이 (5 = 20바이트) |
| TTL | 8비트 | 최대 홉 수, 라우터 통과마다 1 감소 |
| Protocol | 8비트 | 6=TCP, 17=UDP, 1=ICMP |
| Source IP | 32비트 | 출발지 IP |
| Destination IP | 32비트 | 목적지 IP |
TTL(Time To Live)은 패킷이 네트워크에서 무한 순환하는 것을 방지합니다. 라우터를 하나 통과할 때마다 1씩 감소하고, 0이 되면 폐기합니다. Linux 기본값은 64, Windows는 128입니다. traceroute는 이 TTL을 1부터 순차적으로 늘려가며 경로의 각 라우터를 확인하는 도구입니다.
다음 절에서는 네트워크부와 호스트부의 경계를 유연하게 조절하는 서브넷과 CIDR를 살펴보겠습니다.