본문으로 건너뛰기

안동민 개발노트

본문 시작

IPv4 주소 체계

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

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

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

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

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

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

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


IP 주소의 구조

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

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

IPv4 주소는 32비트 숫자

8비트씩 네 옥텟으로 나누어 사람이 읽기 쉬운 점 십진 표기로 쓴다.

  1. 192

    8비트 첫 번째 옥텟

  2. 168

    8비트 두 번째 옥텟

  3. 1

    8비트 세 번째 옥텟

  4. 100

    8비트 네 번째 옥텟

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

네트워크부와 호스트부

IP 주소는 네트워크를 찾는 부분과 그 안의 장치를 찾는 부분으로 나뉜다.

구분판단 내용
네트워크부라우터가 어느 네트워크로 보낼지 판단하는 기준이다.
호스트부같은 네트워크 안에서 특정 장치를 구분한다.
프리픽스/24처럼 경계 위치를 명시한다.

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

라우터는 이 부분만 보고 어떤 네트워크로 보낼지 결정합니다.

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


클래스 기반 주소 체계

클래스 기반 주소는 역사적 기준

A/B/C 클래스는 주소 낭비가 커서 현재 설계 기준은 CIDR이다.

대상의미
Class A/8대형 네트워크, 호스트 24비트
Class B/16중형 네트워크, 호스트 16비트
Class C/24소형 네트워크, 호스트 8비트
CIDR가변필요한 크기에 맞춰 프리픽스 지정

초기 인터넷에서는 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)
클래스첫 비트범위네트워크 수호스트/네트워크서브넷 마스크
A01~12612616,777,214255.0.0.0 (/8)
B10128~19116,38465,534255.255.0.0 (/16)
C110192~2232,097,152254255.255.255.0 (/24)

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

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

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

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


사설 IP와 공인 IP

구분공인 IP (Public)사설 IP (Private)
범위IANA가 관리RFC 1918 정의
인터넷 라우팅가능불가능
고유성전 세계 유일내부 네트워크 내 유일
비용ISP 임대 필요무료
직접 접속가능NAT 필요

RFC 1918 사설 IP 대역

대역범위CIDR호스트 수용도
10.x.x.x10.0.0.0 ~ 10.255.255.255/8~1,677만대규모 기업, 클라우드 VPC
172.16~31.x.x172.16.0.0 ~ 172.31.255.255/12~100만중규모 기업
192.168.x.x192.168.0.0 ~ 192.168.255.255/16~65,534가정, 소규모 사무실
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기본 경로 (Default Route)라우팅 테이블의 마지막 수단
0.0.0.0미지정 주소서버 바인딩 시 모든 인터페이스 수신
127.0.0.0/8루프백localhost (자기 자신)
169.254.0.0/16링크 로컬 (APIPA)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가 안 나온다면 → NAT/프록시 환경

IP 헤더 주요 필드

IPv4 헤더에서 먼저 볼 필드

주소와 TTL, 상위 프로토콜 값이 라우팅과 진단의 핵심이다.

대상의미
Version/IHLIP 버전과 헤더 길이traceroute는 TTL을 일부러 조절해 경로의 각 라우터를 확인한다.
TTL라우터를 지날 때마다 감소traceroute는 TTL을 일부러 조절해 경로의 각 라우터를 확인한다.
ProtocolTCP=6, UDP=17, ICMP=1traceroute는 TTL을 일부러 조절해 경로의 각 라우터를 확인한다.
Source/Destination출발지와 최종 목적지 IPtraceroute는 TTL을 일부러 조절해 경로의 각 라우터를 확인한다.
필드크기핵심 역할
Version4비트IP 버전 (4)
IHL4비트헤더 길이 (5 = 20바이트)
TTL8비트최대 홉 수, 라우터 통과마다 1 감소
Protocol8비트6=TCP, 17=UDP, 1=ICMP
Source IP32비트출발지 IP
Destination IP32비트목적지 IP

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

라우터를 하나 통과할 때마다 1씩 감소하고, 0이 되면 폐기합니다.

Linux 기본값은 64, Windows는 128입니다.

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

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

특수 IPv4 주소는 용도별로 따로 읽는다

0.0.0.0, 127.0.0.1, 169.254.x.x는 일반 목적지 주소가 아니다.

대상의미
0.0.0.0/0기본 경로라우팅 테이블의 마지막 선택
127.0.0.0/8루프백자기 자신과 통신
169.254.0.0/16링크 로컬DHCP 실패 시 자동 할당
255.255.255.255제한 브로드캐스트같은 링크 전체

IPv4 주소 체계에서는 계층 위치, 주소/식별자, 캡처에서 보이는 신호를 확인합니다.

IPv4 주소 체계 점검 기준

주소 표기, 프리픽스, 라우팅 가능 여부를 함께 확인한다.

점검 기준판단 질문
32비트네 옥텟 표기는 사람이 읽기 위한 표현이다.
프리픽스네트워크부와 호스트부 경계를 명확히 쓴다.
공인/사설인터넷 라우팅 가능 여부를 구분한다.
헤더TTL, Protocol, 출발지와 목적지 IP를 우선 확인한다.