一、DHCP简介
**DHCP(Dynamic Host Configuration Protocol)**动态主机配置协议,前身是BOOTP协议。在大型局域网中,需要给很多主机配置地址信息,如果采用传统手工配置(累死),效率太低,因此采用此协议可以很方便的给主机配置各种地址信息,例如IP地址,SubMask、网关地址、DNS等等。
下面进行简单介绍,下面所述中Client值得就是DHCP Client,Server指的是DHCP Server。
(1)DHCP协议理解
- **定义:**DHCP:Dynamic Host Configuration Protocol,动态主机配置协议,是一个应用在局域网中的网络协议,它使用UDP协议工作。
- **理解:**DHCP协议就是一个基于UDP协议工作在局域网内的网络协议,其最终的目的就是获取响应的IP地址,其中这过程中有多种分配方式,以及发送报文的格式要求等。
- **作用:**动态分配IP地址,过程自动化,终端无需一一手工配置,配置信息统一管理(DNS,网关),IP地址有限、需要大量配置IP地址、经常移动终端。
- **好处:**提高配置IP地址效率,减少配置工作量,减少IP地址冲突。
- 分配IP地址方式:
- **(1)手工配置方式:**通过网络管理员手工配置某台客户端特定的IP地址,当客户端请求分配时,DHCP服务器就将手动配置的IP地址分配给客户端。。
- **(2)自动配置方式:**当DHCP客户端第一次想服务端租用到第一个IP地址后,就将这个IP地址永久分配给客户端使用。
- **(3)动态配置方式:**服务器暂时分配一个IP地址给客户端,根据租约到期或者续约租期的方式来管理分配的IP地址。
(2)DHCP报文格式
2.1 DHCP报文封装格式
|----------|-----------------|----------|------------|
| DHCP报文封装格式 ||||
| 链路层头 | IP头 20bytes | UDP头 | DHCP报文 |
2.2 DHCP报文格式

- **op:**1byte,是报文的操作类型,分为请求报文和响应报文,1为请求报文;2为响应报文。具体的报文类型在option字段中标识。
- **htype:**1byte,表示client硬件地址的类型,1表示以太网类型。
- **hlen:**1byte,硬件地址的长度,以太网的硬件地址长度为6bytes。
- **hops:**1byte,表示当前dhcp报文经过的DHCP中继的数目,每经过一个DHCP中继这个字段就加1.
- **xid:**4bytes,由client端产生的随机数,用于匹配请求和应答报文,就是匹配应答报文是对哪个请求报文做出应答。
- **secs:**2bytes,客户端进入IP地址申请进程的时间或者更新IP地址进程的时间;由客户端软件根据情况设定。目前没有使用,固定为0。
- **flags:**2bytes,是标志字段,16比特中只使用了最高位比特(即最左边的比特),这个个比特是广播响应标识位,用来标识DHCP服务器发出的响应报文是广播还是单播,0是单播,1是广播。其余的比特位保留不用,都为0。
- **ciaddr:**4bytes,是客户端的IP地址,可以是client自己的IP地址,也可以是server分配给client的IP地址。
- yiaddr(Your IP Address): 4bytes,是server分配给client的IP地址。
- siaddr: 4bytes,是client端获取IP地址等信息的server端的地址。
- **giaddr:**4bytes,是client发出请求报文后经过的第一个中继的IP地址。
- chaddr: 16bytes,是client端的硬件地址 ,在client发出报文时会把自己网卡的硬件地址写进这个字段。
- **sname:**64bytes,服务器主机名,是client端获取IP地址等信息的服务器名称。
- **file:**128bytes,是client的启动配置文件名,是服务器为client指定的启动配置文件名及路径信息,由服务器填写。
- options:是可选变长的选项字段,这个字段包含了终端的初始配置信息和网络配置信息,包括报文类型,有效租期,DNS服务器的IP地址等配置信息。
Options字段有很多项,是可选的,不同的报文option项可能不同。

不同的option项有不同的含义,下面是一些常见的option项:
- **DHCP Message Type:**表示DHCP的报文类型。
- Client identifier: client端的硬件地址
- Server identifier: 服务器的IP地址
- Subnet Mask: 子网掩码
- route: 网关IP地址
- **Domain Name Server:**DNS服务器的IP地址
- IP Address Lease Time: 租约时间
(3)DHCP报文的种类
Dhcp协议一共有8种报文,包括:DHCP Dsicover ,DHCP Offer ,DHCP Request ,DHCP ACK ,DHCP NAK ,DHCP Release ,DHCP Decline ,DHCP Inform。

报文类型由options字段中的**option53"DHCP Message Type"**选项来确定。各报文的具体含义如下:
1.DHCP Dsicover报文:0x01 客户端请求包
这个报文是client端开始dhcp过程的第一个请求报文,client在请求地址时,并不知道server端的位置,所以client会以广播的方式发送请求报文,它的目的是发现网络中的服务器。
2.DHCP Offer报文: 0x02 服务器响应包
这个报文server端对DISCOVERY报文的响应报文。会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如GATEWAY,DNS SERVER等),构造一个OFFER报文,发送给用户,告知用户本SERVER可以为其提供IP地址的分配,并且。发OFFER报文一般是单播的方式发送。
3.DHCP Request报文:0x03 客户端选择包
在一个子网中可能有多台服务器,所有收到DISCOVER报文的服务器都会回应OFFER报文,所以client端可能收到多个OFFER报文,通常会选择第一个OFFER报文的服务器作为自己的目标服务器,并回应一个REQUEST请求报文。在续租约的时候client端也会发送REQUEST报文 请求续租期。
4.DHCP ACK报文:0x05 服务器确认包
是server对client端的REQUEST报文的确认响应报文,server在收到REQUEST报文后,根据REQUEST报文中携带的client MAC来查找有没有相应的租约记录,如果有则发送ACK报文作为回应,通知client可以使用分配的IP地址。
5.DHCP NAK报文:0x06 服务器拒绝包
Server端对client端的REQUEST报文的拒绝响应报文,如果服务器没有相应的租约记录,就会发送NAK报文给client端。
6.DHCP Release报文:0x07 客户端释放包
Client端主动释放server端分配给它的IP是,就会发送DHCP-RELEASE报文给server,server收到这个报文后,就会回收这个IP地址。
7.DHCP Decline:0x04
client收到server回应的ACK报文后,通过地址冲突检测发现 SERVER分配的地址冲突或由于其它原因导致不能使用,则发送DHCP-DECLINE报文,通知server所分配的IP地址不可用。
8.DHCP Inform报文:0x08
在client已经获得了IP地址,需要从server端获得更详细的配置信息时,就会发送DHCP-INFORM报文向server请求,server在收到这个报文后,会根据租约查找,找到相应的配置信息后,就会回应DHCP-ACK报文给client。
(4)DHCP工作过程
- 客户端通过广播发送DHCP Discover 报文寻找DHCP服务端。
- 服务端通过单播发送DHCP Offer 报文向客户端提供从地址池中挑选的可用IP等网络信息。
- 客户端只接收第一个收到的DHCP Offer报文并提取IP地址,然后向通过广播发送DHCP Request 报文告知服务端要使用该IP地址。
- 服务端通过单播发送DHCP ACK 报文告知客户端该IP地址是合法可用的,并提供租约信息。

二、DHCP动态获取IP地址
DHCP动态获取IP地址的过程主要分为发现Discover阶段 、提供Offer阶段 、选择Request阶段 、确认ACK阶段四个阶段。

(1)发现Discover阶段:
client端在局域网内以广播的方式发起一个DHCP Discover广播报文,目的是在子网络中发现能够给client端提供IP地址的server端。
特别要注意到的是,PC会随机出一个Transaction ID,如果之后收到的Offer报文中的Transaction ID与PC模拟出的不同,PC会将该Offer报文直接丢弃。
UDP 目标端口号为67 源IP地址:0.0.0.0 目的IP地址:255.255.255.255

(2)提供Offer阶段:
局域网中DHCP server接受到Discover包之后,通过发送DHCP offer包给client端应答,主要是告知client端可以提供IP地址,以及相应的IP地址租约信息和其他配置信息也会在其中。
UDP 目标端口号为68 源IP地址:172.22.192.1 目的IP地址:172.22.194.142

DHCP Offer报文中"Your(Client) IP Address "字段就是DHCP Server能够提供给DHCP Client使用的IP地址 ,且DHCP Server会将自己的IP地址放在"option"字段中以便 DHCP Client 区分不同的 DHCP Server。

(3)选择Request阶段:
在client端可能会接受到多个offer包,通常clientdaunt只会接受收到的第一个DHCP offer报文 ,然后client端就会以广播的方式发送一个DHCP request报文请求分配IP地址。
UDP 目标67 源IP为0.0.0.0 目的IP:255.255.255.255

DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的 DHCP Offer 报文 。DHCP Client会发出一个广播的DHCPRequest 报文,在选项字段中会加入选中的 DHCP Server 的 IP 地址和需要的 IP 地址。

(4)确认ACK阶段:
server端在收到DHCP request报文之后,会判断"option"字段的serverIP地址是否是自己的IP地址 ,如果符合分配IP地址的条件,就会给client发送一个DHCP ACK包,如果不满足就发挥发送一个DHCP NAK 包。
DHCP Server收到DHCP Request报文后,判断选项字段中的 IP 地址是否与自己的地址相同 。++如果不相同,++ ++DHCP Server++ ++不做任何处理只清除相应++ ++IP++ ++地址分配记录++;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息。


(5)DHCP Release
DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址 ,DHCP Server收到DHCP Release报文后,会回收相应的 IP地址并重新分配。
图中的5个报文,其中DHCP Release报文为PC释放IP时发出的报文。
