Каков временной интервал между фрагментами udp-пакета?
Всем привет. Пытаюсь разобраться с логикой передачи данных по udp. Все твердят что если нужно передавать малые, в приделе (mtu минус заголовок пакета), данные то он подойдет идеально по скорости и по плотности трафика, но а как же поступит ос если он придет не полностью: отбросит пакет?, поставит "таймер" и будет ждать остаток пакета? Дак вот, как, если второе утверждение верно можно в настройках ос`и выставить значение "таймера"? Ведь получается что если время таймера велико относительно количества пакетов в очереди то это уже получится хорошая dos-атака? В настройках ос`и нашел только вот такие пунктики: net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
Это я так понимаю, входной-выходной буферы, а как же время? Помогиде разобраться!
но а как же поступит ос если он придет не полностью: отбросит пакет?
Несмотря на то, что теоретически пакет может быть фрагментирован где-либо по пути, если он не помещается в MTU (и тогда приложение получит пакет либо целиком, либо никак, даже если до хоста дошел только один IP-фрагмент), практически в реальном интернете, скорее всего, никак она его не получит, если пакет не пролез в MTU где-либо на пути.
https://gilbertasm.github.io/2018/09/13/tunning-ud... — про UDP-буферы
Ниже по стеку идёт алгоритм управления очередью, еще ниже — буфер сетевой карты (txqueuelen).
Интервал между отправкой может быть любой, ОС не даст вам выйти за собственные буферы (блокирующий сокет заблокируется на отправке, неблокирующий вернёт EAGAIN).
То, что вы спрашиваете, называется pacing — оптимальный интервал между отправками двух пакетов. На современных ядрах Linux (вернее, при использовании современных протоколов управления очередью fq/fq_codel) pacing есть по умолчанию. Управлять им можно с помощью SO_MAX_PACING_RATE setsockopt.
Ну и конечно, для протокола поверх UDP вам необходимо реализовать собственный алгоритм управления потоком (Congestion Control Algorithm), чтобы учитывать скорость передачи от вас и приёма ваших пакетов другой стороной.
Спасибо за ответ, но мне нужно разобраться именно с временым интервалом между получениями фрагментов, кстати, пакет влезает в минимальный мту с запасом!
Только представь, теоретически, что можно изобрести прилажуху которая шлет фрагменты по 1-2 байта с временым-большым интевалом по удп, но по времени меньшим чем(где то в протоколе удп или в ядре оси указано) с целью загрузки буфера очереди?
Данил Тунев, не понимаю ваш вопрос. Клиентская программа получит пакет, как только он дойдёт до клиента и обработается ядром. Pacing актуален только на отправляющей стороне.