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

Posted

技术标签:

【中文标题】如何以编程方式在 iOS 中通过 IPv6 获取远程 MAC 地址【英文标题】:How to get a remote MAC address via IPv6 in iOS programmatically 【发布时间】:2016-11-12 07:50:28 【问题描述】:

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

【问题讨论】:

如果您查看 NDP 的工作原理,网络上的每个主机都会订阅一个基于其 IPv6 地址的 Solicited Node 多播地址。您可以将邻居请求消息发送到 IPv6 地址或请求节点地址。在您的应用程序中制作它应该是相当简单的。 RFC 4861, Neighbor Discovery for IP version 6 (IPv6) 为您提供了用于此目的的消息格式: @RonMaupin 你能提供一个具体的答案吗? 你的意思是给你写代码吗?我不这么认为... @RonMaupin 答案不需要实际代码,但需要足够的设计细节,以便其他人可以编写代码。由于目前这个问题没有答案,但人们对答案很感兴趣,我决定提供一些我来之不易的声誉来寻求某人的答案。由于您提供了指向起点的评论,因此您似乎是接近实际答案的合乎逻辑的人,该答案将提供的不仅仅是开始的提示。起始提示和实际代码之间存在很大差距,我只是请求帮助填写。 【参考方案1】:

层和封装

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

那么,第一个问题是remote 是什么意思?

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

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

Arp & NDP

当ARP知道主机的IP地址但不知道MAC地址时,它会在局域网中发送广播,然后找到某人正在呼叫他的主机回复其MAC地址。

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

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

IPv6 中的地址分配

链路本地 IPv6 地址(和一些全球 IPv6 地址)使用接口标识符 (IID) 作为单播 IPv6 地址分配的基础。 ... IID 通常为 64 位长,并且使用修改后的 EUI-64 格式直接从网络接口的底层链路层 MAC 地址形成。或由另一个 随机化值的过程,以期提供一定程度的隐私以防止地址跟踪。

因此,在最常见的情况下,您可以直接从设备的 IPv6 链路本地地址获取设备的 MAC 地址。

结论:

在两个设备中实现您的协议 如果请求节点在同一个局域网中,则向请求节点发送 NDP 消息 从链路本地 IPv6 地址中提取 MAC 地址

参考

*** TCP/IP 图解,第 1 卷

【讨论】:

谢谢你,托尼,我会接受你的回答,认为在这种情况下最有帮助。 "在WiFi环境下,你连接的路由器总是做NAT,这使得你的局域网区域非常有限,可能你感兴趣的设备和你不在同一个局域网。 " IPv6 没有 NAT,所以我不确定 NAT 与这个问题有什么关系。 Everything you need to know about IPv6 描述了为什么 NAT 存在于 IPv4 中以及为什么 IPv6 不需要它。另见Supporting IPv6 DNS64/NAT64 Networks 和IPv6 Security Myth #3 – No IPv6 NAT Means Less Security。 这篇文章也来自特温特大学某人的论文,Impact of IPv6 on WiFibased networks。 @RonMaupin 对不起,我忘记了 OP 想要 IPv6 版本。立即修复。【参考方案2】:

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

我前段时间使用它,但我认为它也适用于 IPv6。

【讨论】:

我查看了 MMLanScan github 存储库,并没有看到任何关于 IPv6 支持的具体内容,因为使用了“显示可用主机的 IP 和 MAC 地址”这句话,所以不确定这是否只是 IPv4 或不是。然而,扩展源以提供除 IPv4 地址之外的 IPv6 地址可能相当容易。你看过这个包的 IPv6 吗? 我只在 IPv6 网络中对这个库进行了一些测试,当它检查当前设备的 IP 地址和子网时,总是得到 IPv4 数据。我已在此网络上完全禁用 IPv4,但设备在连接到此 wifi 网络时会同时获得这两个地址。我用 Fing 应用程序进行了另一个测试来检查它的结果,它也只能找到 IPv4 设备。我认为不支持发现网络上的 IPv6 设备。 感谢您抽出宝贵时间对此进行调查。请使用您的 IPv6 测试结果更新您的答案。剩下的一个问题是该软件包是否可以修改和扩展以包括 IPv6。您是否能够对此进行调查并做出决定?如果您能够提供,github 存储库的作者可能会很感激这方面的帮助。 我已经与 MMLanScan 的开发人员 Michael Mavris 取得了联系。他写道,它只是 IPv4。但是,如果有人可以提供 IPv6 的更改,他愿意接受 github 拉取请求。因为我没有设置 iOS 开发环境,所以对此我无能为力。 如果我有时间我会尝试添加对 IPv6 库的支持。我有一个使用该库的应用程序,并且发现 IPv6 也很有趣。

以上是关于如何以编程方式在 iOS 中通过 IPv6 获取远程 MAC 地址的主要内容,如果未能解决你的问题,请参考以下文章

苹果过审ipv6问题

如何在Objective C中通过UIView获取UIAlertController?

在 iOS Swift 3 中以编程方式添加 Web 视图时如何在 UIWebView 中获取响应状态代码?

Firebase 查询以在 iOS swift 中通过用户 ID 获取特定用户

如何在 iOS 中通过 Twitter API 获取用户电子邮件地址?

Java 中通过 key 获取锁的正确方式