Потеря пакетов UDP

ethernet performance

У меня есть приложение на ПК, которое отправляет 10 пакетов UDP на плату Arduino Portenta. При отправке пакетов без задержки половина из них теряется. Wireshark показывает, что пакеты правильно отправляются ПК. Если я буду ждать 1 мс между каждым сообщением на ПК, Arduino получит все.

Я пытался отключить обработку при получении сообщения, но это не помогает.

Я знаю, что UDP не является надежным протоколом. Тем не менее, потеря половины пакетов при прямом подключении ПК к Arduino вызывает удивление. Я пытаюсь отправить только 10 пакетов!

Есть ли возможность увеличить буфер приема? Я бы попробовал увеличить SO_RCVBUF.

Есть другие идеи?

Спасибо

, 👍-1

Обсуждение

Очевидная "другая идея": TCP - ничего не теряется, и если в сети нет пропускной способности, вы не можете залить ее, как с UDP. Еще один: большие пакеты, реже. Но ничего полезного, @KIIV

Вариант использования не подходит для TCP., @Simon


1 ответ


2

UDP не гарантирует доставку.

https://en.wikipedia.org/wiki/User_Datagram_Protocol

У него нет диалогов подтверждения связи, и, таким образом, программа пользователя подвергается любой ненадежности базовой сети; нет гарантии доставки, заказа или защиты от дублирования.

Вы выбрали протокол, доставка которого по своей природе не гарантируется, поэтому вам необходимо обойти его следующим образом:

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

ПК напрямую подключен к Arduino, и я отправляю только 10 пакетов. Означает ли это, что Arduino буферизует только 5 пакетов?, @Simon

@Simon Это может указывать на то, что скорость, с которой Arduino может удалять пакеты из буфера, такова, что он может не отставать только от более медленной скорости. Возможно буферизуется только один пакет, но к тому времени, как вы его обработали, вы потеряли следующий, а вот третий можно принять нормально. И так далее., @Nick Gammon