DHCP协议详解
定义:DHCP(Dynamic Host Configuration Protocol)动态主机配置协议,主要作用是为局域网内的主机自动分配IP地址。DCHP工作在应用层,是BOOTP(Bootscrap Protocol)的一种扩展,使用UDP协议进行运输,UDP67和UDP68端口分别作为DHCPServer和DHCP Client的服务端口。DHCP协议内容在RFC2131中定义,而DHCP Options在RFC2132中定义。
DHCP的4次握手
测试方法:为了抓到DCHP工作过程的包,在cmd中使用ipconfig/release命令释放客户端ip地址,接着使用ipconfig/renew重新通过DHCP自动获得ip,使用wireshark抓到以下的包(如图1)。
图1:DCHP抓包结果
结合上图可以知道DHCP的4次握手内容如下:
1、客户端广播一个DHCPDiscover包,用来寻找DCHP服务器。
●源MAC: 固有MAC地址,源IP: 未分配,初始0.0.0.0
●目标MAC:FF-FF-FF-FF-FF-FF,目标IP: 255.255.255.255
2、服务器向发送Discover包的客户端MAC地址发送Offer,如图2(可能有多个DHCP服务器,但一般只处理最先收到的Offer)。
●通过分析包数据,目标MAC为客户端MAC,目标IP为将分配给客户端的IP(由于此时客户端还没有获得IP,因此,虽然IP不匹配也不会丢弃)。
●Offer的内容中有将分配给客户端的IP,其中的Options提供了DHCP服务器IP、租约时长、子网掩码、路由IP、DNS等内容。
3、客户端收到Offer后,广播一个Request租约请求,内容中Option包括客户端MAC、DHCP服务器IP、服务器提供的IP等内容。
●源MAC: 固有MAC地址,源IP: 仍然未分配,为0.0.0.0
●目标MAC: FF-FF-FF-FF-FF-FF,目标IP:255.255.255.255
4、DCHP服务器确认Request中的IP是否与发出的Offer相同,若相同,则向客户端发送DHCPACK确认信息,DHCPACK包与DHCPOFFER包的内容几乎完全一样,除了Option53:DHCP Message Type。客户端收到DHCP ACK后,通过ARP广播检测租约中IP是否冲突,若无冲突,则使用该IP。(RFC2131提到另一种冲突解决方案,DHCP服务器在发offer前,SHOULD ping一下租约IP,我的实验中没有抓到ICMP包)
图2:DCHP Offer内容
对于以前接入过的客户端
若原IP可用
测试方法:将DHCP客户端网线插拔。
对于连接过的设备,设备记忆有以前分配过的ip,则无需前两步,只进行客户端请求租用原先ip和服务端确认租用这两步,如图3。
若原IP被占用
测试方法:电脑使用DHCP获得IP后断开网线,将手机IP设为静态的电脑所获IP,然后插上网线,抓包结果如图4。
若原IP被占用,虽然收到DHCP服务器ACK确认报文,但仍被客户端拒绝,重新进行4次握手的过程。这里是客户端拒绝租约而不是DHCP服务器拒绝,如图5所示,客户端收到DHCP ACK报文,会广播针对租约IP的ARP解析包,检测到IP已被占用后,会广播DHCP Decline报文拒绝该租约,并在至少10秒后重新Discover。
图3:接入过的设备跳过DHCP握手前两步
图4:客户端拒绝DHCP ACK
图5:客户端Decline的过程
DHCP客户端释放IP
测试方法:cmd中输入ipconfig/release,或者将客户端IP由DHCP改为静态。
客户端会向服务器发送DHCP Release报文释放掉现有IP,如图6。
图6:客户端释放IP
附1:DHCP报文格式
DHCP Options Field
DHCP报文中的Options字段可以用来存放普通协议中没有定义的控制信息和参数。如果用户在DHCP服务器端配置了Options字段,DHCP客户端在申请IP地址的时候,会通过服务器端回应的DHCP报文获得Options字段中的配置信息。Option的格式由Type、Length、Value三部分组成。类型的取值范围为1-255。
Option 66:
通过option 66字段携带TFTP server的ip地址。从而使设备可以从TFTP server上下载配置文件,通过TFTP server实现自动配置。
图6:FRC2132中的关于Option 66的定义
这种自动配置是如何实现的呢?首先要给DHCP服务器设置Option 66选项,当一个新的设备接入网络,它会发送DHCPDISCOVER广播寻找DHCP服务器来获得IP,这时DHCP服务器的Offer报文利用Option 66给设备提供TFTP服务器的地址,设备通过访问TFTP服务器获得预设的配置。
Option 66的值可以是TFTP服务器域名或IP,需要注意的是Option66的值通常不作为Option 66出现在DHCP packet中,而是被移到DHCP包中的sname(服务器主机名)中,而且域名可能已经被解析成IP地址放于siaddr(服务器IP地址)中。Option 67指定了从Option 66提供的服务器下载的文件名,通常被放在file(文件名)中。
还需要注意的是Option 66字段的Value值使用ascii编码,举例:若TFTP服务器IP为10.10.10.1,则翻译成16进制为31 30 2E 31 30 2E 31 30 2E 31。