为什么需要IPv6邻居请求来获取MAC地址?

我是一名软件开发人员,在Techdays刚刚拿到一本关于IPv6的免费书,我正在阅读这本书。 他们把它拿走了,因为它是一本旧书(W2008),所以对于其他/新的操作系统,情况可能不同,但是我不明白邻居发现获取MAC地址的必要性。

根据本书,每个节点自动获取一个链路本地IP地址,它由MAC地址通过在第3个字节和第4个字节之间插入FF-FE并翻转U / L位构成,从而使得本地链路MAC地址为00-AA-00-3F-2A-1C的节点的IP地址为FE80::2AA:FF:FE:3F:2A1C

为了确定链路层MAC地址,发送一个邻居请求消息给链路本地IP地址,该地址使用包含其MAC地址的消息进行应答…但是发送者已经知道,因为MAC是在链路层中编码的,本地IP地址。 所以这听起来像邮寄明信片给有人要求他们的地址。

每个节点自动生成链接本地地址,但是:

  • 该地址可能不会使用RFC 2464中指定的EUI-64格式生成。 IPv6地址也可以是encryption生成的地址( RFC 3972 ),临时隐私地址( RFC 4941 ),微软的非标准随机地址 ,或者在现代操作系统中,稳定的隐私地址( RFC 7217 )。

  • 由于pipe理员的明确configuration,看起来像EUI-64接口ID的地址可能实际上并不对应于指定的MAC地址。

由于您不能将“将地址转回”为MAC地址,您必须发送邻居请求以确定MAC地址。

邻居请求还有其他一些原因。 其中一些是:

  • 重复地址检测( RFC 4862 )。 其他主机有可能(正确或错误地)声明主机想要使用的地址。
  • 邻居不可达性检测。 对邻居请求缺乏响应是邻居无法到达的一个指标。

书籍都很好,但很不合时宜的书可能没有那么有用。 甚至IPv6在过去的十年里都有了重大的修改。 真相的最佳来源是相关的RFC,无论是原始的还是被标记为已经更新或废弃的RFC。 RFC足够详细地指定以允许符合的实现被写入。 您可以通过阅读RFC 4861来了解邻居发现的所有细节。

所以,你要么误解了,要么就是误会了一些事情。

使用SLAAC,主机可以使用其MAC地址构build自己的IPv6寻址,但是很多人认为这是危险的,会泄露太多的信息,并允许跟踪特定的主机。 基于此,隐私扩展和随机寻址被开发出来,并被操作系统用来提供隐私/安全。 这意味着主机可以创build自己的寻址,而不是基于它的MAC地址。

当主机需要在IPv4中发现邻居的MAC地址时,使用ARP。 ARP广播请求,但IPv6没有广播。 相反,每个主机都必须join一个请求节点组播组。 该组基于其IPv6地址的最后24位。 由于IPv6接口可以有任意数量的IPv6地址,主机可以join多个请求节点组播组。 查找其他主机MAC地址的IPv6主机会向目标IPv6地址的Solicited Node组播组发送组播请求报文。

这比IPv4 ARP提供了一个优点。 由于ARP使用广播请求,它会中断二层广播域中的每个主机。 由于请求节点多播组使用目标IPv6地址的最后24位,所以ND多播请求可能只会中断目标主机,或可能中断二层广播域中的一个或两个其他主机。