如何以编程方式在 iOS 中通过 IPv6 获取远程 MAC 地址

How to get a remote MAC address via IPv6 in iOS programmatically

我需要找到一个解决方案,如何从 WiFi 网络中的其他设备获取 MAC 地址。有一个很好的方法可以为 IPv4 (How does iOS app Fing get MAC Address?) 执行此操作,但是如何为 IPv6 执行此操作?由于ARP被NDP(Neighbour Discovery Protocol)取代,后一种方法行不通。如果有人能帮助我,我将不胜感激。

我为此目的使用 MMLanScan。开始查找 LAN 上设备的 IP/MAC 地址非常简单。

我以前用过它,但我认为它也适用于 IPv6。

层与封装

网络架构是分层的,上层封装下层的不同实现,提供相对于下层更高的抽象。 使用 IP 的网络层封装了不同的 link 层协议,如以太网、WiFi、PPP(可能 运行 在不使用 MAC 地址的串行电缆上)等

  • 所以,第一个问题是remote是什么意思?

如果你指的是 WAN 中的其他主机,除非两个设备都实现特定协议,否则这是不可能的:你向这些设备发送请求,他们用他的 mac 地址回复。

如果您指的是同一局域网中的其他主机,则可以在 IPv4 中使用 ARP 协议,在 IPv6 中使用 NDP(which )。

Arp 和 NDP

ARP在知道主机的IP地址但不知道MAC地址的情况下在局域网内发送广播,发现有人呼叫他的主机回复其MAC地址。

NDP 提供了两个主要功能部分,第一个与 ARP 相同:网络层地址和 link 层地址之间的映射。 (区别在于NDP使用多播地址:前缀f02::1:f/104,结合请求的IPv6地址的低24位)

所以您需要发送 ICMPv6 Neighbor Solicitation 消息。

IPv6 中的地址分配

Link-local IPv6 addresses (and some global IPv6 addresses) use interface identifiers (IIDs) as a basis for unicast IPv6 address assignment. ... IIDs are ordinarily 64 bits long and are formed either directly from the underlyinglink-layer MAC address of a network interface using a modified EUI-64 format. or by another process that randomizes the value in hopes of providing some degree of privacy against address tracking.

因此在大多数情况下,您可以直接从设备的 IPv6 link 本地地址获取设备的 MAC 地址。

结论:

  • 在两个设备中实施您的协议
  • 如果请求节点在同一个 LAN 中,则向请求节点发送 NDP 消息
  • 从 link 本地 IPv6 地址中提取 MAC 地址

参考

  • 维基百科
  • TCP/IP 图解,第 1 卷