最近我使用的是用于IPv6的Berkeley套接字API,并注意到IPv6地址(sockaddr_in6
)有一个名为sin6_scope_id
的字段,该字段不是IPv4地址的一部分。
经过一番搜索,我了解到scope_id
用于识别网络接口,因为多个网络接口可以具有相同的链路本地IPv6地址。这是有道理的,但是我不明白的是IPv4如何处理这个问题,如果那里没有相应的范围ID?
内核中是否存在阻止为多个IPv4接口分配相同链路本地地址的机制?
如果是这种情况,那么为什么有必要为IPv6发明范围ID而不是使用与IPv4相同的解决方案?
另外,scope_id是否仅用于区分具有相同链接本地地址的接口,还是还有其他用例?
答案 0 :(得分:1)
简而言之,没有,没有定义明确的机制来处理具有多个接口的主机上的链路本地IPv4地址。没有什么可以阻止为两个不同的接口选择相同的链路本地地址(但是,如果两个接口位于同一网络链路上,则基于ARP的冲突检测将导致至少其中一个被重新分配)。
RFC 3927 section 3.2涵盖了“地址歧义”的问题:
鉴于IP堆栈必须具有关联的出站接口 与需要发送到本地链接目标的数据包 地址,必须进行接口选择。出站接口 不能从数据包的标头参数(例如source)派生 或目标地址(例如,通过使用转发表查找)。 因此,必须明确进行出站接口关联 通过其他方式。规范没有规定那些 手段。
以及在section 6.3中:
应用程序软件在支持IPv4的多宿主主机上运行 多个接口上的本地链路地址配置可能会失败。
这是因为应用程序软件假定IPv4地址为 毫无疑问,它只能引用一个主机。 IPv4本地链接 地址仅在单个链接上是唯一的。连接到的主机 多个链接很容易遇到相同的情况 地址存在于多个接口上,或者首先存在于一个接口上 接口,稍后再讲;在任何情况下都与 一位主持人。大多数现有软件都没有为此准备好。 将来可能会开发应用程序编程接口 为了防止这个问题。
通过引入作用域ID 在IPv6中解决了此问题。