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 |
- 비트 기준으로 클래스 판별
- 첫 비트가 0이면 → Class A or
- 두 번째 비트가 0이면 → Class B or
- 세 번째 비트가 0이면 → Class C or
- 네 번째 비트가 0이면 → Class D or
- → Class E
이런 식으로 이진수 패턴으로 클래스 분류 가능
Netid와 Hostid
- 각 클래스마다 Netid와 Hostid의 비트 비율이 다르다:
Class | Netid | Hostid |
A | 8비트 | 24비트 |
B | 16비트 | 16비트 |
C | 24비트 | 8비트 |
- Netid: 네트워크 번호, Hostid: 네트워크 내 개별 호스트 식별
클래스별 블록 수와 주소 개수
- 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
- 하지만 현실에서는 다음과 같은 문제가 있었음:
- Class A/B는 너무 커서 낭비가 심함
- 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의 두 가지 한계:
- 주소 낭비
- Class A는 너무 커서 실사용 거의 불가
- Class B도 대부분 낭비 (주소 수 > 실제 사용자 수)
- 라우팅 테이블 과부하
- 너무 많은 소규모 네트워크가 존재 → 테이블 항목 수 폭증
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
- 190.154.27.0/26 + 190.154.27.64/26 → 190.154.27.0/25
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의 동작 원리
- 내부 호스트가 외부 서버로 패킷 보냄
- NAT 라우터가:
- 출발지 IP를 공인 IP로 변경
- 출발지 포트번호를 변형 (PAT 사용 시)
- NAT 테이블에 매핑 정보 저장
- 응답이 들어오면:
- 목적지 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+ 등이 있음 |