dhclient 是 ISC DHCP 客户端,在 Linux 中用于通过 DHCP 协议自动获取 IP 地址、路由、DNS 等网络配置。下面我按 从“程序启动”到“接口完成配置” 的顺序,系统地讲解 dhclient 的启动流程,并穿插关键源码/系统行为说明。
ioctl() / netlink 设置 IPdhclient-script 完成后续配置(DNS、路由等)dhclient eth0
或系统启动时由:
systemd-networkdNetworkManagerinit scriptsifupdown调用。
命令行解析
↓
读取配置文件
↓
初始化网络接口
↓
构建 DHCP 报文
↓
发送 DHCP DISCOVER
↓
接收 DHCP OFFER
↓
发送 DHCP REQUEST
↓
接收 DHCP ACK
↓
应用网络配置
↓
调用 dhclient-script
↓
进入租约维护阶段
main() // client/dhclient.c
主要工作:
-d(前台)-v(verbose)-cf(配置文件)-lf(租约文件)-pf(PID 文件)| 文件 | 作用 |
|---|---|
/etc/dhcp/dhclient.conf |
用户配置 |
/var/lib/dhcp/dhclient.leases |
租约信息 |
dhclient.confrequest subnet-mask, routers, domain-name-servers;)eth0)0.0.0.0255.255.255.255socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));
INIT
↓
SELECTING
↓
REQUESTING
↓
BOUND
Src: 0.0.0.0:68
Dst: 255.255.255.255:67
包含:
ioctl(SIOCSIFADDR)ioctl(SIOCSIFNETMASK)ioctl(SIOCSIFBRDADDR)ip addr add 192.168.1.100/24 dev eth0
ip link set eth0 up
/etc/dhcp/dhclient-enter-hooks.d/
/etc/dhcp/dhclient-exit-hooks.d/
/sbin/dhclient-script
dhclient-script <reason>
常见 reason:
| reason | 含义 |
|---|---|
| BOUND | 新获取 IP |
| RENEW | 续租 |
| REBIND | 重新绑定 |
| EXPIRE | 租约过期 |
| FAIL | 失败 |
/etc/resolv.conf/etc/hosts/var/lib/dhcp/dhclient.leases
| 时间 | 行为 |
|---|---|
| T1(50%) | 尝试 RENEW |
| T2(87.5%) | 尝试 REBIND |
| 过期 | EXPIRE |
| 功能 | 系统调用 |
|---|---|
| 发包 | sendto() |
| 收包 | recvfrom() |
| 配置 IP | ioctl() / netlink |
| 脚本执行 | fork() + exec() |
dhclient -d eth0
tcpdump -i eth0 port 67 or port 68
cat /var/lib/dhcp/dhclient.leases
dhclient 启动后,通过 DHCP 协议与服务器交互获取 IP,然后利用 ioctl/netlink 配置接口,并通过 dhclient-script 完成 DNS、路由等系统级网络配置,同时维护 DHCP 租约生命周期。
如果你愿意,我也可以:
dhclient vs systemd-networkd DHCP你可以直接告诉我你关注哪一层。