我们在上一节中完成了客户端请求和服务器应答的第一个步骤。客户端发出DHCP_DISCOVER消息,局域网内的所有DHCP服务器发出DHCP_OFFER消息,在该消息中包含一个特殊字段叫Your_IP_Address,这是服务器分配给客户端的IP地址,如下图:
客户端可能会同时受到多个DHCP服务器发送的回应,然后它从中选择一个服务器发送过来的IP地址,并构造一个DHCP_REQUEST发送给对方,在数据包的Options字段中,使用一个Option表示它向服务器请求该IP地址:
然后服务器会向客户端发送DHCP_ACK消息表示确认客户端的租借请求:
完成了上面步骤后,服务器会记录客户端硬件地址与租借地址的对应关系,客户端在租用IP后,想要续租时,依旧会与给定服务器交流,在续租时,它会向绑定服务器发送DHCP_REQUEST消息,在消息中附带续租时常,同时如果允许续租的话,服务器会向客户端发送DHCP_ACK消息,在消息里附带了服务器允许客户端继续租用给定IP的时间。
如果客户端需要离开网络,不再使用给定IP,它会向服务器发送DHCP_RELEASE消息表示放弃当前使用的IP,如此服务器就能回收IP资源,将宝贵的IP分发给其他需要的客户端,DHCP_RELEASE消息中包含了客户端当前使用的IP地址,其基本内容如下:
本节我们就使用代码实现该流程。 由于代码涉及到IP分配,为了不影响运行机器的网络功能,我们在运行协议时使用虚构的mac地址:
//构造一个不存在的mac地址
public byte[] deviceFakeMacAddress() {
byte[] fakeMac = new byte[macAddress.length];
for (int i = 0; i < macAddress.length; i++) {
fakeMac[i] = (byte) (macAddress[i] + 1);
}
return fakeMac;
}
在DHCPAppliacation中,我们把上节使用到mac地址的地方都改成上面函数,同时我们修改上节对DHCP_OFFER消息的解读,记录下服务器提供的IP:
private boolean readFirstPart(byte[]