패킷이 어디로 가야 하는지를 나타내는 논리 주소. 앞부분은 네트워크, 뒷부분은 호스트를 가리킨다.
CIDR 표기
192.168.10.37 / 24
└ 앞 24비트가 네트워크, 나머지 8비트가 호스트
네트워크 주소 192.168.10.0
브로드캐스트 192.168.10.255
쓸 수 있는 호스트 192.168.10.1 ~ 254 (254개)
/24 → 256개 (호스트 254)
/25 → 128개
/16 → 65,536개
- 프리픽스가 1 늘 때마다 절반이 된다
같은 네트워크인지 판단하기
내 IP 192.168.10.37 서브넷 마스크 255.255.255.0
- 목적지 — 192.168.10.99
둘 다 마스크와 AND → 192.168.10.0 으로 같다
- 같은 네트워크 → ARP 로 MAC 을 찾아 직접 보낸다
목적지가 8.8.8.8 이면 다르다
- 기본 게이트웨이(라우터)의 MAC 으로 보낸다
"직접 보낼까 라우터에 맡길까"를 이 계산으로 정한다.
라우팅 — 최장 프리픽스 매칭
- 라우팅 테이블에 여러 항목이 걸리면 '가장 구체적인 것' 을 고른다
0.0.0.0/0 → 기본 게이트웨이 (모든 주소에 매칭, 가장 덜 구체적)
10.0.0.0/8 → 라우터 A
10.1.0.0/16 → 라우터 B
10.1.2.0/24 → 라우터 C ← 10.1.2.5 는 이걸로 간다
ip route # 리눅스 라우팅 테이블
traceroute example.com # 어느 홉을 거치는지
best-effort — IP는 보장하지 않는다
IP 가 하는 일: 목적지까지 '최선을 다해' 보낸다 IP 가 안 하는 일: 도착 보장 · 순서 보장 · 중복 방지
그래서 신뢰성이 필요하면 위 계층(TCP)이 얹는다
단편화
링크마다 한 번에 보낼 수 있는 최대 크기(MTU)가 다르다 — 이더넷은 보통 1500바이트 더 큰 패킷은 쪼개진다(단편화)
조각 하나만 잃어도 전체를 다시 보내야 한다 → 비효율
- 요즘은 경로 MTU 를 미리 찾아 처음부터 작게 보낸다 (Path MTU Discovery)
- IPv6 는 중간 라우터의 단편화를 아예 금지했다
면접 함정
- ❌ "IP가 데이터 도착을 보장한다" → best-effort다. 보장은 TCP의 몫이다.
- ❌ "/24는 256대를 연결할 수 있다" → 네트워크·브로드캐스트 주소를 빼면 254대다.
서브넷 계산을 손으로
- 192.168.10.37 / 26 — 의 네트워크는?
/26 → 앞 26비트가 네트워크, 뒤 6비트가 호스트 → 블록 크기 64 네 번째 옥텟이 64 단위로 끊긴다: 0-63 · 64-127 · 128-191 · 192-255 37 은 첫 블록에 속한다
네트워크 192.168.10.0
브로드캐스트 192.168.10.63
호스트 범위 192.168.10.1 ~ 62 (62개)
"블록 크기 = 256 − 마스크의 마지막 옥텟" 으로 암산한다(/26이면 256−192=64).
특수 주소
- 127.0.0.0/8 — 루프백 — 자기 자신
- 169.254.0.0/16 — 링크 로컬 — DHCP 실패 시 자동 할당("IP를 못 받았다"는 신호)
- 0.0.0.0 — "모든 주소" — 서버가 모든 인터페이스에서 듣겠다는 뜻
- 255.255.255.255 — 제한 브로드캐스트
169.254.x.x가 보이면 DHCP를 못 받은 것이다 — 네트워크 문제 진단의 첫 단서다.
TTL은 시간이 아니다
IP 헤더의 TTL 은 '남은 홉 수' 다. 라우터를 지날 때마다 1 줄어든다 0 이 되면 버려지고 ICMP 로 알려 준다
- traceroute 가 이걸 이용한다: TTL 1, 2, 3... 으로 보내며 각 홉의 응답을 모은다