이 포스팅은 공부 목적으로 작성된 포스팅입니다. 왜곡된 내용이 포함되어 있을 수 있습니다.
DHCP
DHCP은 Dynamic Host Configuration Protocol 으로서 host에게 IP를 할당하는 프로토콜이다. 정확하게 말하면 사설IP와 기타 구성 정보를 제공받는 프로토콜이다.(그래서 Dynamic Host Address Protocol이 아니고 Dynamic Host Configuration Protocol이다)
우리는 사실 매일 DHCP를 사용하고 있다. 유선 네트워크(이더뎃) 또는 와이파이 사용하기 위해 컴퓨터를 네트워크에 연결해야하는데 이때 DHCP를 통해 라우터 또는 공유기에 연결한다.
Configuration(Subnet Mask)
사용중인 IP address를 확인하기 위해 ipconfig, ifconfig 명령어를 사용하면 IPv4주소 이외에도 서브넷 마스크와 게이트웨이 주소를 확인할 수 있다. 이러한 상세 설정 정보를 DHCP프로토콜을 통해 DHCP Server에게 할당받는다.
STEP
DHCP는 크게는 4개의 step를 통해 진행된다.
- DISCOVER: Client가 IP주소 요청을 브로드캐스트
- OFFER: dhcp server가 IP 주소를 브로드캐스트 OR 유니캐스트
- REQUEST: Client가 해당 IP 사용 브로드캐스트
- ACK: dhcp server 승인 브로드캐스트 OR 유니캐스트
DHCP Message
DHCP는 아래와 같은 Message format를 사용한다.
송신자: IP주소를 요청하는 클라이언트
- op: operation code (Client -> server :1) -> message의 방향
- htype: hardware type (1: ethernet) -> 하드웨어 주소 타입(mac주소)
- hlen: hardware address len (6: ethernet) -> 하드웨어 주소 길이
- hops: hop (client set 0) -> 홉 카운드, 송신자에서 0으로 지정된다.
- xid: transaction ID (association identifier) -> 송신자가 난수값을 설정한다. message의 식별자가 된다.
- secs: second elapsed(client set 0) -> 경과 시간
- flags: broadcast flag -> 브로드 캐스트 플래그, 브로드 캐스트인지 명시
- ciaddr: clent IP address -> 호스트 IP 주소, 확정나면 채워진다.
- yiaddr: your IP address -> 제시된 IP 주소, DHCP server가 송신자에게 IP주소를 제공한다.
- siaddr: server IP address -> DHCP 서버 주소
- giaddr: relay agent or gateway -> 게이트웨이 주소 or 릴레이 에이전트 주소
- chaddr client hardware address -> 송신자의 mac 주소
- sname: server name -> 서버 호스트 이름
- file: boot filename
- options: 기간, 서브넷 ( ~312 byte)
options 필드가 가변 길이이기 때문에 최대 576 byte를 가진다.
DISCOVER
Client가 IP주소 요청을 브로드캐스트한다.
op: 1
options: (53:1:1->DHCPDISCOVER
61:var:something -> client identifier)
xid: 난수값
udp 255.255.255.255(브로드캐스트)
OFFER
dhcp server가 IP 주소를 브로드캐스트 OR 유니캐스트
op: 2
options: (53:1:2->DHCPOFFER,
54:4:192.168.0.1 ->server identifier)
ciaddr: 0.0.0.0
yiaddr: 192.168.0.2
siaddr: 192.168.0.1
xid: 받은 값
udp 255.255.255.255(브로드캐스트)
options: 서브넷, 유효기간
Request
Client가 해당 IP 사용 브로드캐스트
op: 1
options: (53:1:3->DHCPREQUEST
50:4:192.168.0.2 -> yiaddr)
ciaddr: 0.0.0.0
yiaddr: 192.168.0.2
siaddr: 192.168.0.1
xid: 받은 값
udp 255.255.255.255(브로드캐스트)
ACK
ACK: dhcp server 승인 브로드캐스트 OR 유니캐스트
op: 2
options: (53:1:5->DHCPACK
50:4:192.168.0.2 -> yiaddr ->option에 yiaddr와 같은 값을 보내주기도 한다
54:4:192.168.0.1 ->server identifier)
yiaddr: 192.168.0.2
siaddr: 192.168.0.1
xid: 받은 값
udp 255.255.255.255(브로드캐스트 or 유니캐스트)
위의 4가지 이외에도 메세지가 몇개 더 있다.
RELEASE
DHCP 서버에게 해당 사설 IP 사용을 다했다고 알린다.
op: 1
options: (53:1:5->DHCRELEASE
50:4:192.168.0.2 -> yiaddr
54:4:192.168.0.1 ->server identifier)
udp 유니캐스트
NACK
DHCP 서버가 Client가 REQUEST 한 IP address가 사용 불가능한 경우(중간에 다른 Client 에게 할당된 이유)
op: 2
options: (53:1:6->DHCPNACK)
ciaddr: 192.168.0.2
siaddr: 192.168.0.1
xid: 받은 값
udp 255.255.255.255(브로드캐스트)
DECLINE
Client 가 DHCP Server가 제시한 사설 IP가 사용불가능 한 경우(ARP 이용)
op: 1
options: (53:1:4->DHCPDECLINE)
ciaddr: 192.168.0.2
siaddr: 192.168.0.1
xid: 받은 값
udp 255.255.255.255(브로드캐스트)
과정을 요약하면 아래와 같다.
REUSE CASE
우리가 사용하는 사설 IP 주소를 생각해본다면 주기적으로 사설 IP 주소가 만료될때 마다 DHCP를 처음부터 진행하는 것은 불필요하다.(DHCP 서버와 사용가능한 사설 IP 주소를 알고 있는 상태이기 때문에)
따라서 재사용의 경우 DISCOVER과 OFFER를 제외한 REQUEST 부터 진행한다.
REQUEST(갱신)
op: 1
options: (53:1:3->DHCPREQUEST
50:4:192.168.0.2 -> 이전 IP address
61:var:something -> client identifier)
ciaddr: 0 or 192.168.0.2
siaddr: 0
xid: 받은 값(새로운 값일 수 도 있다)
udp 255.255.255.255(브로드캐스트)
나머지는 기존과 동일
Example
학교 와이파이에 접속할때 실제 DHCP 과정을 살펴보자
실제로는 DHCP server와 client 간에는 유니캐스트로 통신이 진행되었고, 릴레이 에이전트를 사용했다. 실제 환경에서는 DHCP server가 하나의 라우터마다 있는 것이 아니므로 릴레이 에이전트를 많이 사용할 것으로 추측됨
공부하면서 생각해본 내용
왜 DISCOVER는 브로드 캐스트를 해야할까?
DHCP 서버 주소를 모르기 때문에 유니캐스트는 불가하다.
왜 REQUEST는 DHCP 서버를 알고 있는 상황일텐데 브로드 캐스트할까?
문서에서 확인된 바로는 DHCP 서버가 여려개 있다고 생각하면 여러 DHCP 서버에서 OFFER를 보낼텐데 선택한 DHCP 서버가 아니더라도 해당 서버에게 OFFER를 통해 너네가 제공한 OFFER를 사용하지 않겠다고 알려줘야한다고 한다.
그러면 REQUEST 재요청 환경에서는 브로드 캐스트할 필요 없지 않나?
추측으로는 DHCP 서버가 동일한 사설IP를 제공할 수 있는 거 같다. 그러면 DHCP 서버들에게 온 ACK 메세지중에 먼저 온것을 처리하는 거 같다(잘 납득되지 않는다.)
재요청 주기는 어느정도인가?
T1(50%)에 첫 번째 갱신 시도, T2(87.5%)에 두 번째 갱신을 시도한다. 해당 수치의 근거는 모르겠다.
OFFER와 ACK는 어떻게 브로드캐스트와 유니캐스트를 선택할까?
문서에는 flag에서 유니캐스트를 지원안하는 경우 브로드캐스트하고, relay agent가 아니고 ciaddr가 0이 아닌 경우 유니캐스트를 지원한다고 한다.
OPTION 값에 ciaddr와 같이 기존 값들이 중복으로 사용된다고 알고 있는데, 어떤 경우인가?
이거는 명확한 규칙은 없는것 같고 네트워크 장비마다 다른것 같다. 네트워크를 공부하면서 이렇게 애매모호한 경우를 몇번 봤는데, 세밀하게 경우를 나누어서 생각하기 보다는 이해하고 납득하는 시각으로 보는게 맞는 거 같다. 확실하게 하고 싶어서 문서나 레퍼런스를 봐도 글마다 약간 다르게 소개되고 있다.
출처
https://datatracker.ietf.org/doc/html/rfc2131
RFC 2131: Dynamic Host Configuration Protocol
The Dynamic Host Configuration Protocol (DHCP) provides a framework for passing configuration information to hosts on a TCPIP network. DHCP is based on the Bootstrap Protocol (BOOTP), adding the capability of automatic allocation of reusable network addres
datatracker.ietf.org