Отправка огромного количества обработанных в реальном времени данных через UDP на iPhone с сервера - PullRequest
6 голосов
/ 05 марта 2010

Я внедряю удаленное приложение. Сервер будет обрабатывать и отображать данные в режиме реального времени в виде анимации. (точнее, серия изображений) Каждый раз, когда изображение отображается, оно будет передано принимающему клиенту iPhone через UDP.

Я изучил некоторые UDP и знаю следующее:

  • Максимальный размер UDP составляет около 65 КБ.

  • Однако кажется, что iPhone может принимать только 41k UDP-пакетов. Кажется, что iPhone не может получить пакет больше этого.

  • При отправке нескольких пакетов многие пакеты отбрасываются. Это связано с чрезмерной обработкой UDP.

  • Уменьшение размера пакета увеличивает количество пакетов, которые не отбрасываются, но это означает, что для отправки требуется больше пакетов.

Раньше я никогда не писал настоящие практичные приложения UDP, поэтому мне нужны некоторые рекомендации для эффективной связи UDP. В данном случае речь идет о передаче отрисованных изображений в режиме реального времени с сервера для отображения на iPhone.

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

Ответы [ 2 ]

9 голосов
/ 07 марта 2010

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

  1. Добавление порядкового номера в заголовок для каждого пакета
  2. Ack каждого пакета
  3. Настройка повторной передачитаймер, который повторно отправляет пакет, если подтверждение не получено
  4. Отслеживание RTT задержки (время прохождения туда и обратно), чтобы вы знали, как долго устанавливать таймеры на
  5. Потенциально иметь дело с поступлением данных вне очередиэто важно для вашего приложения
  6. Увеличьте размер буфера приема на клиентском сокете .

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

По сути, если вам требуется гарантированная доставка ваших данных в порядке, чем вы собираетесь повторно внедрить TCP поверх UDP,Если единственной причиной, по которой вы используете UDP, является задержка, то вы, вероятно, можете использовать TCP и отключить алгоритм Nagle .Если вам нужны пакетированные данные с надежной доставкой с малой задержкой, другая возможность - SCTP , также с отключенным Nagle.Он также может обеспечить доставку вне очереди, чтобы еще больше ускорить процесс.

Я бы порекомендовал Стивену " Unix Network Programming ", в котором есть раздел, посвященный расширенному UDP и когда это целесообразноиспользуйте UDP вместо TCP.Как примечание, он рекомендует не использовать UDP для массовой передачи данных, хотя реальность такова, что в наши дни это становится все более распространенным явлением для потоковых мультимедийных приложений.

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

Маленькие пакеты, вероятно, лучше, чем большие пакеты: -)

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