~AreEnn
~R4SAS
~acetone
~villain
&N00B
+Xeha
+relaybot
DUHOVKIN
Leopold
Most2
Nausicaa
Ruskoye_911
Vort
anon2
b3t4f4c3
karamba_i2p
nemiga
not_bob_afk
plap
poriori
profetikla
soos
teeth
un
weko_
whothefuckami
relaybot
13apophis: что то бы заработались в пятницу
relaybot
13apophis: *вы
orignal
поправил
user
Поднял на последнем коммите свежий роутер XU. Час аптайма. tcsr 51% R:1132 F:772 Transit Tun:5
user
Больше 5 транзитных не было.
user
Если правильно понял из логов, т.к. нетдб маленькая, я постоянно делаю запросы к фф
orignal
нет
orignal
если кратко
user
Еще смущает это чехарда с портами.
user
Our external address is ip:port1
user
Our port port1 resieved from someip:someport is different from port2
user
Понятно что NAT, там внешний и внутренний порты могут различаться. Но может тут какая проблема есть...
orignal
это и называется Symmetric NAT
orignal
если порты разные
weko
orignal: порты же резные при любом NAT?
weko
Разные*
weko
Transit Tunnels: 41 аптайм 5 часов
weko
Обычно меньше
weko
Кто-то ставит меня IBGW ...
weko
Вижу такой туннель
weko
[00:20:57] <weko> Обычно меньше
weko
До коммита
weko
Но должно быть явно больше
orignal
нет
orignal
должны быть одинаковые
user
Я, в общем, не совсем понимаю, кого может интересовать наш внешний порт на роутере, если наружу мы выходим только через NATовский порт...
orignal
потому что это UDP
orignal
и ответные пакеты приходят на порт
user
Да, что-то я не сообразил.
user
XU last comm ~4hr uptime: TCSR:54% R:2250 F:1090 TT:93
orignal
с последним.
user
+
weko
Transit Tunnels: 60
weko
6.5 часа
weko
Кто-то даже данные пустил
orignal
тоже последний?
orignal
вон Vort какую багу нашел
weko
Ну вот когда Vort просил
weko
После фикса первой баги
user
У меня транзит пока в районе 20-40 киб/с
weko
user: +- также
weko
Туннели 700кб были
weko
Кто мог данные пустить ?
weko
Или это такие жирные exploratory?
user
Транзит через всё, что ниже O не пускается.
user
O,P,X - пускает
weko
user: да забей
weko
Ой
weko
Короче я попутал
user
Да, с L роутерами
weko
Ага
weko
NTCP2 / SSU2 38 / 322
weko
Transit Tunnels: 73
weko
SSU2 134
weko
Колеблется сильно
weko
В какой-то момент количество резко вырастает
weko
300 / 500
weko
Точнее не в какой то, а сейчас
weko
Что за "волны"?
weko
100 / 470
user
В логах довольно-таки много ворнингов - SSU: Session was not introdused after 5 seconds
user
Не знаю, насколько это нормально.
Vort
значит, интродьюсер не ответил. сейчас покажу ещё раз данные по статистике установки SSU2 сессий
Vort
Results: 724958 (359673 out, 365285 in), RI: 392595 (28507), Uptime: 1 d 07 h 01 m
Vort
*|E 72093 20%|F32322 9%|IF21989 6%|T221677 62%|IT11592 3%|ED a 0.8s m 0.5s
Vort
R|E 54484 17%|F32007 10%|IF 6906 2%|T217359 69%|IT 3089 1%|ED a 0.8s m 0.4s
Vort
U|E 17609 38%|F 315 1%|IF15083 33%|T 4318 9%|IT 8503 19%|ED a 1.0s m 0.6s
Vort
user: то, что ты видишь в логах, (not introduced) - это у меня тут в таблице отмечено как IT 8503 19%
Vort
как видно, такого довольно много. но IF15083 33% - в полтора раза больше
Vort
вот эти 33% - это в основном из-за разрыва сессии U узла с интродьюсером
user
XU last comm ~8hr uptime: TCSR:58% R:1671 F:998 TT:49
Vort
надо дальше чинить )
Vort
похоже, ещё одну проблему словил (читаю лог за ночь)
Vort
[22/Jul/2023:00:44:10 +0300]@379/debug - SSU2: Introducer added 1306463008 at sfQd
Vort
[22/Jul/2023:00:44:11 +0300]@379/debug - SSU2 (sfQd): Termination requested, code = 2
Vort
таймаут неактивности сесии вот-вот собирался сработать, а мой узел решил выбрать эту сессию интродьюсером
Vort
и сам же через секунду её прихлопнул :))
Vort
теперь по поводу Path challenge и VirtualBox:
Vort
допустим, у меня U узел в виртуалке. у него есть сессия с интродьюсером
Vort
каждые 30 секунд мой узел отправляет KeepAlive. но при этом же каждые 20 секунд VirtualBox удаляет маппинг
Vort
значит ли это, что в течение 10 секунд интродьюсер не сможет мне послать никаких данных (запросов)?
Vort
где находятся 20 сек в коде VirtualBox я нашёл: virtualbox.org/browser/vbox/trunk/src/VBox/Devices/Network/lwip-new/src/include/lwip/udp.h#L201
Vort
правда, в реальности там немного меньше. за 19 секунд тоже может маппинг удалиться. вот 18 сек вроде нормально работает
Vort
там, кстати, в коде есть коммент про то, что 20 сек они взяли из RFC 3948
Vort
хорошо, что я некоторое время назад написал UDP тестер. сейчас чутка обновил его: paste.i2pd.xyz/?be3d07d7bb76a5b6#7tKKYmjJixVwVYz4h9iakffVimSqCMAMSwN6AMjFm6EP
Vort
user: у тебя логи на U узле какого уровня? debug?
Vort
результаты теста для "const int SSU2_KEEP_ALIVE_INTERVAL = 18;": сессии ко всем трём интродьюсерам продержались положенный час времени
Vort
однако я один раз заметил Path challenge. подтвердить это явление с помощью своего UDPTest.exe правда не смог
Vort
так что видимо правильное значение для NAT`а VirtualBox - 17 секунд
Vort
но на всякий случай и чтобы "круглое" число было можно вполне поставить 15 секунд - то есть половину от того, что стоит сейчас
orignal
короеч какая проблема счас?
user
XU last comm ~13hr uptime: TCSR:59% R:1999 F:998 TT:33
Vort
"<~orignal> короеч какая проблема счас?" - две штуки
Vort
первая - узел иногда закрывает по неактивности соединение со свежевыбранным интродьюсером
user
Vort, Логи warn, поставил дебаг, если нужно что-то поискать, могу попробовать.
Vort
user: да, нужно. сейчас скажу
orignal
какое из двух?
Vort
orignal: вторая проблема - для некоторых NAT нужен пробив (keepalive) чаще, чем 30 сек. допустим, 15 сек
Vort
user: надо поискать, много ли в логе будет SSU2: Path challenge
orignal
и как со вторым быть?
orignal
про ервое не понял кто именно закрывает
Vort
мой U узел сам закрывает соединение со своим интродьюсером
Vort
потому что он его выбрал, а у того таймаут истекал как раз видимо
orignal
а почему?
Vort
хотя я на 100% в причинах не уверен
orignal
выбрал для чего я опять не понял
orignal
то есть в какой то момент он выбрал соединение в качестве интродьюсера стал публиковать и тут же сам закрыл?
orignal
потому что говно мамонта?
Vort
ага
Vort
потому что keepalive через 30 сек
orignal
ну это я починю
Vort
можно или при выборе сразу keepalive слать или что-то другое придумать
orignal
а вот что делать с NAT x3
Vort
или не выбирать тот который на грани истечения
orignal
да это понятно как чинить
orignal
на самом деле смотреть насколько протухший и слать keepalive если близко
Vort
"<~orignal> а вот что делать с NAT x3" я предлагаю поставить const int SSU2_KEEP_ALIVE_INTERVAL = 15;
Vort
это решит проблему с интродьюсерами на некоторых NAT
orignal
а чем 15 лучше 30?
Vort
останется проблема с остальными сессиями, но это не так критично
Vort
orignal: тем, что у некоторых NAT истекает срок годности порта за 20 сек
orignal
а откуда 20? не может быть за 5?
Vort
и, как я понимаю, Боб в течение 30-20=10 сек отправляет запросы в пустоту (если отправляет)
orignal
правильный путь это определять такую ситуацию
Vort
orignal: "откуда" - из Гугла :) допустим, вот: quora.com/How-does-UDP-hole-punching-work
Vort
"with an UDP connection the NAT will timeout the mapping in its table, so the UDP application needs to send out keep-alive packets frequently (< 20 seconds) to keep the connection open."
orignal
тогда да
Vort
"<~orignal> правильный путь это определять такую ситуацию" в идеале, да. но для начала надо чтобы неидеальный вариант хотя бы заработал нормально
orignal
но по хорошему надо в интревале 13-18
orignal
сам понимаешь почему
Vort
такая же фигня явно ещё и с неинтродьюсерскими коннектами. и как это правильно чинить - пока что даже не догадываюсь
Vort
в случае интродьюсера всё понятно - Чарли надо, чтобы пробив держался - он и бьёт себе
user
У меня сначала был включен дебаг пару часов, потом выключил, сейчас снова включил, поэтому результат как есть - 5568
Vort
а вот с остальными коннектами - хз как правильно. может, надо два типа таймаутов делать - на пробив и на остальные данные
Vort
user: то есть - дохрена?
Vort
user: попробуй пожалуйста поставить в SSU2.h const int SSU2_KEEP_ALIVE_INTERVAL = 15;
Vort
вместо 30ки
Vort
и глянь, увеличится ли от этого количество транзитов
user
Блин, я тупанул, там только два вхождения
user
Спросонья.
Vort
а, тогда не поможет, можно не проверять
Vort
это зависит от типа NAT
Vort
у каких-то NAT порт удаляется быстро, у каких-то нет
orignal
займусь где то через час
Vort
плохо я ещё понял работу пробива портов :( поэтому возник вопрос:
Vort
вот создал Чарли сессию к Бобу. создался маппинг локального IP:порта Чарли с внешним IP:портом (его NAT устройства)
Vort
и теперь что получается (в самом простом сценарии) - кто угодно может постучаться на внешний IP:порт Чарли и попасть на его внутренний (локальный) IP:порт?
Vort
если это то, как работает механизм, то сессия к интродьюсеру - это и весь пробив, который нужен. пока она жива, жив маппинг и все навешанные на него сессии к другим пирам
orignal
нет
orignal
снчала чарли пошлет HolePunch к Алисе
orignal
и там вообще может быть порт другой чем с бобом
Vort
значит, нужны ещё keepalive`ы :(
weko
[11:04:22] <orignal> но по хорошему надо в интревале 13-18
weko
[11:04:36] <orignal> сам понимаешь почему
weko
Ага. Можно даже 10-18
Vort
а получилось 15-18. ну всё равно прогресс по сравнению с 30
Vort
теперь нужно тесты от юзеров с разным NAT
Vort
и можно будет подкручивать числа при необходимости
weko
Вот у WG 25 секунд например
Vort
ну мне важно было не выше 18 чтобы можно было в VirtualBox тестировать =)
Vort
а там мало ли - может кто-то из юзеров вообще постоянно держит узел в VirtualBox
Vort
так что неплохой ориентир, думаю
weko
Скорее qemu или в docker
weko
Кстати мне кажется часа мало
Vort
если кому-то интересно и этот кто-то не боится C# (Mono), то может потестировать моей програмкой - с какой задержки начинает прыгать порт
Vort
имею в виду потестировать qemu и docker
Vort
если там есть NAT конечно. ну должен быть наверное
weko
[14:08:07] <weko> Кстати мне кажется часа мало
weko
Может 2 часа поставить?
Vort
не надо пока что это трогать
weko
Почему? За 2 часа больше узлов получат RI -> больше транзита
Vort
ещё не до конца понятна живучесть сессий с интродьюсером
weko
Так время ничего не испортит
weko
Улучшит только
weko
Если сессия и не заканчивается, то будет жить дольше
Vort
так если рвётся сессия, то интродьюс перестаёт работать
Vort
а, я понял
weko
[14:13:06] <Vort> так если рвётся сессия, то интродьюс перестаёт работать
weko
Так нужен новый. Или восстановить сессию
orignal
еще лдин коммит сделал
orignal
чтобы говно мамонта не выбиралось в качестве интредьюсера
Vort
weko: я видел, что выбирался тот же самый интродьюсер кстати. ну или мне причудилось )
Vort
orignal: заведу значит сейчас XU в виртуалке. послежу за ним немного
weko
Для интродьюсеров вообще нужны самые качественные роутеры
weko
Если говорить про профилирование
weko
И нужно их точно на побольше. 2-3 часа
weko
А лучше случайное время в этом диапазоне
orignal
да надо
orignal
с интродьюсерами вообще многое не сделано
Vort
orignal: хм. глянул коммит. или я что-то не так понял, или это немного не то
orignal
это еще другой
orignal
смысл в том что мы не берем сильно старые сессии для интродьюсера
orignal
потому что раньше могли взять сессию которая тут же протухнет
Vort
так проблема была чутка в другом
Vort
хотя не уверен
orignal
я в курсе
orignal
ту проблему я еще не сделал
Vort
мне казалось, что протухание было на уровне IdleTimeout
Vort
а. ок
Vort
два протухания ))
orignal
я просто увидел другую более серьезную
weko
orignal: у жабистов тоже 1 час иетродьюсеры?
Vort
тогда подожду ещё с XU узлом
orignal
да то же самое
weko
Tunnel creation success rate: 60%
orignal
ну неплохо
weko
После обновления будет ещё лучше
orignal
у меня 42% на LU с Symmetric NAT
weko
SSU2_KEEP_ALIVE_INTERVAL = 15;
weko
SSU2_KEEP_ALIVE_INTERVAL_VARIANCE = 4;
weko
Это 11-19 выходит?
Vort
weko: ну я же сказал - 15..18
orignal
15-19
weko
Vort: 15+4 19 же
Vort
weko: 4 там не будет
orignal
а ну да
orignal
пох
Vort
да правильно, что 18. у меня на 19 порты уже менялись в VirtualBox
weko
В чём разница?
weko
SSU2_TO_INTRODUCER_SESSION_DURATION = 3600;
weko
SSU2_TO_INTRODUCER_SESSION_EXPIRATION = 4800;
Vort
я чую, что это очередная проблема, но пока молчу )
Vort
хотя раз уж начали говорить... keepalive ведь до 80 минут должен посылаться?
Vort
но из RI надо выкидывать на 60 минуте
Vort
ну так мне кажется логичным. может понимаю неверно
weko
Не логично
weko
Вроде каждому интродьюсеру в RI добавляется таймстамп
weko
Время истечения
Vort
+80 минут, да?
Vort
а выкинется из RI через 60 минут
weko
Ну должно быть столько, сколько интродьюсер выполняет свою работу
Vort
чтобы дать время RI разойтись по сети
Vort
короч мне кажется, что с выкидыванием из RI сессию дропать не надо. надо ещё 20 минут давать для тех юзеров, которые старым RI пользуются
Vort
иначе не вижу смысла в различных длительностях
weko
Да без разницы. Узлы всегда могут определить какой рабочий интродьюсер, а какой уже нет. Благо что время почти абсолютно для участников сети
Vort
сессия дропнута - тег выкинут - интродьюсер возвращает ошибку
Vort
короч интродьюс работает только пока жива сессия Боба и Чарли
weko
Ну это понятно
weko
Но мы то про время
Vort
ну вот если через 60 минут её закрыть, то уже никто не сможет этим интродьюсером воспользоваться
weko
Ну правильно
weko
И никто не будет
weko
[15:46:59] <weko> Вроде каждому интродьюсеру в RI добавляется таймстамп
weko
Время истечения
Vort
поэтому я и спросил - +80 добавляется?
weko
Врядли
weko
Не логично
weko
Я то откуда знаю
Vort
а какой тогда смысл в 80 ?
weko
Я же вопрос и задал
Vort
:)
weko
Тоже хочу узнать...
Vort
своё объяснение понимания механизма я написал
Vort
теперь ждём, что orignal скажет
weko
Но он не нужен же если в RI пишет время истечения
weko
Пишется*
weko
SSU2: Unexpected message type 67 from {IP}:{port} of {length} bytes
weko
Интересно
Vort
очередной баг какой-то видимо так проявляется
weko
Может где-то едет смещение? Или где то не расшифровалось
weko
Надо такие сообщения сохранять
Vort
ну меня подозрения на две причины: потокобезопасность (так как было много такого в других местах) и big endian/little endian (не)совместимость (кое что у меня вызывало подозрение)
Vort
"<weko> Надо такие сообщения сохранять" - или брекпоинт в дебаггере ставить и гадать, что произошло
Vort
ещё вариант - побольше логирования вокруг этой проблемы наделать
Vort
ещё может быть "шум сети" виноват. надо проверять, действительно ли это i2p трафик
Vort
ещё может быть юзер сбросил ключи допустим, а наш узел пользуется старыми
Vort
ну это всё почти наугад причины. короч копать надо
Vort
вариант "атака" на последнем месте :))
weko
Интересно ещё, кто делает U узлы IBGW
Vort
так были же недавно исправления на эту тему
Vort
выбор рандом пира или что-то около того
Vort
был какой-то шанс выбрать неверно
weko
Аа
weko
Понятно
weko
Кстати а уже пофиксили что пробуется только один интродьюсе
weko
?
Vort
по-моему там не так всё просто
Vort
мне казалось, что может быть несколько попыток
Vort
но может это из-за того, что я несколько туннелей делал по одному и тому же маршруту
Vort
то есть, тут скорее вопрос в том, "один" за какой промежуток времени. за время "жизни" сессии?
Vort
и если проблема проявляется в виде таймаута, то что тут вообще можно сделать?
Vort
вот если интродьюсер ответил, но, допустим, кодом 5, то можно попробовать ещё какой-то
weko
Vort: если таймаут то другой надо
weko
В любом случае если не получилось пробовать другой
user
weko, ты еще тестовый узел U держишь?
weko
Обновил
Vort
weko: на последний коммит?
weko
Да
Vort
интересно было бы узнать, какие таймауты для портов NAT наиболее распространены среди юзеров
Vort
но я даже примерные значения (10-20-30) еле нагуглил :(
Vort
может гуглил плохо, хз
Vort
от этого зависит, какой улучшательный потенциал у последних коммитов
user
Статистика после 20 часов аптаима: TCSR:58 R:1893 F:1066 TT:59 Transit:246.20 MiB
user
Имее смысл дальше её держать? Или можно гасить?
Vort
хорошо. получается около 50 транзитов в среднем
Vort
было бы неплохо, конечно, где-то до тыщи довести...
user
До тыщи часов?
Vort
до тыщи транзитов. багфиксами )
Vort
user: думаю, пока стоит выключать. а если ещё какой-то важный баг выловим, то ещё потестировать
user
Ок
Vort
если есть ещё и белый адрес и желание, могу показать, как измерить таймаут протухания порта у NAT
Vort
хотя для статистики это надо у многих юзеров измерить :(
user
Кстати, ты спрашивал выше про SSU2: Path challenge. За последние примерно 6 часов в логе записей набралось 51. Если это нужная информация.
Vort
это я так пытался угадать таймаут )
Vort
мне кажется, что у твоего NAT таймаут где-то минуту
Vort
у меня на 20 секундах таймаута лог был просто засран этими сообщениями
Vort
без NAT же, как я понимаю, этого сообщения вообще быть не должно
user
Есть
Vort
я выкладывал программу для тестов: paste.i2pd.xyz/?be3d07d7bb76a5b6#7tKKYmjJixVwVYz4h9iakffVimSqCMAMSwN6AMjFm6EP
Vort
под линуксом её через Mono собрать можно: mcs Program.cs
Vort
потом запуск mono Program.exe
Vort
ну или UDPTest.cs / UDPTest.exe лучше
Vort
на белом адресе надо запустить "UDPTest s белый_адрес порт"
Vort
на сером адресе - "UDPTest c белый_адрес порт 1000 1"
Vort
1000 - это таймаут. 1 секунда то есть
Vort
будут посылаться пакеты каждую секунду. сервер будет их ловить и отображать порт
Vort
с таймаутом секунда порт будет всегда одинаковым у следующих друг за другом пакетов
Vort
а вот если таймаут превысит определённый порог (допустим, 20000), то порты будут у каждого пакета разные
Vort
и вот этот самый порог и желательно знать для разных юзеров (ну или хотя бы хоть для кого-то)
Vort
можно ставить 1000, потом 5000, потом 10000 и так далее - пока порт не начнёт "прыгать"
Vort
если с Mono будут проблемы, то можно по этому принципу на чём-то другом написать аналогичную програмку - она не сложная
orignal
что сказать то?
Vort
ну для начала - какой таймаут пишется в RI - INTRODUCER_SESSION_DURATION или INTRODUCER_SESSION_EXPIRATION
orignal
expiration
orignal
то что в iExp
Vort
а меняться в RI интродьюсер должен через сколько?
orignal
не помню смотреть по коду надо
orignal
с дедом это обсуждали
Vort
а сессия с интродьюсером жить должна сколько?
Vort
мне кажется, что 80. но это просто по логике. моей логике )
orignal
сколько EXPIRATION
orignal
но когда истекает DURATION то интродьюсер в RI меняется на новый
Vort
ну вот мне кажется, что сессия живёт 60. то есть, баг
orignal
тем не менее в старой keepalive шлется до EXPIRATION
Vort
ах вот как
orignal
if (ts < session->GetCreationTime () + SSU2_TO_INTRODUCER_SESSION_EXPIRATION)
orignal
session->SendKeepAlive ();
Vort
тогда мне надо будет получше рассмотреть
orignal
должна жить 80
orignal
но после 60 не публикется в новом RI
orignal
но со страрого может
Vort
orignal: короче похоже старой сессии (которой ещё 20 минут надо слать keepalive) просто "жить" негде
Vort
в auto& introducers = v4 ? m_Introducers : m_IntroducersV6 похоже хранятся только те, которые в RI
orignal
надо подумать
Vort
я на 90% уверен, что это баг, но уже сегодня не буду подбирать доказательства
orignal
скорее всего да
orignal
я просто не доделал
orignal
как обычно
orignal
надо сделать список implied introducers
orignal
Vort я это поправил
weko
[17:34:58] <user> Статистика после 20 часов аптаима: TCSR:58 R:1893 F:1066 TT:59 Transit:246.20 MiB
weko
У меня было 800 мб