Контроль скорости UDP-клиента в c # - PullRequest
0 голосов
/ 15 ноября 2010

Я отправляю несколько пакетов udp последовательно на удаленный компьютер.проблема в том, что если объем данных слишком велик, какое-то устройство где-то между каналами испытывает переполнение буфера.я намерен ограничить / регулировать / контролировать скорость отправки пакетов udp.Может кто-нибудь дать мне какое-нибудь руководство о том, как найти оптимальный интервал отправки?

Кстати, пожалуйста, перестаньте предлагать tcp over udpЦелью является не надежная отправка данных, а измерение максимальной пропускной способности.

Ответы [ 3 ]

2 голосов
/ 15 ноября 2010

Метод проб и ошибок. Точка.

  • Установите соединение secnod (на основе UDP или TCP), которое вы используете ТОЛЬКО для отправки команд управления.
  • Отправка статистики об отсутствующих пакетах и ​​т. Д. Затем стороны могут решить, является ли скорость передачи данных слишком высокой.
  • Возможно, начните с низкого уровня, затем увеличивайте скорость передачи данных, пока не увидите пропущенные пакеты.

НИКОГДА (!) Не предполагайте, что все пакеты будут доставлены. Означает: вам нужен (!) Способ поиска пропущенных пакетов. Даже при совершенном cnoditions пакеты иногда теряются.

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

1 голос
/ 16 ноября 2010

Попробуйте следующее:

  • Начните с пакетов размером 1 КБ (например).
  • Для них подсчитайте, сколько пакетов в секунду будет нормально отправлять - например,- 1 ГБ Ethernet = 100 МБ сырой полосы пропускания -> 100 000 пакетов
  • создайте упаковку так, чтобы первые 4 байта были серийным номером, остальные могли быть чем угодно - если вы тестируете здесь, заполните его нулями или шумом (случайным образомdata)
  • на отправляющей стороне, создайте пакеты и отправьте их со скоростью RATE (предварительно рассчитанной) в течение одной секунды.рассчитайте потраченное время и Sleep() остальное время, ожидая нового временного интервала.
  • на приемном конце, соберите пакеты и посмотрите их серийные номера.если пакеты отсутствуют, отправьте (другое соединение) некоторую информацию об этом отправителю.
  • отправитель, в отношении информации о потерянных пакетах, должен сделать что-то вроде RATE = RATE * .9 - уменьшить скорость отправки до 90% от предыдущей.
  • отправитель должен постепенно увеличивать скорость (скажем, 1%) каждые несколько секунд, если он не получает никакого сообщения «потерянные пакеты»
  • через некоторое время ваш RATE будет сходиться к тому, что вы хотели впервое место

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

1 голос
/ 15 ноября 2010

Несмотря на ваше предложение, что я не предлагаю TCP через UDP, я должен.В том же параграфе вы заявляете, что основная цель вашего теста - это измерение пропускной способности - то есть пропускной способности - и единственный способ сделать это правильно, не заново изобретая весь стек TCP, - это фактически использовать стек TCP.Большие части TCP предназначены для работы с проблемами управления потоками, и когда используются потоки TCP, вы получите именно то, что вам нужно - максимальную пропускную способность для данного соединения, с легкостью и без «создания теплой воды».

Если этот ответ вам не подходит, это, вероятно, означает, что вы должны пересмотреть свои требования по проблеме.Они в конфликте.

...