UdpClient.Send 广播到正确和错误的界面
UdpClient.Send broadcasts to right AND wrong interface
我有两个接口 IF-A:10.0.0.1 和 IF-B:172.20.29.152。
向两个接口发送广播应该生成 2 个数据包:
var udp = new UdpClient();
var target1 = IPAddress.Parse("10.255.255.255");
var target2 = IPAddress.Parse("172.20.255.255");
udp.Send(new byte[0], 0, new IPEndPoint(target1, 80));
udp.Send(new byte[0], 0, new IPEndPoint(target2, 80));
我 运行 wireshark 看到我的电脑发出了 4 个数据包。
我发现,每次调用 "udpClient.Send" 都会创建两个相同的数据包 - 每个接口一个:
// First Send()
IF-A: from 10.0.0.1 to 10.255.255.255 (OK)
IF-B: from 10.0.0.1 to 10.255.255.255 (WTF?)
// Second Send()
IF-A: from 172.20.29.152 to 172.20.255.255 (WTF?)
IF-B: from 172.20.29.152 to 172.20.255.255 (OK)
这对我来说完全没有意义。
详情:
数据包转储(4 个数据包):http://pastebin.com/i71NZhaU
我觉得艾伦可能是对的。查看传出数据包的 src mac 地址。来自 10.0.0.1 的两个帧都有一个 src mac 60:67:20:ca:a6:2c
而来自 172.20.29.152 的两个帧都有 d4:be:d9:84:43:b8
.
的 src mac
Ethernet II, Src: IntelCor_ca:a6:2c (60:67:20:ca:a6:2c), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.255.255.255 (10.255.255.255)
Ethernet II, Src: DellInc_84:43:b8 (d4:be:d9:84:43:b8), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 172.20.29.152 (172.20.29.152), Dst: 172.20.255.255 (172.20.255.255)
Ethernet II, Src: DellInc_84:43:b8 (d4:be:d9:84:43:b8), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 172.20.29.152 (172.20.29.152), Dst: 172.20.255.255 (172.20.255.255)
Ethernet II, Src: IntelCor_ca:a6:2c (60:67:20:ca:a6:2c), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.255.255.255 (10.255.255.255)
我不是 C# 方面的专家,但我看不出它为什么会发送两个数据报,所以我的假设是你的两个 NIC 都在交换机上的同一个 VLAN 中,并且你在转储中看到的前两个帧是传出帧,后两个是传入帧。
因此,当您将帧从 60:67:20:ca:a6:2c
(转储中带有 10.0.0.1 的接口 0)发送到 ff:ff:ff:ff:ff:ff
时,交换机将在同一 vlan 中的所有接口上转发该帧,除了一个它收到了框架。它不查看 IP 地址,因此如果使用 d4:be:d9:84:43:b8
连接到您的接口的端口(转储中具有 172.20.29.152 的接口 1)配置为与另一个接口位于同一 vlan 中,您将收到框架上。另一帧也会发生同样的事情。
我有两个接口 IF-A:10.0.0.1 和 IF-B:172.20.29.152。
向两个接口发送广播应该生成 2 个数据包:
var udp = new UdpClient();
var target1 = IPAddress.Parse("10.255.255.255");
var target2 = IPAddress.Parse("172.20.255.255");
udp.Send(new byte[0], 0, new IPEndPoint(target1, 80));
udp.Send(new byte[0], 0, new IPEndPoint(target2, 80));
我 运行 wireshark 看到我的电脑发出了 4 个数据包。 我发现,每次调用 "udpClient.Send" 都会创建两个相同的数据包 - 每个接口一个:
// First Send()
IF-A: from 10.0.0.1 to 10.255.255.255 (OK)
IF-B: from 10.0.0.1 to 10.255.255.255 (WTF?)
// Second Send()
IF-A: from 172.20.29.152 to 172.20.255.255 (WTF?)
IF-B: from 172.20.29.152 to 172.20.255.255 (OK)
这对我来说完全没有意义。
详情:
数据包转储(4 个数据包):http://pastebin.com/i71NZhaU
我觉得艾伦可能是对的。查看传出数据包的 src mac 地址。来自 10.0.0.1 的两个帧都有一个 src mac 60:67:20:ca:a6:2c
而来自 172.20.29.152 的两个帧都有 d4:be:d9:84:43:b8
.
Ethernet II, Src: IntelCor_ca:a6:2c (60:67:20:ca:a6:2c), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.255.255.255 (10.255.255.255)
Ethernet II, Src: DellInc_84:43:b8 (d4:be:d9:84:43:b8), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 172.20.29.152 (172.20.29.152), Dst: 172.20.255.255 (172.20.255.255)
Ethernet II, Src: DellInc_84:43:b8 (d4:be:d9:84:43:b8), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 172.20.29.152 (172.20.29.152), Dst: 172.20.255.255 (172.20.255.255)
Ethernet II, Src: IntelCor_ca:a6:2c (60:67:20:ca:a6:2c), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.255.255.255 (10.255.255.255)
我不是 C# 方面的专家,但我看不出它为什么会发送两个数据报,所以我的假设是你的两个 NIC 都在交换机上的同一个 VLAN 中,并且你在转储中看到的前两个帧是传出帧,后两个是传入帧。
因此,当您将帧从 60:67:20:ca:a6:2c
(转储中带有 10.0.0.1 的接口 0)发送到 ff:ff:ff:ff:ff:ff
时,交换机将在同一 vlan 中的所有接口上转发该帧,除了一个它收到了框架。它不查看 IP 地址,因此如果使用 d4:be:d9:84:43:b8
连接到您的接口的端口(转储中具有 172.20.29.152 的接口 1)配置为与另一个接口位于同一 vlan 中,您将收到框架上。另一帧也会发生同样的事情。