Как обеспечить, чтобы UDP-сервер не терял входящие данные? - PullRequest
2 голосов
/ 09 января 2010

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

  1. Поможет ли это, если сервер подачи просто передает все полученные данные на другие серверы в локальной сети, которая сервер подачи данных имеет второй NIC подключается к? Каждый из другого серверы только собирает данные это касается обработки и оставить другие данные на другие серверы.
  2. Если поступающие данные все еще поступают слишком быстро, есть ли стратегия Уверены, что не теряете никаких данных?

Спасибо.

Ответы [ 5 ]

1 голос
/ 09 января 2010

UDP можно рассматривать как обозначающий «Ненадежный протокол дейтаграмм». Так что это сразу объясняет вашу проблему: вам нужна надежность, то есть услуга, которую не обеспечивает базовый протокол. Возможно, вам также нужен контроль перегрузки, поскольку отсутствие сетевых буферов является источником перегрузки точно так же, как и отсутствие пропускной способности.

Решение состоит в том, чтобы использовать что-то отличное от UDP или добавить контроль над надежностью и перегрузкой поверх UDP; подтверждение и ограничение скорости, по существу.

Возможные замены для UDP включают TCP и SCTP. SCTP был бы хорош, потому что он имеет режим дейтаграмм, поэтому вам не нужно преобразовывать протокол для работы с потоками. Смотрите здесь: http://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocol

1 голос
/ 09 января 2010

Некоторые стратегии, которые стоит попробовать, включают

  • Убедитесь, что процесс приема делает очень мало в потоке приема, просто прочитайте данные и отправьте их во внутреннюю очередь для обработки в другом потоке - это должно снизить вероятность заполнения буфера приема
  • Включите порядковый номер в ваше сообщение. Если получатель замечает пропущенное сообщение, он может повторно запросить его у издателя. Этот повторный запрос будет очень дорогим, но общий случай будет очень быстрым. Это предполагает, что издатель либо хранит разумное количество опубликованных сообщений в памяти (чтобы разрешить повторные запросы), либо сохраняет их где-то, чтобы справиться с воспроизведением.
1 голос
/ 09 января 2010
  1. Если я понимаю, что вы спрашиваете, то нет, потому что вы будете получать данные, а затем отправлять их снова, эффективно удваивая используемую полосу пропускания, так что, вероятно, это не поможет.

  2. Лучшей стратегией, гарантирующей отсутствие потерянных данных, было бы использование TCP через UDP. Однако, если вам нужно использовать UDP, вы можете написать некоторый код, который нумерует каждый отправляемый пакет (чтобы вы могли убедиться, что они приходят по порядку), и добавить больше функциональности, которая позволяет серверу запрашивать пропущенный пакет, например: отправитель отправляет 1, 2, 3, 4, но получатель получает только 1, 2, 4, затем снова запрашивает 3.

0 голосов
/ 09 января 2010

Если вам нужна надежность с UDP, тогда вы должны создать свой собственный поверх него. Как уже говорили другие, вам нужен какой-то метод отправки ACK от одного узла другому, чтобы сообщить другому узлу, что данные поступили безопасно. Затем другой узел может выборочно пересылать датаграммы до тех пор, пока они не будут подтверждены.

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

0 голосов
/ 09 января 2010

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

...