请教一个Linux TCPIP协议栈关于ARP的问题

补充:


三、结论:是否符合 RFC?

角度 是否符合 说明
以太网标准严格语义(RFC 894) :cross_mark: 不符合 对于以太网接口,理论上应使用广播 MAC 封装广播 IP。
协议互操作与实现容忍度(实际 RFC 行为) :white_check_mark: 合理 RFC 未规定“ARP 关闭时必须仍发送广播帧”,Linux 的行为可视为实现选择,不违反协议必备要求。
工程意义 :white_check_mark: 正确 避免了非以太网 NOARP 接口误发广播帧,保持内核一致性。


简要结论:FreeBSD 的实现与 Linux 不同。在 FreeBSD 里,即使接口被设为 NOARPifconfig <if> -arp),对 IPv4 广播报文(如 255.255.255.255 / 子网定向广播)仍会在 L2 使用以太网广播 MAC ff:ff:ff:ff:ff:ff 发送。这是因为 FreeBSD 在 arpresolve()处理 M_BCAST/M_MCAST,完成 L2 目的地址填充后直接返回;对 IFF_NOARP 的检查发生在其,因此不会覆盖广播/多播的映射逻辑。相对地,你前面看到的 Linux 代码是在 NOARP 分支里优先把 neigh->ha 设为本机 MAC,从而“吃掉”了广播语义。