期望的行为
@H_403_1@当应用程序将数据包发送到全局广播IP地址255.255.255.255时,我希望在所有接口上将数据包发送到以太网全局广播地址(ff:ff:ff:ff:ff:ff).
@H_403_1@在Linux和其他操作系统上,这似乎也有效. Windows XP和Windows 7在此方面表现出不同的行为,这种行为都不适合我的情况.
@H_403_1@Windows XP的行为
@H_403_1@数据包将正确发送到第一个网络接口(接口顺序在“网络连接/高级/高级设置”中指定).它也将被发送到其他接口.
@H_403_1@到目前为止,一切都是正确的.问题是,当发送到其他接口时,广播包的源地址是第一个接口的IP地址.例如,想象一下这个网络配置(顺序很重要):
@H_403_1@>适配器1:IP地址192.168.0.1
>适配器2:IP地址10.0.0.1
>适配器3:IP地址172.17.0.1 @H_403_1@现在,如果我发送广播数据包,将发送以下数据包(包含源和目标IP地址): @H_403_1@>在适配器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 @H_403_1@实际上,使用广播数据包的应用程序将无法在适配器1以外的任何接口上运行.在我看来,这是Windows XP的TCP / IP堆栈中的一个明显的错误. @H_403_1@Windows 7的行为 @H_403_1@修改网络接口顺序似乎对Windows 7没有任何影响.相反,广播似乎由IP路由表控制.
> Windows XP将广播数据包发送到所有接口,但它只按预期将它们发送到一个接口,实际上这相当于Windows 7的行为. @H_403_1@目标 @H_403_1@我想一劳永逸地在Windows(最好是Windows 7)中更改此全局IP广播支持.当然更好的方法是获得某种支持的配置更改(注册表黑客或类似),但我对所有建议持开放态度. @H_403_1@有任何想法吗?
>适配器2:IP地址10.0.0.1
>适配器3:IP地址172.17.0.1 @H_403_1@现在,如果我发送广播数据包,将发送以下数据包(包含源和目标IP地址): @H_403_1@>在适配器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 @H_403_1@实际上,使用广播数据包的应用程序将无法在适配器1以外的任何接口上运行.在我看来,这是Windows XP的TCP / IP堆栈中的一个明显的错误. @H_403_1@Windows 7的行为 @H_403_1@修改网络接口顺序似乎对Windows 7没有任何影响.相反,广播似乎由IP路由表控制.
@H_403_1@查看255.255.255.255路线?是的,他们控制广播包.在这种情况下,广播数据包将通过192.168.0.3发送,因为它具有较低的度量…但不是其他接口. @H_403_1@您可以更改非常容易发送全局广播数据包的接口(只需添加具有低度量标准的持久性255.255.255.255路由).但无论你怎么努力,广播数据包只会在一个接口上发送,而不是像我希望的那样全部发送. @H_403_1@结论 @H_403_1@> Windows 7仅将广播数据包发送到一个接口.你可以选择哪一个,但这不是重点.
- 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
- ===========================================================================
> Windows XP将广播数据包发送到所有接口,但它只按预期将它们发送到一个接口,实际上这相当于Windows 7的行为. @H_403_1@目标 @H_403_1@我想一劳永逸地在Windows(最好是Windows 7)中更改此全局IP广播支持.当然更好的方法是获得某种支持的配置更改(注册表黑客或类似),但我对所有建议持开放态度. @H_403_1@有任何想法吗?
并不是说我是在为微软辩护,但在阅读了下面那些试图定义广播如何工作的RFC之后,我认为微软不一定会违反任何RFC. IMO问题应该在应用级别(即定向广播,而不是全局)上修复,这将触及路由表中的适当路由,并且仅从该IP网络的正确接口发送.
@H_403_1@> RFC922
> RFC919 @H_403_1@他们都声明没有为广播定义标准.它还在919中提到应该为广播选择特定的物理接口.对于生成广播的多宿主,多NIC机器,我认为没有明确说明应该发生什么.路由器从一个接口到另一个接口永远不会传递广播,在这种情况下,Windows机器是路由器还是路由器?
如果它充当路由器,那么响应该网络的错误IP地址的广播的任何主机(在您的示例中为适配器2和3)应该将数据包发送回适配器2和3的以太网地址以响应适配器1的IP地址和Windows主机应将其路由到正确的接口.
这听起来令人困惑……但想不出更好的方式来表达这一点 @H_403_1@最后,RFC 919具体说明了
来自RFC 919
简而言之,应该修复应用程序,而不是在这种情况下的操作系统…… @H_403_1@编辑:这是一个link相同的情况,但在Linux上. linux内核只通过默认接口(本例中为NIC A)发送一个数据包来处理它.他们建议应用程序枚举NIC并从每个NIC发送定向广播. Link
> RFC919 @H_403_1@他们都声明没有为广播定义标准.它还在919中提到应该为广播选择特定的物理接口.对于生成广播的多宿主,多NIC机器,我认为没有明确说明应该发生什么.路由器从一个接口到另一个接口永远不会传递广播,在这种情况下,Windows机器是路由器还是路由器?
如果它充当路由器,那么响应该网络的错误IP地址的广播的任何主机(在您的示例中为适配器2和3)应该将数据包发送回适配器2和3的以太网地址以响应适配器1的IP地址和Windows主机应将其路由到正确的接口.
这听起来令人困惑……但想不出更好的方式来表达这一点 @H_403_1@最后,RFC 919具体说明了
来自RFC 919
@H_403_1@Since we assume that the problem@H_403_1@阅读表明源IP地址与广播无关. @H_403_1@由于每个应用程序似乎都以不同的方式处理广播,我认为这是责任所在.例如. nbtstat在多NIC机器上发送定向广播,而游戏可能使用全局广播.
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.
简而言之,应该修复应用程序,而不是在这种情况下的操作系统…… @H_403_1@编辑:这是一个link相同的情况,但在Linux上. linux内核只通过默认接口(本例中为NIC A)发送一个数据包来处理它.他们建议应用程序枚举NIC并从每个NIC发送定向广播. Link