4

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

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

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

如果是这样,那么为什么有必要为 IPv6 发明范围 ID 而不是使用与 IPv4 相同的解决方案?

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

4

1 回答 1

4

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

RFC 3927 第 3.2 节涵盖了“地址歧义”的问题:

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

第 6.3 节中:

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

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

这个问题在 IPv6 中通过引入范围 ID得到了解决。

目前范围 id 仅用于链接本地寻址

于 2019-07-29T16:53:51.320 回答