Sockets IPv6作用域ID与IPv4

Sockets IPv6作用域ID与IPv4,sockets,ipv6,ipv4,berkeley-sockets,Sockets,Ipv6,Ipv4,Berkeley Sockets,最近,我正在使用用于IPv6的伯克利套接字API,并注意到IPv6地址(sockaddr\u in6)有一个名为sin6\u scope\u id)的字段,该字段不是IPv4地址的一部分 搜索了一段时间后,我了解到scope\u id用于标识网络接口,因为多个网络接口可以具有相同的链路本地IPv6地址。这是有道理的,但我不明白的是,如果IPv4没有等效的作用域ID,它是如何处理这个问题的 内核中是否有防止多个IPv4接口被分配同一链路本地地址的机制 如果是这样的话,那么为什么有必要发明IPv6的

最近,我正在使用用于IPv6的伯克利套接字API,并注意到IPv6地址(
sockaddr\u in6
)有一个名为
sin6\u scope\u id
)的字段,该字段不是IPv4地址的一部分

搜索了一段时间后,我了解到
scope\u id
用于标识网络接口,因为多个网络接口可以具有相同的链路本地IPv6地址。这是有道理的,但我不明白的是,如果IPv4没有等效的作用域ID,它是如何处理这个问题的

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

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


此外,作用域id是否仅用于区分具有相同链路本地地址的接口,或者是否也存在其他用例?

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

涵盖“地址歧义”问题:

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

以及:

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

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

在IPv6中,通过引入作用域ID解决了此问题


目前。

实际上,多个接口都具有相同的IPv6链路本地网络。目标地址决定使用哪个接口,如果目标是链路本地地址,则主机无法确定使用哪个接口,因为它们都具有相同的网络。使用同一网络的多个接口可能是IPv4的一个问题。虽然IPv4具有链路本地地址,但它们很少被使用,并且它们的存在通常表明存在严重问题。在IPv6中,每个接口都有一个链路本地地址,并且经常使用它们。