bounty还有4天到期。回答此问题可获得+100声望奖励。Oliver Metz正在寻找一个答案从一个有信誉的来源。
我正在使用NsdManager来解析本地网络(iot设备)上的服务。resolveService返回一个带有主机和端口的NsdServiceInfo。主机是一个Inet6Address对象,具有链路本地地址(fe80::xxxx:xxxx:xxxx:9718),并且没有设置作用域。它还为isLinkLocalAddress返回true。如何在没有作用域的情况下使用此链路本地地址进行任何网络呼叫?
我可以ping服务与我的本地机器的唯一方法是也指定一个网络接口,例如。例如:ping6 fe80::xxxx:xxxx:xxxx:9718%en0
。
感觉我在这里遗漏了Android API或IPv6规范的一些重要方面。**就个人而言,我宁愿只得到一个IPv4地址,但似乎也没有办法告诉NsdManager。
1条答案
按热度按时间5lhxktic1#
首先,要了解IPv6链路本地地址具有特定用途,通常不用于正常网络流量。
从 * RFC 4291, IP Version 6 Addressing Architecture *:
链路本地地址设计用于单个链路上的寻址,例如自动地址配置、邻居发现或不存在路由器时。
接下来,由于设备中的所有接口都使用相同的本地链路网络,因此必须使用区域ID来区分用于目标的接口。请记住,即使主机(PC、打印机等)也有路由表,因此它们必须使用区域ID来区分本地链路地址。
从 * RFC 6874, Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers *:
因为相同的非全局地址可以在相同范围的多于一个区域中使用(例如,在两个单独的物理链路中使用链路本地地址fe 80::1),并且节点可以具有附接到相同范围的不同区域的接口(例如,路由器通常具有附接到不同链路的多个接口),所以节点需要内部手段来标识非全局地址属于哪个区域。这是通过在节点内将不同的“区域索引”分配给该节点所附接到的相同范围的每个区域,并且通过允许地址的所有内部使用由区域索引限定来实现的。
必须使用区域ID进行IPv6本地链路寻址。实际上,链路本地寻址是目前唯一允许使用的区域ID。
从 * RFC 6874, Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers:
为了限制这种风险,实现必须不允许使用这种格式,除非是明确定义的用法,例如发送到前缀为fe 80::/10的链路本地地址。在撰写本文时,这是已知的唯一定义明确的用法。
您可以使用其他一些唯一的寻址方式,例如:ULA(RFC 4193, Unique Local IPv6 Unicast Addresses *),以避免该要求。对于ULA,您使用
fc00::/7
范围内的寻址,但有限制,将您限制在fd00::/8
范围内,其中接下来的40位必须随机选择,为您提供/48
前缀,从中可以获得65,536个标准/64
IPv6网络。