Я реализовываю удаленное приложение. Сервер обработает и представит данные в режиме реального времени как анимацию. (ряд изображений, чтобы быть точным) Каждый раз, изображение представляется, оно будет передано получению клиент iPhone через UDP.
Я изучил некоторый UDP, и я знаю о следующем:
UDP имеет макс. размер приблизительно 65k.
Однако кажется, что iPhone может только получить 41k пакет UDP. iPhone, кажется, не может получить пакет, больше, чем это.
При отправке нескольких пакетов отбрасываются много пакетов. Это происходит из-за сверхкалибровки обработки UDP.
Сокращение размера пакета увеличивает сумму пакетов, не отбрасываемых, но это означает, что больше пакетов требуется, чтобы быть отправленным.
Я никогда не пишу реальные практические приложения UDP прежде, таким образом, мне нужно некоторое руководство эффективной коммуникацией UDP. В этом случае мы говорим о передаче представленных изображений в режиме реального времени с сервера, который будет отображен на iPhone.
Сжатие данных кажется обязательным, но в этом вопросе, я хотел бы сфокусироваться на части UDP. Обычно, когда мы реализовываем приложения UDP, что мы можем сделать с точки зрения лучшей практики для эффективного программирования UDP, если мы должны отправить много данных без остановок в режиме реального времени?
Предполагая, что у вас есть очень конкретная и хорошая причина для использования UDP и что вам нужно, чтобы все ваши данные дошли (т.е. вы не можете терпеть любые потерянные данные), то вам нужно сделать несколько вещей (это предполагает использование uni-cast приложения):
Кроме того, вы можете отправлять данные так быстро, что отбрасываете пакеты внутри машины-отправителя, даже не передавая их через сетевую карту на провод. На некоторых системах вызов select для возможности записи на отправляющем сокете может помочь в этом. Также вызов connect на UDP сокете может ускорить работу, что приведет к меньшему количеству потерянных пакетов.
В принципе, если вам нужна гарантированная доставка данных в порядке их следования, то вам придется реализовать TCP поверх UDP. Если единственной причиной использования UDP является задержка, то вы можете использовать TCP и отключить Nagle Algorithm. Если вам нужны пакетные данные с надежной доставкой с низкой задержкой, то можно использовать SCTP, также с отключенным Nagle. Он также может обеспечить доставку вне очереди, чтобы еще больше ускорить процесс.
Я бы рекомендовал книгу Стивена "Unix Network Programming", в которой есть раздел о расширенном UDP и о том, когда уместно использовать UDP вместо TCP. В качестве примечания, он не рекомендует использовать UDP для передачи больших объемов данных, хотя в действительности это становится гораздо более распространенным в наши дни для потоковых мультимедийных приложений.