Как я могу сделать контроль перегрузки для протокола UDP? - PullRequest
12 голосов
/ 31 декабря 2011

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

Как я могу обнаружить перегрузку в локальной сети, чтобы замедлить скорость отправки пакетов UDP?

РЕДАКТИРОВАТЬ: пожалуйста, не комментируйте использование UDP, подходит ли это или нет.Этот протокол использует UDP, но собирает пакеты в целые файлы, когда они поступают.

Перефразировать вопрос: как работают алгоритмы контроля перегруженности и как обнаруживается перегруженность?

Ответы [ 5 ]

14 голосов
/ 31 декабря 2011

Это предполагает, что вы должны использовать UDP (предпочтительнее TCP).

Из приложения единственным признаком перегрузки сети является потеря IP-пакетов.В зависимости от того, как у вас есть протокол, вы можете захотеть сделать что-то вроде нумерации каждой выходящей датаграммы, и, если получатель обнаружит, что он пропускает некоторые (или выводит их из строя), отправьте сообщение (или несколько) отправителючтобы указать, что произошла потеря пакетов IP и замедлить.

Существует протокол под названием RTP (Транспортный протокол в реальном времени), который используется в приложениях потоковой передачи в реальном времени.

RTP работает по протоколу UDP, а RTCP (протокол управления транспортировкой в ​​реальном времени), работающий с RTP, обеспечивает меры для QoS (качества обслуживания), такие как потеря пакетов, задержка, дрожание и т. Д., Чтобы сообщить об этом отправителю, чтобы он зналкогда тормозить или менять кодеки.

Не говорю, что вы можете использовать RTP, но может быть полезно посмотреть, как это работает.

3 голосов
/ 10 января 2012

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

В следующей статье подробно рассматриваются эти статистические данные и их значение: Техническая записка DEI 0021: потеря, задержка и скорость

Поиск хорошего решения был предметом многих исследований и коммерческих усилий. Различные алгоритмы ( TCP , UDT , Протокол многоцелевых транзакций и т. Д.) Используют разные методы и делают разные предположения, все пытаются выяснить, что происходит в сеть, основанная на очень скудных данных.

3 голосов
/ 31 декабря 2011

Задержка - хороший способ обнаружить застой. Если ваша задержка начинает увеличиваться, то вам, вероятно, следует замедлиться. Потерянный пакет эквивалентен латентности = бесконечности. Но вы никогда не можете быть уверены, что пакет был потерян или просто очень медленный, поэтому у вас должен быть тайм-аут для «обнаружения» потерянных пакетов.

1 голос
/ 30 августа 2015

У меня была следующая идея:

  • Отправитель отправляет данные.
  • Приемник ждет пару секунд, а затем вычисляет пропускную способность / с
  • Получатель отправляет отправителю скорость, с которой его пакеты приема (байты / с)
  • Отправитель рассчитывает скорость отправки пакетов
  • Если скорость отправителя значительно выше, уменьшите ее до соответствия скорости приема.

В качестве альтернативы, более продвинутый подход:

  • Отправитель начинает отправку с заранее определенной минимальной скоростью (например, 1 КБ / с)
  • Получатель отправляет рассчитанную скорость приема обратно отправителю.
  • Если скорость приема совпадает со скоростью отправки (с учетом задержки), увеличьте скорость на установленное значение (например, скорость * 2)
  • Продолжайте делать это, пока скорость отправки не станет выше, чем скорость приема.
  • Продолжайте отслеживать скорости, чтобы учесть изменения в увеличении / уменьшении полосы пропускания, если это необходимо.

Отказ от ответственности: я не эксперт по сети, это может не сработать.

0 голосов
/ 16 декабря 2012

Кажется, AIMD алгоритм - это то, что они используют в протоколах TCP и UDT , чтобы избежать перегрузки.

Со страницы Википедии:

Алгоритм аддитивного увеличения / мультипликативного уменьшения (AIMD) - это алгоритм управления с обратной связью, наиболее известный своим использованием в предотвращении перегрузок TCP.AIMD сочетает в себе линейный рост окна перегрузки с экспоненциальным уменьшением, когда происходит перегрузка.Несколько потоков, использующих управление перегрузкой AIMD, в конечном итоге будут сходиться, чтобы использовать равные количества конфликтующих каналов.

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