Intereting Posts

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

期望的行为

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

在Linux和其他可能的操作系统,这似乎工作。 Windows XP和Windows 7对此performance出不同的行为,这两种行为都不适合我的情况。

Windows XP的行为

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

一切都是正确的。 问题是,当发送到其他接口时,广播报文的源地址是第一个接口的IP地址。 例如,想象这个networkingconfiguration(顺序是重要的):

  • 适配器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的行为

修改networking接口顺序似乎没有对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 =========================================================================== 

请参阅255.255.255.255路由? 是的,他们控制广播数据包。 在这种情况下,广播数据包将通过192.168.0.3发送,因为它具有较低的度量标准…而不是其他接口。

您可以更改全局广播数据包将很容易发送的接口(只需添加一个低度量的持久255.255.255.255路由)。 但是不pipe你怎么努力,广播数据包只能在一个接口上发送,而不是像我希望的那样。

结论

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

目标

我想在Windows(最好是Windows 7)中彻底改变这种全球IP广播支持。 当然更好的办法是有一些支持的configuration更改(registry黑客或类似),但我愿意提供所有的build议。

有任何想法吗?

并不是说我从事的是捍卫微软的工作,但是通过阅读以下试图确定广播如何工作的RFC,我不认为微软必然会违反任何RFC。 国际海事组织(IMO)应该在应用层面解决问题(即定向广播,而不是全局的),这将在路由表中find适当的路由,并只从该IPnetworking的正确接口发送。

  • RFC922
  • RFC919

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

最后,RFC 919特别说明了从RFC 919

因为我们假设这个问题已经在数据链路层解决了,一个IP主机希望
只需发送本地广播或定向广播即可
指定适当的目标地址并发送数据报
通常。 任何复杂的algorithm只需要驻留在网关中。

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

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

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

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

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