2010-11-15 2 views
0

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

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

+1

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

+0

@ Daniel Mošmondor. я так понимаю, вы не знаете, что такое проблемы. пожалуйста, не спам. –

+1

Конечно, у меня нет подсказки, так как вы сказали: * Цель состоит не в том, чтобы надежно передавать данные, а для измерения максимальной пропускной способности. * И, насколько это касается измерения, мое предложение будет делать именно это. –

ответ

2

Судебная и ошибка. Точка.

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

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

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

+0

, честно говоря, дело «решить» довольно легко для не-робота (человека). представляющая проблему математическим способом, является нетривией. есть ли какие-либо документы, исследования по этой теме? Каково ключевое слово, что я должен google? мой фон не является компьютерной сетью, поэтому ... –

+1

Проверьте протоколы RTP. Проблема, с которой вы сталкиваетесь, является стандартной в таких вещах, как передача голоса и видео в реальном времени. RTP использует UDP, и есть протокол управления такими вещами. – TomTom

1

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

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

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

+0

вздох. то, что я пытаюсь достичь, - это измерить, сколько данных может проходить через канал. например, на 1 мб канале, максимальные данные могут протекать через канал 1 Мб. пропускная способность, которую вы можете получить с помощью tcp, - это хорошие данные, исключая заголовки пакетов, за исключением данных, которые необходимо повторно передать. с tcp, вы ВСЕГДА имеете более низкие результаты, чем то, что это is.plus с udp, вы можете получить больше статистики, чем просто пропускную способность. Я ценю, что вы хотите помочь. Но, пожалуйста. –

+1

UDP также имеет заголовки. У каждого протокола у вас будет «слабый». –

+0

конечно udp есть заголовки. Я никогда не говорил, что удп не имеет заголовков, правда? но можете ли вы отслеживать, сколько потребляемых данных? можете ли вы отслеживать, сколько данных в tcp было повторно передано? –

1

Попробуйте тогда:

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

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

+0

Спасибо, Дэниэл. Взгляните на мою текущую реализацию здесь http://stackoverflow.com/questions/4167278/how-to-calculate-bandwidth-using-c.Corrent me if im wrong, из того, что я понимаю, если я отправляю данные в течение 1 секунды, а получатель получил данные в течение 2 секунд, это означает, что мне нужно перенастроить скорость отправки до тех пор, пока я не получу 1 секунду отправки и 1 секунду приема? простите мой язык. Мне нехорошо объяснять себя. это, кстати, напоминает мне некоторые статьи по оценке пропускной способности. один из них - путь. –

+0

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