“一个接口(interface)也可以有多个任何类型(单播、任播和多播)或范围的 IPv6 地址”
----引用自 RFC 4291
最近我在进行实验时遇到了这个问题。我浏览了 RFC 4291,毫 headless 绪...
以下是我的实验的简要介绍:
有两台主机,我分别给它们分配了两个IPv6地址。然后,我测试了两台主机之间的连通性。我使用命令“ping6 ipv6_addr”。但事实证明,它无法使用命令 ping6 访问对端主机的两个地址。
示例更直观*(两个命令都在主机 A 上执行,使用 linux kenel 2.6.32)*:
ping6 addr_b_1 --- 有效
ping6 addr_b_2 --- 无法通过
有两个问题想和大家讨论一下:
1.为什么ipv6协议(protocol)要允许这种机制,一个接口(interface)多个地址?
2. 为什么我不能同时到达主机 a 的两个地址。(本来应该是这样的。IPv6 的默认地址选择在 RFC 3484 中定义)
谢谢大家!
早期的 IPv4 堆栈不支持每个接口(interface)有一个以上的 IP 地址。后来的改进启用了“辅助”地址。这在实践中被发现非常有用,IPv6 的设计者选择强制支持它作为标准的一部分,以便您始终可以指望它成为可能。
IPv6 的设计者所做的不仅仅是强制要求。他们使它成为 IPv6 协议(protocol)的重要组成部分。每个 IPv6 接口(interface)都有一个链路本地 IP 地址。如果该接口(interface)还能够在更大的网络(如 Internet)上进行通信,那么它也有一个全局范围的地址。就在那里,至少有两个地址。如果主机在多宿主 Internet 连接后面,它可能有更多地址。每个接口(interface)多个 IP 地址在 IPv6 中不像在 IPv4 中那样是事后才想到的。
您提到了缺点,但除非配置错误,否则我认为这种情况不会导致任何问题。 (也许您可以详细说明您的设置以及为什么一个 IP 地址有效而另一个无效;但是我保证您有某种错误导致了它)。
另一方面,想想优点:
- 即使没有可用的网络基础设施(即路由器),设备也可以使用链路本地地址在本地 LAN 上相互发现。之后,如果添加路由器并且全局范围地址可用,这些地址会扩充地址集,它们不会替换链路本地地址;因此,使用本地链路地址的现有通信不会中断。
- 当断开、添加或替换互联网连接时,可以从一组 IP 地址中删除或添加一个 IP 地址,而不会影响其他地址。多亏了“弃用”状态,这使得从一个 IP 地址到另一个 IP 地址的重新编号成为可能,并且接口(interface)在一段时间内支持这两种地址。
此外:请记住,几乎所有 IPv4 堆栈也都支持每个接口(interface)多个地址,因此这在 v4 和 v6 之间并不是很大的区别。只有非常旧的 v4 堆栈不支持它。不同之处在于,v6 具有自动管理地址集的方法,但 v4 中不存在。