본문 바로가기

IPv4 주소 체계

IPv4의 32비트 네트워크부와 호스트부를 읽고 공인·사설·특수 주소 및 주요 IP 헤더 필드를 구분합니다.

데이터 링크 계층에서 MAC 주소로 같은 네트워크 내의 장치를 식별한다는 것을 배웠습니다.

하지만 서울에 있는 컴퓨터가 미국 서버에 데이터를 보내려면 MAC 주소만으로는 부족합니다.

전 세계 네트워크를 횡단하며 목적지를 찾아가려면, 논리적 주소 체계가 필요합니다.

그것이 바로 IP(Internet Protocol) 주소입니다.

IPv4의 핵심 역할은 출발지와 목적지 호스트를 32비트 주소로 식별하고, 라우터가 목적지 네트워크를 향해 데이터그램을 넘겨가게 하는 것입니다.

신뢰성, 순서 보장, 재전송은 IPv4 자체가 아니라 TCP 같은 상위 계층이 맡습니다.


IP 주소의 구조

IPv4 주소는 32비트로 구성됩니다.

8비트씩 4개로 나누어 점으로 구분하는 점 십진 표기법(Dotted Decimal Notation)을 사용합니다.

예를 들어 192.168.1.100은 이진수로 11000000.10101000.00000001.01100100입니다.

IP 주소는 두 부분으로 나뉩니다.

네트워크부(Network Part)는 해당 장치가 속한 네트워크를 식별합니다.

이 경계는 주소만으로 정해지지 않고 서브넷 마스크나 프리픽스 길이가 필요합니다. 라우터는 목적지와 일치하는 경로 중 가장 긴 프리픽스를 선택합니다.

IPv4 PREFIX · SAME ADDRESS / DIFFERENT BOUNDARY

주소가 같아도 프리픽스가 다르면 네트워크 경계가 달라진다

192.168.1.100의 마지막 옥텟은 01100100입니다. /24는 마지막 8비트를 호스트부로 두고, /26은 그중 앞 2비트를 네트워크부로 가져갑니다.

주소의 같은 비트에 놓인 /24와 /26 경계같은 32비트주소에서 프리픽스가24일때마지막8비트는호스트부다. 프리픽스가26이면그중앞2비트01은네트워크부이고나머지6비트100100은호스트부다. 주소비트는바뀌지않고경계만달라진다./24 · 같은 192.168.1.100앞 24비트: 192.168.101100100마지막 8비트: 호스트부네트워크: .0 / 범위 .0~.255/26 · 같은 192.168.1.100앞 24비트: 192.168.10110010001: 네트워크 · 100100: 호스트네트워크: .64 / 범위 .64~.127
주소의 같은 비트에 놓인 /24와 /26 경계같은 32비트주소에서 프리픽스가24일때마지막8비트는호스트부다. 프리픽스가26이면그중앞2비트01은네트워크부이고나머지6비트100100은호스트부다. 주소비트는바뀌지않고경계만달라진다./24 · 같은 192.168.1.100앞 24비트: 192.168.101100100마지막 8비트: 호스트부네트워크: .0범위: .0~.255/26 · 같은 192.168.1.100앞 24비트: 192.168.10110010001: 네트워크부100100: 호스트부네트워크: .64범위: .64~.127

/24 마스크는 255.255.255.0, /26은 255.255.255.192입니다. /26에서 01 뒤를 0으로 채운 01000000은 64이며, 호스트부 100100은 그 안의 오프셋 36입니다. 클래스나 첫 옥텟만으로 마스크를 추론하지 않습니다.

호스트부(Host Part)는 해당 네트워크 내에서 특정 장치를 식별합니다.

그림의 AND를 직접 풀기: /26의 마지막 마스크 옥텟은 11000000입니다. 주소의 마지막 옥텟 01100100과 AND하면 01000000 = 64가 남습니다. 따라서 192.168.1.100/26의 네트워크는 192.168.1.64/26이며, 호스트부 6비트의 값은 100100 = 36입니다. 네트워크 시작 64에 오프셋 36을 더하면 원래 주소 100으로 돌아옵니다. 끝 주소는 64 + 63 = 127이고 일반 호스트 범위는 .65~.126입니다.

독립 계산: 같은 주소의 마지막 옥텟만 200으로 바꾸어 192.168.1.200/26을 만들었습니다. 200 = 11001000을 사용해 네트워크 주소·호스트부 오프셋·전체 주소 범위를 구하세요. .100과 같은 /26에 속하는지도 판단하세요.

마스크와 범위 대조

11001000 AND 11000000 = 11000000, 즉 192입니다. 남는 호스트부 001000은 8이므로 192 + 8 = 200입니다. 네트워크는 192.168.1.192/26, 전체 범위는 .192~.255이며 일반 호스트 범위는 .193~.254입니다. .100은 .64~.127 블록이므로 둘은 다른 /26에 속합니다. 두 주소를 /24로 판단할 때는 같은 네트워크가 되므로 주소만 비교해서 같은 서브넷이라고 확정하지 않습니다.


클래스 기반 주소 체계

초기 인터넷에서는 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개 네트워크 · /8 (255.0.0.0), 일반 호스트 16,777,214개
B첫 비트 10, 첫 옥텟 128~191 · 16,384개 네트워크 · /16 (255.255.0.0), 일반 호스트 65,534개
C첫 비트 110, 첫 옥텟 192~223 · 2,097,152개 네트워크 · /24 (255.255.255.0), 일반 호스트 254개

이 클래스 체계는 오늘날에는 거의 사용되지 않습니다.

클래스 A 하나에 1,600만 개의 주소가 할당되는데, 대부분의 기관이 그만큼 사용하지 않아 엄청난 주소 낭비가 발생했기 때문입니다.

현재 라우팅과 주소 할당에서는 주소의 첫 비트만 보고 마스크를 추론하지 않습니다.

192.168.1.0/24처럼 프리픽스 길이를 주소와 함께 명시하는 CIDR 방식이 기준입니다.


사설 IP와 공인 IP

주소 종류할당과 도달 범위
공인 IPv4전역 할당 체계에서 관리하며 인터넷 경로에 사용할 수 있음. 실제 도달 여부는 경로·방화벽·서비스 설정에 의존
RFC 1918 사설 IPv4각 조직 내부에서 중복 없이 운영하며 조직 간 재사용 가능. 공용 인터넷으로 직접 전달하지 않지만 사설망 안에서는 라우팅 가능

사설망에서 외부 서비스에 접속할 때는 흔히 NAT를 사용하며, 프록시나 터널 같은 구성도 가능합니다. 공인 주소의 비용은 ISP·클라우드의 할당 정책에 따라 달라집니다.

RFC 1918 사설 IP 대역

RFC 1918 블록주소 범위와 총수
10.0.0.0/810.0.0.0 ~ 10.255.255.255 · 16,777,216개 주소 · 기업·클라우드에서 사용
172.16.0.0/12172.16.0.0 ~ 172.31.255.255 · 1,048,576개 주소 · 기업에서 사용
192.168.0.0/16192.168.0.0 ~ 192.168.255.255 · 65,536개 주소 · 가정·사무실에서 사용

표의 수는 블록에 포함된 전체 주소 수입니다. 실제 호스트 수는 나눈 서브넷과 예약 규칙에 따라 달라집니다.

다음 코드는 IPv4 입력용 예제입니다. 출력의 사설 IP는 ipaddress.is_private 속성 이름을 단순화한 것이며 RFC 1918 포함 여부와 같지 않습니다. 이 속성은 전역 도달 가능성 분류를 따르므로 링크 로컬·루프백 등도 포함할 수 있습니다. 100.64.0.0/10은 is_private와 is_global이 모두 False이며 Python 버전별 분류 수정도 확인해야 합니다.

ip_classifier.py
"""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 == 0:
        info["클래스"] = "특수 (0/8)"
    elif first_octet <= 126:
        info["클래스"] = "A"
    elif first_octet == 127:
        info["클래스"] = "특수 (루프백)"
    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모든 IPv4에 일치하는 기본 경로 · 더 구체적인 경로가 없을 때 사용
0.0.0.0미지정 주소 · 서버 바인딩에서는 모든 로컬 IPv4 인터페이스 수신 의미
127.0.0.0/8루프백 · 자기 자신
169.254.0.0/16링크 로컬 · DHCP 임대를 얻지 못했을 때 자동 구성될 수 있음
255.255.255.255제한 브로드캐스트 · 같은 링크 범위
서브넷 브로드캐스트192.168.1.0/24에서는 192.168.1.255
서브넷 네트워크 주소192.168.1.0/24에서는 192.168.1.0
ip_check.sh
# 자신의 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 조회가 실패하면 → DNS·연결·조회 서비스부터 확인

IP 헤더 주요 필드

필드크기와 역할
Version4비트 · IPv4는 4
IHL4비트 · 32비트 워드 단위 헤더 길이, 5이면 20바이트
TTL8비트 · 라우터가 최소 1 감소, 만료 시 폐기
Protocol8비트 · 6 TCP, 17 UDP, 1 ICMP
출발지·목적지 IP각 32비트 · 패킷의 출발지와 목적지

TTL(Time To Live)은 패킷이 네트워크에서 무한 순환하는 것을 방지합니다.

라우터는 전달할 때 TTL을 최소 1 감소시키며 만료된 패킷을 폐기합니다. 통상 홉 수 제한처럼 동작합니다.

Linux의 64, Windows의 128은 흔한 초기값이며 설정에 따라 달라집니다.

traceroute는 이 TTL을 1부터 순차적으로 늘려가며 경로의 각 라우터를 확인하는 도구입니다.

다음 절에서는 네트워크부와 호스트부의 경계를 유연하게 조절하는 서브넷과 CIDR를 살펴보겠습니다.