【问题标题】:Synthesize IPv4 mapped IPv6 address from IPv4 address on Android?从Android上的IPv4地址合成IPv4映射的IPv6地址?
【发布时间】:2017-08-08 23:15:05
【问题描述】:

我正在尝试根据RFC-7050 中记录的 Android 中的 IPv4 地址(在本机代码中或在 Java 本身中)合成 IPv6 地址,以便在 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 网络 -> NAT64 网络 -> 客户端

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

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

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

【问题讨论】:

    标签: android ipv6 ipv4 multihomed


    【解决方案1】:

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

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

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

    【讨论】:

    • 据我了解,464xlat 实现不适用于 WiFi。在仅 IPv4 的上游网络后面存在使用 NAT64 的网络。即Internet->IPv4 Only Network->NAT64 Network->Client,我正试图解释这种情况。
    猜你喜欢
    • 2012-12-25
    • 2013-09-18
    • 2015-01-17
    • 1970-01-01
    • 2015-04-01
    • 2012-04-11
    • 1970-01-01
    • 2012-06-29
    • 2011-02-16
    相关资源
    最近更新 更多