Отправка сообщений UDP в Linux: какова причина потери пакетов?

Отправка сообщений UDP в Linux: какова причина потери пакетов?

25 февраля 2022 г.

Классификация потерь UDP


При разработке распределенной программной системы целесообразно использовать обмен данными по протоколу UDP, чтобы минимизировать время обмена. UDP — довольно простой способ действовать быстро. Но эта простота сопровождается отсутствием гарантии доставки данных.


Существует несколько спорадических факторов потери пакетов потока данных:


  • ошибки сетевого носителя

  • аппаратные перегрузки, связанные с сетью

  • аппаратные перегрузки, связанные с исходным хостом

Убытки, связанные со СМИ


Ошибки сетевых носителей возникают из-за неспособности носителя доставлять пакеты потока данных в определенных спорадических обстоятельствах. Например: в магнитную бурю на северном полюсе вай-фай может быть бесполезен на несколько часов.


нестабильные потери UDP, связанные с носителями


Перегрузка сетевого оборудования


При аппаратных перегрузках, связанных с сетью, пакеты могут теряться в случае приоритетов обработки потоков данных. Сетевое программное обеспечение обрабатывает пакеты по «алгоритму приоритетных очередей». Это означает, что наиболее ценные пакеты дочерних очередей будут обрабатываться в первую очередь. Если очередь UDP не имеет первого приоритета, то пакеты не отправляются при перегрузке. Новые входящие UDP-пакеты одновременно увеличивают очередь. Очередь UDP превысит лимит после некоторой длительности процесса перегрузки.


Потери UDP, связанные с приоритетной очередью


При поступлении новых пакетов UDP в буфер дочерней очереди с превышением лимита некоторые старые пакеты необходимо отбрасывать без отправки для замены новых пакетов.


Потери, связанные с хостом источника UDP


При перегрузке аппаратного обеспечения узла-источника также возможно обнаружить потерю пакетов UDP. Смысл потери этих пакетов равен потере на промежуточном сетевом оборудовании. Но один случай использования потерянных UDP-пакетов хоста-источника является специфическим. Переполнение буфера очереди UDP произойдет, если мы будем помещать пакеты со скоростью, превышающей скорость получения пакетов из очереди. На линуксе можно воспроизвести просто действиями на одном хосте.


Случай переполнения буфера UDP в Linux — несколько процессов


Обработка протокола UDP Linux реализована поверх действия с одним буфером, который содержит очередь всех пакетов от всех процессов. По некоторым системно-зависимым факторам (количество процессов клиентов UDP, размер входящего пакета, скорость входящих пакетов) этот буфер может быть превышен. Для изменения размера буфера UDP в Linux можно использовать командную строку:


sysctl -w net.core.rmem_max=<ваше значение>


Это случай, который широко не обсуждается, но может многое запутать. Чтобы свести к минимуму вред, хорошо помнить, что если хорошо упакованные данные будут лучше передаваться по UDP. Хорошо, если поток UDP будет разбит на куски, близкие к MTU. Упаковка для пакетов меньшего размера по одному также предпочтительна. Тогда он максимально закроет записи буфера Linux.


Предложение снизить скорость потери пакетов на источнике UDP


Еще один фактор, над которым стоит поработать, — сжатие данных. Логический способ сжатия может снизить скорость передачи пакетов на стороне клиентов UDP. Вот почему важно иметь сжатие в качестве опции для любого приложения, связанного с UDP, в Linux.


Заключение


Как мы видим, есть простые вещи, которые могут улучшить ваш пользовательский интерфейс UDP. Пожалуйста, поделитесь своими комментариями и предложениями!



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE