以下是该命令的一些示例输出:
$ sudo dhclient -v
Internet Systems Consortium DHCP Client 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/00:15:5d:5a:e4:c5
Sending on LPF/eth0/00:15:5d:5a:e4:c5
Listening on LPF/dummy0/6e:0b:72:f9:83:f0
Sending on LPF/dummy0/6e:0b:72:f9:83:f0
Listening on LPF/bond0/82:a2:7e:03:69:19
Sending on LPF/bond0/82:a2:7e:03:69:19
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3 (xid=0x3115634c)
DHCPDISCOVER on dummy0 to 255.255.255.255 port 67 interval 3 (xid=0x1ab3dc37)
DHCPDISCOVER on bond0 to 255.255.255.255 port 67 interval 3 (xid=0xcea7a32d)
我找不到任何关于“LPF”或“Socket/fallback”是什么的文档。
您能否给出一些解释以及在哪里可以找到更多相关信息?
链接https://www.isc.org/software/dhcp/没有多大帮助。
答案1
显然 LPF 指的是 Linux Packet Filter:https://gitlab.isc.org/isc-projects/dhcp/-/blob/master/common/lpf.c
在其他情况下,它也被称为Linux 套接字过滤或 Berkeley 数据包过滤器。
DHCP 客户端需要能够发送和接收广播 UDP 数据包,而网络接口不一定具有已配置的 IP 地址。它还需要关心数据包将通过哪个接口,以便将网络配置分配给接收数据包的特定网络接口,而不是分配给具有多个接口的系统上的任何接口。
数据包过滤 API(如 Linux 上的 LPF)是 DHCP 软件告诉操作系统网络堆栈的最灵活、最有效的方式:“我将使用原始数据包套接字,因为我的网络流量需求有点不寻常,但我仍然不想收到副本每个数据包通过网络接口到达的数据包——只是这些特定端口号上的 UDP 数据包。”
如果 LPF 或类似的数据包过滤器 API 不可用,则 DHCP 软件将不得不依赖标准网络套接字 API 及其各种扩展 - 特别是套接字选项。但这些并没有在 ISC DHCP 套件支持的所有操作系统上得到统一支持,所以ISC DHCP的socket代码比较复杂并充满了#ifdef
s。
如果既没有数据包过滤器 API 也没有可用的特定套接字选项,则仅当主机只有一个网络接口时,DHCP 套件才可能正常工作:
#if !defined(SO_BINDTODEVICE) && !defined(USE_FALLBACK)
/* Make sure only one interface is registered. */
if (once) {
log_fatal ("The standard socket API can only support %s",
"hosts with a single network interface.");
}
once = 1;
#endif
当使用数据包过滤 API 时,ISC DHCP 套件还会设置一个备用套接字使用标准网络套接字 API。在接收端,后备套接字只是丢弃任何到达的流量:也许某些数据包过滤 API 会产生一个复制传入流量的数量,并且需要存在常规套接字以确保操作系统不会认为用于 DHCP 的 UDP 端口已关闭,并导致为任何收到的单播 DHCP 数据包发送 ICMP 错误消息(即刷新现有活动)租)。
在发送端,后备套接字的使用不太明显。如果其他人了解更多,请随时编辑此答案或添加您自己的答案。