Tam*_*ola 7 sockets ipv4 ipv6 berkeley-sockets
最近,我正在使用用于 IPv6 的伯克利套接字 API,并注意到 IPv6 地址 ( sockaddr_in6) 有一个名为sin6_scope_id,该字段不是 IPv4 地址的一部分。
经过一番搜索后,我\xe2\x80\x99了解到这scope_id意味着识别网络接口,因为多个网络接口可以具有相同的链路本地IPv6地址。这是有道理的,但是我不明白\xe2\x80\x99不明白的是IPv4如何处理这个问题,如果\xe2\x80\x99s没有等效的范围ID?
内核中是否有一种机制可以防止为多个 IPv4 接口分配相同的链路本地地址?
\n\n如果情况确实如此,那么为什么有必要为 IPv6 发明作用域 ID,而不是采用与 IPv4 相同的解决方案?
\n\n另外,scope_id 仅用于区分具有相同链路本地地址的接口,还是还有其他用例?
\n简而言之,没有,没有明确的机制来处理具有多个接口的主机上的链路本地 IPv4 地址。没有什么可以阻止为两个不同的接口选择相同的链路本地地址(但是,如果这两个接口位于同一网络链路上,则基于 ARP 的冲突检测将导致其中至少一个接口被重新分配)。
RFC 3927 第 3.2 节涵盖了“地址歧义”的问题:
鉴于 IP 堆栈必须具有与需要发送到本地链路目标地址的数据包关联的出站接口,因此必须进行接口选择。出站接口无法从数据包的标头参数(例如源地址或目标地址)中得出(例如,通过使用转发表查找)。因此,出接口关联必须通过其他方式显式完成。该规范没有规定这些方法。
还有第 6.3 节:
在支持多个接口上的 IPv4 链路本地地址配置的多宿主主机上运行的应用程序软件可能会失败。
这是因为应用程序软件假定 IPv4 地址是明确的,它只能引用一台主机。IPv4 链路本地地址仅在单个链路上是唯一的。连接到多个链路的主机很容易遇到这样的情况:同一个地址出现在多个接口上,或者首先出现在一个接口上,后来出现在另一个接口上;在任何情况下都与多个主机相关联。大多数现有软件都没有为这种模糊性做好准备。将来,可以开发应用程序编程接口来防止这个问题。
IPv6 中通过引入作用域 ID解决了这个问题。
| 归档时间: |
|
| 查看次数: |
3350 次 |
| 最近记录: |