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 錯誤訊息(即刷新現有的活動租)。

在發送端,後備套接字的使用不太明顯。如果其他人了解更多,請隨時編輯此答案或添加您自己的答案。

相關內容