UdpClient.Send广播到正确和错误的接口

时间:2015-02-06 11:51:04

标签: c# networking udp broadcast ipv4

我有两个接口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 Packet summary

1 个答案:

答案 0 :(得分:0)

我认为Eren可能是对的。查看传出数据包的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#的专家,但我认为没有理由为什么会发送两个数据报,所以我的假设是你的两个网卡都在交换机上的同一个VLAN中,而你在转储中看到的前两个帧是传出帧,后两个是传入帧。

因此,当您将帧从60:67:20:ca:a6:2c(接口0与转储中的10.0.0.1)发送到ff:ff:ff:ff:ff:ff时,交换机将在同一个VLAN中的所有接口上转发该帧,但收到的帧除外框架上。它不会查看IP地址,因此如果连接到您的接口的端口d4:be:d9:84:43:b8(转储中的接口1与172.20.29.152)配置为与其他接口位于同一个VLAN中,您将收到它的框架。对于另一个框架也会发生同样的事情。