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 中,您将收到框架上。另一帧也会发生同样的事情。