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
Есть какие-то идентификаторы сесии
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
да
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
м
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
посмотрю