IPv6范围ID与IPv4

时间:2018-01-18 19:33:10

标签: sockets ipv6 ipv4 berkeley-sockets

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

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

内核中是否存在阻止为多个IPv4接口分配相同链路本地地址的机制?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

  

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

以及在section 6.3中:

  

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

     

这是因为应用程序软件假定IPv4地址为    毫无疑问,它只能引用一个主机。 IPv4本地链接    地址仅在单个链接上是唯一的。连接到的主机    多个链接很容易遇到相同的情况    地址存在于多个接口上,或者首先存在于一个接口上    接口,稍后再讲;在任何情况下都与    一位主持人。大多数现有软件都没有为此准备好。    将来可能会开发应用程序编程接口    为了防止这个问题。

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

当前scope id is only used for link-local addressing