IP: 주소와 라우팅으로 패킷을 목적지까지 전달하는 인터넷 프로토콜
인터넷 프로토콜(Internet Protocol, IP)은 서로 다른 네트워크의 호스트를 주소로 식별하고 패킷을 목적지까지 전달한다. IPv4와 IPv6는 주소 길이와 헤더 구조가 다르지만, 라우터가 목적지 주소와 라우팅 테이블을 비교해 다음 홉을 선택한다는 원리는 같다. IP는 최선형 전달(best-effort delivery)만 제공하며 신뢰성, 순서
By 송민성
1. 개념
인터넷 프로토콜(Internet Protocol, IP)은 네트워크 계층(network layer)에서 데이터그램(datagram)을 전달하는 프로토콜이다. 송신 호스트와 목적지 호스트를 IP 주소로 식별하고, 여러 네트워크를 거쳐 패킷이 이동할 수 있게 한다.
현재 사용되는 주요 버전은 IPv4와 IPv6다.
- IPv4: 32비트 주소 사용
- IPv6: 128비트 주소 사용
- IPv5: 실험용 프로토콜에 사용된 번호이므로 일반 인터넷 프로토콜로 배포되지 않음
IPv4 주소는 일반적으로 점으로 구분한 10진수로 표현한다.
192.168.10.25IPv6 주소는 16비트 단위의 16진수를 콜론으로 구분한다.
2001:0db8:0000:0000:0000:ff00:0042:8329연속된 0은 한 번만 ::로 줄일 수 있고, 각 그룹 앞의 0도 생략할 수 있다.
2001:db8::ff00:42:8329IP는 다음 기능을 제공한다.
- 호스트와 네트워크의 논리적 주소 지정
- 서로 다른 네트워크 사이의 패킷 전달
- 라우팅 테이블을 이용한 다음 홉(next hop) 선택
- 패킷의 무한 순환을 막는 수명 제한
- 상위 계층 프로토콜 식별
IP 자체는 연결 설정, 전송 순서, 도착 여부, 중복 제거를 보장하지 않는다. 이런 특성을 최선형 전달(best-effort delivery)이라고 한다.
2. 왜 사용하는가
이더넷(Ethernet)의 매체 접근 제어 주소(Media Access Control address, MAC address)는 같은 링크 안에서 프레임을 전달하는 데 사용된다. 그러나 MAC 주소만으로는 여러 네트워크를 거쳐 전 세계의 목적지를 찾기 어렵다.
IP 주소는 네트워크 부분과 호스트 부분을 계층적으로 표현한다. 라우터는 개별 호스트의 위치를 모두 저장하는 대신 주소 접두사(prefix)를 기준으로 경로를 묶어 관리할 수 있다.
예를 들어 192.168.10.0/24는 앞의 24비트가 네트워크 접두사라는 뜻이다.
네트워크 주소: 192.168.10.0
사용 가능한 범위: 192.168.10.1 ~ 192.168.10.254
브로드캐스트 주소: 192.168.10.255IPv4의 /24 네트워크에는 총 2^(32-24) = 256개 주소가 있다. 전통적인 일반 서브넷에서는 네트워크 주소와 브로드캐스트 주소를 제외한 254개를 호스트에 할당할 수 있다. /31 지점 간 링크와 /32 단일 호스트 경로는 별도 규칙을 사용한다.
IP를 사용하면 다음 통신을 같은 방식으로 처리할 수 있다.
- 같은 서브넷의 장치 간 통신
- 다른 서브넷의 서버와 통신
- 인터넷 서비스 제공자 사이의 통신
- 데이터센터와 클라우드 사이의 통신
- 가상 사설망(Virtual Private Network, VPN) 터널 통신
3. 동작 원리
IP 패킷 구성
IPv4 패킷은 헤더와 페이로드(payload)로 구성된다. 옵션이 없으면 IPv4 헤더 크기는 20바이트다.
주요 IPv4 헤더 필드는 다음과 같다.
- 버전(version): IPv4를 나타내는 값
4 - 헤더 길이(Internet Header Length, IHL): IPv4 헤더 크기
- 전체 길이(total length): 헤더를 포함한 전체 패킷 크기
- 식별자와 단편화 필드: 조각난 패킷의 재조립에 사용
- 생존 시간(Time To Live, TTL): 통과 가능한 홉 수 제한
- 프로토콜(protocol): TCP, 사용자 데이터그램 프로토콜(User Datagram Protocol, UDP), 인터넷 제어 메시지 프로토콜(Internet Control Message Protocol, ICMP) 등 상위 프로토콜 식별
- 헤더 체크섬(header checksum): IPv4 헤더 오류 검사
- 출발지와 목적지 주소
IPv6 기본 헤더는 고정된 40바이트다. IPv4의 헤더 체크섬과 라우터 단편화 기능을 제거하고 선택 기능을 확장 헤더(extension header)로 분리했다. IPv4의 TTL에 대응하는 필드는 홉 제한(hop limit)이다.
같은 서브넷인지 판단
호스트는 자신의 주소와 목적지 주소에 서브넷 마스크(subnet mask)를 비트 단위 논리곱(AND)으로 적용한다.
호스트 주소: 192.168.10.25
서브넷 마스크: 255.255.255.0
네트워크 주소: 192.168.10.0목적지의 네트워크 주소가 같으면 같은 서브넷으로 판단한다. IPv4에서는 주소 결정 프로토콜(Address Resolution Protocol, ARP)을 사용해 목적지 IPv4 주소에 대응하는 MAC 주소를 찾는다.
목적지가 다른 서브넷에 있으면 패킷을 기본 게이트웨이(default gateway)로 보낸다. 이때 이더넷 프레임의 목적지 MAC 주소는 게이트웨이의 MAC 주소지만, IP 패킷의 목적지 주소는 최종 서버 주소다.
클라이언트
IP 목적지: 203.0.113.20
MAC 목적지: 기본 게이트웨이
↓
라우터
↓
다음 라우터
↓
목적지 서버IPv6에서는 ARP 대신 이웃 탐색 프로토콜(Neighbor Discovery Protocol, NDP)을 사용한다.
라우팅과 최장 접두사 일치
라우터는 목적지 IP 주소를 라우팅 테이블과 비교한다. 여러 경로가 일치하면 접두사 길이가 가장 긴 경로를 선택한다. 이를 최장 접두사 일치(longest prefix match)라고 한다.
10.0.0.0/8 → 라우터 A
10.20.0.0/16 → 라우터 B
10.20.30.0/24 → 라우터 C
0.0.0.0/0 → 기본 경로목적지가 10.20.30.45라면 세 경로가 모두 일치하지만 가장 구체적인 /24 경로가 선택된다.
라우터가 IPv4 패킷을 전달할 때 TTL을 1 감소시킨다. TTL이 0이 되면 패킷을 폐기하고 일반적으로 ICMP 시간 초과(Time Exceeded) 메시지를 보낸다. traceroute는 이 동작을 이용해 경로상의 라우터를 확인한다.
공인 주소, 사설 주소, 주소 변환
IPv4 사설 주소(private address) 범위는 다음과 같다.
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16사설 주소는 공용 인터넷에서 직접 라우팅되지 않는다. 가정이나 회사의 라우터는 네트워크 주소 변환(Network Address Translation, NAT)을 사용해 사설 주소를 공인 주소로 변환할 수 있다.
여러 내부 연결이 하나의 공인 IPv4 주소를 공유할 때는 주소와 포트를 함께 변환하는 네트워크 주소·포트 변환(Network Address and Port Translation, NAPT)을 주로 사용한다.
192.168.10.25:53120 → 203.0.113.5:40001
192.168.10.30:53120 → 203.0.113.5:40002NAT는 IPv4 주소 부족을 완화하지만 종단 간 연결을 복잡하게 만든다. 외부에서 내부 장치로 연결하려면 포트 전달(port forwarding), 중계 서버, NAT 통과(NAT traversal) 같은 구성이 필요할 수 있다.
최대 전송 단위와 단편화
최대 전송 단위(Maximum Transmission Unit, MTU)는 링크가 한 번에 전달할 수 있는 최대 패킷 크기다. 일반적인 이더넷 MTU는 1,500바이트다.
IPv4 패킷이 다음 링크의 MTU보다 크면 라우터가 패킷을 단편화(fragmentation)할 수 있다. 단편화 금지(Don't Fragment, DF) 비트가 설정되어 있으면 라우터는 패킷을 폐기하고 ICMP 오류를 보낸다.
IPv6 라우터는 패킷을 단편화하지 않는다. 송신 호스트가 경로 최대 전송 단위 탐색(Path MTU Discovery)을 통해 크기를 조절하고, 필요할 때만 단편화 확장 헤더를 사용한다.
4. 코드 예제
다음 TypeScript 프로그램은 IPv4 주소와 클래스 없는 도메인 간 라우팅(Classless Inter-Domain Routing, CIDR) 접두사를 입력받아 네트워크 주소, 브로드캐스트 주소, 전체 주소 수를 계산한다.
function parseIPv4(address: string): bigint {
const parts = address.split(".");
if (parts.length !== 4) {
throw new Error(`잘못된 IPv4 주소: ${address}`);
}
return parts.reduce((result, part) => {
if (!/^\d+$/.test(part)) {
throw new Error(`잘못된 IPv4 주소: ${address}`);
}
const value = Number(part);
if (!Number.isInteger(value) || value < 0 || value > 255) {
throw new Error(`잘못된 IPv4 주소: ${address}`);
}
return (result << 8n) | BigInt(value);
}, 0n);
}
function formatIPv4(value: bigint): string {
return [24n, 16n, 8n, 0n]
.map((shift) => Number((value >> shift) & 255n))
.join(".");
}
function inspectCIDR(cidr: string) {
const [address, prefixText] = cidr.split("/");
if (address === undefined || prefixText === undefined) {
throw new Error(`잘못된 CIDR 표기: ${cidr}`);
}
const prefix = Number(prefixText);
if (!Number.isInteger(prefix) || prefix < 0 || prefix > 32) {
throw new Error(`잘못된 접두사 길이: ${prefixText}`);
}
const ip = parseIPv4(address);
const hostBits = 32 - prefix;
const allBits = (1n << 32n) - 1n;
const hostMask = hostBits === 0 ? 0n : (1n << BigInt(hostBits)) - 1n;
const networkMask = allBits ^ hostMask;
const network = ip & networkMask;
const broadcast = network | hostMask;
const totalAddresses = 1n << BigInt(hostBits);
return {
입력: cidr,
네트워크주소: formatIPv4(network),
브로드캐스트주소: formatIPv4(broadcast),
전체주소수: totalAddresses.toString(),
같은네트워크예시: formatIPv4(network | (hostMask > 0n ? 1n : 0n)),
};
}
const cidr = process.argv[2] ?? "192.168.10.25/24";
try {
console.log(inspectCIDR(cidr));
} catch (error) {
console.error(error instanceof Error ? error.message : error);
process.exit(1);
}파일을 ip-cidr.ts로 저장한 뒤 실행한다.
npx tsx ip-cidr.ts 192.168.10.25/24실행 결과는 다음 형태다.
{
'입력': '192.168.10.25/24',
'네트워크주소': '192.168.10.0',
'브로드캐스트주소': '192.168.10.255',
'전체주소수': '256',
'같은네트워크예시': '192.168.10.1'
}운영체제의 실제 IP 주소와 라우팅 테이블도 확인할 수 있다.
ip address
ip routemacOS에서는 다음 명령을 사용한다.
ifconfig
netstat -rn목적지까지의 IP 경로는 traceroute로 확인한다.
traceroute example.com5. 시간 복잡도 또는 성능 특성
IP 전달 성능은 일반적인 애플리케이션 알고리즘의 시간 복잡도보다 라우팅 조회, 패킷 크기, 링크 속도, 지연 시간, 혼잡, 패킷 손실의 영향을 크게 받는다.
- 라우터는 패킷마다 최장 접두사 일치를 수행한다. 실제 장비는 트라이(trie), 테이블 압축, 내용 주소화 메모리(Content Addressable Memory, CAM) 같은 구조를 사용하므로 단순한 빅오(Big-O)만으로 처리량을 판단하기 어렵다.
- 옵션이 없는 IPv4 헤더는 20바이트다.
- IPv6 기본 헤더는 40바이트다.
- 일반적인 이더넷 MTU가 1,500바이트일 때 IPv4와 TCP 옵션이 없는 TCP 세그먼트의 최대 세그먼트 크기(Maximum Segment Size, MSS)는
1500 - 20 - 20 = 1460바이트다. - 같은 조건에서 IPv6의 TCP MSS는
1500 - 40 - 20 = 1440바이트다. - 터널링, VPN, 확장 헤더가 추가되면 실제로 전달할 수 있는 상위 계층 데이터 크기가 더 줄어든다.
- 단편화된 조각 하나가 손실되면 원래 데이터그램 전체를 재조립할 수 없다. TCP에서는 해당 데이터의 재전송도 필요하므로 단편화를 피하는 편이 일반적으로 유리하다.
- IPv4 전체 길이 필드는 16비트이므로 헤더를 포함한 데이터그램의 최대 크기는 65,535바이트다.
- IPv4 헤더 체크섬은 각 라우터가 TTL을 변경할 때 다시 계산해야 한다. IPv6 기본 헤더에는 헤더 체크섬이 없다.
6. 실무 사용 사례
웹 서버 접근 제어
웹 서버는 클라이언트 IP 주소를 로깅하거나 접근 정책에 사용할 수 있다. 다만 프록시나 로드 밸런서 뒤에서는 서버가 확인한 연결 상대 주소가 실제 사용자 주소와 다를 수 있다.
X-Forwarded-For 같은 헤더는 신뢰하도록 설정한 프록시가 추가한 경우에만 사용해야 한다. 외부 요청이 보낸 값을 그대로 신뢰하면 IP 기반 정책을 우회할 수 있다.
클라우드 서브넷 설계
가상 사설 클라우드(Virtual Private Cloud, VPC)는 CIDR 범위를 여러 서브넷으로 나눈다.
VPC: 10.20.0.0/16
공개 서브넷 A: 10.20.10.0/24
공개 서브넷 B: 10.20.20.0/24
비공개 서브넷 A: 10.20.110.0/24
비공개 서브넷 B: 10.20.120.0/24주소 범위가 겹치면 VPC 피어링, VPN, 사내망 연결에서 경로를 구분할 수 없게 된다. 연결 가능성이 있는 네트워크는 초기 설계부터 중복되지 않는 주소 범위를 사용해야 한다.
컨테이너와 쿠버네티스 네트워크
컨테이너와 파드(pod)는 별도의 IP 주소를 받을 수 있다. 노드 주소, 파드 주소, 서비스 주소가 서로 다른 CIDR 범위를 사용하며, 컨테이너 네트워크 인터페이스(Container Network Interface, CNI) 구현이 라우팅이나 캡슐화를 담당한다.
주소 범위가 사내망이나 클라우드 서브넷과 겹치면 특정 목적지로 패킷이 잘못 전달될 수 있다.
장애 분석
IP 통신 장애는 계층별로 범위를 좁혀 확인한다.
- 인터페이스에 올바른 IP 주소와 접두사가 설정됐는지 확인한다.
- 목적지가 같은 서브넷인지 계산한다.
- ARP 또는 NDP 이웃 정보가 생성됐는지 확인한다.
- 기본 경로와 더 구체적인 경로를 확인한다.
- 방화벽, NAT, 보안 그룹과 경로상의 패킷 손실을 확인한다.
7. 주의할 점
- IP 주소와 도메인 이름은 다르다. 도메인 이름 시스템(Domain Name System, DNS)은 이름을 IP 주소 등으로 변환하지만 실제 패킷 전달은 IP 주소를 기준으로 수행된다.
- IP 주소와 포트 번호도 다르다. IP 주소는 호스트나 네트워크 인터페이스를 식별하고, TCP·UDP 포트는 호스트 안의 통신 종단점을 구분한다.
127.0.0.0/8은 IPv4 루프백(loopback) 범위다.127.0.0.1에 바인딩한 서버는 같은 호스트에서만 접근할 수 있다.0.0.0.0은 상황에 따라 미지정 주소 또는 모든 IPv4 인터페이스를 뜻한다. 서버를0.0.0.0에 바인딩하면 외부 인터페이스에서도 연결을 받을 수 있으므로 방화벽과 인증을 확인해야 한다.255.255.255.255는 IPv4 제한 브로드캐스트(limited broadcast) 주소다. IPv6에는 브로드캐스트가 없으며 멀티캐스트(multicast)를 사용한다.- 사설 IP 주소는 보안 경계가 아니다. 같은 네트워크나 연결된 사설망의 다른 시스템이 접근할 수 있으므로 방화벽과 인증이 필요하다.
- NAT는 방화벽과 같은 개념이 아니다. 주소 변환과 접근 허용 정책은 별도로 설계해야 한다.
- IPv4 주소를 문자열 순서로 비교하면 숫자 순서와 다를 수 있다. CIDR 포함 여부와 범위 계산은 32비트 정수 또는 검증된 IP 주소 라이브러리로 처리해야 한다.
- 클라이언트 IP는 프록시, VPN, 이동통신망, 통신사 등급 NAT(Carrier-Grade NAT, CGNAT) 때문에 여러 사용자가 공유하거나 수시로 바뀔 수 있다. IP 주소만으로 사용자를 인증하거나 고유하게 식별하면 안 된다.
- 경로 최대 전송 단위 탐색에 필요한 ICMP를 무조건 차단하면 큰 패킷만 전달되지 않는 최대 전송 단위 블랙홀(MTU black hole)이 발생할 수 있다.
8. 핵심 정리
- IP는 네트워크 계층에서 주소 지정과 패킷 전달을 담당한다.
- IPv4는 32비트 주소, IPv6는 128비트 주소를 사용한다.
- CIDR 접두사는 주소의 네트워크 부분 길이를 나타낸다.
- 같은 서브넷의 IPv4 호스트는 ARP로 목적지 MAC 주소를 찾고, 다른 서브넷의 목적지는 기본 게이트웨이로 보낸다.
- 라우터는 최장 접두사 일치로 다음 홉을 선택한다.
- IP는 패킷의 도착, 순서, 재전송을 보장하지 않는다.
- NAT는 사설 IPv4 주소와 공인 IPv4 주소 사이의 변환에 사용되지만 종단 간 연결을 복잡하게 만든다.
- MTU와 단편화 문제는 VPN, 터널, 클라우드 네트워크의 간헐적 통신 장애 원인이 될 수 있다.