最近,我正在使用用于IPv6的伯克利套接字API,并注意到IPv6地址(sockaddr_in6)有一个名为sin6_scope_id的字段,它不是IPv4地址的一部分。
在搜索了一下之后,我了解到scope_id是用来识别网络接口的,因为多个网络接口可以具有相同的链接本地IPv6地址。这是有道理的,但我不明白的是,如果没有相当于范围ID的内容,IPv4是如何处理这个问题的?
内核中是否有一种机制可以防止多个IPv4接口被分配到相同的链路本地地址?
如果是这样的话,为什么有必要为IPv6发明作用域ID而不是使用与IPv4相同的解决方案呢?
另外,scope_id只用于区分具有相同链接本地地址的接口,还是也有其他用例?
发布于 2019-07-29 16:53:51
简而言之,不存在处理具有多个接口的主机上的链接本地IPv4地址的定义良好的机制。没有什么可以阻止为两个不同的接口选择相同的链接本地地址(但是,如果这两个接口位于同一个网络链路上,那么基于ARP的冲突检测将导致至少一个接口被重新分配)。
RFC 3927第3.2节涵盖了“地址歧义”问题:
假定IP堆栈必须具有与需要发送到的数据包相关联的出站接口,则必须进行接口选择。出站接口不能从包的报头参数(例如源地址或目标地址)导出(例如,通过使用转发表查找)。因此,必须通过其他方法显式地完成出站接口关联。说明书没有规定这些手段。
同时也在第6.3节中
在多主机上运行的应用软件可能会失败,该主机支持多个接口上的IPv4链路-本地地址配置。 这是因为应用软件假定IPv4地址是明确的,它只能引用一个主机。IPv4链接-本地地址仅在单个链接上是唯一的。连接到多个链接的主机很容易遇到一种情况,即同一地址存在于多个接口上,或首先出现在一个接口上,随后出现在另一个接口上;在任何情况下都与多个主机相关联。大多数现有软件都没有准备好应付这种模棱两可的情况。将来可以开发应用程序编程接口来防止这个问题。
在IPv6中,通过引入作用域ID解决了这个问题。
https://stackoverflow.com/questions/48328995
复制相似问题