Linux

是否可以通過靜態 ARP 條目覆蓋多播幀的目標 MAC?

  • September 19, 2016

我有一個我認為有點模糊的問題。我在這裡有一個非常具體的案例,所以請把這個問題視為純粹的學術問題。

我有一個通過乙太網傳輸 IP UDP 多播數據包的設備(執行 Linux 2.4 核心)。我需要能夠控制幀的目標 MAC 地址。通常情況下,當通過正常的 UDP 套接字發送 UDP 多播幀時,目標 MAC 是通過標準映射自動得出的,基本上是 01:00:5E:XX:XX:XX,其中 XX 表示最後 3 個八位字節(實際上我認為是 23 位)IP。對於單播幀,目的 MAC 顯然是通過 ARP 獲得的。

我的問題是:

如果我為多播 IP 添加靜態 ARP 條目,是否可以保證系統將使用該目標 MAC 而不是標準映射?我已經在系統上對此進行了測試,它似乎確實有效,但我很好奇這是否是一種已定義的行為。

我本來希望 UDP 多播數據包繞過整個 ARP 表查找機製作為優化,但顯然情況並非如此。

看起來它實際上確實掃描了靜態 ARP 表,即使是多播數據包也是如此。但是,如果找不到條目,它將不會發送 ARP 請求。相反,它似乎回退到標準映射。這對我來說是一個明智的行為。

我試圖導航核心 IP 堆棧源,以更好地了解決定是否進行 ARP 查找的決定,但我遇到了一些麻煩。

如果有人能指出這個決定是在核心原始碼中做出的,那將不勝感激。根據我現在收集的資訊,數據包首先發送到“udp.c”中的 udp_sendmsg。然後,從那裡,它被移交給“ip_output.c”。我不確定 ARP 查找發生在哪裡。

傑克

我無法告訴您核心決定將數據包發送到何處的確切位置,但這種行為絕對是標準的,並且在實現時考慮了性能和 OSI 模型。ARP 位於比 IP 更低的層上,因此如果核心找到 IP 的 ARP 條目,則無需檢查其他任何內容。它不需要知道它是否是多播地址,它只是將數據包發送到給定的 MAC。

還要記住,只有一個 ARP 表,靜態條目只有一個附加 (PERM) 標誌,所以基本上核心總是首先檢查這個表,因為一旦存在 IP(靜態或非靜態),核心就不必對其進行任何其他查找/計算,例如網路地址是什麼,網路遮罩是什麼,多播地址是什麼,給定的 IP 是多播 IP,如果它是創建多播幀。事實上,多播比單播更像是一種特殊情況,因此在檢查 ARP 表之前進行多播檢查根本不是優化。

雖然在這種情況下它可能會有點分散注意力,因為 ARP 是一種 IP 和乙太網之間的過渡層,但原則上你可以記住 ARP 位於比 IP 更低的層上,因此 ARP 總是優先於 IP。

引用自:https://serverfault.com/questions/803997