为什么需要 IPv6 Neighbor Solicitation 来获取 MAC 地址?

Edw*_*win 12 ipv6 discovery

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

根据这本书,每个节点都会自动获得一个Link-local IP-address,该地址是通过FF-FE在第3和第4个字节之间插入并翻转U/L位的MAC地址构造的,因此对于一个Link-local IP, MAC 地址为 的节点00-AA-00-3F-2A-1C变为FE80::2AA:FF:FE:3F:2A1C

为了确定链路层的 MAC 地址,一个 Neighbor Solicitation 消息被发送到链路本地 IP 地址,它用一条包含其 MAC 地址的消息进行回复......本地 IP 地址。因此,这听起来就像向询问地址的人邮寄明信片一样。

Mic*_*ton 20

每个节点都会自动生成一个本地链路地址,但是:

  • 该地址可能不是使用RFC 2464 中指定的 EUI-64 格式生成的。IPv6 地址也可以是加密生成的地址 ( RFC 3972 )、临时隐私地址 ( RFC 4941 ),或者在现代操作系统中是稳定的隐私地址 ( RFC 7217 )。

  • 由于管理员的显式配置,看起来具有 EUI-64 接口 ID 的地址实际上可能并不对应于指示的 MAC 地址。

因为您不能只是将地址“转换回”MAC 地址,所以您必须发送邻居请求来确定 MAC 地址。

邻居征集是必要的还有其他原因。其中一些是:

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

书都很好,但非常过时的书可能没有那么有用。甚至 IPv6 在过去十年中也进行了重大修订。最好的事实来源是相关的 RFC,包括原始 RFC 和任何标记为已更新或过时的 RFC。RFC 被足够详细地指定,以允许编写符合要求的实现。您可以通过阅读RFC 4861了解邻居发现的所有细节。


Ron*_*pin 9

所以,你要么误解了,要么被误导了一些事情。

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

当主机需要在 IPv4 中发现邻居的 MAC 地址时,它使用 ARP。ARP 广播请求,但 IPv6 没有广播。相反,每个主机都必须加入一个请求节点多播组。该组基于其 IPv6 地址的最后 24 位。由于 IPv6 接口可以有任意数量的 IPv6 地址,因此主机可以加入多个请求节点多播组。寻找另一台主机的 MAC 地址的 IPv6 主机将向目标 IPv6 地址的请求节点多播组发送多播请求。

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