如何更改 Windows 上的全局广播地址 (255.255.255.255) 行为?

Eti*_*mps 10 networking windows ip

期望的行为

当应用程序向全局广播 IP 地址发送数据包时255.255.255.255,我希望将数据包发送到ff:ff:ff:ff:ff:ff所有接口上的以太网全局广播地址 ( )。

在 Linux 和其他操作系统上,这似乎也有效。Windows XP 和 Windows 7 在这方面表现出不同的行为,对于我的情况,这两种行为都是不可取的。

Windows XP 行为

数据包将正确发送到第一个网络接口(接口顺序在“网络连接/高级/高级设置”中指定)。它也将被发送到其他接口。

到目前为止一切正常。问题是,当发送到其他接口时,广播数据包的源地址是第一个接口的IP地址。例如,想象一下这个网络配置(顺序很重要):

  • 适配器 1:IP 地址 192.168.0.1
  • 适配器 2:IP 地址 10.0.0.1
  • 适配器 3:IP 地址 172.17.0.1

现在,如果我发送广播数据包,将发送以下数据包(带有源和目标 IP 地址):

  • 在适配器 1 上:192.168.0.1=>255.255.255.255

  • 在适配器 2 上:192.168.0.1=>255.255.255.255

  • 在适配器 3 上:192.168.0.1=>255.255.255.255

    实际上,使用广播数据包的应用程序不能在适配器 1 以外的任何接口上工作。在我看来,这是 Windows XP 的 TCP/IP 堆栈中的一个明显错误。

Windows 7 行为

修改网络接口顺序似乎对 Windows 7 没有任何影响。相反,广播似乎由 IP 路由表控制。

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0   10.202.254.254       10.202.1.2    286
          0.0.0.0          0.0.0.0      192.168.0.1      192.168.0.3     10
       10.202.0.0      255.255.0.0         On-link        10.202.1.2    286
       10.202.1.2  255.255.255.255         On-link        10.202.1.2    286
   10.202.255.255  255.255.255.255         On-link        10.202.1.2    286
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.0.0    255.255.255.0         On-link       192.168.0.3    266
      192.168.0.3  255.255.255.255         On-link       192.168.0.3    266
    192.168.0.255  255.255.255.255         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link        10.202.1.2    286
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link       192.168.0.3    266
  255.255.255.255  255.255.255.255         On-link        10.202.1.2    286
===========================================================================
Run Code Online (Sandbox Code Playgroud)

看到255.255.255.255路线了吗?是的,他们控制广播数据包。在这种情况下,广播数据包将通过 发送,192.168.0.3因为它具有较低的指标......但不会发送到其他接口。

您可以非常轻松地更改发送全局广播数据包的接口(只需添加255.255.255.255一个低度量的持久路由)。但是无论您多么努力,广播数据包都只会在一个接口上发送,而不是像我希望的那样全部发送。

结论

  • Windows 7 只向一个接口发送广播数据包。你可以选择哪一个,但这不是这里的重点。
  • Windows XP 向所有接口发送广播数据包,但它只按预期将它们发送到一个接口,这在实践中相当于 Windows 7 的行为。

目标

我想一劳永逸地更改 Windows(最好是 Windows 7)中的这种全局 IP 广播支持。当然,更好的方法是进行某种受支持的配置更改(注册表修改或类似操作),但我愿意接受所有建议。

有任何想法吗?

Sco*_*erg 6

并不是说我是在为 Microsoft 辩护,而是在阅读了以下试图定义广播如何工作的 RFC 之后,我认为 Microsoft 不一定违反了任何 RFC。IMO 问题应该在应用程序级别(即定向广播,而不是全局)修复,这将命中路由表中的适当路由,并且仅从该 IP 网络的正确接口发送。

他们都声明没有为广播定义标准。它还在 919 中提到应该为广播选择特定的物理接口。在多宿主、多 NIC 机器生成广播的情况下,我认为没有明确说明应该发生什么。广播永远不应该由路由器从一个接口传递到另一个接口,那么在这种情况下,Windows 机器是否是路由器?
如果它充当路由器,那么任何响应广播的主机(在您的示例中为适配器 2 和 3)都应该将数据包发送回适配器 2 和 3 的以太网地址以响应适配器1 的 IP 地址和 Windows 主机应将其路由到正确的接口。
这听起来令人困惑……但想不出更好的表达方式

最后,RFC 919 特别说明 来自 RFC 919

由于我们假设问题已经在数据链路层解决了,所以希望
发送本地广播或定向广播的 IP 主机只需要
指定适当的目标地址并
照常发送数据报。任何复杂的算法只需要驻留在网关中。

阅读这表明源 IP 地址与广播无关。


由于每个应用程序似乎以不同的方式处理广播,我认为这就是责任所在。例如。 nbtstat在多网卡机器上发送定向广播,而游戏可能使用全局广播。
简而言之,在这种情况下,应用程序应该是固定的,而不是操作系统......

编辑:这是相同情况的链接,但在 Linux 上。linux 内核通过仅从默认接口(本例中为 NIC A)发送一个数据包来处理它。他们建议应用程序枚举 NIC 并向每个 NIC发送定向广播。 关联

  • 不知道你说的重复是什么意思。RFC 特别禁止转发广播数据包。应该只发送一个数据包,我认为这是我们讨论的全部关键。如果操作系统按照你说的做,它实际上必须生成 9 个数据包(每个接口 3 个),因为 IP 层必须生成三个具有单独源 IP 的数据包(第 3 层的每个 NIC 一个),然后每个 NIC 都必须将它们发送到以太网(第 2 层)上。如果网络之间存在路由,那么您会得到 3 个响应!哪一个是对的? (4认同)
  • 不明白您从 RFC 919 中引用的段落与源地址之间的关系。在我看来很明显,在具有另一个接口的源地址的接口上发送 IP 数据包*总是*是错误的,而不管数据包的广播/单播性质如何。我的意思是,您不能合理地说“源 IP 地址与广播无关”,当然是这样!应用程序还应该如何知道谁发送了广播? (2认同)

Eti*_*mps 4

最后我通过编程解决了这个问题。我编写了一个名为WinIPBroadcast的小软件,它负责将广播帧中继到所有接口。

它的工作原理是利用一个有趣的事实:在侦听环回地址 (127.0.0.1) 时,可以接收本地生成的全局广播数据包。WinIPBroadcast 使用原始套接字侦听所有广播的本地地址,然后对于每个广播数据包,它将其中继到除首选接口之外的所有接口。

更新 06.12.2021:更新了社区链接