首页 > 解决方案 > 为什么 Java 将某些 IPv6 地址解释为 IPv4?

问题描述

为什么某些 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
  }
}

标签: javaipipv6ipv4

解决方案


范围内的IPv6 地址::ffff:0:0/96是 IPv4 映射的 IPv6 地址。这是一个以 IPv6 寻址格式表示 IPv4 地址的特殊范围,因此它们实际上是 IPv4 地址,而不是 IPv6 地址。这在RFC 4291,IP 版本 6 寻址架构中进行了解释:

2.5.5.2。IPv4 映射的 IPv6 地址

定义了包含嵌入式 IPv4 地址的第二种 IPv6 地址。此地址类型用于将 IPv4 节点的地址表示为 IPv6 地址。“IPv4映射的IPv6地址”的格式如下:

   |                80 bits               | 16 |      32 bits        |
   +--------------------------------------+--------------------------+
   |0000..............................0000|FFFF|    IPv4 address     |
   +--------------------------------------+----+---------------------+

有关“IPv4 映射的 IPv6 地址”的使用背景,请参阅 [ RFC4038 ]。


推荐阅读