~AreEnn
~R4SAS
~acetone
~orignal
~villain
&N00B
+Xeha
+relaybot
DUHOVKIN
Guest8639
HackerMan
Most2
Nausicaa
Ruskoye_911
Vort
`
ananas
anon3
dressedie
nemiga
not_bob_afk
plap
poriori_
profetikla
segfault
soos
teeth
un
weko_
whothefuckami
orignal
идея появилась
orignal
а что если нам часть сообщений на ретрансмиссию отслыать вместе с потоком новых сообщений
orignal
отправляем сообщеие или несколько смотрим
orignal
нету ли чего по времени на ретрансмиссию если есть то отсылаем
orignal
чтобы не выбрасывать пачками
orignal
речь об SSU2 если что
orignal
окзывается уже делаю только не так
orignal
if (m_SendQueue.size () > 0) // windows is full
orignal
Resend (i2p::util::GetMillisecondsSinceEpoch ());
orignal
выкидываем кучу а потом еще кучу
orignal
что неправильно
Vort
"<~orignal> чтобы не выбрасывать пачками" видимые всплески от ретрансмиссий были убраны корректировкой частоты срабатывания таймера
Vort
а чтобы оценить эффект от невидимых всплесков - это надо очень постараться
orignal
проблема тут в том что они часто все враз выюрасываются
orignal
по таймеру
orignal
таймер же там для всех общий
Vort
сразу, да, но раз в 40-50мс
Vort
поэтому шип получается небольшой
orignal
это я знаю
orignal
и с лимитом 128 за раз типа того
Vort
у меня когда я тестировал до лимита не доходило даже
orignal
я же предлагаю проверять нету ли чего при каждом сообщении с интревалом 1 мс
orignal
так а если тысчяи соединений?
Vort
если прилепливать к отправкам, то это же при каждой отправке будет по всему окну итерации гоняться?
Vort
не лучше ли таймер ещё чаще просто сделать?
orignal
мне не нравится этот момент
orignal
<orignal> if (m_SendQueue.size () > 0) // windows is full
orignal
<orignal> Resend (i2p::util::GetMillisecondsSinceEpoch ());
orignal
мы только что насрали так что окно забили да еше ретрасмисию делаем
Vort
мне вообще привязка к отправкам кажется сомнительной
orignal
я согласен что лучше к получению
orignal
в метод Flush
orignal
и проверять по времени когла последний раз делали
orignal
при получаении кроме того что то почитится
Vort
чем тебе не нравится делать перепосылки исключительно по таймеру (возможно, с бОльшей частотой)?
Vort
да, там будут блоки слаться, но при высокой частоте они будут маленькие
Vort
если мы предполагаем, что потери - это более-менее случайный процесс
orignal
не нравится что может накапливаться много
orignal
а если накопомится много мы выбросим пачку что не есть хорошо
Vort
в любом случае, вопрос в том, с какой частотой будет делаться проверка на истечение таймаута
Vort
и от этой частоты зависит средний размер пачки
Vort
"<~orignal> и проверять по времени когла последний раз делали" - эффект будет такой же, как и у таймера. разве что, может, меньше ресурсов сожрётся. но, может, и больше
orignal
разница будет
orignal
1. проверяться чаще
orignal
2. у разных сесиий в разное время
Vort
частота зависит от выбора константы
Vort
вот размазка по времени из-за разных сессий - это может быть полезно, да
Vort
orignal: то есть, думаешь выкинуть Resend ( из PostI2NPMessages и перенести в FlushData ? и в придачу, сделать что-то по аналогии с if (ts >= it.second->GetLastResendTime () + SSU2_RESEND_CHECK_TIMEOUT)
Vort
разве что таймаут для этого случая поменьше выбрать
Vort
SSU2_RESEND_CHECK_TIMEOUT1 и SSU2_RESEND_CHECK_TIMEOUT2 допустим
Vort
заметил кое что кстати
Vort
как я понял, m_LastResendTime = ts; ставится только если был хотя бы один пакет переотправлен
orignal
типа да
orignal
нет я думаю в Post тоже оставить только провреять время
orignal
не пытаться срать на каждом сообщении как мы счас делаем
Vort
в итоге, есть риск получить долбёжку
orignal
сделать время проверки не отправки
orignal
проверяем не чаше чем раз в миллисекунду
Vort
убрать LastResendTime вообще и сделать другую переменную?
Vort
или она зачем-то ещё будет нужна?
orignal
я не помню зачем у нас last resend time
Vort
SSU2Server::HandleResendTimer
Vort
глянь
Vort
не совсем понимаю, зачем там эта проверка, правда
orignal
вот я это и хочу переделать
orignal
чтобы переотправка по таймеру было крайним вариантом
orignal
когда активность низкая
Vort
в общем, после этого обсуждения я думаю, что всё же стоит попробовать такое изменение
Vort
но как тестировать - как всегда загадка
orignal
как onon делал
orignal
смотреть дропы на интерфейсе
Vort
"<~orignal> когда активность низкая" плохо помню - ack`и тоже дадут активность? если в одном только направлении сессия работает
Vort
просто подумал, не будут ли проблемы с привязкой к чтению, если только отправки будут
Vort
хотя.. ты же хочешь в двух местах оставить, тогда нормально
orignal
именно
Vort
в таком случае остаётся вопрос производительности - не будут ли проверки тыщу раз в секунду сильно грузить проц
orignal
ну активность низкая перепосылки делаем только по таймеру
Vort
это я понял
orignal
потому что например аки потерляись по дороге
Vort
если будет высокая активность - и постоянно данные туда-сюда гоняться
orignal
и выглядит так что данные не идут в обе стороны
orignal
а если высокая вот и будем тут же делать перепосылки как время для них
Vort
наверно только профилирование при высокой нагрузке покажет насколько такой метод ресурсоёмкий
Vort
так не перепосылки же время жрать будут, а проверки "не сработал ли таймаут для этого пакета? а для вот этого?" тыщу раз в сек
orignal
зачем? выкачу на флудфил и посмотрюб
orignal
сколько тредж жрет
Vort
но это решается просто подкруткой константы
Vort
то есть, если константа 1мс будет слишком грузить, можно будет 2мс, 5мс поставить
orignal
вот о том и речь
orignal
я вооьще собираюсть начатьс 10
Vort
окей
orignal
ты последний коммит не пробовал?
orignal
я там багу нашел
Vort
на что смотреть? на ошибки в логе?
orignal
на работу в целом
orignal
на ту проблему с внезапными тормозами
Vort
у меня только IRC активен и он как работал нормально, так и работает
orignal
да я не про ирк а про высокогруженные
orignal
я вчера ютуб на 480 гонял без лагов
Vort
это вопрос к тем юзерам, которые попадали на проблему. у меня нету опыта взаимодействия с проблемой так сказать, поэтому и различия увидеть не могу
Vort
но коммит поставил на свой узел
orignal
вот у меня радио на 320 кбс
orignal
я на нем обычно тестирую качество линка
Vort
через браузер проверяешь что ли? мой браузер как-то неадекватно отреагировал на ссылку: сразу проигрываение не включил, а как включил, то секунду поиграл и завис
Vort
AIMP же не поддерживает SOCKS прокси
orignal
через http прокси
Vort
VLC заработал с i2pd через SOCKS. через гугл найти это было почти нереально :(
Vort
не сразу радио заработало, но сейчас уже нормально идёт. интересно, сколько секунд буфер плеер выбрал
orignal
я с браузера пробовал
Vort
сразу возник вопрос - ни на что лучше, чем mp3, народ так и не перешёл? хотя сейчас, наверно, юзеры и вобще не знают, какими кодеками они пользуются
Vort
10+ лет назад хорошо радио с AAC+ работало. но это проприетарщина и за столько времени явно что-то получше было придумано
orignal
ну я не знаю это сделали много лет назад первое попавшееся для тестов
Vort
за 15 минут тестов раза 4 затыкалось проигрывание. странность заметил, кстати: у стрима показывается RTT 1631
Vort
так и стоит на этом значении
orignal
интерсно почему у меня не затыкается
Vort
туннели разные бывают, скорее всего
Vort
ещё и подход к буферизации у плеера влияет
orignal
у мпня на всех тоннелях получалось нормально
orignal
моджет у тебя опять сеть перегружена?
Vort
вообще, радио показывает две вещи - 1. может ли туннель вытянуть в среднем скорость 2. будет ли обрыв связи
Vort
когда кто-то тащит торрент - тогда перегружена, но на отдачу, а не на скачку
orignal
так на отдачу же ответы приходят
Vort
могли торренты "выдавить" какой-то из туннелей, да
Vort
но если буфер 30 сек, допустим, то радио много чего выдержать может )
orignal
вот тут x3
Vort
в каких-то плеерах, вроде, можно контроллировать буфер
orignal
я вижу буфер примерно 8 секунд
Vort
браузер показывает? как?
orignal
там пишет сколько какое время счас играется и общее время ролика
orignal
и они оба все время меняются
orignal
и разницу примерно в 8 секунд
Vort
браузер пишет?
orignal
да
orignal
проигрыватель внутри него
Vort
теперь у меня радио вообще заглохло, только изредка обрывки звуков пробиваются
Vort
а лог засран сообщениями error - Streaming: Number of NACKs exceeds 256. seqn=45577 nextSeqn=45573
orignal
вот с этим надо разб ираться
orignal
где потери
Vort
короч этот стрим уже не восстановится, похоже
Vort
мне кажется, что потери были просто триггером
Vort
который привёл к какому-то глюку в стримах
orignal
ну вот надо понять причины
orignal
это дропы в тоннеле или ошибки расшифровки
Vort
[07/Aug/2024:17:16:44 +0300]@4/error - Streaming: Number of NACKs exceeds 256. seqn=46029 nextSeqn=46021
Vort
[07/Aug/2024:17:19:45 +0300]@4/error - Streaming: Number of NACKs exceeds 256. seqn=46029 nextSeqn=46021
Vort
3 минуты прошло, а пишет одно и то же
orignal
вот надо разбираться почему так
Vort
только я собрался вырубать, как радио заработало нормально
Vort
глюки минут 10 длились
Vort
похоже на длительность жизни туннеля
orignal
ну так надо смотреть почему в стриме так
Vort
так если туннель не в состоянии передавать данные нормально, то что делать?
orignal
стрим закрывать
orignal
если такая хрень случилась
orignal
либо переключать тоннели
Vort
как я понимаю, сейчас переключение случается, если пакеты не идут вообще
Vort
в случае с радио они шли, но с ужасной скоростью
Vort
ну это мне так по внешним проявлениям кажется, может туннель и не виноват был, а это чисто глюк стримов
orignal
вопрос почему на эту ошибку не среагировали должным образом
Vort
хех. из-за 10 минут лагов, буфер на эти 10 минут и разжирел, похоже :)) сейчас данные через стрим вообще не идут, много туннелей сфейлилось, но музыка играет
Vort
кончился буфер...
Vort
короч багов дофига ещё
Vort
небось, "та" сторона закрыла стрим. хотя это опять мои догадки
Vort
можешь глянуть - жив ли стрим ещё с твоей стороны?
Vort
Sent 496466 Received 100424216
orignal
счас
orignal
нет нету там стрима
orignal
вот видишь как полезно смотреть
orignal
новые баги сразу видны
Vort
у меня стрим висит до сих пор. наверно onon таки воткнул в код конское количество перепосылок
orignal
вот это надо срочно чинить
orignal
такой хуйни быть не должно
Vort
когда я настраивал, то целился где-то на 1-2 минуты попыток в худшем случае
Vort
а в прошлых версиях его кода было ожидание около получаса по-моему
orignal
так смотри если эта ошибка случилась сразу закрывать на хуй надо
`
Есть здесь "убунтофилы"? Как долго мэйнтэйнер будет обновлять пакет?
orignal
какой?
`
i2pd
`
2.52.0 до сих пор
Most2
13.<douknowwatusee> > *`:* Есть здесь "убунтофилы"? Как долго мэйнтэйнер будет обновлять пакет?
Most2
13.<douknowwatusee> В дебиане до сих пор 2.43 лежит))
Vort
стрим до сих пор висит :) и постоянно что-то отправляет. это уже даже для повышенного количества перепосылок как-то дохрена
Vort
попробую warn уровень логов включить, может понятнее станет
orignal
это явная лажа
Vort
Streaming: LeaseSet was not confirmed in 4000 milliseconds. Trying to resubmit
Vort
вот что он шлёт оказывается
Vort
resend`ы уже делать и не пытается
Vort
кстати, кое что ещё в логе увидел
orignal
что?
Vort
"I2PTunnel: Stream read error: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного ко
Vort
мпьютера"
Vort
но я не знаю, есть ли связь этого сообщения с зависанием стрима
orignal
это таймаут
Vort
откуда? сокс коннект живой. вижу эти сообщения с интервалом в час. адресная книга может таймауты выдаёт?
Vort
IRC тоже не отваливался
Vort
ну короч с зависанием стрима, скорее всего, связи нету. хотя фиг знает
Vort
проверю сейчас, не переглючило ли вообще прокси целиком - попробую открыть reg.i2p
Vort
reg открылся. значит проблема локальна для конкретного стрима
Vort
кстати, бесконечные попытки отправки лизсетов мы когда-то обсуждали
Vort
конечно, можно туда какую-то защиту воткнуть, но всё равно надо понять, почему не сработали другие механизмы завершения стрима
orignal
начинать надо с рекацию на ошибку с nack-ами
Vort
так после неё же стрим восстановился, значит ошибка не критичная
Vort
правда потом всё же завис
orignal
причем очевидно что на той стороне он закрылся
orignal
то есть туда FIN дошел
Vort
закрылся он явно после этих ошибок
Vort
потому что понемногу пакеты всё же просачивались и номера пакетов в ошибках двигались
orignal
реально ситуация когда помежуточный узел не держит поток
Vort
понятно, что что-то пошло не так, но не непосредственно во время этих сообщений, а позже
Vort
точнее, "не держит поток" это проблема, но не критичная. а вот последующее зависание - уже похуже
Vort
короч, мне кажется что эти ошибки с NACK`ами - это предусмотренный режим работы нынешнего алгоритма стримов
Vort
если что-то не тянет, то должна сбавляться скорость, как я понимаю
orignal
вот x3
Vort
для юзера радио - это, может, глупо. но в целом - нормально
orignal
говорю же в стримах море ошибок
Vort
стоит разделять "стрим не смог правильно сделать то, что пытался" и "стрим не должен был делать то, что делал"
Vort
первую категорию проблем я кое-как ловить умею
Vort
а вот со второй - сложнее, так как ответ на вопрос "а как же надо было делать?" часто очень непрост
orignal
ладно посмотрю попозже
orignal
счас занят
orignal
смотри тут в чем дело
orignal
LogPrint (eLogError, "Streaming: Number of NACKs exceeds 256. seqn=", seqn, " nextSeqn=", nextSeqn);
orignal
choking = true;
orignal
htobuf16 (packet + size, choking ? PACKET_FLAG_DELAY_REQUESTED : 0);
orignal
это команда притозмозить
orignal
я когда то ее делал
orignal
надо смотреть как она реализована
orignal
а дальше начинается код
orignal
if (flags & PACKET_FLAG_DELAY_REQUESTED)
orignal
и мы там сбрасываем окно
Titlacahuan
ещё что крутое можно сделать upower.freedesktop.org
Titlacahuan
'LidIsClosed' read 'b'
Titlacahuan
'LidIsPresent' read 'b'
Titlacahuan
узнать если лаптоп закрыт
Vort
orignal: я немного протупил с анализом проблемы стрима к радио. конечно, у меня не будет перепосылок - посылать то нечего. это радио только посылает
Vort
и если пакет с закрытием стрима от радио просрался - вот и висит себе стрим
Titlacahuan
и вот на вин stackoverflow.com/questions/4486674/capturing-laptop-lid-closing-event-in-windows
orignal
так ясен пень что он просрался
orignal
так а если ты закроешь проигратаель что будет?
Vort
я закрыл VLC, через некоторое время (минуту?) стрим закрылся
Vort
так что с этим проблемы нету (ну почти)
orignal
а ну тогда нормально
orignal
в теории стримы могут висеть годами ничего вообще не посялая
orignal
у них нет требования
orignal
но вот если лизсет не подтверждается то надо закрывать
Vort
это получается единственный вариант?
Vort
как-то через жопу. но ладно. тут много чего через жопу
orignal
ну а как иначе?
orignal
с TCP не видел такого никогда что ли?
orignal
выдергиваешь кабель наружу из роутера а сокет у тебя висит открытй
orignal
пока сам сокет не закроешь так и будет стоять хотя соединения давно нет
Vort
я плохо понимаю эту часть, но нельзя ли вместо _не подтверждения_ лизсета какую-то ошибку присылать?
orignal
кто ее пришлет?
orignal
потому в прикладных протоколах и сделаны хартбиты
Vort
я когда-то видел зависшие TCP коннекты, верно, но чтобы вот так скачка файла, допустим, зависла - ни разу. но наверно просто в качалках таймауты
Vort
HTTP тупой, нет там хартбитов и всё же работает довольно нормально
orignal
там есть таймауты насклоолько я знаю
orignal
точнее в брауезрах
orignal
потому что в времена диалапа они часто выпадали
orignal
ну так ты попробуй у себя
orignal
возьми начни скачивать а потом из роутера выдерни кабель который идет к провайдеру
Vort
в общем, понятно, с обычным TCP в такое реже попадаем из-за меньшего количества потерь и из-за таймаутов в софте
orignal
нет из-за того что почти у всез приложений или хартбиты или тайауты
orignal
вот FIX например он стоит по многу часов без разрыва соединения
orignal
и там по харбитам отвалы случаются
orignal
так что тут с лизсетами самое то
orignal
а еще я собираюсь на уровне чесночных сессий слать харбьиты
orignal
а стримы должны проверять нету ли зависшегоэ
orignal
если есть то или пыптаться переключаться или закрывать
Vort
может так и пинги при односторонней передаче можно получить?
Vort
а то с этим явно проблемы в стримах
Vort
с HTTP только при запросе можно RTT посчитать
Vort
но потом же кучу раз туннели меняются, а RTT так и стоит старый
Vort
а если он ещё и определился криво, так ещё хуже получается
orignal
как раз у стримов есть пинги
orignal
но та сторона отвечать на них не обязана
orignal
я могу RTT на уровне сессии считать
Vort
и потом подмешивать эти данные к RTT, определённым традиционным методом?
orignal
не знаю
orignal
просто говорю что могу сделать чтобы с сессии брать
Vort
ну я имею в виду - как замену или как дополнение?
Vort
опять же - в этой части кода я плохо разбираюсь
orignal
как дополнения для расчета RTO
orignal
второй источник типа
Vort
окей
orignal
когда поток малый что выборка для RTT низкая
Vort
мне кажется, что стоит для начала попробовать реализовать идею с привязкой перепосылок к чтению и отправке в SSU2
Vort
так как со стримами это можно вляпаться надолго
orignal
само собой
orignal
ну идея с харбитами у меня уже давно
orignal
как я занимаюсь I2CP в последнее время
orignal
потому что в отличие от стримов там нет возможность определить что потом не идет
orignal
только на уровне сесии
Vort
пока копался в логах, заметил ещё одну проблему: волны сообщений вида "SSU2: Send exception: Требуемый адрес для своего контекста неверен to 0.0.0.0:27028". помню, подобную фигню мы уже чинили, но, видимо, не дочинили
Vort
или это что-то похожее просто
Vort
из-за волнообразного характера ловить отладчиком будет сложно, но, может, я и попробую
orignal
давно пытаюсь поймать
orignal
ты скажи лучше были ли ошибки расшифровки
Vort
какой уровень? error ?
Vort
"Garlic: Can't handle ECIES-X25519-AEAD-Ratchet message" сыпятся, я об этом говорил
Vort
а про другие не знаю
orignal
про них
orignal
интересно почему они у меня не сыплются?
Vort
связь надёжнее, может
orignal
так понять бы еще что это такое
orignal
дубликаты или реальные данные
Vort
мы же когда-то разбирались с дублями и ничего с тех пор не менялось в этом отношении
Vort
вот и ошибки остались на месте
orignal
так я счас нашел неправленую отправку тагов
orignal
начать надо с вопроса откуда они вообще бурется
Vort
так эти дубли то _приходят_
orignal
так как они возникают?
Vort
уже не помню подробностей
Vort
любой пакет же может продублироваться?
Vort
может, перепосылки влияют. сейчас не соображу
orignal
короче проблемы в SSU2 изначально
orignal
получается
Vort
думаю, что да, но доказательств нету
Vort
у меня же эти ошибки тоже волнами идут
Vort
вполне может быть, что волну пускают качальщики торрентов
Vort
можешь попробовать себе сеть как-то подгрузить - может и у тебя сыпаться начнут
orignal
у меня не прогрузишь 1.5 гигабита
Vort
тогда есть ещё вариант виртуалки с wanem/netem и потерями. но это морочливо настривать правда
orignal
я вот думаю может фильтр блума воткнуть?
Vort
этого не знаю, не разбирался ещё с ним
orignal
ну записывать те таги которые уже обработаны
orignal
и дропать дубликаты сразу
orignal
std::set<uint32_t> m_OutOfSequencePackets;
Vort
вроде что-то похожее и было
orignal
у меня в SSU2 такая хуйня есть
orignal
нет в чесноках точно этого нет
Vort
но ещё же и коллизии бывают - можно дропнуть правильный пакет
Vort
хотя... я наверно фигню говорю
orignal
это при реальном блум фильре
orignal
в std::set
Vort
я просто припоминаю ситуацию, когда происходили коллизии id-шек у сообщений
Vort
и вот тогда детекты дубликатов создавали проблемы
Vort
может, данного случая это и не касается
Vort
id ведь рандомно генерятся? поэтому может прийти два разных пакета с одним и тем же id
Vort
детектор дубликатов же один из них грохнет
orignal
так таги генерятся я не помню
orignal
счас скажу
Vort
и сразу глянь сколько бит у id
Vort
если 32 и рандом - то будут проблемы. если 64, то и рандом не страшен
orignal
i2p::crypto::HKDF (m_SessionTagKeyData, m_SessTagConstant, 32, "SessionTagKeyGen", m_SessionTagKeyData); // [sessTag_ck, tag] = HKDF(sessTag_chainkey, SESSTAG_CONSTANT, "SessionTagKeyGen", 64)
orignal
ну случайно
orignal
там HKDF
Vort
uint64_t RatchetTagSet::GetNextSessionTag ()
Vort
но 64 бита. так что коллизии не страшны
orignal
угу
orignal
так и есть