【发布时间】:2021-07-30 00:36:54
【问题描述】:
为什么在使用InetAddress.getByName
时某些 IPv6 地址会转换为 IPv4 地址?
例如,我希望::f:f:f
、::ffff:f:f
这两个地址都转换为Inet6Address
但是,这个::ffff:f:f
变成了Inet4Address
import java.net.InetAddress;
class Main {
public static void main(String[] args) throws Exception {
// Interpreted as IPv6
var address = InetAddress.getByName("::f:f:f");
System.out.println(address); // /0:0:0:0:0:f:f:f
System.out.println(address.getClass()); // class java.net.Inet6Address
// Interpreted as IPv4
address = InetAddress.getByName("::ffff:f:f");
System.out.println(address); // /103.30.217.152
System.out.println(address.getClass()); // class java.net.Inet4Address
}
}
【问题讨论】:
-
您可以参考 IANA IPv6 Special-Purpose Address Registry 了解特殊 IPv6 地址范围。这不包括 IPv6 多播范围(
ff00::/8
具有范围和标志,以及单独的 IANA 页面)和当前的全球 IPv6 地址范围 (2000::/3
)。