java - 为什么 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
}
}
解决方案
范围内的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 ]。
推荐阅读
- ruby-on-rails - 如何在 Heroku 上的 Rails 中读取一个巨大的 CSV 文件?
- python - 让脚本等待输入数字
- python - 删除 QTextEdit 内部的 QTextDocument
- python - 如何通过 Python 用 J-Tag 刷固件?
- oracle - Oracle 触发器用 case 语句创建
- ios - Swift 进度条 completedUnitCount 和 totalUnitCount
- visual-studio-code - VSCode:自动完成有时会停止工作
- reactjs - 如何使用 Reactjs 和 D3js 在饼图中动态显示数据
- dji-sdk - M210 和 M600 上的开放协议和数据透明传输
- assembly - 汇编语言猜谜游戏。即使猜测应该是正确的,我的代码仍然在循环?