IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2025/05/23
~AreEnn
~AreEnn_
~R4SAS
~acetone
~orignal
~villain
@onon
&N00B
+Xeha
GFW
GTA
Komap
Most2
Nikat
Opax
Vort
`
anon
anontor
b3t4f4c3
duck
fidoid
grimreaper
iiii
karamba_i2p
not_bob
osoznayka
poriori
profetikla
qend
r3med1tz
rc13
slfd
soos
teeth
un
weko_
whothefuckami
orignal короче давайте кратко чего тут без меня по поводу SSU2 надумали,
orignal вмержил изменения сэма
Vort только половину надумали - надо давать транзитным пакетам больше времени сидения в очереди (скорее всего без привязки к RTT, скорее всего около 4 секунд)
Vort про вторую половину - сколько разрешать своим пакетам сидеть в очереди пока никто ничего не придумал. может, onon вернётся и что-то сообразит
Vort посмотрел сейчас в код и понял, что я не совсем правильно описал механизм дропа своих пакетов
Vort так как цель - побыстрее донести информацию (сигнал) о перегрузке (переполнении), алгоритм использует смешанный подход:
Vort для транзитных пакетов сделан head drop, для своих - tail drop (так как о "потере" своего пакета есть возможность узнать сразу же)
Vort то есть, общая масса пакетов накапливает очередь, если очередь оказывается наполненной больше, чем наполовину, то сразу идёт дроп своих свежих пакетов (с уведомлением)
Vort с одной стороны, сделано как-то через задницу, но, с другой стороны, свои цели алгоритм, в основном, выполняет и как переделать, чтобы было лучше - непонятно
NS Вопрос: какие параметры конфиг файла нужно прописать для узлов на статических ip c большой пропускной способностью, чтоб выжимать максимум пользы для сети? Порты какие нужно открывать?
Vort NS: прописать bandwidth = в соответствии с возможностями и поставить [limits] transittunnels = побольше
Vort порт открыть достаточно один, который в конфиге, но открыть его надо и по TCP и по UDP
NS bandwidth = Х пойдет? Или лучше какое то конкретное значение?
NS Цитата: порт открыть достаточно один, который в конфиге, но открыть его надо и по TCP и по UDP - это какой именно? Там портов куча в конфиге.
Vort правильное конкретное значение для bandwidth подобрать не так просто, поэтому скорее всего достаточно X
Vort пока нет атак, это не важно
Vort если начнутся перегрузки - тогда надо будет думать
Vort NS: ещё стоит подумать над настройкой floodfill =
Vort с одной стороны, поставить туда true - самое подходящее для мощных узлов
Vort с другой стороны, правильная работа этих узлов для сети довольно важна и поэтому слишком большое их количество может быть воспринято как атака
Vort NS: ещё один немного рискованный метод - это поднятие нескольких узлов на одном компьютере/IP адресе. для обычных узлов и для узлов флудфилов разрешенное количество различается
Vort лучше больше одного флудфила на IP адрес не ставить
NS По порту понял, по умолчанию 4567, но лучше чтоб польователь вручную сам что то придумал от 1024 до 65535. Можно ли этот конфиг с bandwidth = Х рекомендовать тем, кто за NAT сидит?
Vort 4567 - это не по умолчанию. по умолчанию рандомное значение, которое прописывается в router info если я правильно помню
Vort но рандомное значение в фаерволле не настроишь, поэтому сделана возможность в конфиге его закрепить
NS 4567 - это не по умолчанию. Понял. Хорошо. Есть какие либо еще рекомендации?
Vort если у этих пользователей за NAT достаточная пропускная способность (> 2 мегабайт/сек), то стоит ставить X, да
Vort но использоваться полноценно полоса скорее всего не будет
NS но использоваться полноценно полоса скорее всего не будет - да, не на всех роутерах стоят такие лимиты, что делает сеть медленее как я понимаю.
Vort там сложная ситуация. условно говоря, причина недогруженности узлов за NAT - в багах и недоработках, как конкретно i2pd, так и протоколов i2p в целом
Vort ну и говоря про NAT я имею в виду ситуацию, когда невозможно полноценно принимать входящие подключения. если порт проброшен, то такой узел будет работать так же хорошо, как и без NAT
Vort NS: ещё стоит проверить состояние IPv6 сети. параметр ipv6 = должен соответствовать возможностям
Vort если у пользователя нормальный, прямой доступ через IPv6, то стоит ставить ipv6 = true
Vort если нету, то важно, чтобы стояло ipv6 = false. i2pd сам не сообразит
Vort NS: также стоит убедиться, что флаги у узла правильно проставились. для белого IP должно получиться Router Caps: XfR для флудфила и XR для не-флудфила
Vort если вместо R стоит U или если есть буквы D или E - значит, есть проблемы и надо разбираться
Vort правда, алгоритм определения R / U в i2pd часто глючит, в таком случае стоит нажать ссылку Router commands / Run peer test несколько раз
Vort если после нескольких пир тестов U флаг не уходит - значит, с доступностью порта проблемы
Vort если D или E - значит, узел перегружен. или по количеству транзитов или по трафику
Vort есть ещё флаг G, но он появляться при нормальной работе не должен
NS Ок. Чуть позже в личку скину, что у меня получилось. Спасибо!
orignal я думаю надо делать SSU2 логически близким к NTCP2
orignal в плане дропов пакетов
Vort orignal: почему не "наоборот" - дропы NTCP2 делать близкими к SSU2?
Vort то, что атакующие не заDoSили NTCP2, - это лишь показатель их лени
Vort тестовый бинарник с новыми стримами крешнулся
Vort креш был из-за повреждения кучи, а так как бинарник я собирал без отладочной информации, то подробнее сказать что-либо сложно
Vort может стримы виноваты, может ещё что-то
orignal а как их можно заддосить?
Vort кого их? NTCP2 транспорты? наполняя очередь
Vort то есть, отправляя быстрее, чем принимающая сторона может или хочет прочитать
Vort чтобы так переполнить очередь быстрых узлов - не хватит трафика, а вот медленные - скорее всего реально
orignal ну так и счас наполянют
Vort при нормальной работе это происходит случайно
Vort если несколько очередей наполнится - то не страшно
Vort атакующий же может постараться наполнить как можно большее количество
Vort потратив как можно меньше трафика
orignal а как их можно забить кроме как через тоннели?
Vort не совсем понимаю - какая разница через что забивать. важно то, есть такая возможность у атакующего или нету
Vort как я понимаю, любое сообщение узлу окажется в этой очереди. мне кажется, что этого достаточно
Vort если контроллировать сколько сообщений принялось, то можно постараться не превшать лимит в 500 сообщений, чтобы Terminate() не словить
orignal ну там же размер очереди проверяется
Vort поэтому атакующему надо её не переполнять, а держать наполненной близко к лимиту
Vort тыщу медленных узлов так перегрузить - уже полгига RAM съестся
orignal можно еще по времени отравки смотреть
orignal если долго отправляет то закрывать
Vort ну вот потому я и делал оценку переполнения по времени "сидения" в очереди
orignal а я хочу просто
orignal отправляем буфуер меряем время за которое он отправился
orignal делим на число байт и смотрим превышеат ли пороговое значение
orignal в соотвемтвии с заяленной скоростью
Vort это ты имеешь в виду измерения на TCP уровне?
Vort мы ж пока что обсуждали очереди из сообщений
Vort или имеешь в виду измерять время отправки сообщения из очереди?
orignal вызываем async_write
orignal потом когда приходит коллбэк смотрим сколько времени заняло
orignal посчитали скорость
orignal если она ниже заявленной узлом закрываем сессиию и все дропаем
Vort узел заявляет общую скорость, а так измерится скорость лишь одного из транспортов
orignal угу но все равно верхний предел будет верный
Vort можешь числа для примера показать? не могу пока понять идею
orignal надо подумать
Vort допустим, со стандартным bandwidth = L
orignal отправили буфер в 64K коллюбэк за 1 сек
orignal итого у нас скорость 64K в секунда
orignal если L то продолжаем
orignal если O то дропаем
orignal примерно так
Vort у O узла в тот момент могло быть 4 таких отправки в 64к за 1 сек, наша - одна из них
Vort да и наш узел тупить может по множеству причин
un orignal, здарова. нелели 2-3 как полеты стабильные, может ли быть связано с тем что жависты флудфил_ssu баг починили ?
orignal а что за баг был?
orignal Vort потому и надо подумать
un то что без ssu1 жава не становилась флудфилом
orignal надо считать как то более сложно
orignal вряд ли число флудфилов влияет на стабильность
segfault orignal: пиковая скорость может быть больше заявленной? например, 1 секунду передаём с максимальной скоростью, потом 10 секунд ничего не передаём. в среднем: L. такое будет недопустимо?
segfault orignal: такой вариант могу предложить: массив из 60 беззнаковых целых чисел. time() % 60-ый элемент хранит количество переданных байт в i-секунду. то есть циклически замкнутый. отдельной переменной переменной поддерживается сумма байт во всём массиве. за o(1)
segfault считаем среднюю скорость за минуту. если в какую-либо секунду средняя скорость за минуту превышает верхний порог: закрываем сокет
segfault orignal: можно не минуту сделать, а например 20 секунд
orignal отстань
orignal разговор не с тобой был
orignal onon дай снова ссылки на изменения
onon Ща поищу
onon privatebin.i2p/?0d3646084e5409fe#F18uirJZ7R2bEnh9d5EPKD5K2QbZuCz9TESmL64xKsYL
onon privatebin.i2p/?2a2cc457c97bc7e8#78ctT4skj7Lf6Ykgmua4ArvRx51Wx1fHs7fQiE3NCqk3
onon Я там наверняка сделал неэффективный код
onon Можно переписать/оптимизировать
orignal попробуй сегодня
orignal попробую
onon Я ж не програмист
orignal а что делает то?
onon Ну там немного другой алгоритм
orignal и что это дает?
onon Он на стоячей волне работает
onon Пытается выжать максимум из узкого места
onon За счёт того что создаёт там намеренно очередь
onon Небольшую
orignal ну так а что будет? быстрее рабоать? стабильнее?
onon Плюс срабатывание защиты загрубил
onon Поэтому на мелкие всплески RTT не реагирует
onon Поэтому продолжает слать с прежней скоростью
orignal вот так понятнее
onon А по поводу RTT и буферов щас распишу
onon Я так понял, Vort пытался сделать codel
orignal это что?
onon Это такой AQM
onon Типа "прогрессивный" RED
onon Если у нас в "узком месте" 100КБ/с, то теоретически, отправитель, разогнавшись до 200КБ/с, должен обнаружить рост RTT и сбросить окно.
orignal поглядим
onon Ты пока на стримы погляди, спрашивай, что непонятно пока я тут
onon А то могу скоро исчезнуть
onon В общем, если в узком месте пинг до следующего узла 100мс, то в таком случае задержка вырастет до 200
onon Но если мы возьмём общую задержку на маршруте в 1000мс
onon То общая задержка вырастет до 1100мс
onon Что вообще на уровне нормального "дрожания" RTT
onon Т.е. отправитель даже не заметит такой рост RTT
onon А чтобы он его заметил, необходимо значительное отклонение от минимального RTT
onon Это что касается Delay-based СС
onon Теперь по поводу Loss-based СС.
orignal мне счас некогда
orignal попозэе
onon Так как у нас в сети очень большие задержки, то дроп пакета промежуточным маршрутизатором создаёт большие проблемы для нас, так как получается HOLB
onon И все пакеты, отправленные после потерянного пакета будут копиться на получателе и ждать пока отправитель переотправит этот потерянный пакет
onon А это примерно 1,5 RTT
onon Поэтому мне сильно не нравится идея использовать loss-based алгоритмы
onon А с delay сами видите, какая история получается
orignal вот поглядим
onon Оптимальным мне пока видится обычный RED/WRED.
orignal Vort говорил у него с новым кодом грохнудось
onon Так как отправитель увеличивает размер окна в два раза за 1 RTT, а максимальный размер окна у нас сейчас 512, то за 1 RTT у нас может получиться 256 "лишних" пакетов.
onon Т.е. теоретически, если настроить RED на срабатывание при превышении очереди в 256 пакетов, то этого должно хватать для одного потока для полной утилизации ширины канала.
onon Примерно так сейчас у нас сделано в NTCP2
onon Только там не RED а скорее tail drop
onon После 250 пакетов
onon В будущем, конечно, хотелось бы увеличить максимальный размер окна для большей скорости
onon Тогда нужно будет и RED перенастраивать
onon Ну и тагов побольше сделать
onon И вообще сделать как-то согласование количества тагов на уровне сессии
onon И лимитировать количество одновременно отправленных пакетов разными стримами
onon Но у RED тоже есть очевидный недостаток - транспортов у нас могут быть тысячи
onon И каждый будет хранить по 256+ пакетов...
onon Может гибрид какой сделать...
onon Чтобы пакеты удалялись, если больше максимально допустимого периода времени лежат.
onon Например равному максимально допустимому RTT
orignal ну короче будет работать быстрее?
onon Ну не всегда...
onon Но в основном да
onon В некоторых случаях может работать хуже чем нынешний
onon Но довольно редко
onon Самое главное, что он меньше шумит
onon Работает плавно по возможности
onon Но медленно разгоняется
onon Если транспорты переделать и подождать пока все обновятся, потом можно будет этот лимит выключить
onon И будет разгоняться быстро
orignal потестирую
onon Ты только сам код посмотри, а то может я там такого понаписал
onon Чего писать ненадо
orignal посотмрю
onon Оно там примерно вот так работает: