# Protocolo de configuración dinámica de host

El protocolo de configuración dinámica de host (en inglés: Dynamic Host Configuration Protocol, también conocido por sus siglas de DHCP), desarrollado a partir de 1985 como extensión de BOOTP, es un protocolo de red de tipo cliente/servidor mediante el cual un servidor DHCP asigna dinámicamente una dirección IP y otros parámetros de configuración de red a cada dispositivo en una red para que puedan comunicarse con otras redes IP. Este servidor posee una lista de direcciones IP dinámicas y las va asignando a los clientes conforme estas van quedando libres, sabiendo en todo momento quién ha estado en posesión de esa IP, cuánto tiempo la ha tenido y a quién se la ha asignado después. Así los clientes de una red IP pueden conseguir sus parámetros de configuración automáticamente. Este protocolo por primera vez se publicó en octubre de 1993 (RFC 1531) y su implementación actual para IPv4 está en la RFC 2131 (marzo de 1997); para IPv6 está descrita en RFC 3315 (julio de 2003).

## Historia

DHCP se definió por primera vez como un protocolo de seguimiento estático de las normas en el RFC 1531 en octubre de 1993, como una extensión del protocolo Bootstrap (BOOTP). La motivación para extender BOOTP /etc/sysconfig/network-scripts/ifcfg-enpXs0 era porque BOOTP requería intervención manual para completar la información de configuración en cada cliente, y no proporciona un mecanismo para la recuperación de las direcciones IP en desuso. Puede ser usado para entregar un amplio rango de "option subnet-mask" parámetros de configuración extra a los clientes IP, incluyendo parámetros específicos a ciertas plataformas. Debido a algunos errores en el proceso editorial, fue rápidamente reemitido como RFC 1541.
El protocolo BOOTP a su vez fue definido por primera vez en el RFC 951 como un reemplazo para el protocolo RARP (del inglés "Reverse Address Resolution Protocol"), o resolución de direcciones inversa. La principal motivación para la sustitución de RARP con BOOTP fue que RARP era un protocolo de la capa de enlace de datos. Esto hizo más difícil su aplicación /etc/sysctl.d/99-sysctl.conf en muchas plataformas de servidores, y requería un servidor presente en cada enlace de red individual. BOOTP introdujo la innovación de un agente de retransmisión, lo que permitió el envío de paquetes BOOTP fuera de la red local utilizando enrutamiento IP estándar, por lo que un servidor central de BOOTP podría servir de anfitriones en muchas subredes IP.
Muchos trabajaron para mejorar el protocolo, ya que ganó popularidad y en 1997 se agregó el tipo de mensaje DHCPINFORM y otros cambios menores en el RFC 2131, y al 2016 se mantiene como el estándar para redes IPv4. /etc/sysctl.d/99-sysctl.conf DHCPv6 fue documentado originalmente en el RFC 3315 en 2003 y luego complementado por muchos otros RFC. El RFC 3633 añadió un mecanismo de delegación de prefijo para DHCPv6. DHCPv6 se amplió aún más para proporcionar información a los clientes con la configuración automática de direcciones sin estado en el RFC 3736.

## Asignación de direcciones IP

Cada dirección IP debe configurarse manualmente en cada dispositivo y, si el dispositivo se mueve a otra subred, se debe configurar otra dirección IP diferente. El DHCP le permite al administrador supervisar y distribuir de forma centralizada las direcciones IP necesarias y, automáticamente, asignar y enviar una nueva IP si fuera el caso en que el dispositivo es conectado en un lugar diferente de la red.
El protocolo DHCP incluye tres métodos de asignación de direcciones IP:

### Asignación manual o estática

    Asigna una dirección IP a una máquina determinada. Se suele utilizar cuando se quiere controlar la asignación de dirección IP a cada cliente, y evitar, también, que se conecten clientes no identificados.

### Asignación automática

    Asigna una dirección IP a una máquina cliente la primera vez que hace la solicitud al servidor DHCP y hasta que el cliente la libera. Se suele utilizar cuando el número de clientes no varía demasiado.

### Asignación dinámica

    El único método que permite la reutilización dinámica de las direcciones IP. El administrador de la red determina un rango de direcciones IP y cada dispositivo conectado a la red está configurado para solicitar su dirección IP al servidor cuando la tarjeta de interfaz de red se inicializa. El procedimiento usa un concepto muy simple en un intervalo de tiempo controlable. Esto facilita la instalación de nuevas máquinas clientes.
Algunas implementaciones de DHCP pueden actualizar el DNS asociado con los servidores para reflejar las nuevas direcciones IP mediante el protocolo de actualización de DNS establecido en RFC 2136 (Inglés).
El DHCP es una alternativa a otros protocolos de gestión de direcciones IP de red, como el BOOTP (Bootstrap Protocol). DHCP es un protocolo más avanzado, pero ambos son los usados normalmente.
En Windows 98 y posteriores, cuando el DHCP es incapaz de asignar una dirección IP, se utiliza un proceso llamado "Automatic Private Internet Protocol Addressing".

## Parámetros configurables

Un servidor DHCP puede proveer de una configuración opcional al dispositivo cliente. Dichas opciones están definidas en el RFC 2132. Algunas de las opciones configurables son:
* Dirección del servidor DNS
* Nombre DNS
* Puerta de enlace de la dirección IP
* Dirección de Publicación Masiva (broadcast address)
* Máscara de subred
* Tiempo máximo de espera del ARP (Protocolo de Resolución de Direcciones según siglas en inglés)
* MTU (Unidad de Transferencia Máxima según siglas en inglés) para la interfaz
* Servidores NIS (Servicio de Información de Red según siglas en inglés)
* Dominios NIS
* Servidores NTP (Protocolo de Tiempo de Red según siglas en inglés)
* Servidor SMTP
* Servidor TFTP
* Nombre del servidor de nombres de Windows (WINS)

## Implementaciones

Microsoft introdujo el DHCP en sus Servidores NT con la versión 3.5 de Windows NT a finales de 1994.
El Consorcio de Software de Internet (ISC: Internet Software Consortium) publicó distribuciones de DHCP para Unix con la versión 1.0.0 del ISC DHCP Server el 6 de diciembre de 1997 y una versión (2.0) que se adaptaba mejor al RFC el día 22 de junio de 1999. Se puede encontrar el software en https://web.archive.org/web/20050102090919/http://www.isc.org/sw/dhcp/
Otras implementaciones importantes incluyen:
* Cisco: un servidor DHCP habilitado en Cisco IOS 12.0 en el mes de febrero de 1999
* Sun: añadió el soporte para DHCP a su sistema operativo Solaris el 8 de julio de 2001.
Además, varios routers incluyen soporte DHCP para redes de hasta 255 dispositivos.

## Anatomía del protocolo

(Autoridad de Números Asignados en Internet según siglas en inglés) en BOOTP: 67/UDP para las computadoras servidor y 68/UDP para los clientes.
A continuación, se describe la secuencia de intercambio de mensajes entre el cliente DHCP y el servidor DHCP.

### DHCP Discovery

DHCP Discovery es una solicitud DHCP realizada por un cliente de este protocolo para que el servidor DHCP de dicha red de computadoras le asigne una dirección IP y otros Parámetros DHCP como la máscara de red o el nombre DNS. La solicitud va contenida en un mensaje de descubrimiento que se difunde a todas las máquinas en la red.
DHCPDISCOVER :
| IP: source=0.0.0.0; destination=255.255.255.255 UDP: source port=68; destination port=67 ||||
| Octet 0 | Octet 1 | Octet 2 | Octet 3 |
| OP | HTYPE | HLEN | HOPS |
| 0x01 | 0x01 | 0x06 | 0x00 |
| XID ||||
| 0x3903F326 ||||
| SECS | SECS | FLAGS | FLAGS |
| 0x0000 | 0x0000 | 0x0000 | 0x0000 |
| CIADDR (Client IP address) ||||
| 0x00000000 ||||
| YIADDR (Your IP address) ||||
| 0x00000000 ||||
| SIADDR (Server IP address) ||||
| 0x00000000 ||||
| (Gateway IP address) ||||
| 0x00000000 ||||
| CHADDR (Client hardware address) ||||
| 0x00053C04 ||||
| 0x8D590000 ||||
| 0x00000000 ||||
| 0x00000000 ||||
| 192 octets of 0s, or overflow space for additional options; BOOTP legacy. ||||
| [Magic cookie] ||||
| 0x63825363 (En formato IP es 99.130.83.99 (RFC-1497)) ||||
| DHCP options ||||
| 0x350101 53: 1 (DHCP Discover) ||||
| 0x3204c0a00164 50: 192.168.1.100 requested ||||
| 0x370401030f06 55 (Parameter Request List):1 (Request Subnet Mask),, 3 (Router),, 15 (Domain Name), y 6 (Domain Name Server) ||||
| 0xff 255 (Endmark) ||||

### DHCP Offer

DHCP Offer es el paquete de respuesta del Servidor DHCP a un cliente DHCP ante su petición de la asignación de los Parámetros DHCP. Para ello involucra su dirección MAC (Media Access Control). Este mensaje contiene una dirección IP disponible que el servidor está dispuesto a asignar al cliente, junto con los otros parámetros de configuración. El servidor puede enviar múltiples ofertas de asignación de direcciones IP y otros parámetros de configuración al cliente.
DHCPOFFER :
| IP: source=192.168.1.1; destination=255.255.255.255 UDP: source port=67; destination port=68 ||||
| Octet 0 | Octet 1 | Octet 2 | Octet 3 |
| OP | HTYPE | HLEN | HOPS |
| 0x02 | 0x01 | 0x06 | 0x00 |
| XID ||||
| 0x3903F326 ||||
| SECS | SECS | FLAGS | FLAGS |
| 0x0000 | 0x0000 | 0x0000 | 0x0000 |
| CIADDR (Client IP address) ||||
| 0x00000000 ||||
| YIADDR (Your IP address) ||||
| 0xC0A80164 (192.168.1.100) ||||
| SIADDR (Server IP address) ||||
| 0xC0A80101 (192.168.1.1) ||||
| GIADDR (Gateway IP address) ||||
| 0x00000000 ||||
| CHADDR (Client hardware address) ||||
| 0x00053C04 ||||
| 0x8D590000 ||||
| 0x00000000 ||||
| 0x00000000 ||||
| 192 octets of 0s; BOOTP legacy. ||||
| Magic cookie ||||
| 0x63825363 (En formato IP es 99.130.83.99 (RFC-1497)) ||||
| DHCP options ||||
| 53: 2 (DHCP Offer) ||||
| 1 (subnet mask): 255.255.255.0 ||||
| 3 (Router): 192.168.1.1 ||||
| 51 (IP address lease time): 86400s (1 day) ||||
| 54 (DHCP server): 192.168.1.1 ||||
| 6 (DNS servers): 9.7.10.15, 9.7.10.16, 9.7.10.18 ||||

### DHCP Request

Después de recibir las ofertas, el cliente DHCP selecciona una oferta específica de los paquetes recibidos de DHCP Offer. El cliente envía un mensaje de solicitud al servidor DHCP correspondiente, indicando que desea aceptar esa oferta en particular. El mensaje contiene la dirección IP de la oferta seleccionada.
DHCPREQUEST :
| OP | HTYPE | HLEN | HOPS |
| 0x01 | 0x01 | 0x06 | 0x00 |
| XID ||||
| 0x3903F326 ||||
| SECS | SECS | FLAGS | FLAGS |
| 0x0000 | 0x0000 | 0x0000 | 0x0000 |
| CIADDR ||||
| 0x00000000 ||||
| YIADDR ||||
| 0x00000000 ||||
| SIADDR ||||
| GIADDR ||||
| 0x00000000 ||||
| CHADDR ||||
| 0x00053C04 ||||
| 0x8D590000 ||||
| 0x00000000 ||||
| 0x00000000 ||||
| 192 octets of 0's. BOOTP legacy ||||
| Magic Cookie ||||
| 0x63825363 (En formato IP es 99.130.83.99 (RFC-1497)) ||||
| DHCP Options ||||
| DHCP option 53: DHCP Request ||||
| DHCP option 50: 192.168.1.100 requested ||||
| DHCP option 54: 192.168.1.1 DHCP server. ||||

### DHCP Acknowledge

Al recibir el mensaje de solicitud del cliente, el servidor la reconoce y le envía un acuse de recibo o mensaje de aceptación DHCP, se inicia la fase final del proceso de configuración. Esta fase implica el reconocimiento con el envío de un paquete al cliente. Este paquete confirma que la dirección IP solicitada ha sido asignada al cliente e incluye la duración de la conexión y cualquier otra información de configuración que el cliente pueda tener solicitada. En este punto, el proceso de configuración TCP/IP se ha completado. El servidor reconoce la solicitud y la envía acuse de recibo al cliente. El sistema en su conjunto espera que el cliente configure su interfaz de red con las opciones suministradas. El servidor DHCP responde a la DHCPREQUEST con un DHCPACK, completando así el ciclo de iniciación. La dirección origen es la dirección IP del servidor de DHCP y la dirección de destino es todavía 255.255.255.255. El campo YIADDR contiene la dirección del cliente, y los campos CHADDR y DHCP: Client Identifier campos son la dirección física de la tarjeta de red en el cliente. La sección de opciones del DHCP identifica el paquete como un ACK.
DHCPACK :
| UDP Src=192.168.1.1 sPort=67 Dest=255.255.255.255 dPort=68 ||||
| OP | HTYPE | HLEN | HOPS |
| 0x02 | 0x01 | 0x06 | 0x00 |
| XID ||||
| 0x3903F326 ||||
| SECS | SECS | FLAGS | FLAGS |
| 0x0000 | 0x0000 | 0x0000 | 0x0000 |
| CIADDR (Client IP Address) ||||
| 0x00000000 ||||
| YIADDR (Your IP Address) ||||
| 0xC0A80164 ||||
| SIADDR (Server IP Address) ||||
| 0x00000000 ||||
| GIADDR (Gateway IP Address switched by relay) ||||
| 0x00000000 ||||
| CHADDR (Client Hardware Address) ||||
| 0x00053C04 ||||
| 0x8D590000 ||||
| 0x00000000 ||||
| 0x00000000 ||||
| 192 octets of 0's. BOOTP legacy ||||
| Magic Cookie ||||
| 0x63825363 (En formato IP es 99.130.83.99 (RFC-1497)) ||||
| DHCP Options ||||
| DHCP option 53: DHCP ACK ||||
| DHCP option 1: 255.255.255.0 subnet mask ||||
| DHCP option 3: 192.168.1.1 router ||||
| DHCP option 51: 1 day IP lease time ||||
| DHCP option 54: 192.168.1.1 DHCP server ||||

### Confidencialidad

En un contexto de proveedor de Internet, los registros DHCP de asignación de direcciones o bien contienen o están vinculadas a información de identificación personal confidencial, los datos de contacto del cliente. Estos son atractivos para los spammers, y podrían ser buscados para "expediciones de pesca" por las agencias de policía o litigantes. Por lo menos una aplicación imita la política de Canadian Library Association para la circulación del libro y no retiene información de identificación una vez que el "préstamo" ha terminado.

## Parámetros de configuración del cliente

El servidor DHCP puede proporcionar parámetros de configuración opcionales para el cliente. El RFC 2132 describe las opciones de DHCP disponibles definidas por Internet Assigned Numbers Authority (IANA) - Parámetros DHCP y BOOTP.
Un cliente DHCP puede seleccionar, manipular y sobrescribir los parámetros proporcionados por un servidor DHCP.