дубликаты пакетов udp: как часто это происходит? - PullRequest
4 голосов
/ 08 февраля 2012

Я разрабатываю протокол по UDP для использования в локальной сети, между источником и приемником будет только коммутатор (cisco, 3com и т. Д.), Обе системы Linux, один и тот же MTU. Как часто следует ожидать дублирования пакетов udp (очевидно, не мной, а коммутатором или, возможно, сервером) в месте назначения в этом случае? Мне нужно это знать, чтобы реализовать проверку дублирования в моем коде или нет.

Ответы [ 4 ]

6 голосов
/ 10 февраля 2012

Коммутаторы будут отправлять пакеты на все интерфейсы при использовании широковещательных рассылок или в экстремальных условиях (полная таблица MAC-адресов). Это может привести к дублированию, если между двумя или более коммутаторами есть петля и если протокол Spanning Tree не используется. Так что ответ редко.

2 голосов
/ 03 декабря 2015

Из памяти истории, которую я прочитал ~ 20 лет назад ...

Был неисправный маршрутизатор, который дублировал UDP-пакеты. Короче говоря, было обнаружено, что какое-то прерывание вызывалось слишком часто. Это вызвало следующий сценарий:

  1. Маршрутизатор перешел в очередь исходящих пакетов
  2. Он отправил пакет и перед тем, как пометить его как отправленный ...
  3. Прервано.
  4. По какой-то причине после обработки прерывания маршрутизатор вернулся, чтобы проверить очередь исходящих пакетов, вместо того, чтобы пометить пакет как отправленный (несвязанная ошибка?), Заставив его повторно передать тот же пакет до интервала между прерываниями было достаточно долго, чтобы закончить шаг 2.
0 голосов
/ 15 апреля 2018

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

Добавление простой проверки приращения иногда не будет работать, как ожидалось. Почему? Маршрутизаторы могут легко изменять входящие / исходящие маршруты для пакетов UDP даже в режиме реального времени, что может вызвать задержку в некоторых пакетах. Это может вызвать следующий сценарий:

  • Программа A отправляет 3 пакета UDP с инкрементными идентификаторами 1, 2 и 3 в Программу B.
  • Программа B получает пакеты UDP в порядке 2, 1 и 3. Не то, что вы ожидаете.

Итак, вместо этого я делаю ставку по тому же, но другому механизму:

  • Добавьте несколько случайных значений в ваш пакет.
  • Создает контрольную сумму пакета, когда ваша программа получает их.
  • Сохранить последние N контрольных сумм (например, N = 100) пакетов.
  • Каждый раз, когда вы получаете пакет, ищите дублированную контрольную сумму в вашем списке. Сбросить, если найден.

Надеюсь, это поможет вам полностью избежать дублирования пакетов. Не имеет значения, если ваш протокол не зашифрован, случайные значения помогут вам получить уникальные контрольные суммы (надеюсь, у вас не будет коллизии контрольных сумм в последних N пакетах).

0 голосов
/ 08 февраля 2012

Возможность получения дублированных пакетов UDP на хосте назначения зависит от количества интерфейсов назначения, которые получают пакет от хоста источника.Пункт назначения получит три дублированных UDP-пакета, если три его интерфейса (eth1, eth2, eth_int) смогут одновременно получать пакеты из источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...