Network Programming/Network Layer

[Network Layer] IPv4 Address

dh_0e 2025. 4. 21. 00:56

Introduction

  • IP 주소는 인터넷 계층(네트워크 계층)에서 사용하는 식별자이다.
  • IPv4 주소는 32비트 (4바이트)로 구성된 고유하며 보편적인 주소로, 인터페이스 단위로 부여된다.
  • 두 개의 장치가 한 네트워크에 연결되어 있을 때, 이 둘은 동시에 같은 주소를 가질 수 없다
    • 한 장치가 두 개의 네트워크에 연결되어 있다면 → IP 주소도 2개 할당됨.
  • 중요한 개념: IP 주소는 “호스트”가 아닌 인터페이스의 주소임.

표기법 & 연산

  • Binary Notation: 2진수로 표현된 IP (예: 11000000.10101000.00000000.00000001), Base 2
  • Dotted-Decimal Notation: 우리가 자주 쓰는 10진수 점 표기법 (예: 192.168.0.1), Base 256

비트 연산

  • AND: IP와 마스크를 연산해서 네트워크 주소를 구함
  • OR: 브로드캐스트 주소 계산 시 사용
  • NOT: 마스크 반전할 때 사용

클래스(Class) addressing

  • IPv4는 A~E 클래스로 나뉜다.
  • 클래스는 IP 주소의 앞쪽 비트를 통해 구분한다.

클래스 시작 비트주소 범위
A 0xxxxxxx 0 ~ 127
B 10xxxxxx 128 ~ 191
C 110xxxxx 192 ~ 223
D 1110xxxx 224 ~ 239
E 1111xxxx 240 ~ 255
  • 비트 기준으로 클래스 판별
    1. 첫 비트가 0이면 → Class A or
    2. 두 번째 비트가 0이면 → Class B or
    3. 세 번째 비트가 0이면 → Class C or
    4. 네 번째 비트가 0이면 → Class D or
    5.  → Class E
      이런 식으로 이진수 패턴으로 클래스 분류 가능

Netid와 Hostid

  • 각 클래스마다 Netid와 Hostid의 비트 비율이 다르다:
Class Netid Hostid
A 8비트 24비트
B 16비트 16비트
C 24비트 8비트
  • Netid: 네트워크 번호, Hostid: 네트워크 내 개별 호스트 식별

Class A는 Netid가 128개로 매우 한정적이므로 미국방성, MIT, IBM, Apple 등 당시 연구에 참가했던 단체들이 할당되어 있음


클래스별 블록 수와 주소 개수

  • Class A: 2^7 = 128 블록 (→ 일부 예약됨), 각 블록: 2^24 = 16,777,216개 주소
  • Class B: 2^14 = 16,384 블록, 각 블록: 2^16 = 65,536개 주소
  • Class C: 2^21 = 2,097,152 블록, 각 블록: 2^8 = 256개 주소
Class A/B는 대부분 낭비 심함 → 현실에선 비효율적

 


Class D, E

  • Class D: 224.0.0.0 ~ 239.255.255.255 1 블록: 2^28 = 268,435,456개 주소
    • 멀티캐스트 전송 (여러 호스트에게 동시에 전송)
    • regualr unicast traffic에는 사용할 수 없음
  • Class E: 240.0.0.0 ~ 255.255.255.255 1 블록: 2^28 = 268,435,456개 주소
    • 예약 주소 (실험/미래용도, 일반 사용 불가)

Classful Addressing 예시 (그림 설명)

네트워크 구조 예시

  • 왼쪽 LAN: Class C (220.3.6.0)
  • 오른쪽 LAN: Class B (134.18.0.0)
  • WAN이 양쪽 LAN과 외부 인터넷을 연결
  • 각 네트워크가 다른 클래스로 구성되고, 라우터가 목적지 주소를 보고 어느 인터페이스로 보낼지 판단

Network Address 계산

  • 라우터가 목적지 네트워크 주소를 알아내기 위해 사용하는 방식은:
    • IP 주소네트워크 마스크AND 연산
  • 이 과정을 통해 어떤 네트워크에 속하는지 식별할 수 있음

예시 설명

  • 주소: 192.168.1.12
  • 마스크: 255.255.255.0
  • 연산 결과: 192.168.1.0 → 이게 바로 네트워크 주소
11000000.10101000.00000001.00001100   (192.168.1.12)
11111111.11111111.11111111.00000000   (255.255.255.0)
-----------------------------------
11000000.10101000.00000001.00000000   → 192.168.1.0

 

라우터는 목적지 IP를 보고 AND 연산을 통해 어느 네트워크에 속해 있는지 판단하고, 그 결과에 따라 다음 인터페이스로 포워딩함.

네트워크 마스크 (Network Mask)

  • 클래스별 기본 마스크:
클래스마스크접두 표현
A 255.0.0.0 /8
B 255.255.0.0 /16
C 255.255.255.0 /24
  • IP 주소와 마스크를 AND 연산 → 네트워크 주소 추출

Subnetting (서브넷팅)

  • 기존 Classful 구조는 2단계 주소 체계였음:
    • Netid + Hostid
  • 하지만 현실에서는 다음과 같은 문제가 있었음:
    1. Class A/B는 너무 커서 낭비가 심함
    2. Class C는 너무 작음
  • 그래서 서브넷팅(subnetting)이라는 개념 도입: → Netid + Subnetid + Hostid로 세분화
  • 큰 네트워크를 여러 개의 소규모 네트워크로 나눔
  • 보안, 트래픽 관리 목적

  • 서브넷을 나누기 위해서는 서브넷 마스크(Subnet Mask)가 필요함
  • 기존 마스크보다 더 많은 비트를 Netid 측으로 이동시켜야 함
  • 각 Subnet끼리 router만 거치고 통신 가능
  • network 관리를 효율적이게 만들어줌

Subnet Address 계산

  • 서브넷 마스크로 네트워크 주소 식별
  • AND 연산을 통해 어떤 서브넷에 속하는지 계산

예: Class B 기본 구조

  • 기존 마스크: /16 → 255.255.0.0
  • 서브넷팅 후 마스크: /18로 증가
    • /18이면 마스크는 255.255.192.0
    • 서브넷은 2^2 = 4개 증가
이렇게 서브넷 마스크는 서브넷 ID에 해당하는 비트 수만큼 더 1을 포함하게 됨

 

서브넷팅할 때 필요한 마스크 길이는 다음 공식으로 계산:

마스크 길이 = 기본 마스크 + log₂(서브넷 개수)

예시:

  • Class B 주소 /16을 4개의 서브넷으로 나누고 싶다면?
    • log₂(4) = 2
    • 새로운 마스크: 16 + 2 = /18 → 255.255.192.0
  • 계산 공식:
    • 서브넷 개수 s일 때 → n_subnet = n + log₂(s)
    • 예: /16에서 4개의 서브넷 필요 → /18로 마스크 늘림

Supernetting

  • Supernetting(수퍼넷팅)은 여러 개의 Class C 네트워크 블록을 하나의 큰 네트워크로 묶는 것
  • 서브넷팅이 → 큰 네트워크를 쪼개는 것이라면
    슈퍼넷팅은 → 작은 네트워크를 합치는 것
  • 이때 사용되는 마스크가 Supernet Mask
  • HostID를 늘려줌
  • Class C 주소 여러 개를 묶어 하나의 큰 네트워크로 사용
  • → 마스크를 짧게 만들면서 블록 확장
    • ex) /24 + /24 = /23으로 묶음

예시

  • 2개의 Class C 블록을 묶으려면 → 1비트 줄임 → /23 → 255.255.254.0
    • HostID가 2배 늘어남
  • 4개 묶으려면 → /22 → 255.255.252.0

조건: 반드시 2의 거듭제곱 개수만큼만 묶을 수 있음
(1개, 2개, 4개, 8개 등)


Classless Addressing (CIDR)

  • 기존의 Classful Addressing (A/B/C)의 문제점이 심각해지면서 새로운 방식이 필요해짐

Classful Addressing의 두 가지 한계:

  1. 주소 낭비
    • Class A는 너무 커서 실사용 거의 불가
    • Class B도 대부분 낭비 (주소 수 > 실제 사용자 수)
  2. 라우팅 테이블 과부하
    • 너무 많은 소규모 네트워크가 존재 → 테이블 항목 수 폭증

Long-Term Solution – IPv6 도입

목적 주소 공간 자체를 확장
방법 IPv4의 32비트 주소 → IPv6의 128비트 주소
특징 완전히 새로운 포맷과 프로토콜 설계 필요
적용 시점 미래 지향적 / 점진적 도입

Short-Term Solution – Classless Addressing (CIDR)

목적 IPv4 주소를 보다 유연하게 할당
방법 클래스를 제거하고, 접두 길이(/n)로 주소 블록 표현
표기 예 110.23.120.14/20 → 앞 20비트는 prefix (네트워크), 나머지는 host ID
특징 주소 낭비 최소화, 라우팅 테이블도 줄어듦
적용 시점 IPv4 주소 부족을 단기적으로 해결하기 위한 현실적 방법

핵심 정리

CIDR 표기법 IP / Prefix Length (예: 192.168.0.0/22)
Prefix = 네트워크 식별자 Suffix = 호스트 식별자
클래스 구분 없음 모든 주소는 “클래스리스”로 취급

 

  • CIDR은 서브넷팅과 슈퍼넷팅 모두 포함하는 범용 개념
  • 주소 블록을 필요한 만큼만 나누고, 묶을 수도 있음 → 효율 최고
  • 클래스 개념 없이 슬래시(/) 표기 사용 → /n
    • 예: 192.168.0.0/20
  • CIDR 계산법:
    • 총 주소 수: 2^(32 - n)
    • 첫 주소(네트워크 주소): IP & 마스크
    • 마지막 주소(가장 큰 주소): IP | NOT(마스크)

CIDR Aggregation

  • 여러 개의 인접 CIDR 블록을 하나로 묶는 기술
  • 라우팅 테이블을 줄이고 효율 향상
  • 예시:
    • 190.154.27.0/26 + 190.154.27.64/26 → 190.154.27.0/25
      • 0~63 서브넷과 64~128 서브넷을 합쳐서 0~128을 관리하는 블록(서브넷)으로 만듬
    • 190.154.27.0/25 + 190.154.27.128/25 → 190.154.27.0/24
CIDR Aggregation으로 여러 개의 서브넷을 하나의 큰 주소 블록(CIDR 블록)으로 묶으면 라우팅 테이블이 더 작고 효율적이 된다!

Special Addresses

1. All-Zeros Address (전체 0 주소)

  • 형식: 0.0.0.0 (CIDR 표기로는 0.0.0.0/32)
  • 용도:
    • 자기 자신의 IP 주소를 모르는 호스트가 임시로 사용하는 주소
    • 예: 부팅 시 DHCP 요청을 보낼 때
      • DHCP 서버로 All-Zeros(0.0.0.0)을 보내 자신에게 할당 된 IP 주소, 서브넷 마스크, 게이트웨이 등을 얻어옴
      • DHCP: IP 주소를 자동으로 할당해주는 애플리케이션 계층 프로토콜 (보통 네트워크 장비(라우터 등)에서 운영됨)
  • 이 주소를 출발지 주소로 사용해서 브로드캐스트 요청을 보냄

출발지는 0.0.0.0, 목적지는 255.255.255.255 → IP를 아직 못 받은 상황

 

2. All-Ones Address (Limited Broadcast Address)

  • 형식: 255.255.255.255
  • CIDR 표기: /32
  • 용도: 로컬 네트워크에 있는 모든 호스트에게 패킷 전송
  • 제한적(limited) 브로드캐스트이기 때문에, 라우터는 이 패킷을 외부로 넘기지 않음

네트워크 전체가 아니라 현재 네트워크 안의 모든 호스트들에게만 전파됨


3. Loopback Address

  • 범위: 127.0.0.0 ~ 127.255.255.255 (통상적으로 127.0.0.1 사용)
  • CIDR 표기: 127.0.0.0/8
  • 용도:
    • 자기 자신에게 패킷을 보내는 테스트용
    • 로컬 TCP/IP 스택이 정상 작동하는지 확인할 때 사용
    • Application layer → Transport layer → Network layer(Destination) → Transport layer → Application layer
  • 예시 명령어: ping 127.0.0.1

이 주소로 보낸 패킷은 네트워크로 나가지 않고, 자신에게 바로 돌아온다


4. Private Addresses (사설 IP 주소)

  • 인터넷에서 사용되지 않고, 내부 네트워크 전용(사설망 전용)
  • 주로 회사, 집, 학교 등 로컬 네트워크에서 사용됨
  • NAT와 결합되어 IPv6의 중요도가 내려감
이 주소들은 라우터를 통해 외부로 직접 전달되지 않음NAT로 변환 필요

5. Network Address & Broadcast Address (Block 내에서)

어떤 블록이든 처음 주소와 마지막 주소는 특별한 의미를 가짐:

주소 의미
첫 주소 (suffix = 000...0) 네트워크 식별 주소
네트워크 자신을 정의함
마지막 주소 (suffix = 111...1) 브로드캐스트 주소 (해당 블록 내 전체 호스트 대상)
네트워크 내부 모든 호스트들에게 패킷을 전달하기 위해 사용됨

예시: 192.168.1.0/24

  • 네트워크 주소: 192.168.1.0
  • 브로드캐스트 주소: 192.168.1.255

NAT (Network Address Translation)

  • IPv4 주소는 32비트로 약 43억 개밖에 없음
  • 이미 고갈 → 모든 기기에 고유한 공인 IP 주소 부여 불가
  • NAT 사용하여 내부에서 사설 IP 주소 사용 (무료, 반복 가능)
  • 내부 사설 IP 주소 ↔ 외부 공인 IP 주소를 변환하는 기술
  • 하나의 공인 IP로 여러 사설 호스트를 인터넷에 연결 가능
  • 외부에서는 NAT 장비의 공인 IP 주소 하나만 보임
  • 라우터(또는 게이트웨이 장비)에서 동작
  • NAT 테이블에 포트번호까지 함께 저장하면 다수 매핑 가능 (PAT: Port Address Translation)

 

NAT의 동작 원리

  1. 내부 호스트가 외부 서버로 패킷 보냄
  2. NAT 라우터가:
    • 출발지 IP를 공인 IP로 변경
    • 출발지 포트번호를 변형 (PAT 사용 시)
    • NAT 테이블에 매핑 정보 저장
  3. 응답이 들어오면:
    • 목적지 IP/포트 보고 내부 호스트로 다시 변환해서 전달

 

내부 네트워크 (Private)

  • 사설 IP를 사용하는 여러 장치들이 존재
  • 각각 고유한 사설 IP + 포트번호 조합으로 인터넷 접근 시도

NAT 라우터

  • 하나의 공인 IP (203.0.113.5)를 사용
  • 각 내부 요청에 대해 공인 포트번호를 다르게 할당하여 구분
    → 이 과정을 PAT (Port Address Translation)이라고 함
  • NAT 테이블에 포트번호를 포함한 매핑 정보 저장
내부 (사설) NAT 변환 외부에서 들어올 때 다시 변환
192.168.1.10:1234 203.0.113.5:5001 192.168.1.10:1234
192.168.1.11:2345 203.0.113.5:5002 192.168.1.11:2345
192.168.1.12:3456 203.0.113.5:5003 192.168.1.12:3456


 

핵심

  • 하나의 공인 IP 주소만으로도 여러 사설 IP 호스트가 인터넷 사용 가능
  • 이 구조 덕분에 NAT는 IPv4 주소 고갈 문제의 현실적인 대안이 됨
  • PAT 구조는 반드시 IP + Port를 함께 변환해야 정확한 매핑 가능
항목 내용
NAT 기능 내부 IP를 공인 IP로 변환 (양방향)
필요성 IPv4 주소 부족 대응
테이블 사설 IP + 포트 ↔ 공인 IP + 포트
PAT 하나의 공인 IP로 여러 내부 호스트 지원
사설 IP는 인터넷 직접 연결 ❌ NAT 장비가 변환해야 함
ISP "Internet Service Provider"의 줄임말로, 인터넷 접속을 제공하는 서비스를 제공하는 사업자 또는 회사. 중구 지역에서 ISP는 KT, SK브로드밴드, LG U+ 등이 있음