我正在开发一个Android应用程序,我需要找到Android设备的全球单播地址,而不需要任何网络请求。 (如果我们可以发出网络请求,那应该很容易,因为我们可以看到标头中的公共ipv6接口)。我想看到的是如何在我们发出网络请求之前找到单播地址。
我使用API从所有接口检索所有可能的IPv6。然后我专注于落入2000::/3
范围的IP。但是,有时我只有一个IPv6(这是正确的答案),有时我在2000::/3
范围内得到两个/多个地址。我认为这种情况可能是由网络状态变化引起的,但我不确定。
例如:API返回以下两个IPv6
2600:1010:b022:1349:d25c:f9bf:2881:d30c%3%3
和2600:1010:8043"3aba:67ca:ac76:4a8f:dbdb%9%9
谁能告诉我全球单播IPv6如何在Android设备上运行?我如何确保获得真正的IPv6而不是临时的IPv6?
答案 0 :(得分:1)
使用Privacy Extensions,临时地址是世界其他地方通常使用的地址。它会定期更改,以防止任何人将您的地址与您关联。隐私扩展的实现方式取决于操作系统,但通常情况下,您将获得一段时间的临时地址,更改为新的临时地址,旧的临时地址仍然可用,但在其消失之前已弃用一段时间。真实地址不会改变,但通常不会在其他设备看到的地方使用。此行为取决于操作系统,因此您的里程可能会有所不同。
您问题的真正答案取决于您打算如何处理地址。您可能真的需要临时地址而不是DHCP或SLAAC分配的地址,但您必须意识到它会发生变化。
此外,地址中的public static int readInt(Scanner in) {
System.out.println("Please type in an integer");
return in.nextInt();
}
public static String readString(Scanner in) {
System.out.println("Please type in a string");
return in.nextLine();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Integer you type is: " + readInt(in));
System.out.println("String you type is: " + readString(in));
}
或%3%3
实际上并不属于IPv6地址;它们是指定地址的接口的指示符。 (链路本地地址需要这个,因为链接本地地址在多个接口上可能是相同的。)我不确定,但您可能正在查看两个完全不同的接口(连接到不同的来源,如Wi-Fi ,和蜂窝电话,或两个不同的蜂窝塔?)。
答案 1 :(得分:0)
全局单播IPv6地址应使用DHCPv6或由IPv6路由器发送的路由器公告发布的网络前缀在无状态地址自动配置中生成(在这种情况下,它应由网络前缀和接口MAC地址组成) )。有关详细信息,请参阅http://www.slideshare.net/rodolk/networking-tcpip-stack-introduction-ipv6,幻灯片98。