main icon indicating copy to clipboard operation
main copied to clipboard

Psi+ всегда предпочитает IPv6 даже если TCP стек сконфигурён предпочитать IPv4, это плохо с туннелем

Open Ri0n opened this issue 10 years ago • 10 comments

Original issue 594 created by psi-plus on 2014-09-30T23:40:54.000Z:

Шаги по воспроизведению проблемы:

  1. Запускаем Psi+ видим, что лезет на сервер по IPv6

Каков ожидаемый результат? Лезет согласно предпочтениям, выставленным в TCP стеке, если там предпочитать IPv4, то делать так же. В винде стоит предпочитать IPv4, как видно из:

netsh interface ipv6 show prefix Querying active state...

Precedence Label Prefix


    50      0  ::ffff:0:0/96
    40      1  ::1/128
    30      2  ::/0
    20      3  2002::/16
    10      4  ::/96
     5      5  2001::/32

И все программы это понимают, кроме Psi+.

Что Вы видите вместо этого? Лезет всегда по IPv6

Какую версию Psi+ / ОС Вы используете? 0.16.361 Win7 Ultimate SP1

Дополнительная информация по проблеме: На IPv6 стоит туннель, оно коннектица и работает, но едет долго через Америку и Германию, вместо того, чтобы ехать короче по IPv4 без туннеля. Кроме того, передача файлов едет медленно через файловый прокси вместо напрямую, поскольку другая сторона обычно без IPv6.

Ri0n avatar Mar 19 '15 10:03 Ri0n

Необходим кроссплатформенный способ получения предпочтений.

Ri0n avatar Jun 09 '15 12:06 Ri0n

Способа не нужно. Если задано предпочтение, список адресов getaddrinfo() автоматически сортируется согласно нему, в соотв. с https://datatracker.ietf.org/doc/rfc6724/?include_text=1 Задача Psi+ просто пройти по списку до первого успеха, не занимаясь самодеятельностью.

Это как минимум для *nix и, наверное, макоси, потому что там стек от BSD. Под windows таблица предпочтений выглядит как в RFC, получить её можно через

netsh interface ipv6 show prefix

а вот есть ли там getaddrinfo() или как называется его аналог - не знаю. Но что-то есть, поскольку предпочтение работает при коннекте на dual-stack сайты (не из Psi+).

ache avatar Jun 09 '15 15:06 ache

так уж сложилось что мы не используем getaddrinfo. у нас есть свой резолвер. почему свой? думаю потому что оригинальным разработчикам хотелось что-то прикрутить для dns на маке (avahi like). настоящих причин не знаю.

на данный момент добавлен алгоритм happy eyeballs, который из-за выших задержек по ipv6 таки может подключить вас по ipv4. но как бы там не было happy eyeballs решает другую проблему.

getaddrinfo думаю есть везде.

Ri0n avatar Jun 09 '15 15:06 Ri0n

Тут есть 2 решения, правильное и радикальное. Правильное - имплементировать в своём резолвере RFC 6724, но тут кроссплатформенного способа точно нет и не будет, везде придётся по-разному. Радикальное - выкинуть свой резолвер и юзать getaddrinfo(). Всё (и не только это) заработает автоматом, да и стремительно стареющего неподдерживаемого кода меньше будет.

ache avatar Jun 09 '15 15:06 ache

ну меня были примерно те же выводы. впрочем скоро перелазим на qt5 и там наш резолвер по больше части не понадобится.

Ri0n avatar Jun 09 '15 15:06 Ri0n

Кста, вот какая ситуация получается как следствие, c File Transfer на машине dual-stack. Если сервер jabber.ru, коннекция к нему идёт по ipv6 потому что см. всё выше и он тоже dual-stack. Так вот, в XML запроса выходящего файл трансфёра передаётся тоже только этот ipv6 адрес. А с другой стороны машина ipv4. Она обламывается, о чём диагностика про невозможность подключиться к NAT что-то, c двух сторон. Лечится прописыванием ipv4-only dynamic dns в поле "Внешний адрес для передачи данных", но это костыли. Оно тогда сначала всё равно с той стороны лезет на ipv6, обламывается и потом на указанный ipv4 dynamic dns (он передаётся вторым почему-то). Всех просить прописать proxy.jabber.ru невозможно, многие клиенты просто не умеют, и оно бывает не работает само по себе.

ache avatar Aug 26 '15 07:08 ache

Собственно, оно могло бы использовать STUN, который у меня прописан и получить само адрес ipv4 который можно выдавать для File Transfer.

ache avatar Aug 26 '15 07:08 ache

стун для файл трансфера в моем туду. но не знаю когда руки дойдут

Ri0n avatar Aug 26 '15 10:08 Ri0n

@ache, @Ri0n: What is the current situation?

Neustradamus avatar May 07 '24 18:05 Neustradamus

@Neustradamus we use qt resolver now. But still our own HappyEyesballs which prefers IPv6. Even so I tried to connect both ipv4 and 6 almost parallel.

Wrt using STUN for file transfer, we use it with WebRTC datachannels. But AFAIK only Psi supports it, so transferring to other clients may still be problematic. Using STUN with socks5 will probably force us to use socks5 only in UDP mode.

Ri0n avatar May 08 '24 06:05 Ri0n