Sending ICMP ping
对于 ICMP ping 请求(回显请求),我需要获取目标的 MAC 地址吗?我正在尝试学习如何使用原始套接字在 C 中实现这一点,但无法理解如何获取目标的 MAC 地址。
任何帮助表示赞赏。
谢谢。
- 建议:获取coreutils的源码,看看ping。 gnu.org/software/coreutils
-
@HuStmpHrrr: ping 不在 coreutils 中。
[...] do I need to get the MAC address of the destination ?
不,你不应该,在大多数情况下。
来自 raw(7) 的手册页(我的重点):
Raw sockets allow new IPv4 protocols to be implemented in user space. A raw socket receives or sends the raw datagram not including link level headers.
这只是合乎逻辑的,因为您可能在 ping-ing 不在同一子网上的东西,在这种情况下,MAC 地址将是路由器的 MAC 地址。
为了证明这一点,这里有一些旧 BSD 版本 ping 的源代码——我在 Google 上找到的第一个。请注意,它不会尝试查找目标 MAC 地址。
请注意,一些 UNIX ping 程序会做各种有趣的事情。例如,某些版本允许您欺骗传出源 IP。某些版本包括 arping 功能。在这些情况下,他们将在较低级别(在链接级别)注入东西,在这种情况下,您将需要原始标头。
- 我需要获取路由器的 Mac 地址,在这种情况下是目的地(下一跳)。
-
@ Novak007,除非您不使用原始套接字,而是使用原始以太网数据包,否则您不需要这样做。如果您使用的是原始套接字,那么操作系统会为您解决这个问题。
-
正如答案所示,ARP 会处理目标 MAC 地址。如果您使用的是原始套接字并且操作系统将为您的以太网标头使用解析的地址目标 MAC
-
但是,如果要创建 arp 回复和响应,则不同,在这种情况下,您需要创建 arp 标头。
-
@cmidi 确实。普通 ping 不会这样做,但 arping(或包含 arping 的 ping)会。