【问题标题】:Why IPv6 allows a single interface with multiple addresses? [closed]为什么 IPv6 允许具有多个地址的单个接口? [关闭]
【发布时间】:2026-02-13 22:05:02
【问题描述】:

“单个接口也可以有多个任意类型(单播、任播和多播)或范围的 IPv6 地址” ----引用格式 RFC 4291

最近我在进行实验时遇到了这个问题。我浏览了 RFC 4291,毫无头绪...

这是我的实验的简要介绍:
有两台主机,我分别为它们分配了两个 IPv6 地址。然后,我测试了两台主机之间的连接性。我使用命令“ping6 ipv6_addr”。但事实证明,它无法通过命令 ping6 到达对等主机的两个地址。

通过示例更具洞察力*(两个命令都在主机 A 上执行,使用 linux kenel 2.6.32)*:
ping6 addr_b_1 --- 有效
ping6 addr_b_2 --- 打不通

我想和你们讨论两个问题:
1.为什么ipv6协议要允许这种机制,单接口多地址?
2. 为什么我不能同时访问主机 a 的两个地址。(应该是这种情况。IPv6 的默认地址选择在 RFC 3484 中定义)

谢谢你们!

【问题讨论】:

  • 简单的答案:因为 IPv6 使之成为可能。这对于“低”数量的可用 IPv4 地址来说是不可行的,但对于 IPv6 地址的数量,这不是问题。如此简单:“因为他们可以”。
  • @LiKao 好的...但根据我的经验,这种能力似乎弊大于利。并让多种实验考虑更多场景
  • 没有任何版本的 IP 可以弥补系统管理员搞砸了路由表。
  • @LiKao,我们的 Sun 接口上通常有 5 或 6 个 IPv4 地址。早期的 Linux,之前没有尝试过使用 SunOS。
  • 这与编程无关。

标签: linux ipv6


【解决方案1】:

早期的 IPv4 堆栈不支持每个接口多个 IP 地址。后来的改进启用了“辅助”地址。这被发现在实践中非常有用,IPv6 的设计者选择强制支持它作为标准的一部分,这样您就可以始终相信它是可能的。

IPv6 的设计者所做的不仅仅是强制它。他们使它成为 IPv6 协议的重要组成部分。每个 IPv6 接口都有一个本地链路 IP 地址。如果接口还能够在更大的网络(例如 Internet)上进行通信,那么它也具有全局范围地址。至少有两个地址,就在那里。如果主机位于多宿主 Internet 连接后面,它可能有更多地址。在 IPv6 中,每个接口多个 IP 地址并不是事后才想到的,就像在 IPv4 中那样。

您提到了缺点,但除非配置错误,否则我认为这种情况不会导致任何问题。 (也许您可以详细说明您的设置以及为什么一个 IP 地址有效而另一个无效;但是我保证您有某种错误导致它。

另一方面,想想优点:

  • 即使没有可用的网络基础设施(即路由器),设备也可以使用本地链路地址在本地 LAN 上发现彼此。稍后,如果添加了路由器并且全局范围地址可用,这些地址会增加地址集,它们不会替换链路本地地址;因此使用链接本地地址的现有通信不会中断。
  • 断开、添加或替换 Internet 连接时,可以从该组中撤消或添加一个 IP 地址,而不会影响其他 IP 地址。由于处于“已弃用”状态,这使得从一个 IP 地址到另一个 IP 地址的正常重新编号成为可能,并且接口在一段时间内同时支持这两种地址。

另外:请记住,几乎所有 IPv4 堆栈也支持每个接口的多个地址,因此这在 v4 和 v6 之间没有太大区别。只有真正旧的 v4 堆栈不支持它。不同之处在于 v6 具有自动管理地址集的方法,而 v4 中不存在这种方法。

【讨论】:

  • 嗯,一个实际的问题是它会使给定连接的源 IP 地址选择变得复杂......
  • @SamB 这并不比多个接口的情况更复杂,每个接口都有一个 IP 地址。源地址选择算法被很好地指定,并且涵盖了这两种情况。
  • @Celada 谢谢你,你真的帮我解决了我对 IP 堆栈中的多地址的一些困惑。具体来说,我正在模拟一个多宿主场景来做一些工作。所以看起来我真的有一些错误配置,因为当我第一次设置测试台时,两个地址集都可以很好地相互通过。但后来,它失败了。我会检查所有的细节。 ^_^
  • 在给定接口上可以配置多少个 IPv6 地址是否有上限?
  • @user31986 这将是特定于操作系统的详细信息,我不太确定,但在 Linux 上 /proc/sys/net/ipv6/conf/default/max_addresses 为我建议 16。
最近更新 更多