一.DHCP协议的简介
任何一个设备要连入网络后,要进行正式通讯前它必须知道自己的IP地址、子网掩码、路由器IP地址等信息,但是设备的具体使用环境是不能确定的,所以不能将设备的IP地址写死。这时候就需要一种叫动态主机配置协议(DHCP)的协议,DHCP客户端通过同DHCP服务器的交互,设备可以获得一个有效IP地址,使得它可以在特定网络环境下运行。其中动态的意思是,客户端只是暂时的租用了服务器的IP,服务器会给每个客户端维持一个租期,在这个租期内服务器不会把该IP租给其他客户,在租期满后,客户端必须续租或停止使用该IP地址。DHCP客户端一经启动后便一直存在于系统内核中,完成地址请求、地址选择、地址绑定、地址更新、重绑定等操作。
二.DHCP协议的本质
DHCP使用UDP进行报文的传输。在主机DHCP获得地址之前,主机并没有有效的IP地址,它是通过受限广播IP地址(全1),当该地址作为目的地址时,子网内的所有主机都能收到该IP数据报。IP层的广播实际上是基于链路层的广播来实现的,所以这里有个前提,即链路层具有广播功能,在以太网中,目的地址为全1的MAC地址可作为链路上的广播地址。只要数据包能够正确到达主机IP层UDP的端口上,则应用程序就能收到该端口上的广播IP包,这正是DHCP设备能正确获得IP地址的本质。
三.DHCP协议的工作基本过程
DHCP协议采用UDP作为传输协议,DHCP客户端使用固定端口号68,而服务器使用固定端口号67。客户端要获得IP,需经过下图过程:
1、客户端以广播的方式发送DHCP_DISCOVER报文,广播的范围的服务器都能接收到该报文。
2、所有的DHCP服务器都会对该报文进行响应,向DHCP客户端发送DHCP_OFFER报文,报文中的Your(Client)IP Address字段携带了分配给客户端的IP地址,同时服务器的IP地址放在报文中的option字段中以便客户端可以区分,服务器分配后IP地址给客户端后,会把该地址分配记录下来。
3、DHCP客户端可能收到多个服务器的DHCP_OFFER报文,但是它只能对其中的一个做响应,通常DHCP客户端处理最先收到的DHCP_OFFER报文并响应。
4、DHCP客户端从DHCP_OFFER报文中提取可使用的IP地址和服务器IP地址后,会发出个广播的DHCP_REQUST报文,并在选项字段中加入选中的DHCP服务器的IP地址和自己要的IP地址。
5、DHCP服务器收到DHCP_REQUST报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP服务器不做任何处理,然后清除相应IP地址分配记录;如果相同,DHCP服务器就会向客户端发送一个DHCP_ACK报文,并在报文选项字段中增加IP地址的使用租期信息。
6、DHCP客户端接收到DHCP_ACK报文后,会检查服务器分配的IP地址是否能够使用(发送一个ARP请求到网络中,如果无主机回应该请求,则表示该地址可用)。如果可以使用,则客户端成功获得IP地址会根据IP地址使用租期自动启动续延过程;如果DHCP客户端发现分配的IP地址已经被使用,则需要向DHCP服务器发出一个DHCP_DECLINE报文,通知DHCP服务器禁用这个IP地址,此后,DHCP客户端重新开始上述地址申请流程。
7、客户端在使用租期超过50%或87.5%时,会以广播播形式向DHCP服务器发送DHCP_REQUST报文来续租IP地址。如果DHCP客户端成功收到服务器返回的DHCP_ACK报文,则按相应时间延长IP地址租期;如果没有收到服务器返回的的DHCP_ACK报文,则DHCP 客户端继续使用这个IP地址,直到IP地址使用租期到期。当租期到期后,DHCP客户端会向DHCP服务器发送一个DHCP_RELEASE报文来释放这个IP地址,并开始新的IP地址申请过程。
8、最后需要指出的是,DHCP服务器发送的DHCP_OFFER报文中的IP地址不一定是最后分配给客户端的IP地址,通常情况下,DHCP服务器会保留该地址直到客户端发出DHCP_REQUEST请求。在整个协商过程中,如果DHCP客户端发送的DHCP_REQUEST报文中的地址信息不正确,如客户端已经迁移到新的子网或者租约已经过期,DHCP服务器会发送DHCP_NAK报文给DHCP客户端,让客户端重新发起地址申请过程。