查找以太网头的下一跳MAC地址

时间:2018-08-14 08:50:02

标签: c linux network-programming ethernet

我想将数据包发送到另一台机器,但以太网头中的MAC地址不同。为此,我在C中使用原始套接字并创建自己的以太网头,以便可以根据需要设置源MAC。问题是我不确定要在标题中填写哪个目标MAC地址。我知道目标计算机的IP,但不知道MAC。即使知道,我也不想对该MAC进行硬编码。

我看到的一个选择是,我的机器将知道其ARP表中的MAC,并且我可以读取它并获取MAC地址并进行填充。但是在发送每个数据包之前这样做会产生开销。我可以阅读一次并继续使用,但是如果有一天替换目标计算机,该怎么办。管理员会将相同的IP地址分配给新计算机,但MAC地址将不同。新机器启动时,可能会发送免费的ARP,而我的机器将更新其ARP表。但是我的程序不知道这一点。我的程序将继续使用旧的MAC发送数据包。

我觉得我缺少一些非常基本的东西。有想法吗?

2 个答案:

答案 0 :(得分:1)

您在这里看到的是每个人都试图实现网络堆栈的相同问题。 您有几种选择:

  • 如果数据包是 reply 数据包,则只需使用发件人地址的MAC地址
  • 如果表中的条目丢失或过时,则可以维护自己的arp表并发送arp请求。解析arp答复并相应地更新您的表。没有有效arp表条目的要发送的数据包必须排队。这是最优雅的方法,但也是非常苛刻的选择。
  • 您只需将数据包发送到本地路由器的MAC。它将把数据包转发到IP标头中指定的正确主机。如果您的本地路由器使用vrrp,hsrp或gblp等协议,则即使更换了路由器,MAC地址也将始终相同且不会更改。
  • 您可以从getString()/proc/net/arp读取MAC地址,但是如果您的主机最近未尝试与之通信,则所寻找IP的条目可能不存在。当然,您可以在读取arp表之前将带有ioctl(SIOCGARP, ...);的伪数据包发送到该主机。

如果您更详细地描述您打算做什么,建议可能会更好。

答案 1 :(得分:0)

您可以使用SIOCSIFHWADDR ioctl请求设置设备的MAC地址。 netdevice的手册是一个很好的起点。