DHCP概念:
动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),是一个应用层协议。该协议允许服务器向客户端动态分配 IP 地址和配置信息。
知识补充:
BOOTP(Bootstrap Protocol,引导程序协议):
是一种引导协议,基于IP/UDP协议,也称自举协议,是DHCP协议的前身。BOOTP用于无盘工作站的局域网中,可以让无盘工作站从一个中心服务器上获得IP地址。通过BOOTP协议可以为局域网中的无盘工作站分配动态IP地址,这样就不需要管理员去为每个用户去设置静态IP地址。BOOTP使用UDP,通常与TFTP协同工作。
BOOTP vs. DHCP
- DHCP可以说是BOOTP的增强版本,比较起BOOTP,DHCP透过"租约"的概念,有效且动态的分配客户端的IP设定,而且,作为兼容考虑,DHCP也完全照顾了BOOTP Client的需求。
- 必须至少有一台DHCP工作在网络上面,它会监听网络的DHCP请求。它提供两种IP定位方式:自动分配,一旦DHCP客户端第一次成功的从DHCP服务器租用到IP地址之后,就永远使用这个地址;动态分配,当DHCP第一次从HDCP服务器端租用到IP地址之后,并非永久的使用该地址,只要租约到期,客户端就得释放。
- DHCP除了可以动态的进行设定IP地址之外,还能够直接将一些IP保留下来给一些特殊用途的机器进行使用。另外一个方面,它能够直接按照硬件地址来固定的分配IP地址。
- DHCP与BOOTP的不同点在于,BOOTP也可以完成给主机分配IP地址的任务,但它要求主机的硬件地址必须被手工输入到BOOTP表中。可以讲DHCP看成一个动态的BOOTP。但是,BOOTP还可以将用来引导主机的操作系统发送给主机。而DHCP不可以。
DHCP协议支持C/S(客户端/服务器)结构,主要分为两部分:
- DHCP客户端:通常为网络中的PC、打印机等终端设备,使用从DHCP服务器分配下来的IP信息,包括IP地址、DNS等。
- DHCP服务器:所有的IP网络设定信息都由DHCP服务器集中管理,并处理客户端的DHCP请求。
DHCP采用UDP作为传输协议,客户端发送消息到DHCP服务器的的67号端口,服务器返回消息给客户端的68号端口。
通常DHCP 服务器至少向客户端提供以下信息:
- IP 地址
- 子网掩码
- 默认网关
还可以提供其他信息,如域名服务 (DNS) 服务器的地址和 Windows Internet 名称服务 (WINS) 服务器的地址。
DHCP服务器为客户端分配IP地址有三种形式:
- 管理员将一个IP地址固定分配给一个客户端。
- 随机地将地址永久性分配给客户端。
- 随机地将地址分配给客户端使用一段时间。
第三种是最常见的使用形式。地址的有效使用时间段称为租用期,租用期满之前,客户端必须向服务器请求继续租用。服务器接受请求后才能继续使用,否则无条件放弃。
默认情况下,路由器隔离广播包,不会将收到的广播包从一个子网发送到另一个子网。当DHCP服务器和客户端不在同一个子网时,充当客户端默认网关的路由器将广播包发送到DHCP服务器所在的子网,这一功能就称为DHCP中继(DHCP Relay)。
DHCP在工作过程中涉及到的报文种类及其作用如下:
- DHCP DISCOVER:客户端开始DHCP过程的第一个报文,是请求IP地址和其它配置参数的广播报文。
- DHCP OFFER:服务器对DHCP DISCOVER报文的响应,是包含有效IP地址及配置的单播(或广播)报文。
- DHCP REQUEST:客户端对DHCP OFFER报文的响应,表示接受相关配置。客户端续延IP地址租期时也会发出该报文。
- DHCP DECLINE:当客户端发现服务器分配的IP地址无法使用(如IP地址冲突时),将发出此报文,通知服务器禁止使用该IP地址。
- DHCP ACK :服务器对客户端的DHCP REQUEST报文的确认响应报文。客户端收到此报文后,才真正获得了IP地址和相关的配置信息。
- DHCP NAK:服务器对客户端的DHCP REQUEST报文的拒绝响应报文。客户端收到此报文后,会重新开始新的DHCP过程。
- DHCP RELEASE:客户端主动释放服务器分配的IP地址。当服务器收到此报文后,则回收该IP地址,并可以将其分配给其它的客户端。
- DHCP INFORM:客户端获得IP地址后,发送此报文请求获取服务器的其它一些网络配置信息,如DNS等。
DHCP服务器向DHCP客户端出租的IP地址一般都有一个租借期限,期满后DHCP服务器便会收回出租的IP地址。为了能继续使用原先的IP地址,DHCP客户端会向DHCP服务器发送续租的请求。
DHCP续租的工作流程描述如下:
- 在使用租期过去50%时刻处, 客户端向服务器发送单播DHCP REQUEST报文续延租期。
- 如果收到服务器的DHCP ACK报文,则租期相应向前延长,续租成功。如果没有收到DHCP ACK报文,则客户端继续使用这个IP地址。在使用租期过去87.5%时刻处,向服务器发送广播DHCP REQUEST报文续延租期。
- 如果收到服务器的DHCP ACK报文,则租期相应向前延长,续租成功。如果没有收到DHCP ACK报文,则客户端继续使用这个IP地址。在使用租期到期时,客户端自动放弃使用这个IP地址,并开始新的DHCP过程。
抓包分析
如下是我在Tcpdump中抓到的log:
使用bootp或者dhcp筛选包如下:
截取后,分析一下如下包:
第一个包:如果之后收到的Offer报文中的Transaction ID与PC模拟出的不同,PC会将该Offer报文直接丢弃。
第二个包:
第三个包:
第四个包:
第五个包:DHCP Release报文为PC释放IP时发出的报文。
注意:
DHCP Release的传输ID与上面分配流程不一致。