linux - 为什么 IPv6 允许一个接口(interface)有多个地址?

标签 linux ipv6

<分区>

“一个接口(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 中不存在。

关于linux - 为什么 IPv6 允许一个接口(interface)有多个地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9886711/

相关文章:

c - 在 IPv4 客户端/服务器应用程序中添加对 IPv6 的支持 - sin6_flowinfo 和 sin6_scope_id 字段?

python - 如何从当前网络地址递增并获取下一个 IPv6 网络地址

javascript - NodeJS 数据报 - 接收 IPv6 多播

linux - 根据列 ID 合并多个文件

linux - 当lib在/lib : usr/bin/ld: cannot find -l<Mylibrary>时

linux - 没有gui linux的rdesktop请求

linux - 使用 Unix 排序对带小数部分的正/负数进行排序

c - 我应该在与 IPv4 不同的端口上监听 IPv6 连接吗?

ipv6 - "dead beef"是什么意思?

python - 在 CentOS for Python 上升级 Sqlite3 版本时出现问题