【问题标题】:Sending ICMP ping发送 ICMP ping
【发布时间】:2015-09-11 14:45:17
【问题描述】:

对于 ICMP ping 请求(回显请求),我需要获取目标的 MAC 地址吗?我正在尝试学习如何使用原始套接字在 C 中实现这一点,但无法理解如何获取目标的 MAC 地址。

感谢任何帮助。 谢谢。

【问题讨论】:

标签: c macos ping icmp raw-sockets


【解决方案1】:

[...] 我需要获取目的地的 MAC 地址吗?

不,在大多数情况下,您不应该这样做。

来自raw(7) 的手册页(我的重点):

原始套接字允许在用户空间中实现新的 IPv4 协议。原始套接字接收或发送原始数据报不包括链接级标头

这只是合乎逻辑的,因为您可能ping-ing 不在同一个子网上的东西,在这种情况下,MAC 地址将是路由器的 MAC 地址。

为了证明这一点,hereping 的旧 BSD 版本的一些源代码 - 我在 Google 上找到的第一个源代码。请注意,它不会尝试查找目标 MAC 地址。

请注意,一些 UNIX ping 程序会做各种有趣的事情。例如,某些版本允许您欺骗传出源 IP。某些版本包括arping 功能。在这些情况下,他们将在较低级别(在链接级别)注入东西,在这种情况下,您将需要原始标头。

【讨论】:

  • 我需要获取路由器的Mac地址,在这种情况下是目的地(下一跳)。
  • @Novak007,除非您使用原始套接字,而是使用原始以太网数据包,否则您不需要这样做。如果您使用的是原始套接字,那么操作系统会为您解决这个问题。
  • 正如答案所暗示的,ARP 会处理目标 MAC 地址。如果您使用的是原始套接字,并且操作系统将为您的以太网标头使用解析的目标 MAC 地址
  • 不同的是,如果您想创建 arp 回复和响应,在这种情况下您需要创建一个 arp 标头。
  • @cmidi 确实如此。普通ping 不会这样做,但arping(或包含arping 的ping)会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多