Почему я не могу получить все пакеты UDP? - PullRequest
4 голосов
/ 08 марта 2010

Моя программа использует UdpClient, чтобы попытаться получить 27 ответов от 27 хостов. Размер ответа составляет 10 КБ. Моя широкополосная входящая пропускная способность составляет 150 КБ / с.

27 ответов отправляются с хостов почти одновременно и каждые 10 секунд.

Однако я могу получать только 8 - 17 ответов каждый раз. Количество ответов, которые я могу получить, довольно динамично, но в пределах диапазона.

Может кто-нибудь сказать мне, почему? почему я не могу получить все?

Я понимаю, что UDP не надежен. но я пытался получить 5-10 ответов одновременно, это сработало. Я думаю, что сетевые ссылки не так уж и плохи.

Код очень прост. На 27 хостах я просто использую UdpClient для отправки 10 КБ на мою машину.

На моей машине один UdpClient получает дейтаграммы. Каждый раз, когда я получаю данные, я создаю поток для их обработки (в основном обработка означает, что нужно просто распечатать «Я получил 10 КБ», но он выполняется в потоке).

listener = new UDPListener(Port);
listener.Start();
while (true) {
    try {
        UDPContext context = listener.Accept();
        ThreadPool.QueueUserWorkItem(new WaitCallback(HandleMessage), context);

    } catch (Exception) { }
}

Если я уменьшу размер ответа до 3 КБ, дело станет намного лучше, если будет получено примерно 25 ответов.

Есть еще идеи? Проблемы с буфером UDP ???

Ответы [ 3 ]

5 голосов
/ 08 марта 2010

Как вы сами сказали, UDP не надежен. Так что, скорее всего, пакеты отброшены куда-то.

Обратите внимание, что падение пакета вызвано как перегруженными коммутаторами / маршрутизаторами / сетевыми картами, так и плохими ссылками Если кто-то отправит вам 27 ответов 10Kb «одновременно». вполне возможно, что буферы вашей сетевой карты или ближайшего коммутатора переполнены, а пакеты отброшены.

Пока у вас нет кода для показа, вероятно, больше нечего сказать.

1 голос
/ 08 марта 2010

Пакеты размером 10 КБ, вероятно, фрагментированы. Если хотя бы один из фрагментов отброшен, пакет не может быть повторно собран. В зависимости от вашей сети, пакеты 3 КБ могут не фрагментироваться, но в любом случае они будут фрагментированы меньше, что увеличивает шансы на их прохождение Вы можете запустить инструмент обнаружения PMTU, чтобы определить максимальный размер пакета, поддерживаемый ссылками.

0 голосов
/ 17 марта 2010

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

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