Отправка огромного объема реального времени обработала данных через UDP к iPhone с сервера

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

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

  • UDP имеет макс. размер приблизительно 65k.

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

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

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

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

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

6
задан Karl 5 March 2010 в 17:06
поделиться

2 ответа

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

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

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

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

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

9
ответ дан 10 December 2019 в 02:46
поделиться

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

0
ответ дан 10 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: