IPv6 作用域 ID 与 IPv4



最近我在使用伯克利的IPv6套接字API,注意到IPv6地址(sockaddr_in6)有一个名为sin6_scope_id的字段,它不是IPv4地址的一部分。

经过一番搜索,我了解到scope_id用于标识网络接口,因为多个网络接口可以具有相同的链路本地 IPv6 地址。这是有道理的,但是我不明白的是,如果没有等效的作用域ID,IPv4如何处理这个问题?

内核中是否有一种机制可以防止为多个 IPv4 接口分配相同的链路本地地址?

如果是这样的话,那么为什么有必要为 IPv6 发明作用域 ID,而不是采用与 IPv4 相同的解决方案呢?

此外,scope_id仅用于区分具有相同链路本地地址的接口,还是还有其他用例?

简而言之,没有明确定义的机制来处理具有多个接口的主机上的链路本地 IPv4 地址。没有什么可以阻止为两个不同的接口选择相同的链路本地地址(但是,如果两个接口位于同一网络链路上,则基于 ARP 的冲突检测将导致至少其中一个接口被重新分配)。

RFC 3927 第 3.2 节涵盖了"地址歧义"问题:

鉴于 IP 堆栈必须具有关联的出站接口 使用需要发送到链路本地目标的数据包 地址,则必须进行接口选择。 出站接口 不能从数据包的标头参数(如源)派生 或目标地址(例如,通过使用转发表查找)。 因此,必须显式完成出站接口关联 通过其他方式。 该规范没有规定那些 方法。

同样在第 6.3 节中:

在支持 IPv4 的多宿主主机上运行的应用程序软件 多个接口上的链路本地地址配置可能会失败。

这是因为应用程序软件假定 IPv4 地址是 明确,它只能引用一个主机。 IPv4 链路本地 地址仅在单个链路上是唯一的。 连接到的主机 多个链接很容易遇到相同的情况 地址存在于多个接口上,或第一个出现在一个接口上 接口,后来在另一个界面上;在任何情况下与超过 一台主机。 大多数现有软件都没有为这种歧义做好准备。 将来,可以开发应用程序编程接口 以防止此问题。

此问题已在 IPv6 中通过引入作用域 ID得到解决。

目前作用域 id 仅用于链路本地寻址。

最新更新