- [ ] DHCP工作流程:
- 客户端发送DHCP Discover广播报文即目的地址为255.255.255.255,在网络上寻找DHCP Server。网络的的DHCP服务器响应客户端的请求,可能有多个DHCP Sever响应,以广播的方式进行。
- 在网络中接收到DHCP discover发现信息的DHCP服务器都会做出响应,它从尚未出租的IP地址中挑选一个分配给DHCP客户机,向DHCP客户机发送一个包含出租的IP地址和其他设置的DHCPoffer信息。
- 客户端收到了DHCP Server的DHCP Offer报文之后,则向DHCP Server发送所需要的IP地址请求,该信息中包含向它所选定的DHCP服务器请求IP地址的内容。因为有多个DHCP服务器,所以客户端是以广播方式发送DHCP Request报文,还因为要通知所有的DHCP服务器,他将选择某台DHCP服务器所提供的IP地址 。
- 服务器收到请求之后,给客户端发送ACK响应报文。
- 以后DHCP客户端每次重新登录网络时,就不需要再发送DHCP discover发现信息了,而是直接发送包含前一次所分配的IP地址的DHCP request请求信息。当DHCP服务器收到这一信息后,它会尝试让DHCP客户机继续使用原来的IP地址,并回答一个DHCP ack确认信息。
- 如果此IP地址已无法再分配给原来的DHCP客户机使用(比如此IP地址已分配给其它DHCP客户机使用),则DHCP服务器给DHCP客户机回答一个DHCP nack否认信息。当原来的DHCP客户机收到此DHCP nack否认信息后,它就必须重新发送DHCP discover发现信息来请求新的IP地址。
相对于DHCP CLIENT,DHCP SERVER的行为比较简单,DHCP SERVER的行为完全由DHCP CLIENT来驱动,只需根据收到的DHCP CLIENT的各种请求报文,相应的响应不同的DHCP响应报文即可。
DHCP SERVER给DHCP CLIENT分配IP地址原则:DHCP SERVER收到DHCP请求报文后,将会首先查看“giaddr(gateway IP address )”字段是否为0,如果不为0,则就会根据此IP地址所在网段从相应地址池中为CLIENT分配IP地址,如果为0,则DHCP SERVER认为CLIENT与自己在同一子网中,将会根据自己的IP地址所在网段从相应地址池中为CLIENT分配IP地址。
DHCP SERVER还能实现地址池管理功能。
客户端获得的IP地址都带有一个租期,在租期满了之后,如果没有续约行为,则用户的IP地址会被服务器收回。
流程如下:
当租期到50%的时候,客户端发送DHCP Request 报文,进行续约,因为前期已经有DHCP Server的信息,故此时是单播。
服务器收到DHCP Request之后,给客户端发送响应信息,此次重置租期。
如果服务器在租期50%的时候没有收到客户的续约报文(DHCP Request),则客户的IP地址租约不会重置。到租约时间的87.5%的时候,客户端还没有收到服务器的响应(针对客户端50% 发出的请求),客户端会假定原来的DHCP服务器不可用,并开始发送广播的DHCPREQUEST报文。网络上的任何DHCP服务器均可以响应此客户端的请求,并向此客户端发送DHCPACK报文或者DHCPNAK报文。
如果客户端收到一个DHCPACK报文,那么就返回到绑定状态,且重新设置“租期更新和重绑定定时器”。
如果客户端收到的都是DHCPNAK报文,那么就返回到初始化状态。此时客户端必须立即停止使用此IP地址,并且返回到初始化状态,重新申请新的IP地址。
若客户端在“到达租期定时器”到期前都没有收到响应,客户端必须立即停止使用此IP地址,并且返回到初始化状态,重新申请新的IP地址。
DHCP 服务器收到续约请求后,发送DHCP ACK响应用户的续约,此时重置用户的租期。
DHCP Relay:
DHCP中继的应用环境:
早期的DHCP协议只适用于DHCP客户端和服务器处于同一个网段内的情况,不能跨网段,早期的DHCP报文格式中少很多字段,如giaddr、hop等,后期进行了扩充。因此,为进行动态主机配置,每个网段需要一个DHCP服务器,这显然是很不经济的。
DHCP中继(DHCP Relay)功能的引入解决了这一难题:客户端可以通过DHCP中继与其他网段的DHCP服务器通信,最终取得合法的IP地址。这样,多个网段的DHCP客户端可以使用同一个DHCP服务器,既节省了成本,又便于进行集中管理。
DHCP报文多采用广播方式,是无法穿越多个子网的,当DHCP报文要穿越多个子网时,就要有DHCP RELAY的存在。
DHCP RELAY可以是路由器,也可以是一台主机,总之,DHCP RELAY要监听UDP目的端口号为67的所有报文。
当DHCP RELAY收到一个这样的报文时,会首先判断是否是用户的请求报文,如果是而且“giaddr”(gateway IP address )字段为0,则把自己的IP地址填入此字段,并把此报文单播给真正的DHCP SERVER,以实现DHCP报文穿越多个子网的目的。
当DHCP RELAY发现这是DHCP SERVER的响应报文时,会根据“flag”字段中的广播标志位来广播或单播封装好的报文后,传送给DHCP CLIENT。
DHCP Relay场景下的流程如下:
- [ ] 客户端发送DHCP Discover广播报文在网络上寻找DHCP Server。
- DHCP Relay收到DHCP Discover报文后,把自己的IP地址填入giaddr 字段,发送给DHCP Server。并把DHCP Server 字段填充相应的Server IP 地址,发送单播报文给DHCP Server。
- DHCP Server 收到 DHCP Relay发来的Discover报文,给DHCP Relay相应,给客户端响应DHCP Offer报文,其中带有DHCP服务器的IP地址。
- DHCP Relay 把收到的Offer报文传送给客户端。
- 客户此时已经找到DHCP Server,开始发送DHCP Request请求IP地址。
- DHCP Relay 收到此请求后,把giaddr字段填充自己的IP地址,并把DHCP Request报文单播发给DHCP Server。
- Server收到请求后,给客户端分配IP地址,发送DHCP ACK 报文,如果客户的请求地址无效则发送NAK报文给DHCP Relay。Server发送给DHCP Relay的报文中,Your IP address填充分配给客户的IP地址。
- DHCP Relay收到服务器的响应报文,把相应的报文发送给客户端。
- 如果用户想释放IP地址,则发送DHCP Release报文,报文中Client IP Address填充已获得的IP地址。
- DHCP Relay收到Release报文后,把giaddr字段填充自己的IP地址发送给Server。Server收到请求后,释放先前分配的IP地址。