一文彻底了解UDHCP源码核心☝️
🍄参考学习: udhcp源码剖析(一)——DHCP服务器和客户端的工作流程_udhcpc源码v1.29.2-CSDN博客
前言介绍
本文深入探讨了DHCP服务器和客户端的工作流程,以udhcp为例,详细阐述了udhcpd(服务器)如何分配IP和网络配置,以及udhcpc(客户端)如何通过交互获取和续租IP。同时,介绍了udhcp的文件结构,如Dhcpd.c、Dhcpc.c和Frontend.c等,揭示了其内部模块的功能…
☝️还不是很清楚 DHCP 的理论, DHCP 协议的学习移驾:
一文读懂DHCP协议 && DHCPv6协议 - 知乎 (zhihu.com)
先启动 dhcpd,再启动 dhcpc
🥇DHCP服务器的工作流程
udhcpd,即dhcp服务器,在路由器等网关设备中,DHCP服务器启动后用于给LAN侧和无线终端分配IP、租约和其他网络配置。根据RFC2131文档规范,一个标准的DHCP服务器和客户端的交互时序如下,这是一个完整的交互过程,从INIT到BOUND,其余的交互过程,比如INIT_REBOOT、RENEWING和REBINDING都可视作该过程的简化或一部分。
🐻第一次连接过程解析:
- client 开始初始化
- client 广播发送 DHCP Discover 到 server 端
- server 接收到,回复 DHCP Offer 包到 client 端, client 端接收到回复,开始收集回应信息,从中挑选一个 server
- 挑选好 server 之后,client 发送 DHCP Request 到 server 端
- 被选中的 server 接收到 DHCP Request 包后,提交 client 的配置信息, 并回复 DHCP ACK
- client 接收到 DHCP ACK 后,初始化结束.
🐻第一次断开过程解析: - client 端突然 shutdown, 会发送 DHCP Release 包到 server 端
- server 端接收到 DHCP Release 后,就丢弃 lease
🥈DHCP客户端的工作流程
udhcpc,即DHCP客户端的工作相对简单,可以使用客户端状态转移图来描述,根据所处的
不同状态,与服务器进行交互。如下图所示,客户端工作的起点一般是INIT和INIT_REBOOT状态,
● 一个标准的获取IP及其配置的流程是INIT->SELECTING->REQUESTING->BOUND, 重启后的重新获取IP
● lease的流程:INIT_REBOOT->REBOOTING->BOUND,
● T1过期续约lease:BOUND->RENEWING->BOUND,
● T1和T2过期续约lease:BOUND->RENEWING->REBINDING->BOUND。
可见,BOUND状态是最终完成配置的状态,REBOOTING、REQUESTING、RENEWING和REBINDING是中间状态,在中间状态,若接收到ACK即跳转到BOUND状态完成配置,若接收到NAK或lease过期则回到INIT状态。
☝️dhcpc 的工作流程图
dhcpc 的状态逻辑图
源码解析图
超时处理
处理网络数据包
信号处理
☝️dhcpd 的工作流程图
处理 DHCP 请求
udhcp的文件结构
udhcp的文件夹中包含许多源文件和头文件,每组源和头文件对应着一个模块或功能。
● 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。
总结
本期先介绍先总结一下UDHCP的整体的工作流程图,在接下来的几篇文章里,将会详细介绍每个文件的作用,以及函数的作用,可以期待一下。
觉得有用的话,不要吝啬点赞哦!
勤奋小牛,努力奋斗!