Должен ли я использовать TCP или UDP?

Мое приложение должно отправлять видеоданные кадр за кадром с сервера на клиент. Я колеблюсь между использованием TCP или UDP.

Из моего теста я узнал следующие результаты:

TCP: Очень легко реализовать.

UDP: Чтобы отправить кадр (около 50 КБ) клиенту, если я создаю 1 пакет UDP для каждого кадра, то отправка всегда теряет кадры. Поэтому я должен разделить каждый кадр на множество пакетов UDP. Это делает мой алгоритм намного более сложным, потому что протокол UDP может терять пакеты, и пакеты могут быть доставлены не по порядку. Кроме того, если длина данных в каждом пакете UDP велика, они легко теряются.

У меня есть несколько вопросов:

  1. Должен ли я использовать TCP или UDP для этого типа приложений.

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

  3. Исходя из своего опыта, можете ли вы оценить, на сколько процентов TCP быстрее UDP?

Извините за так много вопросов в сообщении, но мне нужно знать больше деталей, прежде чем решить, использовать ли TCP или UDP в моем приложении.


person TTGroup    schedule 18.06.2012    source источник
comment
skullbox.net/tcpudp.php , udp обычно используется для аудио и видео, поэтому, возможно, для ваше приложение было бы более подходящим   -  person theBigChalk    schedule 18.06.2012


Ответы (3)


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

Кроме того, вы должны принять во внимание целевую сеть. Это только локальный хост, локальная сеть, глобальная сеть или даже Интернет. Чем меньше у вас контроля над сетью, тем выше влияние предпочтения TCP с точки зрения времени приема-передачи, задержки, потери пакетов и т. д. Под контролем я имею в виду верхние границы или оценки количества пересекаемых сегментов сети (#маршрутизаторов), количества различных конфигураций (QoS, ограничитель полосы пропускания, MTU, ...) и так далее.

Как правило, UDP хорош, когда все данные, необходимые для данного момента (определенные ниже), помещаются в один пакет (MTU гарантированно равен 1280 в IPv6). Мгновение — это короткий снимок во времени, срок жизни которого обычно равен времени прохождения туда и обратно. UDP также отлично подходит для диалогов, в которых и запрос, и ответ являются небольшими объектами.

Так что в этом смысле я использовал бы UDP для чего-то вроде DNS (короткий запрос, короткий ответ) или данных о финансовых транзакциях (их так много в течение жизненного цикла 1 времени туда и обратно), или метаданные протокола, такие как количество или идентификационные хэши участвующих клиентов (запрос/ответ короткий, и в течение времени приема-передачи их всего несколько).

Надеюсь это поможет.

Изменить:
чтобы ответить на ваши вопросы

  1. UDP (ограничения перечислены выше)
  2. IPv6 offers path mtu detection, you'd simply use the PMTU, for IPv4 you'd have to roll your own:
    • set the IP_DONTFRAG socket option
    • отправить пакет, который, как вы предполагаете, проходит
    • подумайте о простом протоколе, позволяющем получателю сообщить вам, был ли пакет полностью получен
    • если нет -> уменьшить размер, если да -> увеличить размер
    • после нескольких пинг-понгов у вас есть безопасная оценка для PMTU (конечно, вы уже можете отправлять данные полезной нагрузки)
  3. UDP значительно превосходит TCP, если характер сети стабилен и остается стабильным. (И наоборот) TCP не будет выигрывать, если природа сети постоянно меняется (вариации задержки, изменение вероятности потери пакетов и т. д.). Но в то же время UDP не будет strong> выигрывают, когда сетевые сегменты очень далеко друг от друга и QoS используется в некоторых промежуточных сегментах (QoS, которое настроено так, чтобы отдавать предпочтение более или менее известным службам TCP по сравнению с «другими» вещами.

Для некоторых цифр и вдохновения вы должны проверить udt.

person hroptatyr    schedule 18.06.2012
comment
Какой? Вы бы использовали UDP для финансовой информации, но TCP для потокового видео с ограничениями в реальном времени? Это очень далеко от лучших практик. - person Oleksi; 18.06.2012
comment
Нет, я и в этом случае использовал бы UDP, при условии, что у меня есть контроль над кодеком. И я думаю, что по сравнению с финансовыми данными потоковое видео гораздо более спокойное с точки зрения задержки, пока она остается постоянной. - person hroptatyr; 18.06.2012

Поскольку ваше приложение транслирует видео, вам, вероятно, нужен UDP. Одно огромное различие между TCP и UDP (в данном случае) заключается в том, что UDP не пытается восстановить потерянные пакеты, как это делает TCP. Вы не хотите, чтобы видео перезагружалось каждый раз, когда пропускается кадр, потому что это займет много времени, вместо этого UDP просто пропустит потерянные кадры. (Если щелкнуть правой кнопкой мыши видео на Youtube, можно увидеть количество пакетов, отброшенных при потоковой передаче видео)

person pennetti    schedule 18.06.2012
comment
Извините, я не знаю о процентах, но вы можете посмотреть stackoverflow.com/questions/47903/ для получения дополнительной информации о разнице в скорости. - person pennetti; 18.06.2012

Помимо потоковой передачи видео/аудио UDP используется для приложений с малой задержкой, которые имеют короткие сообщения.

person Ivan Voroshilin    schedule 03.03.2014