udhcp源码剖析(一)——DHCP服务器和客户端的工作流程
DHCP服务器的工作流程
udhcpd,即dhcp服务器,在路由器等网关设备中,DHCP服务器启动后用于给LAN侧和无线终端分配IP、租约和其他网络配置。根据RFC2131文档规范,一个标准的DHCP服务器和客户端的交互时序如下,这是一个完整的交互过程,从INIT到BOUND,其余的交互过程,比如INIT_REBOOT、RENEWING和REBINDING都可视作该过程的简化或一部分。
DHCP客户端的工作流程
udhcpc,即DHCP客户端的工作相对简单,可以使用客户端状态转移图来描述,根据所处的
不同状态,与服务器进行交互。如下图所示,客户端工作的起点一般是INIT和INIT_REBOOT状态,
一个标准的获取IP及其配置的流程是INITSELECTINGREQUESTINGBOUND, 重启后的重新获取IP
lease的流程:INIT_REBOOTREBOOTINGBOUND,
T1过期续约lease:BOUNDRENEWINGBOUND,
T1和T2过期续约lease:BOUNDRENEWINGREBINDINGBOUND。
可见,BOUND状态是最终完成配置的状态,REBOOTING、REQUESTING、RENEWING和REBINDING是中间状态,在中间状态,若接收到ACK即跳转到BOUND状态完成配置,若接收到NAK或lease过期则回到INIT状态。
udhcp的文件结构
udhcp的文件夹中包含许多源文件和头文件,每组源和头文件对应着一个模块或功能。
Dhcpd.c——整个DHCP server运行的主线,其udhcpd_main函数就是server开始允许的入口,相当于main入口。在udhcpd_main中,各个模块被组合起来实现DHCP服务器的功能。
Dhcpc.c:DHCP client运行的主线,提供udhcpc_main作为入口函数,相当于main函数,将各个客户端模块组合起来实现DHCP客户端的功能。
Frontend.c:该文件提供了一个main入口,在其中根据传入参数选择启动DHCP服务器还是客户端。
其余文件都是负责各个具体的模块:
Arpping.c:该源文件只包含arpping函数,在服务器给客户端分配一个free IP后,会调用arpping函数,查看网络上是否有主机已经使用该地址。
File.c和file.h:DHCP server file manipulation,负责DHCP服务器的文件操作,其中最重要的函数是read_config,该函数载入默认配置信息,并从配置文件udhcpd.conf读取配置信息。(以后读取配置信息的函数可以模仿read_config函数写)。
leases.c:tools to manage DHCP leases,针对dhcpOfferedAddr结构的操作函数,该结构体是DHCPOFFER报文的数据主体,通过它,服务器向客户端提供租约的信息。
options.c:DHCP server option packet tool,针对DHCP数据报文的options字段的操作函数都在这个文件中。
packet.c:DHCP数据报文的构造和发送。
pidfile.c:Functions to assist in the writing and removing of pidfiles。针对pidfile的写和删除操作。主要针对/tmp/var/run/udhcpd0.pid
serverpacket.c:Constuct and send DHCP server packets。构造和发送dhcp服务器报文。
clientpacket.c:Packet generation and dispatching functions for the DHCP client。
socket.c:DHCP server client/server socket creation。套接字创建,包含interface信息的读取
script.c:Functions to call the DHCP client notification scripts。