为什么某些 IPv6 地址在使用时会转换为 IPv4 地址InetAddress.getByName
?
例如,我希望这两个地址::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
}
}
该::ffff:0:0/96
范围内的IPv6 地址是 IPv4 映射的 IPv6 地址。这是在 IPv6 寻址格式中表示 IPv4 地址的特殊范围,因此它们实际上是 IPv4 地址,而不是 IPv6 地址。这在RFC 4291, IP Version 6 Addressing Architecture 中有解释:
2.5.5.2 . IPv4 映射的 IPv6 地址
定义了包含嵌入式 IPv4 地址的第二种 IPv6 地址。该地址类型用于将 IPv4 节点的地址表示为 IPv6 地址。“IPv4-mapped IPv6 address”的格式如下:
| 80 bits | 16 | 32 bits | +--------------------------------------+--------------------------+ |0000..............................0000|FFFF| IPv4 address | +--------------------------------------+----+---------------------+
有关“IPv4 映射的 IPv6 地址”的使用背景,请参阅 [ RFC4038 ]。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句