IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2025/12/14
~AreEnn
~AreEnn_
~R4SAS
~acetone
~orignal
~villain
@onon
&N00B
+Xeha
orignal все время так или просирается?
onon Ну если сломалось то сломалось насовсем
onon Вначале бывает несколько пакетов нормально пройдут а потом перестаёт
onon Вот если сразу не сломалось то потом нормально рабооает
onon На старте все проблемы
orignal ломается сразу или после определенного числа пакетов?
onon Ну я же говорю несколько могут пройти
onon Небольшое число
onon Сколько точно не скажу
orignal может ответы не доходят?
orignal интересно почему у меня такого не бывает
onon Ну смотри как я сделал
onon Я сделал что он сначала один пакет шлёт
onon И ждёт пока сессия установится и придёт подтверждение
onon И когда акк получил тогда начинает слать основной поток
orignal надо бы понять что происходит с сессией
onon Вот бывает что из потока некоторое количество нормально проходит и даже акки отправляет
onon А потом перестаёт
onon И пишет error - Garlic: Can't handle ECIES-X25519-AEAD-Ratchet message
onon А бывает что на клиенте не расшифровывает
onon Т.е. сессию установили, шлём поток получили несколько акков и все
orignal буду смотерть
onon И больше акки не расшифровываются
orignal но у меня ничего такого не видно
onon А ты поток туда шлёшь или что?
onon Может ты по одному пакету в секунду что отправляешь
orignal я же сказал кино мегабит в секунду
onon Я кстати переставил if (flags & UDP_SESSION_FLAG_RESET_PATH) ниже чем if (flags & UDP_SESSION_FLAG_ACK_REQUESTED)
onon Не помогло
onon Всё равно там ноль откуда-то берётся
orignal а у меня не берется
onon Есть какие-то идентификаторы сесии
orignal специально пробую
onon А ты клиент перезагрузи
onon И снова переподключись
orignal нет нету
orignal в смысле перегрузить?
onon Ну с которого кино транслируешь
onon Выключи и снова включи
onon Я так делаю
onon Может в этом проблема?
orignal то есть ffmpeg что ли?
onon нет, роутер
onon Но там же новый b32 будет
orignal а ну так я на одном и том же гоняю
orignal если смена сессии то это другая тема
onon Неужели он может путать сессии
orignal а точно там b32 новый?
onon Конечно
orignal может путать да
orignal weko что то такое говорил
onon Это всё твои оптимизации
orignal неее
orignal я же тебе говорю UDP тоннели изначально сделаны криво
onon Ну так чини
orignal ну а я что делаю?
onon Ноль ищешь
orignal так а без рестарта ничего не случается?
onon Пока ноль не найдём нормально работать не будет
onon Ну я же говорю, если сразу не сломалось то работает
orignal так ноль это следуствие рестта
onon Ты так думаешь?
orignal ну посмолько у меня он не вылазит
onon А ты как проверяешь
onon LogPrint (eLogCritical, "UDP Server: UDP_SESSION_ACKED: ", m_LastSession->m_LastReceivedPacketNum);
onon Я вот так
orignal а я просто в Acked встатил
onon Сразу после replyOptions.Put (UDP_SESSION_ACKED, m_LastSession->m_LastReceivedPacketNum);
orignal заодно статичтика такая
orignal на 1 repliable идет 10-23 raw
onon А до if (m_UnackedDatagrams.empty () && seqn < m_UnackedDatagrams.front ().first) return; или после?
orignal я печататаю что на сервер прилтает
onon Так это с сервера прилетает
onon А не на сервер
orignal нет я печатаю именно что прилетает на сервер с клиента
onon Ну а я печатаю, что сервер отправляет и что на клиенте получается
orignal там там только ответы там raw вообще не должно быть
onon Клиент оптравляет options.Put (UDP_SESSION_FLAGS, UDP_SESSION_FLAG_RESET_PATH | UDP_SESSION_FLAG_ACK_REQUESTED);
onon GetDatagramDestination ()->SendDatagram (session, nullptr, 0, 0, 0, &options);
onon В ответ получает ack seqn = 0
orignal без рестартов?
onon Давай подробно, клиент установил соединение, шлёт поток, потом перестал получать подтверждения (сломался туннель), он ждёт таймаут, отправляет GetDatagramDestination ()->SendDatagram (session, nullptr, 0, 0, 0, &options); В ответ получает ack seqn = 0
orignal значит на сервере сессия создалась по новой
onon Ну, дальше если слать поток то ответы с правильными аками
onon И шифрование не ломается
orignal правильными как будет продолжаются?
orignal или новые насчитвваюстся
onon Продолжаются
onon И акк с нулем он шлёт даже в том случае если не делал m_LastSession->GetDatagramSession ()->DropSharedRoutingPath ();
orignal то есть у него такая реация именно на такой пакет?
onon Очевидно что проблема в том что у нашего магического пакета нет seqn
onon Да
orignal вот тперь ясно
orignal счас думать будем
onon Но по логике у него seqn и не должно быть
onon Он где-то всё-таки записывает m_LastSession->m_LastReceivedPacketNum = 0
onon Потому что когда поток возобновляется то здесь if (options->Get (UDP_SESSION_SEQN, seqn) && seqn > m_LastSession->m_LastReceivedPacketNum)
onon Он присваивает 0 к следующему seqn
orignal я что то плохо соображаю
orignal разберусь
orignal в том пакете fromport и toport нулевые
orignal вот тебе и ответ
orignal там скорее весего новая сессия генерится
onon Ах вот оно что
onon Пофиксить реально?
orignal легко
onon Ну значит завтра сделаем
onon Или сегодня?
orignal if (!m_LastSession || m_LastSession->Identity.GetLL()[0] != from.GetIdentHash ().GetLL()[0] || fromPort != m_LastSession->RemotePort)
orignal m_LastSession = ObtainUDPSession(from, toPort, fromPort);
orignal думаю ясно?
onon Ну я в такие дебри не лез
orignal fromPort тут 0
onon Ну ты объяснил теперь понятно
onon Это нужно будет фейковый пакет генерить получается
orignal счас закоммичу
onon А я чаю сделаю пока
orignal готово
onon Щас посмотрим
onon ЗБС
onon Теперь нету нулей
onon Может и шифрование перестанет ломаться...
orignal это вряд ли
orignal шифрование что то другое
orignal nevermidn it's github
orignal I will let you know
orignal не туда
onon Не туда
orignal давай теперь твои изменения
onon Ну ты не торопись
onon Их же все перенести нужно, перепроверить
onon Завтра
onon Плюс у тебя какая-то чехарда с LastRepliableDatagramTime
onon Я не понимаю
onon Если я не разберусь, то переделаю по своему
orignal а что тут? это просто время отправки
onon или запроса?
onon Отправляющая сторона сама должна акки запрашивать
orignal нет когда последяя repliable ушла
onon А мне нужно время запроса
onon Чтоб запрашивать акки с определённой частотой
orignal ну это то же самое
orignal в raw запросов нет
onon Короче теперь когда он ноль не шлёт мой код не работает =)
onon Если исходящие пакеты потерялись
onon То он отвечает seqn меньше чем есть в окне и оно не освобождается
onon Вот буду думать как исправить
onon orignal, а если шифрование сломалось, есть ли вариант как-то удалить сессию и установить заново?
orignal через 4 минуты сама протухнет
orignal и да можно начать новую
orignal новая дожна менять старую
orignal но я проверю
onon И в хедер добавить
onon 47,48d46
onon < bool m_IsSendingAllowed = true;
onon < bool m_IsFirstPacket = true;
onon Но это ещё тестировать нужно
onon Так что смотри как сделал я, думай как сделал бы ты, может я что накосячил
onon Вот там где if (!m_UnackedDatagrams.empty ()) ScheduleAckTimer (0); // try again if failed
onon Там можно счётчик фейлов сделать
onon И потом пытаться сессию пересоздать
onon Но я это не умею
onon Логика такая что если 10 фейлов например то можно очистить всё и закрыть сессию, а если на порт продолжают долбиться то пытаться заново
onon А если там новых пакетов нет то ошибку в лог и всё закрыть
onon Ну и заново слушать порт
orignal вопрос тут в другом
orignal а что если та сторона вообще в даун ушла
onon Вот и я про то же
onon Ну щас получается что будет каждые 8 сек слать пытаться
onon У меня нет хорошего ответа, как лишнее не слать
orignal просто дропать
orignal это проблемы дятся
orignal *дятла
onon Ну поток датаграм и так будет дропаться
onon А слаться будет тот самый магический пакет
onon Если связи нет и сессии
orignal слаться пока лизсет на протухнет
orignal а нет лизсета все
onon Ну да
orignal можно твой код коммитить?
onon Ну ты сначала его посмотри
onon Чтоб там явных косяков не было
onon Ну и тестировал его я не так долго
onon И ещё важный момент
onon Я почему изначально переделал вот это if (!m_RTT || !m_AckTimerSeqn || (!m_UnackedDatagrams.empty () &&
onon ts > m_UnackedDatagrams.back ().second + repliableDatagramInterval)) // last ack request
orignal посмотрю
onon Потому что словил ситуацию когда был затык, потом все пакеты подтвердились одновременно и получилось что m_UnackedDatagrams.empty () = екгу
onon true
onon И он начал слать только raw
onon Но сейчас я такого бага пока не поймал поэтому не переделывал
onon Может с твоим новым кодом и нормально...
orignal так я же переделал
onon Ну вот тестировать нужно
onon Долго и муторно
onon В разных ситуациях
onon Но как минимум этот код нормально почти бесшовно переключается по туннелям
onon И если шифрование сразу не сломалось то работает хорошо
orignal посмотрим
onon Да чуть не забыл DeleteExpiredUnackedDatagrams (); это нужно бы выпилить
onon Оно не нужно
onon И здесь тоже что-то бы придумать получше while (numPackets < i2p::datagram::DATAGRAM_SEND_QUEUE_MAX_SIZE)
onon Чтоб оно за границы размера окна не вылезало
orignal посмотри
orignal как назвать твои изменения?
onon Без понятия
onon Это твои изменения
orignal я твои имею ввиду
onon А ты их проверил?
orignal еще нет
onon Ну так чего тогда спрашиваешь
orignal потому что я может проверю когда ты уйдешь уже
onon send only one packet at the start before session is created, stop sending datagrams if no ack, clear window and send new datagrams after path change
onon Вот по сути все изменения
onon Ну и DeleteExpiredUnackedDatagrams () я просто закомментил, а так выпилить бы его
orignal понял
onon Ещё у меня там очепятка в слове path
orignal где?
onon В комментарии
onon Я только заметил
orignal поправлю
orignal проверил закоммитил
onon Я вот что подумал. Если щас сделано так что на старте он шлёт только один магический пакет, который без порта, то на второй стороне сессия создаётся неправильная а потом начинаем слать поток и всё ломается.
onon Может такое быть?
orignal именно так и будет
orignal надо не создавать сессию
orignal объясни смысл магического пакета?
onon Ну те что мы шлём для смены маршрута
onon КОторые пустые
onon Только с опциями
orignal так там же сессия уже есть
orignal откуда возьмется новая?
orignal я просто не понимаю о какой сессии ты говоришь
onon Ну смотри, на сокете появился пакет, мы его пытаемся отправить, запрашиваем лизсет и все дела. Но он с высокой вероятностью не достигнет адресата и потеряется так?
onon Так вот через таймаут следом за ним начинают слаться магические пустые пакеты
onon До тех пор пока не получим подтверждение
onon Вот если сессия создаётся на основе именно такого пакета пустого
onon Может ли это приводить к проблемам
orignal не может
onon Понял, значит шифрование как-то по другому ломается
orignal сессия между дестнейшинами
orignal другое дело что для датаграм там псих чего то наворотил в коде ObtainSession
onon Ну ты же говоришь что если порта нету в пакете он новую сессию зоздаёт
orignal вот это и надо понять
orignal что там происходит
orignal между дестинейшинами
onon Значит тебе задание на ближайшую перстпективу
orignal какое?
onon Выяснить что там происходит
onon между дестинейшинами
orignal посмотрю