如何在Linux上用C语言从ICMP回复中提取MAC地址

4
我正在尝试在交换环境中发送原始数据包后查找机器的MAC地址。我正在尝试实现traceroute命令。当我收到ICMP超时消息时,我想知道如何提取该机器的MAC地址。由于我是网络编程新手,因此不确定哪个套接字调用可以帮助我提取MAC地址。
谢谢。

请帮我推荐一些深入了解套接字的好书。 - j10
2
W. Richard Stevens的UNIX网络编程http://www.amazon.com/Unix-Network-Programming-Sockets-Networking/dp/0131411551 - 我只有第一版,强烈推荐... - 无论如何,我认为第三版也同样启发人心。 - alk
试试这个:http://stackoverflow.com/questions/4012921/how-to-determinate-destination-mac-address - Piotr Praszmo
3个回答

4

不可以从ICMP回复中提取MAC地址。

您只能确定与您相连的机器的MAC地址。在ICMP(tracert)中,您只能找到目标或中间机器的IP地址。

如果想检测MAC地址,应在本地网络中使用适用的ARP协议,而不是在互联网上。

ICMP协议从IPv4头开始[1],MAC地址与物理/链路层有关。在低层级中,MAC地址将从高层级(如网络(IP)或传输等)透明。

要确定MAC地址,您应该使用原始套接字或PCAP SDKs来访问网络编程的较低层。 (我再次强调,这些对互联网毫无用处)


那么,为了实现跟踪第二层的路由的traceroute mac命令,我应该如何继续? - j10
您可以使用“以太网地址解析协议”(ARP)(http://tools.ietf.org/html/rfc826)。目前没有标准的方法来在互联网上检索MAC地址。 - masoud

0
一般而言,在互联网上,您甚至不知道主机用于传输数据包的媒体。假设远程主机通过PPP协议连接到串行rs-232-C链接。它没有MAC地址。例如,如果主机使用令牌环接口或帧中继链路,则也会发生这种情况。这使得确定主机的远程MAC地址完全成为本地问题。通常,当您从以太网上的远程站点获得数据包时,数据包中源MAC地址是将您连接到互联网的最后一个路由器的MAC地址,而不是发送IP数据包的原始主机的MAC地址。在关于鸟类承运人的IP RFC(rfc1149、rfc2549和rfc6214)中,用于传输的媒体不允许使用MAC地址(如果鸽子上有可行的链接地址,那么应该是其名称)。
如果您想了解交换机以太网网络上的traceroute,请参阅IEEE802.1ag,该规范具有在交换机上执行tracerouting的功能(tracelink服务),但我认为这超出了本回答的范围。

0

正如Masoud M所说,您只能获取本地网络上的机器的MAC地址。 也就是说,您可以解析arp命令的输出,通过IP地址查找本地网络上某台机器的MAC地址。


那么,为了实现跟踪第二层的路由的traceroute mac命令,我应该如何进行? - j10
@JitenShah,您是在谈论http://routemyworld.com/2009/05/01/layer-2-traceroute/中描述的Cisco层2跟踪吗? 如果是这样,那就需要使用思科专有的Cisco Discovery Protocol。 您可以尝试使用开放式链路层发现协议进行类似的操作,但沿途的设备需要实现该协议,而且您必须阅读文档以了解如何发现设备之间的连接方式。 还要注意,CDP和LLDP仍然局限于本地网络,并且无法获取LAN外的MAC地址。 - Sam Skuce
谢谢。是的,我在谈CDP。那么,如果我想实现它,我应该如何算法上进行?我无法想象这如何适用于第二层。当你说:“traceroue mac1 mac2”时,这是如何工作的?这是否意味着我需要使用RARP(反向)查找命令中使用的两个设备的IP,然后在第三层进行跟踪路由,以获取IP,然后使用ARP获取中间设备的MAC地址。CDP如何帮助我? - j10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接