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


10

期望的行为

当应用程序向全球广播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
===========================================================================

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

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

结论

  • Windows 7仅将广播数据包发送到一个接口。您可以选择哪一个,但这不是重点。
  • Windows XP将广播数据包发送到所有接口,但仅按预期方式将它们发送到一个接口,这实际上等同于Windows 7行为。

目标

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

有任何想法吗?


您正在使用什么来生成这些广播。除了定向广播,我无法让XP堆栈执行任何操作。即10.202.255.255您的情况。
Scott Lundberg,2009年

您能否参考RFC或其他说明您描述的正确行为的文档?虽然我同意它是理想的行为,但称其为正确行为应参考定义正确行为的规范。可能是特定的路由实现由提供者(在这种情况下为Microsoft)决定吗?
杰森·库姆斯

斯科特·伦德伯格(Scott Lundberg):许多应用程序(尤其是游戏)将发送全球广播。您可以使用netcat生成一些内容:例如“ nc -v -u 255.255.255.255 5000”。
Etienne Dechamps,2009年

杰森·库姆斯(Jason R. Coombs):的确,也许我的单词选择不佳。我应该使用“理想的行为”。我认为没有RFC,但是我可能是错的。
Etienne Dechamps,2009年

您正在发送TCP或UDP数据包吗?据此,这很重要social.msdn.microsoft.com/Forums/en/peertopeer/thread/…
Nissan Fan

Answers:


6

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

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

最后,RFC 919特别指出“ 来自RFC 919”

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

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


由于每个应用程序似乎对广播的处理方式不同,因此我认为这是责任所在。例如。 nbtstat在多网卡的计算机上发出定向广播,而游戏可能使用全局广播。
简而言之,应固定应用程序,而不是固定操作系统。

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


2
在不理解您从RFC 919引用的段落和源地址之间的关系。在我看来,无论数据包的广播/单播性质如何,在具有另一个接口源地址的接口上发送IP数据包总是错误的。我的意思是,您不能合理地说“源IP地址与广播无关”,当然是!应用程序还应该如何知道谁发送了广播?
Etienne Dechamps,2009年

1
“在919中还提到应为广播选择特定的物理接口。” 哪里?“地址255.255.255.255表示在本地硬件网络上广播”(RFC919 7.)?在这种情况下,我谨表示不同意。我们正在讨论在主机级别而不是在网络级别处理广播。此外,下面仅说一台主机可以“通过使用255.255.255.255广播到其所有直接邻居”。它的所有直接邻居。不是“特定网络接口上的所有邻居”。
Etienne Dechamps,2009年

1
“应用程序不在乎哪个接口发送了广播。它们只需要对此做出响应。” 嗯...他们也需要发送广播,而不仅仅是响应它们。考虑局域网游戏服务器浏览器的情况。它发送广播数据包以发现网络上的游戏服务器。如果广播数据包未发送到所有接口,则游戏服务器浏览器将不会显示通过这些接口可访问的游戏服务器。换句话说,史诗般的失败。
Etienne Dechamps,2009年

1
“我不确定,但是我认为操作系统正在收到255.255.255.255请求,并说它需要在所有接口上发送该请求(以找到所有直接邻居),但是它是从特定应用程序请求的,绑定到一个特定IP(根据指标可能是默认值)。” 我同意。这并不意味着这是正确的事情。在我看来,从应用程序开发人员的角度来看,它完全违反了最少惊讶的原则,后者只是希望将数据包发送到所有接口上的每个人。
Etienne Dechamps,2009年

4
不知道重复是什么意思。RFC特别禁止转发广播数据包。应该只发送一个数据包,我认为这是我们整个讨论的重点。如果操作系统按照您所说的去做,则实际上必须生成9个数据包(每个接口3个),因为IP层必须生成三个具有单独源IP的数据包(每个3层NIC一个)。每个NIC都必须通过以太网将其发送出去(第2层)。如果网络之间存在路由,那么您将获得3条回复!哪一个是对的?
Scott Lundberg

4

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

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


由于Windows堆栈是BSD堆栈的分支,因此我很想知道BSD是否表现出相同的行为。
x0n 2011年

您的软件无法正常工作。The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.。祝您.dll在Google上找到成功。
亚历克斯G

@AlexG:太奇怪了,我以为我已经通过github.com/dechamps/WinIPBroadcast/commit/…解决了这个问题。您确定运行的是最新版本(1.6)吗?请随时在github.com/dechamps/WinIPBroadcast/issues上提交错误,我来看一下。
Etienne Dechamps
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.