![为什么需要 IPv6 邻居请求来获取 MAC 地址?](https://linux22.com/image/692293/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%20IPv6%20%E9%82%BB%E5%B1%85%E8%AF%B7%E6%B1%82%E6%9D%A5%E8%8E%B7%E5%8F%96%20MAC%20%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
我是一名软件开发人员,在 Techdays 上刚刚免费获得了一本关于 IPv6 的书,我读这本书是为了好玩。他们之所以免费赠送这本书,是因为它有点旧了(W2008),所以对于其他/较新的操作系统来说,情况可能有所不同,但我不明白邻居发现获取 MAC 地址的必要性。
根据书中所述,每个节点都会自动获得一个链路本地 IP 地址,该地址是通过FF-FE
在第 3 和第 4 个字节之间插入 MAC 地址并翻转 U/L 位构成的,因此 MAC 地址为 的节点的链路本地 IP00-AA-00-3F-2A-1C
变为FE80::2AA:FF:FE:3F:2A1C
。
为了确定链路层 MAC 地址,会向链路本地 IP 地址发送邻居请求消息,该 IP 地址会回复包含其 MAC 地址的消息...但发送者已经知道这一点,因为 MAC 已编码在链路本地 IP 地址中。因此,这听起来就像向某人寄明信片询问他们的地址一样。
答案1
每个节点都会自动生成一个链路本地地址,但是:
该地址可能不是按照RFC 2464. IPv6 地址也可以是加密生成的地址(RFC 3972)、临时隐私地址(RFC 4941),或者在现代操作系统中,稳定的隐私地址(RFC 7217)。
由于管理员的明确配置,看起来具有 EUI-64 接口 ID 的地址实际上可能并不对应于指示的 MAC 地址。
因为您不能仅仅“将地址转换回”MAC 地址,所以您必须发送邻居请求来确定 MAC 地址。
邻居劝诱的必要性还有其他原因。其中一些是:
- 重复地址检测(RFC 4862)。有可能其他某个主机 (无论正确与否) 已经声明了某个主机想要使用的地址。
- 邻居不可达性检测。对邻居请求没有响应是邻居不可达的一个指标。
书籍固然好,但过时的书籍可能就没那么有用了。即使是 IPv6 在过去十年中也经历了重大修订。最好的事实来源是相关的 RFC,包括原始的 RFC 和标记为已更新或已过时的 RFC。RFC 的详细说明足以允许编写符合要求的实现。您可以通过阅读了解邻居发现的所有细节RFC 4861。
答案2
所以,您要么误解了某些事情,要么被误导了。
使用 SLAAC,主机可以使用其 MAC 地址构建自己的 IPv6 寻址,但许多人认为这很危险,会泄露太多信息,并允许跟踪特定主机。基于此,开发了隐私扩展和随机寻址,操作系统使用它们来提供隐私/安全性。这意味着主机可以创建自己的寻址,而不是基于其 MAC 地址。
当主机需要在 IPv4 中发现邻居的 MAC 地址时,它会使用 ARP。ARP 会广播请求,但 IPv6 没有广播。相反,每个主机都必须加入一个 Solicited Node 多播组。此组基于其 IPv6 地址的最后 24 位。由于 IPv6 接口可以有任意数量的 IPv6 地址,因此主机可以加入多个 Solicited Node 多播组。寻找另一台主机的 MAC 地址的 IPv6 主机将向目标 IPv6 地址的 Solicited Node 多播组发送多播请求。
这比 IPv4 ARP 更具优势。由于 ARP 使用广播发送请求,因此它会中断第 2 层广播域上的每个主机。由于请求节点多播组使用目标 IPv6 地址的最后 24 位,因此 ND 多播请求可能只会中断目标主机,或者可能是第 2 层广播域上的一两个其他主机。