【问题标题】:How is the destination MAC address automatically updated when the destination IP address is geven for an UDP frame in C#在 C# 中为 UDP 帧提供目标 IP 地址时,如何自动更新目标 MAC 地址
【发布时间】:2015-05-13 07:42:58
【问题描述】:

我尝试了如下所示的程序:-

 class Program
{
    static IPEndPoint Mypoint = new IPEndPoint(IPAddress.Parse("10.169.20.30"), 8050);
    static IPEndPoint UrPoint = new IPEndPoint(IPAddress.Parse("10.169.20.15"), 8051);
    static UdpClient TxClient;
    static void Main(string[] args)
    {
        int i = 0;
        byte[] data= new byte[1472];
        TxClient = new UdpClient(Mypoint);
        while (i < 500)
        {
            data[i]++;
            try
            {
                TxClient.Send(data, data.Length, UrPoint);
            }
            catch { }
            Console.WriteLine("Sent frame " + ++i + " times\n");

        }
        Console.ReadKey();
    }
}

在此我向 IP 地址为 10.169.20.15 的系统发送一系列帧。我没有为此系统提供任何 MAC ID。 但是当我通过wireshark查看帧的传输时,我发现目标MAC Id会自动更新为该系统的MAC Id。

谁能告诉我这是怎么回事。是系统自动找出IP地址对应的MAC id,还是有其他原因。

我之所以问这个是因为,我现在需要以 UDP 协议与微控制器通信。由于我无法在 C# 中更新目标 MAC 地址,因此仅提供 IP 地址就足够了。 MAC Id 会自动解析吗?

希望问题很清楚,感谢您的帮助!!!

编辑:- 我尝试在命令提示符下使用 arp -s ipaddress mac address 然后运行我的程序,但是发送的帧仍然没有传输到给定的 mac 地址。

谁能告诉我如何解决这个问题。 感谢您的帮助

【问题讨论】:

    标签: c# udp ethernet


    【解决方案1】:

    简而言之,IP 不关心 MAC 地址,以太网软件/驱动程序关心。

    IP 层及以上(包括 TCP/UDP)完全独立于较低层。它甚至不知道以太网在下面,也不应该(也许它不是以太网?)。 IP的软件只是构建它的数据包并将它们发送到下面的层,这层是什么并不重要。这意味着在 IP 级别没有 MAC 地址的概念,这是一件好事,它允许在没有 MAC 地址的网络上运行 IP。

    现在,如您所见,这个 MAC 地址是如何更新为正确的?这实际上非常简单。网络上的每个设备都知道下一个到达数据包目标的设备,并相应地填充 MAC 源和目标。每个设备通过填写正确的 MAC 地址在以太网上中继数据包。

    【讨论】:

    • @ElderBug,这是否意味着如果我将微控制器连接到我电脑的以太网端口,驱动程序会自动保存它的 MAC 地址?并且每次我向它的 IP 地址发送一个帧时,MAC 都会自动更新?
    • @Bas 微控制器的 MAC 地址将存储在 PC 的 ARP 表中。这是一个用于了解哪个设备(MAC 地址)与哪个 IP 相关联的表。 ARP 通常被视为以太网和 IP 之间的一层。它有点像 DNS(IP 是“google.com”),但用于较低层。当 PC 发送数据包时,驱动程序会在某个时候查看 ARP 表,并确定它必须将数据包发送到哪个 MAC。微控制器也会做同样的事情。
    • @Bas 在 windows 和 linux 上,您可以使用 arp -a 命令显示 ARP 表(两个操作系统的命令相同)。
    • @Bas 如果arp -s 没有做任何事情,你可能做错了。无论如何,由于您的 MCU 和您的计算机已连接到路由器,因此预期的行为是使用路由器的 MAC。否则它将无法正常工作。换句话说,发送到路由器 MAC 的数据包是正常的。此外,您不必在 MAC 和 ARP 级别上做任何事情。如果它不能按原样工作,则问题可能不在 MAC 或 ARP 上。
    • @Bas 你真的不需要使用arp -s。您的 MCU 软件是否启用了 ARP?任何具有以太网和 IP 堆栈的 MCU 都应实现 ARP。我的意思是,如果它不能按原样工作,那就是有问题,使用arp -s 不是解决方案,只是一种解决方法。您可以选择忽略该问题,但这并不是真正推荐的。对于直接链接和路由器链接,这仍然适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多