自写DHCP服务端,使DHCP每次连接获得IP不一样

By | 2018年7月26日

首先我们要先了解一下DHCP请求IP的流程:

1、客户端启动发送Discover广播(如果原先获得的IP租赁时间未到期,则发送Request请求,即第3步);

2、DHCP服务端收到Discover广播,然后给客户端发送一个Offer(Option中带有分配给客户端的IP)响应;

3、客户端收到Offer请求,再向服务端发送Request请求去请求Offer中的IP;

4、服务端如果确认客户端的IP请求,则响应ACK,否则响应NAK,(如果响应NAK,客户端又重新进入第1步的Discover)。

问题分析:

如果要让客户端每次请求到的IP不一致,先要了解下面两个现状:

1、客户端在租赁时间使用50%和87.5%的时候,都会向服务端重新Request这个IP。

解决思路:我们应该分配给客户端尽量长的释放时间,比如24小时

2、如果上一个IP使用未达到释放时间,客户端重新请求的话,发送的Request请求,这样,服务端正常情况下会发送ACK确认响应

解决思路:我们应该拒绝客户端这个Request请求,使客户端能进入Discover阶段,以便服务端分配新IP,优先分配该Mac地址没有获得过的IP

解决方案:

1、客户端Discover阶段,读取该mac地址历史分配记录,优先Offer该mac地址未使用过的IP,再分配最早释放的IP,并缓存该Offer信息

2、客户端Request阶段,如果请求的IP不存在于第一步的分配信息中,则客户端的请求是续租原有IP,这里向客户端发送NAK响应,如果是第一步Offer的IP,则发送ACK响应

具体细节自行优化一下,目的就可以达到了,本人是用Python实现的。