关于 c:发送 ICMP ping

Sending ICMP ping

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

任何帮助表示赞赏。
谢谢。


[...] 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 功能。在这些情况下,他们将在较低级别(在链接级别)注入东西,在这种情况下,您将需要原始标头。