是否可以通过静态 ARP 条目覆盖多播帧的目标 MAC?

是否可以通过静态 ARP 条目覆盖多播帧的目标 MAC?

我认为我有一个有点晦涩的问题。我这里有一个非常具体的用例,所以请将这个问题视为纯粹的学术问题。

我有一个设备(运行 Linux 2.4 内核),它通过以太网传输 IP UDP 多播数据包。我需要能够控制帧的目标 MAC 地址。通常,当通过常规 UDP 套接字发送 UDP 多播帧时,目标 MAC 是通过标准映射自动得出的,该映射基本上是 01:00:5E:XX:XX:XX,其中 XX 代表 IP 的最后 3 个八位字节(我认为实际上是 23 位)。对于单播帧,目标 MAC 显然是通过 ARP 获得的。

我的问题是:

如果我为多播 IP 添加静态 ARP 条目,是否可以保证系统将使用该目标 MAC 而不是标准映射?我已经在系统上测试过了,它似乎确实有效,但我很好奇这是否是一种定义的行为。

我原本期望 UDP 多播数据包能够绕过整个 ARP 表查找机制作为一种优化,但显然事实并非如此。

看起来它确实会扫描静态 ARP 表,即使是多播数据包也是如此。但是,如果找不到条目,​​它不会传输 ARP 请求。相反,它似乎会回到标准映射。对我来说,这是一种明智的行为。

我试图浏览内核 IP 堆栈源,以便更好地了解是否进行 ARP 查找的决定在哪里做出,但是我遇到了一些麻烦。

如果有人能告诉我这个决定是在内核源代码中做出的,我将不胜感激。从我现在收集的信息来看,数据包首先进入“udp.c”中的 udp_sendmsg。然后,从那里,它被交给“ip_output.c”。不过我不确定 ARP 查找发生在哪里。

杰克

答案1

我无法告诉您内核究竟决定将数据包发送到何处,但这种行为绝对是标准的,并且是在考虑性能和 OSI 模型的情况下实现的。ARP 位于比 IP 更低的层,因此如果内核找到 IP 的 ARP 条目,它无需检查其他任何内容。它不需要知道它是否是多播地址,它只需将数据包发送到给定的 MAC。

还请记住,只有一个 ARP 表,静态条目只有一个附加 (PERM) 标志,因此基本上内核总是首先检查此表,因为一旦存在 IP(静态或非静态),内核就不必为其进行任何额外的查找/计算,例如网络地址是什么、网络掩码是什么、多播地址是什么、给定的 IP 是否为多播 IP,如果是,则创建多播帧。事实上,多播比单播更特殊,因此在检查 ARP 表之前进行多播检查根本不是优化。

虽然在这种情况下可能会有点分散注意力,因为 ARP 是 IP 和以太网之间的一种过渡层,但原则上你可以记住 ARP 位于比 IP 更低的层,因此 ARP 总是优先于 IP。

相关内容