当应用程序将数据包发送到全局广播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广播支持.当然更好的方法是获得某种支持的配置更改(注册表黑客或类似),但我对所有建议持开放态度.
有任何想法吗?
他们都声明没有为广播定义标准.它还在919中提到应该为广播选择特定的物理接口.对于生成广播的多宿主,多NIC机器,我认为没有明确说明应该发生什么.路由器从一个接口到另一个接口永远不会传递广播,在这种情况下,Windows机器是路由器还是路由器?
如果它充当路由器,那么响应该网络的错误IP地址的广播的任何主机(在您的示例中为适配器2和3)应该将数据包发送回适配器2和3的以太网地址以响应适配器1的IP地址和Windows主机应将其路由到正确的接口.
这听起来令人困惑……但想不出更好的方式来表达这一点
最后,RFC 919具体说明了
来自RFC 919
Since we assume that the problem
has already been solved at the data
link layer,an IP host wishing to
send either a local broadcast or a
directed broadcast need only
specify the appropriate destination
address and send the datagram as
usual. Any sophisticated algorithms
need only reside in gateways.
阅读表明源IP地址与广播无关.
由于每个应用程序似乎都以不同的方式处理广播,我认为这是责任所在.例如. nbtstat在多NIC机器上发送定向广播,而游戏可能使用全局广播.
简而言之,应该修复应用程序,而不是在这种情况下的操作系统……
编辑:这是一个link相同的情况,但在Linux上. linux内核只通过默认接口(本例中为NIC A)发送一个数据包来处理它.他们建议应用程序枚举NIC并从每个NIC发送定向广播. Link