1. 개요

DHCP(Dynamic Host Configuration Protocol)는 기기가 네트워크에 붙을 때 IP 주소, 서브넷 마스크, 기본 게이트웨이, DNS 서버를 자동으로 받아 오는 프로토콜이다. 집에서는 공유기가 DHCP 서버 역할을 한다.

와이파이에 막 붙은 노트북은 아직 IP 가 없다. 그래서 출발 주소를 0.0.0.0 으로 비워 두고 LAN 전체에 브로드캐스트(같은 LAN 의 모두에게 보내기)하는 것으로 시작해, 네 번의 메시지를 주고받아 설정을 받는다.

노트북IP 없음 (0.0.0.0)공유기DHCP 서버① Discover — 서버를 찾는 브로드캐스트② Offer — 192.168.0.112 를 제안③ Request — 그 주소를 쓰겠다는 브로드캐스트④ Ack — 확정 + 설정값받는 MAC ff:ff:ff:ff:ff:ff · 출발 IP 0.0.0.0아직 확정 아님DHCP 서버가 여럿이어도 하나만 고른다IP .112 · 마스크 /24 · 게이트웨이 .1DNS 서버 · 임대 시간 (예: 24시간)· IP 가 없어서 MAC 브로드캐스트(점선)로 시작한다 — LAN 이 IP 보다 먼저 있다는 증거· 브로드캐스트라 라우터를 못 넘는다 — 그래서 LAN 마다 DHCP 서버가 있다 (집에서는 공유기)· 임대 시간의 절반이 지나면 같은 주소를 계속 쓰겠다고 공유기에 갱신을 요청한다· 받은 마스크는 같은 서브넷 판단에, 게이트웨이는 라우팅 테이블의 default 줄이 된다
주황 점선은 브로드캐스트, 파랑 실선은 공유기의 답 — 이 네 번의 교환이 LAN 과 서브넷을 짝지어 준다

2. 프로토콜 계층

DHCP 는 UDP 위에서 동작하는 응용 계층 프로토콜이다. 서버는 UDP 67번, 클라이언트는 68번을 쓴다. 하는 일은 그보다 아래인 IP 계층의 설정을 채우는 것이라, 계층으로 보면 위층이 아래층을 설정하는 특이한 구조다.

DHCP 가 실려 가는 모양L7 · DHCP 메시지응용 계층 프로토콜L4 · UDP서버 67번 · 클라이언트 68번L3 · IP0.0.0.0 → 255.255.255.255L2 · Ethernet받는 MAC ff:ff:ff:ff:ff:ff (모두)DHCP 가 정해 주는 것IP 주소 · 마스크L3 — 나는 누구이고 어디까지가 우리 서브넷인가기본 게이트웨이L3 — 모르는 곳은 누구에게 맡기나DNS 서버L7 — 이름은 누구에게 묻나임대 시간이 설정을 언제까지 쓰나· 응용 계층(L7) 프로토콜이 그 아래 L3 설정을 채운다 — 그래서 IP 가 정해지기 전에 IP 칸을 비워 두고 쓴다· TCP 가 아니라 UDP 인 이유: 연결을 맺을 내 주소가 아직 없고, 모두에게 보내는 브로드캐스트는 TCP 로 할 수 없다
DHCP 는 UDP 위의 응용 계층 프로토콜이지만, 하는 일은 IP 계층의 설정을 채우는 것이다

3. 메시지 종류

DHCP 메시지는 모두 같은 형식이고, 옵션 53번(메시지 종류)의 값으로 무슨 메시지인지 구분한다.

1
DISCOVER · 클라이언트
서버를 찾는 브로드캐스트
2
OFFER · 서버
쓸 주소를 제안
3
REQUEST · 클라이언트
그 주소를 쓰겠다고 요청 · 갱신 때도 씀
5
ACK · 서버
확정과 설정값
4
DECLINE · 클라이언트
이미 누가 쓰는 주소라 거절
6
NAK · 서버
요청 거절 · 처음부터 다시
7
RELEASE · 클라이언트
주소 반납
8
INFORM · 클라이언트
주소는 있고 다른 설정만 요청
실선 = 평소 오가는 네 개 (DORA) · 점선 = 예외 상황 · 주황 = 클라이언트가 보냄 · 파랑 = 서버가 보냄 · 숫자 = 옵션 53 의 값

평소에 오가는 건 1, 2, 3, 5 네 개다. 앞 글자를 따서 DORA 라고 부른다.

4. 메시지 구조

DHCP 메시지는 이전 프로토콜인 BOOTP 의 형식을 그대로 물려받았다. 고정된 칸들 뒤에 옵션이 붙는다.

Ethernet받는 MAC = 모두 (ff:ff…)IP0.0.0.0 → 255.255.255.255UDP68 → 67DHCP 메시지아래로 펼침ophtypehlenhops요청인지 응답인지 등 — 몰라도 됨xid — 거래 번호네 단계가 같은 번호로 짝을 맞춘다secsflags몰라도 됨ciaddr — 지금 내 IP처음엔 0.0.0.0yiaddr — 네가 쓸 IPOffer · Ack 에 192.168.0.112siaddrgiaddr — 릴레이릴레이를 거치면 그 라우터 IPchaddr — 요청한 기기의 MAC누구에게 준 주소인지 기록sname · file (192B)거의 안 씀magic cookie 63 82 53 63여기부터 옵션이라는 표시options (가변)진짜 알맹이53 종류: 1 Discover · 2 Offer3 Request · 5 Ack1 마스크 · 3 게이트웨이 · 6 DNS51 임대 시간 · 82 릴레이 정보아직 IP 가 없어서 출발 0.0.0.0, 도착 255.255.255.255 — UDP 위의 메시지지만 LAN 브로드캐스트로 배달된다
IP 를 받기 전에도 IP 패킷으로 보낸다 — 출발을 비워 두고 모두에게 브로드캐스트할 뿐이다

4.1. 주요 옵션

받는 설정
1서브넷 마스크
3기본 게이트웨이
6DNS 서버
51임대 시간 (초)
대화 관리
53메시지 종류
54응답한 서버 주소
50원하는 주소
갱신
58T1 · 갱신 시점
59T2 · 재바인딩 시점
릴레이
82가입자 회선 정보

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}

받은 값 다섯 개가 각각 어디에 쓰이는지 이으면 이렇다.

ACK 에 담긴 값yiaddr192.168.0.112패킷의 출발 주소 — 이제부터 내 IP옵션 1마스크 /24같은 서브넷 판단 — 같으면 ARP 로 직접, 아니면 게이트웨이로옵션 3게이트웨이 .1라우팅 테이블 default 줄 — 모르는 곳은 전부 여기로옵션 6DNS .1이름을 IP 로 바꿀 때 — 물어볼 서버옵션 51임대 24시간갱신 타이머 — T1 12시간 · T2 21시간
받은 값 다섯 개가 노트북의 출발 주소, 판단, 경로, 이름 풀이, 갱신을 각각 채운다

6. 임대와 갱신

DHCP 로 받은 주소는 빌린 것이다. 임대 시간이 정해져 있고, 기간 안에 갱신해야 계속 쓸 수 있다.

임대 24시간 (이 노트북이 받은 실제 값)그냥 쓴다갱신 시도재바인딩0Ack 받음T1 = 12시간 (50%)준 서버에게 직접 RequestT2 = 21시간 (87.5%)누구에게나 브로드캐스트24시간만료· 갱신이 성공하면 시계가 0 으로 돌아가고 같은 주소를 계속 쓴다 — 그래서 집 기기의 IP 가 잘 안 바뀐다· 21시간까지 공유기가 답이 없으면 다른 DHCP 서버라도 찾고, 24시간이 지나면 주소를 내려놓고 Discover 부터 다시 한다
T1 에서는 준 서버에게 조용히 묻고, T2 에서는 아무에게나 브로드캐스트로 묻는다

T1 과 T2 의 기본값은 임대 시간의 50% 와 87.5% 다. 위 노트북이 받은 값(24시간 · 12시간 · 21시간)이 정확히 이 기본값이다.

7. 릴레이

DHCP 의 시작은 브로드캐스트라 라우터를 넘지 못한다. 그래서 원칙적으로는 LAN 마다 DHCP 서버가 하나씩 있어야 한다. 통신사처럼 DHCP 서버를 중앙에 하나만 두려면, 각 LAN 의 라우터가 브로드캐스트를 받아 중앙 서버로 대신 전달한다. 이걸 DHCP 릴레이라고 한다.

우리 집KT (통신사)KT 안쪽 — 모르면 위로노트북IP 받는 쪽공유기서버 겸 클라이언트1받음: 192.168.0.112 /24default → 192.168.0.1받음: 공인 IPdefault → 국사 라우터① 공유기 → 노트북: 주소 · 마스크 · 게이트웨이② 국사 → 공유기: 공인 IP · 게이트웨이집 안 사설 IP 는 공유기가 직접 고른다국사 라우터DHCP 릴레이중앙 DHCP 서버한 곳에서 주소를 정함2Discover 브로드캐스트3릴레이 · giaddr = 국사WAN 의 공인 IP 를 정해 돌려줌· DHCP 의 시작은 브로드캐스트라 라우터를 넘지 못한다· 그래서 국사 라우터가 브로드캐스트를 받아 중앙 서버로 대신 전한다· 이때 giaddr 칸에 자기 IP 를, 옵션 82 에 가입자 회선을 적는다· 공유기의 default 가 국사 라우터를 가리키는 건 이렇게 받은 값이다· 국사 = 동네마다 있는 통신사 건물(전화국). 집집의 선이 여기로 모인다국사지역 집선백본국경다른 회사BGP아래쪽은 default 한 줄 — 위로 갈수록 아는 길이 많고, 백본과 국경은 BGP 로 받은 약 100만 줄을 든다
공유기는 안쪽에선 DHCP 서버, 바깥쪽에선 DHCP 클라이언트다 — default 는 이렇게 한 칸씩 위에서 내려온다

릴레이는 메시지의 giaddr 칸에 자기 IP 를 적는다. 요청한 공유기는 아직 IP 가 없어서, 중앙 서버는 이 값 하나로 두 가지를 해결한다.

① 어느 동네 주소를 줄까?② 답장은 어디로 보낼까?요청 (B 국사에서 옴)giaddr = 211.10.2.1중앙 DHCP 서버A 국사 · 211.10.1.0/24B 국사 · 211.10.2.0/24· giaddr 의 대역에 맞는 주소 덩어리를 고른다· 그래서 B 국사 공유기는 211.10.2.x 를 받는다공유기아직 IP 없음국사 라우터211.10.2.1중앙 서버브로드캐스트giaddr 적어 전달giaddr 로 답장MAC 으로 전달· 공유기는 IP 가 없어서 서버가 직접 답장할 수 없다· 서버는 giaddr(국사 라우터)로 답장을 보내고· 국사 라우터가 자기 LAN 에서 MAC 으로 전해 준다덤 · giaddr 는 어느 국사인지까지, 옵션 82 는 어느 가입자 회선(포트)인지까지 알려 준다 — 고정 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).”