DHCP协议的运行过程
预热知识
DHCP协议是使用C/S模式,DHCP服务器运行DHCP服务器进程,在用户主机上运行DHCP客户进程,简称为DHCP客户。DHCP协议是TCP/IP应用层的协议,使用的是传输层的UDP所提供的服务。DHCP报文会被封装在UDP报文中,另外DHCP服务器使用的UDP端口是67,客户机是的端口是68。封装有DHCP报文的UDP数据报将会在网络层封装为IP数据报,然后再根据所使用的的网络接口封装成相应的数据链路层的帧进行转发,下面将是讨论DHCP服务器和DHCP客户交互的过程。
发现阶段
DHCP客户机启用DHCP服务后,DHCP客户广播发送DHCP发现报文(DHCP DISCOVER),该报文的IP数据报的源IP地址为0.0.0.0(因为主机还没有分配到IP地址),目的IP地址为广播地址255.255.255.255,之所以进行广播发送,是因为该主机还不知道网络中有哪些DHCP服务器,他们的IP地址是什么,所以网络中的所有设备都会收到该IP数据报。
提供阶段
当DHCP服务器得到该报文后,并逐步向上层解封UDP用户数据报,对于其他设备,其他应用层没有监听该UDP用户数据报目的端口的67的进程,也就是DHCP服务器进程,因此无法交付DHCP发现报文,只能选择丢弃,而对于DHCP服务器,其应用层始终运行DHCP服务器进程,所以会接受DHCP发现报文并做出相响应。DHCP报文格式较复杂,但是这里只需要知道其内部封装有事务ID和DHCP客户端的MAC地址即可。DHCP收到服务器DHCP发现报文后,根据其中封装的DHCP客户端MAC地址来查找自己的数据库,看是有MAC对应的配置信息,若有则使用这些配置信息来构建并发送DHCP提供报文(DHCP OFFER),否则则采用默认配置信息来构建并且发送DHCP提供报文。封装该DHCP提供报文的IP数据报的源IP地址为DHCP服务器的IP地址,目的地址任然为广播地址。(为什么这里仍然需要使用广播地址,因为该客户机还没有收到配置的IP地址,为了使得主机可以收到,只能广播发送。这样一来网络中的所有设备都会收到该DHCP提供报文。)
选择阶段
然后客户机将其DHCP提供报文对它进行层层解封,解封出来的出UDP用户数据报,有些主机其应用层没有监听该端口68的进程,也就是DHCP客户进程,所以无法交互DHCP提供报文,只能选择丢弃,否则就接收。DHCP客户会根据DHCP提供报文中的事务ID,来判断该报文是否是自己说请求的报文。如果该事务ID和之前发送的DHCP请求报文的事务ID一致就表明是自己请求的报文,就接收该报文。DHCP提供报文中还封装有(IP地址,子网掩码,地址租期,默认网关,DNS服务器等)DHCP服务器从自己的IP地址池中挑选等待租用给主机的IP地址时,会使用到ARP来确保所选IP地址未被网络中其他主机占用。DHCP客户机会收到若干个DHCP提供报文,DHCP会选择最先收到的那一个。然后将选中的DHCP服务器发送一个DHCP请求报文,封装该报文的源地址仍然为0.0.0.0,因为该客户机还没有得到DHCP服务器的同意,只是收到了它发过来的信息,
确认阶段
后面就是DHCP服务器收到了DHCP客户机发送过来的请求报文,DHCP服务器就发送一个DHCP确认报文,这时封装的报文包含了源IP地址,但是目的地址任然为广播地址,DHCP客户收到该确认报文后,就可以使用IP地址了。在使用这个IP地址前,DHCP客户机又会再次用ARP检查分配到的IP地址是否被其他主机使用,若被占用则该DHCP客户机将向DHCP服务器发送“DHCP DECLINE”报文,并且撤销分配到的IP地址,然后重新发送DHCP请求报文。
更新租约
当租用期到了一半时DHCP客户会向服务器发送DHCP请求报文来更新租用期,然后DHCP服务器得到该报文后,根据情况是否发送确认报文。这就好比你去网吧上网,打得上瘾了时间到了一半,你就要求网管加钱,至于你是否能继续玩下去还要看网管的决策,当然这是网管能听到的情况下,如果没有听到,等到了还没有多少时间的时候就在发送一个请求,若已知没有响应,客户机在租用时间耗尽后就必须强制交换给IP给DHCP服务器,当然DHCP客户也可以选择没有用完租用期就离开。