Inet6Address是Java中表示IPv6地址的不可变类,用于准确构造、解析和验证IPv6地址,支持作用域标识、IPv4映射地址及链路本地地址识别,但不直接处理网络连接。

Java 中的 Inet6Address 类本身不主动“处理”网络连接,它只是 IPv6 地址的不可变表示和解析工具。真正建立或管理连接的是 Socket、ServerSocket 或 HttpURLConnection 等高层类;Inet6Address 的作用是准确识别、构造和验证 IPv6 地址,尤其在多接口、动态地址、作用域标识等复杂网络环境下提供底层支撑。
支持 IPv6 多接口与作用域标识(如 fe80::/10)
IPv6 链路本地地址(如 fe80::1%eth0)必须携带作用域 ID(interface index 或 name),否则无法唯一确定目标网卡。Java 通过 Inet6Address 的 getScopedInterface() 和 isLinkLocalAddress() 方法识别这类地址,并在创建 InetSocketAddress 时自动保留作用域信息。例如:
- 调用
InetAddress.getByName("fe80::1%enp0s3")会返回一个带作用域的Inet6Address实例; - 该实例可用于构造
new InetSocketAddress(addr, port),确保连接发往正确的本地链路; - 若忽略作用域(如只写
fe80::1),系统可能因无法解析而抛出UnknownHostException。
兼容混合地址格式(IPv4-mapped 和 IPv4-compatible)
在双栈环境中,应用常需同时支持 IPv4 和 IPv6。Inet6Address 能识别并接受形如 ::ffff:192.168.1.1 的 IPv4 映射地址(IPv4-mapped IPv6 address),但注意:
- Java 运行时默认将这类地址视为 IPv4 地址,内部转为
Inet4Address实例; - 若需强制保留为
Inet6Address,应使用字节数组构造(Inet6Address.getByAddress(...))并传入 16 字节的 IPv6 格式数据; - 不推荐使用已废弃的
::d.d.d.d兼容格式(如::192.168.1.1),现代 Java 版本可能拒绝解析或行为不一致。
配合自动配置与无状态地址分配
IPv6 常依赖 SLAAC(无状态地址自动配置)生成临时或稳定地址,如 2001:db8::1234:5678:abcd:ef01。Inet6Address 提供以下能力辅助适配:
-
isAnyLocalAddress()可识别::(未指定地址),用于监听所有接口; -
isLoopbackAddress()正确识别::1,不依赖字符串匹配; - 结合
NetworkInterface枚举本地地址时,能准确区分全局单播、链路本地、唯一本地(ULA)等类型,便于按策略选择出口地址。
避免常见解析陷阱
文本形式的 IPv6 地址易因压缩规则出错。使用 Inet6Address 时需注意:
- 双冒号
::在一个地址中只能出现一次,2001::1::2是非法的; - 解析含作用域的地址(如
fe80::1%wlan0)时,应确保系统支持接口名作为作用域标识(Linux/macOS 支持,Windows 通常需用数字索引); - 避免手动拼接字符串构建地址,优先使用
InetAddress.getByName()或Inet6Address.getByAddress(),由 JVM 内置逻辑做标准化和校验。

















