> For the complete documentation index, see [llms.txt](https://jmxx219.gitbook.io/cs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jmxx219.gitbook.io/cs/network/dhcp.md).

# DHCP(Dynamic Host Configuration Protocol)

> 동적 호스트 설정 프로토콜

<br>

### 등장배경

* TCP/IP 프로토콜을 사용하는 모든 호스트들은 [IP 주소](/cs/network/ip.md), [서브넷 마스크](/cs/network/undefined-2.md)가 할당되어야 정상적으로 네트워크와 연결이 가능함
* 다른 망과 통신하기 위해서는 디폴트게이트웨이 주소를 알아야하고, IP 주소 대신 도메인 이름을 사용해 통신하기위해 [DNS 주소](/cs/network/dns.md)도 알아야함
* 일반 사용자들이 해당 주소들을 입력하는 것이 쉽지 않으므로 호스트 설정 프로토콜이 등장하게 되었음

<br>

## DHCP란?

* 개념
  * DHCP 서버에 의한 호스트 구성정보 **동작할당** 절차 정의
  * 호스트를 인터넷에 연결할때 `호스트 구성정보`를 자동으로 할당해주는 프로토콜
    * DHCP 서버 : `호스트 구성 정보`를 유지하고 있는 서버
  * IP주소, 서브넷마스크, 디폴트 게이트웨이 주소, DNS 서버주소 등을 자동으로 할당해주는 프로토콜
* 원리
  * 클라이언트가 DHCP 서버에게 IP를 요청하고 DHCP가 **현재 사용하지 않는 IP를 잠시 임대해주는 방식**
    * 같은 IP를 계속 부여하는 것이 아닌 임대 시간 동안 빌려주는 것
    * 항상 같은 IP가 아닌 그때 그때마다 동적으로 IP가 변경될 수 있음
  * 일반적인 가정집이나 사무실에서 가장 많이 사용되는 네트워크 사용 방법

<br>

### DHCP 특징

* 클라이언트/서버 형태로 동작함
  * 동적인 구성 정보를 요청/제공하는 프로토콜
  * DHCP 클라이언트(요청) 및 서버(응답)가 동일 서브넷에 있을 수도 있고, 다른 서브넷에 분리될 수 도 있음
    * 다른 서브넷에 있을 경우 [DHCP Relay Agent](#dhcp-relay-agent) 이용함
* `UDP 기반 프로토콜`
  * 서버가 사용 가능한 주소를 자동으로 확인하고 네트워크 클라이언트에게 IP 주소를 실시간으로 부여함
    * UDP 67(Server)번과 68(Client)번 포트를 사용함
  * DHCP는 네트워크 장비의 초기화 과정에서 일어나기 때문에 네트워크 구성 정보를 효율적으로, 빠르게 구성할 수 있어야 함
    * 신뢰성보다 속도가 더 중요하기 때문에 UDP를 사용함

<br>

#### 장점

* 사용자 편의성
  * ip 주소들을 외우고 있지 않아도 됨
* IP 주소 절약
  * 필요할 때만 할당하고, 동시 사용자 수만큼 할당함
* 신뢰성 높은 DHCP IP 주소 구성
  * 동일한 IP 주소를 사용하는 사용자들 사이 충돌 방지
* 높은 이동성
  * 사용자는 네트워크 범위내에서 어디서든지 모바일 장치 이용 가능
* 효율적인 네트워크 관리
  * DHCP 이용시 별도 IP 할당 서버가 필요하지 않으며 네트워크 관리 효율성 개선

<br>

#### 보안문제

* 승인받지 않은 DHCP 서버가 잘못된 정보를 클라이언트에게 제공할 위험성 존재
* 승인받지 않은 클라이언트가 DHCP서버를 가로채 리소스에 대한 접근 권한 얻을 위험성 존재
* 악성 클라이언트가 DHCP 리소스를 소모시킬 수 있는 위험성 존재

\ <br>

## 호스트 구성 정보 (Configuration Information)

> DHCP 서버는 클라이언트에 다음 기본 정보를 제공한다.

#### 기본 정보

* 호스트 IP 주소
  * 동일한 네트워크 주소인지, 다른 네트워크 주소인지 판별
* 서브넷 마스크(Subnetmast)
  * 네트워크 ID 필드 크기, 네트워크 주소 구분을 위한 필수 정보
  * 서브넷 마스크를 통해 해당 ip 주소와 연결된 네트워크 주소를 계산하고, 그 값을 통해 라우팅
* 디폴트 게이트웨이 주소(Default Gateway Address)
  * 자신의 네트워크에 연결된 라우터의 주소, 목적지 주소가 동일 네트워크에 존재하지 않을 때 IP 데이터그램을 전달할 다음 홉 주소

<br>

#### 추가 정보

* [DNS 서버 주소](https://jmxx219.gitbook.io/cs/network/pages/7Rn9x7YQbhOMGvRS1bw7#네임-서버dns-서버)
  * 지역 DNS 서버의 주소, DNS Query를 전달할 서버

<br>

> **디폴트 게이트웨이 주소**
>
> 기본적으로 host컴퓨터는 라우팅 테이블 정보가 없다. 따라서 자신과 연결되어있는 네트워크에 해당하는 목적지 주소가 있다면 해당 주소로 전송하면 된다. 하지만 그렇지 않을 경우 라우터로 패킷을 전송해야하고, 이 값을 디폴트 게이트웨이 주소라고 한다.

\ <br>

## DHCP 동작 절차

![스크린샷 2023-07-03 오후 3 54 51](https://github.com/jmxx219/CS-Study/assets/50795805/aac447b9-d89d-4d00-9893-7856927632fe)

1. DHCP 서버 발견 (DHCP Server Discovery)
   * DHCP서버를 찾기 위해 단말이 `DHCP Discover 메시지`를 브로드캐스트함
   * 동일 서브넷 안의 모든 단말들은 해당 메시지 수신할 수 있음
2. DHCP 서버 제안 (DHCP Server Offer)
   * Discover 메시지를 수신한 DHCP 서버는 자신을 알리기 위해 `DHCP Offer 메시지`를 브로드캐스팅(Broadcasting)함
     * DHCP Offer 메시지: 제안하는 IP주소, DHCP서버 ID, 임대기간 등 포함
   * Offer 메시지 또한 동일 서브넷 안의 모든 단말들이 수신
3. DHCP 요청 (DHCP Request)
   * DHCP서버 존재를 확인한 호스트는 `DHCP Request 메시지`를 브로드캐스팅함
     * DHCP Request 메시지: 자신에게 IP주소를 제안한 DHCP 서버의 ID 포함
   * 특정 DHCP 서버에 요청하며 나머지 DHCP서버도 요청 메시지를 인지
4. DHCP 확인 (DHCP Ack)
   * 서버는 DHCP Request 메시지의 `DHCP 서버 ID` 확인
   * 자신의 IP 주소와 동일한 경우
     * `DHCP Ack메시지`를 보로트캐스트 방식으로 전송하고 IP주소를 할당함
   * 자신의 IP 주소와 동일하지 않은 경우
     * 제안한 IP주소를 IP주소 풀에 그대로 유지

\ <br>

## DHCP Relay Agent

* 필요성
  * 일반적으로 DHCP 메시지는 브로드캐스팅되기 때문에 단말과 DHCP 서버는 반드시 동일 서브넷 상에 위치해야함
    * 그 이유는 라우터가 브로드캐스트 패킷을 다른 인터페이스로 전달하지 않기 때문에 단말이 송신한 DHCP 메세지가 라우터를 통해 DHCP 서버로 전달될 수 없기 때문
  * 하지만 이러한 제약 사항으로 DHCP 서버가 각 서브넷(랜)마다 위치해야만 하는데 실제 통신 사업자 망 혹은 기업망 환경에서 이와 같은 구성은 실용적이지 못함
  * 이와 같은 문제를 해결하기 위해 DHCP Relay Agent 개념이 생겨남
    * 라우터에 DHCP Relay Agent 기능을 설정하면, 서로 다른 서브넷에 위치하는 단말과 DHCP 서버간에도 DHCP 메시지 통신이 가능하게 됨
* 개념
  * 서로 다른 서브넷에 위치한 클라이언트가 DHCP 서버와 통신할 수 있도록 중계하는 역할
    * 가장 핵심적인 기능은 단말이 송신하는 DHCP 브로드캐스트 패킷을 유니캐스트로 변환하여 DHCP 서버에 전달하는 것
  * DHCP 서버가 없는 서브넷으로부터 다른 서브넷에 존재하는 1개 이상의 DHCP서버에게 DHCP 또는 `BOOTP` 요청을 중계(Relay)
* DHCP Relay Agent가 있는 환경에서 DHCP의 동작 원리
  1. \[단말 -> DHCP 서버] DHCP Discover Message
     * 단말이 Discover 패킷을 브로드캐스트하면 이를 DHCP Relay Agent가 수신하여 유니캐스트로 변환하여 DHCP 서버로 전달
  2. \[단말 <- DHCP 서버] DHCP Offer Message
     * DHCP 서버가 DHCP Relay Agent에게 유니캐스트로 보내면 이를 수신한 DHCP Relay Agent는 단말로 브로드캐스트로 변환하여 전송
  3. \[단말 -> DHCP 서버] DHCP Request Message
     * 단말이 Request 패킷을 브로드캐스트하면 이를 DHCP Relay Agent가 수신하여 유니캐스트로 변환하여 DHCP 서버로 전달
  4. \[단말 <- DHCP 서버] DHCP Ack Message
     * DHCP 서버가 DHCP Relay Agent로 유니캐스트로 보내면 이를 수신한 DHCP Relay Agent는 단말로 브로드캐스트로 변환하여 전송

<br>

> **BOOTP**
>
> * 정적으로 클라이언트/서버 형태의 구성정보를 제공하는 프로토콜
> * 처음으로 부팅된 컴퓨터, 디스크를 갖지 않은 컴퓨터에게 IP주소등 구성정보 제공
> * 지금은 거의 사용되지 않은 구형 프로토콜, 상위버전읜 동적 DHCP와는 완벽 호환

\ <br>

## DHCP의 IP주소 할당 방식

* 동적 할당
  * 관리자가 DHCP에 IP주소를 유보해놓은 경우 동적할당 방식 활용
  * 제한된 수량의 IP주소를 '재사용', '한시적 사용', '자동 재활용' 가능
* 자동 할당
  * DHCP서버는 관리자가 정한 규칙에 따라 IP주소 클라이언트에 **영구할당하는 방식**
  * DHCP서버에 이전 IP주소 할당 데이터가 있고, 동일한 IP주소를 동일한 클라이언트에게 재할당할 수 있다는 점에서 동적할당과 다름
* 수동 할당
  * 관리자가 각 클라이언트에 대한 고유한 식별자를 IP주소에 수동할당하는 방식
  * 미리 할당된 IP주소를 장치에게 전달해 장치가 IP주소 사용

\ <br>
