2

我正在尝试从 Android 中的 IPv4 地址(在本机代码或 Java 本身中)合成 IPv6 地址,如RFC-7050中所述,以便在 NAT64 后面使用。

在 iOS 中工作时,此选项可通过调用 来获得getaddrinfo,但似乎 Android 的实现getaddrinfo只会为主机名合成 IPv6,而不是 IPv4 地址。

在 iOS 上,在 NAT64 之后,以下代码将在变量res的地址列表中生成一个合成的 IPv6 地址。但是,在 Android 上,相同的本机代码将生成 IPv4 地址,除非我将主机名而不是 IPv4 地址传递给getaddrinfo.

struct addrinfo *res;
getaddrinfo("x.x.x.x", "80", NULL, &res);

编辑

我知道 Android 实现了 CLAT/464lat,但这并不涵盖所有设备和网络。一个典型的例子是仅 IPv4 网络后面的 NAT64 网络。

示例:Internet -> IPv4 Only 网络-> NAT64 网络->客户端

客户端将具有RFC-4193下的本地 IPv6 地址(我相信),但只能通过其 NAT64 网关访问互联网,这意味着 NAT64 必须在将地址发送到上游之前对其进行转换。

所以我需要一种为合成的 IPv6 地址生成前缀的方法

理想情况下,我们需要合成一个 IPv6 地址才能到达 IPv4 端点。

4

1 回答 1

2

这可能是也可能不是您的答案:

您不需要在 Android 上合成地址。它具有 464xlat 模拟 NAT64 网络上的 IPv4 堆栈,因此您的应用程序可以只使用 IPv4,Android 将负责幕后的映射。

这里 iOS 和 Android 的区别在于 Android 在堆栈中实现了 IPv4 仿真。Apple 决定他们希望保持 IP 堆栈干净,并为开发人员提供工具(如getaddrinfo)来自己进行映射。不同的设计决策。

于 2017-08-09T05:50:48.697 回答