Синтезировать IPv4 сопоставленный IPv6-адрес из IPv4-адреса на Android?
Я пытаюсь синтезировать IPv6-адрес из IPv4-адреса в Android (либо в собственном коде, либо в самой Java), как описано в RFC-7050, для использования за NAT64.
При работе в iOS эта опция была доступна через звонок getaddrinfo
Однако, похоже, что реализация Android getaddrinfo
будет синтезировать IPv6 только для имен хостов, а не для адресов IPv4.
На iOS, за NAT64, следующий код будет генерировать синтезированный IPv6-адрес внутри переменной res
список адресов. Однако в Android тот же собственный код будет генерировать адрес IPv4, если я не передам имя хоста вместо адреса IPv4 getaddrinfo
,
struct addrinfo *res;
getaddrinfo("x.x.x.x", "80", NULL, &res);
редактировать
Я знаю, что в Android реализован CLAT/464lat, однако он не охватывает все устройства и сети. Одним из ярких примеров будет сеть NAT64 за сетью только IPv4.
Пример: Интернет -> Сеть только IPv4 -> Сеть NAT64 -> Клиент
У клиента будет локальный IPv6-адрес в соответствии с RFC-4193 (я полагаю), но он сможет получить доступ к Интернету только через шлюз NAT64, что означает, что NAT64 должен будет преобразовывать адреса перед отправкой их в восходящем направлении.
Так что мне нужен способ генерации префикса для синтезированного IPv6-адреса
В идеале нам нужно было бы синтезировать адрес IPv6, чтобы достичь конечной точки IPv4.
1 ответ
Это может или не может быть ответом для вас:
Вам не нужно синтезировать адреса на Android. Он имеет 464xlat, который имитирует стек IPv4 в сети NAT64, так что ваше приложение может просто использовать IPv4, а Android позаботится о отображении за кулисами.
Разница между iOS и Android заключается в том, что Android реализовал эмуляцию IPv4 в стеке. Apple решила, что они хотят поддерживать чистоту стека IP и предоставлять разработчику инструменты (например, getaddrinfo
) сделать отображение самостоятельно. Отличное дизайнерское решение.