1. 개요
DHCP(Dynamic Host Configuration Protocol)는 기기가 네트워크에 붙을 때 IP 주소, 서브넷 마스크, 기본 게이트웨이, DNS 서버를 자동으로 받아 오는 프로토콜이다. 집에서는 공유기가 DHCP 서버 역할을 한다.
와이파이에 막 붙은 노트북은 아직 IP 가 없다. 그래서 출발 주소를 0.0.0.0 으로 비워 두고 LAN 전체에 브로드캐스트(같은 LAN 의 모두에게 보내기)하는 것으로 시작해, 네 번의 메시지를 주고받아 설정을 받는다.
2. 프로토콜 계층
DHCP 는 UDP 위에서 동작하는 응용 계층 프로토콜이다. 서버는 UDP 67번, 클라이언트는 68번을 쓴다. 하는 일은 그보다 아래인 IP 계층의 설정을 채우는 것이라, 계층으로 보면 위층이 아래층을 설정하는 특이한 구조다.
3. 메시지 종류
DHCP 메시지는 모두 같은 형식이고, 옵션 53번(메시지 종류)의 값으로 무슨 메시지인지 구분한다.
평소에 오가는 건 1, 2, 3, 5 네 개다. 앞 글자를 따서 DORA 라고 부른다.
4. 메시지 구조
DHCP 메시지는 이전 프로토콜인 BOOTP 의 형식을 그대로 물려받았다. 고정된 칸들 뒤에 옵션이 붙는다.
4.1. 주요 옵션
5. 받는 값
macOS 에서는 마지막으로 받은 DHCP 응답을 그대로 볼 수 있다. 아래는 집 공유기에게 받은 ACK 의 일부다.
ipconfig getpacket en0
dhcp_message_type (uint8): ACK 0x5
yiaddr = 192.168.0.112
server_identifier (ip): 192.168.0.1
lease_time (uint32): 0x15180 ← 86400초 = 24시간
renewal_t1_time_value (uint32): 0xa8c0 ← 43200초 = 12시간
rebinding_t2_time_value (uint32): 0x12750 ← 75600초 = 21시간
subnet_mask (ip): 255.255.255.0
router (ip_mult): {192.168.0.1}
domain_name_server (ip_mult): {192.168.0.1}
받은 값 다섯 개가 각각 어디에 쓰이는지 이으면 이렇다.
6. 임대와 갱신
DHCP 로 받은 주소는 빌린 것이다. 임대 시간이 정해져 있고, 기간 안에 갱신해야 계속 쓸 수 있다.
T1 과 T2 의 기본값은 임대 시간의 50% 와 87.5% 다. 위 노트북이 받은 값(24시간 · 12시간 · 21시간)이 정확히 이 기본값이다.
7. 릴레이
DHCP 의 시작은 브로드캐스트라 라우터를 넘지 못한다. 그래서 원칙적으로는 LAN 마다 DHCP 서버가 하나씩 있어야 한다. 통신사처럼 DHCP 서버를 중앙에 하나만 두려면, 각 LAN 의 라우터가 브로드캐스트를 받아 중앙 서버로 대신 전달한다. 이걸 DHCP 릴레이라고 한다.
릴레이는 메시지의 giaddr 칸에 자기 IP 를 적는다. 요청한 공유기는 아직 IP 가 없어서, 중앙 서버는 이 값 하나로 두 가지를 해결한다.
7.1. 집 공유기의 두 역할
공유기는 양쪽에서 역할이 다르다. 안쪽(LAN)에서는 노트북과 폰에게 사설 주소를 나눠 주는 DHCP 서버이고, 바깥쪽(WAN)에서는 통신사에게 공인 주소를 받는 DHCP 클라이언트다.
7.2. PPPoE 와의 관계
한국 통신사는 회선에 따라 DHCP 대신 PPPoE 를 쓰기도 한다. PPPoE 는 아이디와 비밀번호로 접속해 세션을 맺고 주소를 받는 방식이다. 방식은 달라도 공유기 WAN 이 공인 주소와 게이트웨이를 받는다는 결과는 같다.
8. 확인 명령
# macOS
ipconfig getpacket en0 # 받은 DHCP 응답 전체
ifconfig en0 # 내 IP · 마스크
route -n get default # 기본 게이트웨이
sudo tcpdump -i en0 -nn -v 'port 67 or port 68' # DHCP 패킷 보기
sudo ipconfig set en0 DHCP # 주소 다시 받기
# Linux
ip addr show # 내 IP · 마스크
ip route show default # 기본 게이트웨이
sudo tcpdump -i eth0 -nn -v 'port 67 or port 68' # DHCP 패킷 보기
journalctl -u systemd-networkd # DHCP 클라이언트 로그 (환경마다 다름)
9. 관련 문서
- ARP — DHCP 로 받은 게이트웨이 주소의 MAC 을 찾는다
- Subnet — DHCP 가 나눠 주는 주소의 범위
- LAN — Discover 브로드캐스트가 닿는 범위. 릴레이가 없으면 서버도 이 안에 있어야 한다
- Network & K8s.01-2 Across the Network — LAN 과 서브넷, 기본 경로가 내려오는 사슬
- Service — 쿠버네티스에서는 Pod 주소를 DHCP 가 아니라 CNI 가 나눠 준다
10. 출처
정의, 동작 순서, 갱신 시점은 RFC 2131 에, 옵션 번호는 RFC 2132 에, 릴레이 정보는 RFC 3046 에 근거한다.
“The Dynamic Host Configuration Protocol (DHCP) provides a framework for passing configuration information to hosts on a TCPIP network.”
“The client then broadcasts the DHCPDISCOVER on the local hardware broadcast address to the 0xffffffff IP broadcast address and ‘DHCP server’ UDP port.”
“T1 defaults to (0.5 * duration_of_lease). T2 defaults to (0.875 * duration_of_lease).”