IPv6范围ID与IPv4的区别

7

最近我在使用IPv6的伯克利套接字API,并注意到IPv6地址(sockaddr_in6)有一个名为sin6_scope_id的字段,而这个字段不是IPv4地址的一部分。

经过一番搜索,我了解到scope_id旨在标识网络接口,因为多个网络接口可以具有相同的链路本地IPv6地址。这很有道理,但我不明白的是,如果IPv4中没有类似于scope ID的东西,那么IPv4如何处理这个问题呢?

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

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

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


确实如此,多个接口都具有相同的IPv6链路本地网络。目标地址决定使用哪个接口,如果目标是链路本地地址,主机无法确定使用哪个接口,因为它们都具有相同的网络。具有相同网络的多个接口可能会对IPv4造成问题。 - Ron Maupin
虽然IPv4有本地链接地址,但它们很少使用,它们的存在通常表示严重问题。而在IPv6中,每个接口始终都有一个本地链接地址,并且它们经常被使用。 - Michael Hampton
1个回答

6
简而言之,对于具有多个接口的主机来说,没有明确定义的处理链路本地IPv4地址的机制。没有什么阻止选择同一链路本地地址用于两个不同的接口(但是,如果这两个接口在同一网络链接上,则基于ARP的冲突检测将导致它们中至少一个被重新分配)。 RFC 3927第3.2节涵盖了“地址模糊性”的问题:
给定需要发送到链路本地目标地址的数据包,IP堆栈必须与出站接口相关联,因此必须进行接口选择。出站接口不能从数据包的头部参数(例如源或目标地址)中推导出(例如,通过使用转发表查找)。因此,必须通过其他方式显式地执行出站接口关联。规范没有规定这些手段。
还有第6.3节
应用软件在支持IPv4 Link-Local地址配置的多主机上运行时,可能会在多个接口上失败。
这是因为应用程序假定IPv4地址是无歧义的,只能引用一个主机。 IPv4 Link-Local地址仅在单个链路上是唯一的。 连接到多个链路的主机可以很容易地遇到同一地址存在于多个接口上的情况,或者首先在一个接口上,后来在另一个接口上; 在任何情况下都与多个主机相关联。 大多数现有软件都没有准备好解决这种模棱两可的情况。 将来,可以开发应用程序编程接口以防止此问题。
IPv6通过引入范围ID解决了这个问题。
目前,范围ID仅用于链路本地寻址

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接