dhclient -v 输出中的 LPF 和 Socket/fallback 是什么?

dhclient -v 输出中的 LPF 和 Socket/fallback 是什么?

以下是该命令的一些示例输出:

$ 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代码比较复杂并充满了#ifdefs。

如果既没有数据包过滤器 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 错误消息(即刷新现有活动)租)。

在发送端,后备套接字的使用不太明显。如果其他人了解更多,请随时编辑此答案或添加您自己的答案。

相关内容