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

24

我需要找到一种方法来获取WiFi网络中其他设备的MAC地址。有一种很好的方法可以用于IPv4(iOS应用程序Fing如何获取MAC地址?),但是如何在IPv6中实现呢?由于ARP被邻居发现协议(NDP)所取代,后一种方法不起作用。如果有人能够帮助我,我将非常感激。


如果您查看NDP的工作方式,网络上的每个主机都订阅了基于其IPv6地址的Solicited Node组播地址。您可以向IPv6地址或Solicited Node地址发送邻居请求消息。在您的应用程序中编写这个应该是相当简单的。_RFC 4861, IP版本6(IPv6)的邻居发现_为此提供了要使用的消息格式。 - Ron Maupin
@RonMaupin,你能详细地提供一个实际的答案吗? - Richard Chambers
1
你是说让我替你写代码吗?我觉得不行... - Ron Maupin
@RonMaupin,一个答案不需要实际的代码,但需要足够的设计细节,以便其他人可以编写代码。由于目前这个问题还没有得到回答,但人们对答案很感兴趣,所以我决定为某人的答案提供一些我辛苦赚来的声望。由于您提供了一个起点的评论,您似乎是一个合适的人选,可以提供一个实际的答案,而不仅仅是一个开始的提示。在一个开始的提示和实际代码之间有很大的差距,我只是请求帮助填补这个差距。 - Richard Chambers
2个回答

5

层次化和封装

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

  • 那么,首先的问题是你所说的 remote 是什么意思?

如果你指的是广域网中的其他主机,除非两个设备都实现了一个特定的协议,否则这是不可能的:你发送一个请求到这些设备,他们回复他的 MAC 地址。

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

ARP 和 NDP

当 ARP 知道主机的 IP 地址而不知道 MAC 地址时,它会在本地网络中发送广播,然后那些发现有人呼唤它的主机会回复它的 MAC 地址。

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

因此,你需要发送 ICMPv6 邻居探测消息。

IPv6 中的地址分配

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

因此,在大多数常见情况下,你可以直接从他们的 IPv6 链路本地地址中获取设备的 MAC 地址。

结论:

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

参考资料

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

谢谢你,Tony。我会接受你的答案作为在这种情况下最有帮助的答案。 - Max Niagolov
在WiFi环境中,您连接的路由器总是进行NAT,这使得您的局域网区域非常有限,也许您感兴趣的设备与您不在同一局域网中。IPv6没有NAT,所以我不确定NAT与问题有什么关系。 - Ron Maupin
《关于IPv6的一切》(https://arstechnica.com/gadgets/2007/03/ipv6/)描述了为什么IPv4中存在NAT以及为什么在IPv6中它不再必要。同时请参阅[支持IPv6 DNS64/NAT64网络](https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html)和[IPv6安全神话#3-无IPv6 NAT意味着更少的安全性](http://www.internetsociety.org/deploy360/blog/2015/01/ipv6-security-myth-3-no-ipv6-nat-means-less-security/)。 - Richard Chambers
1
请参阅来自特文特大学某人的论文的文章,IPv6对基于WiFi的网络的影响 - Richard Chambers
@RonMaupin 抱歉,我忘记了 OP 需要 IPv6 版本。现在已经修复。 - Tony

3
我正在使用MMLanScan来实现这个目的。它非常简单易用,可以找到你局域网中设备的IP/MAC地址。
我以前用过它,但我认为它也支持IPv6。

我查看了MMLanScan的GitHub存储库,没有看到有关IPv6支持的任何特定内容,因为短语“显示可用主机的IP和MAC地址”仅涉及IPv4而不确定是否支持IPv6。但是,扩展源代码以提供IPv6地址可能相对容易。您是否已经使用此软件包进行了IPv6测试? - Richard Chambers
我在一个仅有IPv6网络中使用这个库进行了一些测试,当它检查当前设备的IP地址和子网时,总是得到IPv4数据。我已经完全禁用了该网络上的IPv4,但是当设备连接到这个WiFi网络时,它会获得两个地址。我使用Fing应用程序进行了另一个测试以检查结果,它只发现IPv4设备。我认为这个库不支持发现网络上的IPv6设备。 - sergiog90
感谢您抽出时间查看此事。请更新您的答案,包括IPv6的测试结果。还有一个问题是是否可以修改和扩展软件包以包含IPv6。您能否调查并作出决定?如果您能提供帮助,github存储库的作者可能会在这个领域感激您的帮助。 - Richard Chambers
我已经联系上了MMLanScan的开发者Michael Mavris。他表示该软件仅支持IPv4,但是如果有人能够提供IPv6的更改,他愿意接受Github的pull request。由于我没有iOS开发环境,无法提供帮助。 - Richard Chambers
如果我有时间,我会尝试为库添加IPv6支持。我有一个使用该库的应用程序,发现IPv6也很有趣。 - sergiog90
太好了!让我知道进展如何。如果没有其他的,我可以提供精神支持! - Richard Chambers

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