
DHCP: IP 주소 자동 배정소
카페 와이파이 연결할 때 IP 주소 수동 설정 안 하죠? DHCP 서버가 자동으로 빈 IP를 찾아서 임대해줍니다. DORA 과정으로 2시간짜리 IP 임대계약 체결하기.

카페 와이파이 연결할 때 IP 주소 수동 설정 안 하죠? DHCP 서버가 자동으로 빈 IP를 찾아서 임대해줍니다. DORA 과정으로 2시간짜리 IP 임대계약 체결하기.
내 서버는 왜 걸핏하면 뻗을까? OS가 한정된 메모리를 쪼개 쓰는 처절한 사투. 단편화(Fragmentation)와의 전쟁.

미로를 탈출하는 두 가지 방법. 넓게 퍼져나갈 것인가(BFS), 한 우물만 팔 것인가(DFS). 최단 경로는 누가 찾을까?

이름부터 빠릅니다. 피벗(Pivot)을 기준으로 나누고 또 나누는 분할 정복 알고리즘. 왜 최악엔 느린데도 가장 많이 쓰일까요?

매번 3-Way Handshake 하느라 지쳤나요? 한 번 맺은 인연(TCP 연결)을 소중히 유지하는 법. HTTP 최적화의 기본.

2년 전, 스타트업을 막 시작했을 때의 일입니다. 초보 개발자였던 저는 개발 환경 설정을 받고 있었습니다. 선배가 제 노트북 네트워크 설정을 보더니 이렇게 말했습니다.
"아, 이거 자동으로 받기로 해놔야 해. DHCP 활성화 해야지."
저는 멍하니 물었습니다. "DHCP가 뭔데요?"
선배는 웃으며 대답했습니다. "그냥 IP 자동으로 받는 거야. 신경 쓸 필요 없어."
그 말이 오히려 더 궁금하게 만들었습니다. IP를 자동으로 받는다는 게 도대체 무슨 원리일까?
몇 달 후, 집에서 공유기를 직접 설정할 일이 생겼습니다. 설정 페이지를 열어보니 "DHCP 서버 활성화" 체크박스가 있더라고요. 이게 뭐지? 켜두는 게 맞나? 꺼두는 게 맞나? 그냥 체크만 되어있을 뿐, 저는 아무것도 모르고 있었습니다.
더 황당했던 건, 스타트업에서 사무실을 처음 구축할 때였습니다. 네트워크 장비 업체 담당자가 "DHCP 서버는 어디에 두실 건가요?"라고 물었는데, 저는 대답을 못 했습니다. 그 순간 깨달았죠. 나는 개발자인데, 네트워크의 기본도 모르고 있구나.
제대로 알고 싶어서 공부를 시작했습니다.
"Dynamic Host Configuration Protocol"
이 단어를 처음 봤을 때의 당황스러움이란... 각 단어는 다 아는데, 합쳐지니 뭔 소린지 모르겠더라고요.
가장 이해가 안 갔던 건, 왜 굳이 자동으로 받아야 하는지였습니다. "그냥 IP 주소 192.168.0.100 이렇게 박아두면 되는 거 아닌가? 왜 이렇게 복잡하게 자동으로 받고 어쩌고 하는 거야?"
그때 저는 몰랐습니다. 100대 규모의 네트워크를 수동으로 관리하는 게 얼마나 지옥인지를.
DHCP를 제대로 이해한 건 한 블로그 글에서 본 비유 덕분이었습니다. 정말 와닿았던 비유라 지금도 기억에 남습니다.
"카페에 100명이 들어올 수 있는데, 자리는 50개밖에 없습니다.
옛날 방식 (고정 IP, Static IP):
- 손님마다 '나는 3번 테이블'이라고 미리 정해둠
- 3번 테이블 주인이 오늘 안 와도 그 자리는 계속 비어있음
- 새 손님이 와서 '나 3번이요' 했는데, 다른 손님도 '어? 나도 3번인데?' → 충돌 발생
- 손님이 떠나도 자리 회수가 제대로 안 됨
DHCP 방식 (동적 IP, Dynamic IP):
- 손님이 오면 카운터 직원(DHCP 서버)이 빈 자리를 찾아서 '오늘은 12번 테이블 쓰세요'라고 번호표를 발급
- 2시간이 지나면 번호표가 만료됨 → 자리를 자동 반납하거나 연장 가능
- 항상 빈 자리를 효율적으로 활용할 수 있음
- 손님이 나가면 그 자리는 바로 다음 손님에게 배정 가능"
이 비유를 읽고 나서야 비로소 이해했습니다. 결국 이거였구나! DHCP는 IP 주소라는 한정된 자원을 효율적으로 관리하는 시스템이었습니다.
스타트업에서 사무실 네트워크를 구축할 때 실제로 겪은 일입니다.
처음엔 "PC가 10대밖에 안 되는데 뭐 DHCP까지 필요해?"라고 생각했습니다. 그냥 각 PC에 고정 IP를 설정하면 되지 않을까?
첫 주:
한 달 후:
3개월 후:
이때 깨달았습니다: 100대 규모의 사무실이었다면 저는 IP 관리만 하다가 퇴사했을 겁니다. 진짜로 미칩니다.
결국 제대로 된 공유기를 사서 DHCP를 활성화했습니다.
DHCP 서버: 활성화
IP 범위: 192.168.0.100 ~ 192.168.0.200 (100개)
서브넷 마스크: 255.255.255.0
게이트웨이: 192.168.0.1
DNS: 8.8.8.8, 8.8.4.4
임대 시간: 24시간
그 후로:
진작에 정리해볼 걸 그랬습니다. DHCP는 네트워크 관리자의 정신 건강을 지켜주는 기술이었습니다.
DHCP가 IP를 할당하는 과정은 DORA라는 4단계로 이루어집니다. 실제로 Wireshark로 패킷을 캡처해보면 정확히 이 순서대로 패킷이 오가는 걸 볼 수 있습니다.
[내 노트북] "여기 새로 온 PC인데요, DHCP 서버 계신가요? 대답해주세요!"
(브로드캐스트: 255.255.255.255:67로 UDP 패킷 송신)
Source IP: 0.0.0.0 (아직 IP가 없으니까)
Destination IP: 255.255.255.255 (전체 브로드캐스트)
Source MAC: 00:1A:2B:3C:4D:5E (내 맥 주소)
노트북이 네트워크에 처음 연결되면, 모든 기기에게 "DHCP 서버 누구세요?"라고 외칩니다. 이 단계에서는 아직 IP 주소가 없기 때문에 Source IP가 0.0.0.0입니다.
실제로 Linux에서 DHCP 요청을 시작하려면:
# DHCP 클라이언트 시작 (Discover 패킷 송신)
sudo dhclient -v eth0
# 출력:
# Listening on LPF/eth0/00:1a:2b:3c:4d:5e
# Sending on LPF/eth0/00:1a:2b:3c:4d:5e
# Sending on Socket/fallback
# DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
[DHCP 서버] "저 여기 있어요! 192.168.0.155 비었는데 쓸래요?"
제공 내용:
- IP 주소: 192.168.0.155
- 서브넷 마스크: 255.255.255.0 (같은 네트워크 범위)
- 게이트웨이: 192.168.0.1 (공유기 주소, 외부 인터넷 연결용)
- DNS 서버: 8.8.8.8, 8.8.4.4 (구글 DNS)
- 임대 시간: 86400초 (24시간)
- DHCP 서버 IP: 192.168.0.1
DHCP 서버가 응답합니다. 네트워크에 DHCP 서버가 여러 개 있다면, 각각이 다 Offer를 보낼 수 있습니다. PC는 보통 가장 먼저 도착한 Offer를 선택합니다.
# dhclient 출력 계속:
# DHCPOFFER of 192.168.0.155 from 192.168.0.1
# DHCPREQUEST for 192.168.0.155 on eth0 to 255.255.255.255 port 67
[내 노트북] "좋아요! 192.168.0.155 제가 쓸게요!"
(다시 브로드캐스트로 확정 의사 표시)
Source IP: 0.0.0.0 (아직도 IP 할당 전)
Destination IP: 255.255.255.255 (브로드캐스트)
Requested IP: 192.168.0.155
Server Identifier: 192.168.0.1
왜 브로드캐스트로 보낼까요? 유니캐스트로 DHCP 서버에게만 보내면 되는 거 아닌가요?
이유: 네트워크에 DHCP 서버가 여러 개 있을 수 있습니다. 예를 들어, 제가 첫 번째 서버의 Offer를 선택했다면, 나머지 DHCP 서버들에게도 "저는 첫 번째 서버 선택했어요"라고 알려야 합니다. 그래야 나머지 서버들이 제공한 IP를 회수할 수 있습니다.
[DHCP 서버] "오케이! 192.168.0.155는 네 거야. 24시간 동안 써."
Source IP: 192.168.0.1 (DHCP 서버)
Destination IP: 192.168.0.155 (이제 내 IP로 확정)
Lease Time: 86400초
Renewal Time (T1): 43200초 (50%, 12시간 후 갱신)
Rebinding Time (T2): 75600초 (87.5%, 21시간 후 재시도)
DHCP 서버가 최종 승인합니다. 이제 제 노트북은 정식으로 IP 주소를 받았고, 인터넷을 쓸 수 있습니다!
# dhclient 출력 마지막:
# DHCPACK of 192.168.0.155 from 192.168.0.1
# bound to 192.168.0.155 -- renewal in 43200 seconds.
실제로 내 IP 확인:
ip addr show eth0
# 출력:
# eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
# inet 192.168.0.155/24 brd 192.168.0.255 scope global dynamic eth0
# valid_lft 86400sec preferred_lft 86400sec
DHCP 과정을 눈으로 보고 싶다면 Wireshark를 사용하면 됩니다:
# Wireshark 필터
udp.port == 67 or udp.port == 68
# 또는 더 간단하게
bootp
캡처하면 이렇게 보입니다:
1. DHCP Discover (Client → Broadcast)
2. DHCP Offer (Server → Client)
3. DHCP Request (Client → Broadcast)
4. DHCP Ack (Server → Client)
DHCP로 받은 IP는 영구 소유가 아닙니다. 시간제 임대입니다. 이 개념을 받아들였을 때 DHCP의 효율성이 확실히 이해되었습니다.
집 공유기: 보통 24시간 (86400초)
회사 네트워크: 8시간 (28800초)
카페 WiFi: 2시간 (7200초)
호텔 WiFi: 1시간 (3600초)
임대 시간의 50%가 지나면 자동으로 갱신을 시도합니다. 이걸 T1 타이머라고 합니다.
24시간 임대를 받음
→ 12시간 후 (50% 시점): "연장해주세요" (DHCP Request 재송신)
→ DHCP 서버: "오케이, 24시간 더 줄게" (ACK)
→ 다시 24시간 카운트 시작
이 과정은 백그라운드에서 조용히 일어납니다. 사용자는 전혀 눈치채지 못합니다.
# Linux에서 임대 정보 확인
cat /var/lib/dhcp/dhclient.leases
# 출력:
# lease {
# interface "eth0";
# fixed-address 192.168.0.155;
# option subnet-mask 255.255.255.0;
# option routers 192.168.0.1;
# option dhcp-lease-time 86400;
# option dhcp-renewal-time 43200; # T1: 50%
# option dhcp-rebinding-time 75600; # T2: 87.5%
# renew 3 2025/05/08 12:00:00;
# expire 4 2025/05/09 00:00:00;
# }
만약 T1 시점에 원래 DHCP 서버가 응답을 안 하면? (서버가 고장났거나 네트워크 문제)
임대 시간의 87.5% 시점(T2 타이머)에 브로드캐스트로 다시 요청합니다. "원래 서버 말고 다른 DHCP 서버 있으면 대답해주세요!"
→ 21시간 후 (87.5% 시점): 브로드캐스트로 "아무 서버나 대답해주세요!"
→ 백업 DHCP 서버: "내가 연장해줄게"
PC를 끄거나 WiFi를 끊으면 정상적으로 IP를 반납합니다:
# 수동으로 IP 반납하기
sudo dhclient -r eth0
# 출력:
# Removed stale PID file
# Killed old client process
반납하면 DHCP 서버는 그 IP를 다시 풀(Pool)에 넣어서 다른 기기에게 줄 수 있습니다.
하지만 실제로는 비정상 종료가 더 많습니다:
이 경우 DHCP 서버는 임대 시간이 만료될 때까지 기다렸다가 IP를 회수합니다.
제가 자주 가는 카페에서 노트북을 켜면:
1. Discover: "DHCP 서버 있나요?"
2. Offer: "192.168.1.105 줄게, 2시간 동안"
3. Request: "그거 쓸게요"
4. Ack: "승인!"
2시간 후:
가끔 카페에서 오래 있으면 WiFi가 1~2초 끊겼다 붙는 이유: 바로 이 갱신(Renewal) 과정 때문입니다. 대부분의 경우 부드럽게 넘어가지만, 가끔 짧은 끊김이 발생할 수 있습니다.
Docker도 내부적으로 DHCP와 비슷한 방식을 씁니다. docker network를 만들면:
# Docker 네트워크 생성
docker network create --subnet=172.20.0.0/16 mynet
# 컨테이너 실행
docker run -d --network mynet nginx
# 자동으로 172.20.0.2 같은 IP가 할당됨
docker inspect <container_id> | grep IPAddress
# 출력:
# "IPAddress": "172.20.0.2"
Docker는 IPAM(IP Address Management) 드라이버를 통해 컨테이너에게 자동으로 IP를 할당합니다. 컨테이너가 종료되면 IP를 회수하고, 새 컨테이너가 생기면 다시 재사용합니다.
클라우드 환경에서도 DHCP는 중요합니다. AWS에서 VPC를 만들면 자동으로 DHCP Options Set이 생성됩니다:
# AWS CLI로 DHCP Options 확인
aws ec2 describe-dhcp-options
# 출력 (JSON):
{
"DhcpOptions": [{
"DhcpConfigurations": [
{
"Key": "domain-name",
"Values": [{"Value": "ap-northeast-2.compute.internal"}]
},
{
"Key": "domain-name-servers",
"Values": [{"Value": "AmazonProvidedDNS"}]
}
]
}]
}
AWS의 EC2 인스턴스는 부팅할 때 DHCP를 통해:
을 자동으로 받습니다.
커스텀 DHCP Options를 만들면 자체 DNS 서버를 지정할 수도 있습니다:
# 커스텀 DHCP Options 생성
aws ec2 create-dhcp-options \
--dhcp-configurations \
"Key=domain-name-servers,Values=10.0.0.10,10.0.0.11" \
"Key=domain-name,Values=mycompany.internal"
대학 시절, 캠퍼스 네트워크가 어떻게 동작하는지 궁금해서 네트워크 관리실에 가본 적이 있습니다.
문제:
의문: 공대 건물에서 "DHCP 서버 있나요?" 하고 브로드캐스트로 외쳐봤자, 전산실까지 안 들리는데?
브로드캐스트는 라우터를 넘지 못합니다. 같은 서브넷 내에서만 전달됩니다.
해결책: DHCP Relay Agent각 건물의 라우터가 DHCP Relay Agent 역할을 합니다:
[공대 PC] → "DHCP 서버 있나요?" (브로드캐스트)
[공대 라우터] → "어? DHCP 요청이네? 내가 전산실 서버한테 전달해줄게"
[공대 라우터] → 전산실 DHCP 서버에게 유니캐스트로 전달
[전산실 DHCP] → "192.168.1.105 줄게" (공대 라우터에게 응답)
[공대 라우터] → 공대 PC에게 전달
Cisco 라우터 설정 예시:
interface GigabitEthernet0/1
description Engineering Building Network
ip address 192.168.1.1 255.255.255.0
ip helper-address 10.0.0.100 # 전산실 DHCP 서버 IP
ip helper-address 명령어가 바로 DHCP Relay Agent를 활성화하는 설정입니다.
IPv4에서 IP 주소가 고갈되면서 IPv6로 전환이 진행되고 있습니다. IPv6에서는 DHCP도 업그레이드되었습니다: DHCPv6.
IPv6는 두 가지 방식으로 자동 설정이 가능합니다:
# Linux에서 DHCPv6 클라이언트 실행
sudo dhclient -6 -v eth0
# 출력:
# Bound to *:546
# Listening on Socket/eth0
# Sending on Socket/eth0
# PRC: Confirming active lease (INIT-REBOOT).
# XMT: Forming Rebind, 0 ms elapsed.
# RCV: Reply message on eth0 from fe80::1.
DHCPv6 주소는 이렇게 생겼습니다:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
훨씬 길죠. IPv6는 주소 공간이 거의 무한대(2^128개)라서 고갈 걱정이 없습니다.
DHCP는 편리하지만, 보안 취약점도 있습니다. 스타트업에서 보안 감사를 받을 때 지적받은 내용들입니다.
시나리오:
제 PC가 아침에 부팅되면서 "DHCP 서버 있나요?" 외치는데, 진짜 회사 서버보다 불법 공유기가 더 빨리 응답하면?
[내 PC] → "DHCP 서버 있나요?"
[불법 공유기] → "나 여기! 192.168.100.50 써!" (가장 먼저 응답)
[회사 서버] → "나도 여기! 192.168.0.100 써!" (늦게 응답)
→ 내 PC는 불법 공유기의 IP를 받음
결과:
실제로 겪은 사례: 한 직원이 "제 책상 근처에 WiFi가 안 잡혀서" 개인 공유기를 몰래 설치했습니다. 악의는 없었지만, 그 주변 10명의 PC가 전부 그 공유기에 연결되어 회사 내부 서버 접속이 안 되는 사태가 발생했습니다.
공격 방식: 해커가 Python 스크립트를 돌려서 가짜 MAC 주소 수천 개를 생성하고, 각각에 대해 DHCP Discover를 보냅니다:
# 악의적 스크립트 예시 (교육 목적)
from scapy.all import *
for i in range(1, 255):
fake_mac = f"00:11:22:33:44:{i:02x}"
dhcp_discover = (
Ether(dst="ff:ff:ff:ff:ff:ff", src=fake_mac) /
IP(src="0.0.0.0", dst="255.255.255.255") /
UDP(sport=68, dport=67) /
BOOTP(chaddr=fake_mac) /
DHCP(options=[("message-type", "discover"), "end"])
)
sendp(dhcp_discover, iface="eth0")
DHCP 서버는 순진하게 각 요청마다 IP를 할당해줍니다:
결과: IP 풀이 동남 (Starvation) → 진짜 직원들은 IP를 못 받아서 인터넷 불가 → DoS 공격 성공
이런 공격을 막으려면 네트워크 스위치에서 DHCP Snooping 기능을 활성화해야 합니다.
동작 방식:
Cisco 스위치 설정 예시:
# DHCP Snooping 활성화
ip dhcp snooping
ip dhcp snooping vlan 10,20,30
# 신뢰할 수 있는 포트 지정 (DHCP 서버가 연결된 포트)
interface GigabitEthernet0/1
description Uplink to DHCP Server
ip dhcp snooping trust
# Rate Limiting (초당 최대 10개 DHCP 요청)
interface range GigabitEthernet0/2-24
ip dhcp snooping limit rate 10
프로젝트에서 이 설정을 적용한 후로 Rogue DHCP 문제가 완전히 사라졌습니다.
서버:
프린터:
CCTV/IoT 장비:
공유기/라우터:
"서버는 고정 IP가 필요한데, 일일이 서버에 가서 설정하기 귀찮아..."
해결책: DHCP Reservation (IP 예약)
DHCP 서버 설정에서 MAC 주소와 IP를 매핑해둡니다:
MAC 주소: 00:1A:2B:3C:4D:5E
예약 IP: 192.168.0.100
이렇게 하면:
장점:
집 공유기 설정 예시:
고정 IP 할당 (DHCP Reservation):
장치명: Synology NAS
MAC: 00:11:32:5E:3C:1A
IP: 192.168.0.10
장치명: Raspberry Pi
MAC: B8:27:EB:7A:3D:9F
IP: 192.168.0.20
어느 월요일 아침, 출근해서 노트북을 켰는데 "IP 주소 충돌" 에러가 떴습니다.
Windows 네트워크 오류:
"네트워크에서 이 IP 주소를 사용 중인 다른 컴퓨터가 있습니다"
인터넷이 완전히 안 됩니다. 팀 전체 회의가 30분 뒤인데...
원인 파악:
해결: IT 팀이 DHCP 범위와 고정 IP 범위를 분리했습니다:
DHCP 범위: 192.168.0.100 ~ 192.168.0.199 (100개)
고정 IP 범위: 192.168.0.1 ~ 192.168.0.99 (서버용)
특수 용도: 192.168.0.200 ~ 192.168.0.254 (프린터, CCTV 등)
그 이후로 IP 충돌은 한 번도 없었습니다. 결국 네트워크 설계를 제대로 해야 한다는 걸 이해했습니다.
집 공유기를 공장 초기화했을 때의 일입니다.
초기화 후 PC를 재부팅했는데 인터넷이 안 됐습니다. IP 주소를 확인해보니:
ipconfig
# 출력:
# 이더넷 어댑터 Ethernet:
# IPv4 주소: 169.254.123.45
# 서브넷 마스크: 255.255.0.0
169.254.x.x? 이게 뭐지?
검색해보니 APIPA (Automatic Private IP Addressing) 라는 기능이었습니다.
APIPA란?:
원인: 공유기 초기화 후 DHCP 서버 기능이 꺼져 있었습니다.
해결: 공유기 관리 페이지(192.168.0.1) 접속 → DHCP 서버 활성화 → PC 재부팅
DHCP 서버: 켜기 (On)
IP 시작: 192.168.0.100
IP 끝: 192.168.0.200
임대 시간: 86400초 (24시간)
PC가 재부팅되면서 정상적으로 192.168.0.105를 받았습니다.
집에서 홈서버를 운영하려고 포트포워딩을 설정했는데 외부에서 접속이 안 됐습니다.
환경:
문제: 개인 공유기에서 포트포워딩 설정했는데 안 됨.
원인: 더블 NAT
해결:
또는 더 깔끔하게:
배운 점: DHCP로 자동 설정이 편하긴 한데, 네트워크 구조를 제대로 이해하지 못하면 나중에 삽질합니다. 정리해본다면, DHCP는 네트워크의 시작점이지, 끝이 아니었습니다.
DHCP를 공부하면서 받아들였던 핵심 개념들:
카페에서 WiFi 연결만 하면 "자동으로 인터넷이 되는" 마법 같은 일이 사실은 DHCP라는 명확한 프로토콜 덕분이었습니다. 이제는 공유기 설정 페이지를 열어도 각 항목이 무슨 의미인지 확실히 이해하게 되었고, 회사 네트워크를 설계할 때도 자신 있게 의견을 낼 수 있게 되었습니다.
결국, DHCP는 단순히 "IP 자동 배정"이 아니라, 한정된 자원(IP 주소)을 효율적으로 관리하고 공유하는 분산 시스템이었습니다. 정말 와닿았던 개념입니다.