TCP vs UDP в потоке видео


Я только что вернулся домой с экзамена по сетевому программированию, и один из вопросов, который они нам задали, был " Если вы собираетесь передавать видео, вы бы использовали TCP или UDP? Дайте объяснение как для сохраненного видео, так и для живых видеопотоков". На этот вопрос они просто ожидали короткого ответа TCP для сохраненного видео и UDP для живого видео, но я думал об этом по дороге домой, и обязательно лучше использовать UDP для потоковой передачи живого видео? Я имею в виду, если у вас есть пропускная способность для это, и скажем, вы транслируете футбольный матч или концерт, если на то пошло, вам действительно нужно использовать UDP?

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

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

Итак, это подводит меня к моему вопросу. Есть ли какие-либо недостатки, которые я не знаю об использовании TCP для потоковой передачи в реальном времени? Или это действительно должно быть, что если у вас есть пропускная способность для этого, вы должны пойти на TCP, учитывая, что он "лучше" для сети (управление потоком)?

13 71

13 ответов:

недостатки использования TCP для живого видео:

  1. обычно устройства для потоковой передачи видео в реальном времени не предназначены для потоковой передачи TCP. Если вы используете TCP, ОС должна буферизировать неподтвержденные сегменты для каждого клиента. Это нежелательно, особенно в случае живых событий; по-видимому, ваш список одновременных клиентов длинный из-за необычности события. Предварительно записанные видеоролики обычно не имеют такой большой проблемы с этим, потому что зрители шатаются их активность воспроизведения; поэтому TCP более подходит для воспроизведения видео по требованию.
  2. многоадресной IP-рассылки значительно снижает требования к пропускной способности видео для большой аудитории; ПТС предотвращает использование многоадресной IP-рассылки, но UDP не подходит для многоадресной IP-рассылки.
  3. видео в реальном маштабе времени нормально поток постоянн-ширины полосы частот записанный с камеры; пре-записанные видео-потоки приходят с диска. Потери-переключений динамика ПТС сделать это тяжелее, чтобы служить живым видео, когда источник потоков находятся на постоянной полосе пропускания (как это было бы для живого события). Если вы буфера на диск с камеры, убедитесь, что у вас есть достаточный буфер для непредсказуемых сетевых событий и переменной передачи TCP/частота переключений. UDP дает вам гораздо больше контроля для этого приложения, так как UDP не заботится о снижении уровня сетевого транспорта.

к вашему сведению, пожалуйста, не используйте слово "пакеты" при описании сетей. Сети отправляют "пакеты".

но во время футбольного матча, или концерт, какое это имеет значение, если вы не одна минута позади ручья?

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

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

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

Если ваш живой поток использует TCP / IP, то это будет заставили ждать тех упавших пакетов до он может продолжить обработку новых данных.

это вдвойне плохо:

  • старый данные будут повторно переданы (это, вероятно, для кадра, который уже был отображен и поэтому бесполезен)и
  • новые данные не могут прибыть до после старые данные были повторно переданы

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

для записанного потока ситуация немного отличается: вы, вероятно, будете буферизовать намного больше (возможно, несколько минут!) и предпочел бы, чтобы данные были повторно переданы, чем иметь некоторые артефакты из-за потерянных пакетов. В этом случае TCP является хорошим соответствием (это все еще может быть реализовано в UDP, конечно, но TCP не имеет столько недостатков, как для случая live stream).

есть некоторые варианты использования, подходящие для транспорта UDP и другие, подходящие для транспорта TCP.

прецедент также диктует настройки кодирования для видео. При трансляции футбольного матча основное внимание уделяется качеству, а для видеоконференции - задержке.

при использовании многоадресной рассылки для доставки видео вашим клиентам используется UDP.

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

Многоадресная рассылка упростит широковещательное программное обеспечение, поскольку сетевое оборудование будет обрабатывать распределительные пакеты для клиентов. Клиенты подписываются на многоадресные каналы, и сеть будет реконфигурирована для маршрутизации пакетов новому абоненту. По умолчанию все каналы доступно для всех клиентов и может быть оптимально маршрутизировать.

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

рабочий процесс Unicast (TCP) позволяет серверу проверять учетные данные клиента и разрешать только действительные подписки. Даже разрешить только определенное количество одновременное подключение.

Многоадресная рассылка не включена через интернет.

для доставки видео через интернет необходимо использовать TCP. При использовании UDP разработчики в конечном итоге повторно реализуют повторную передачу пакетов, например. Живой протокол Bittorrent p2p.

" Если вы используете TCP, ОС должна буферизировать неподтвержденные сегменты для каждого клиента. Это нежелательно, особенно в случае живых событий".

этот буфер должен существовать в некоторая форма. Же самое верно для буфера дрожания на стороне игрока. Он называется "Socket buffer", и серверное программное обеспечение может знать, когда этот буфер заполнен, и отбрасывать правильные видеокадры для живых потоков. Лучше использовать метод unicast / TCP, потому что серверное программное обеспечение может реализовать правильную логику отбрасывания кадров. Случайные пропущенные пакеты в случае UDP просто создадут плохой пользовательский интерфейс. как в этом видео: http://tinypic.com/r/2qn89xz/9

" IP multicast значительно снижает требования к пропускной способности видео для больших аудиторий"

Это верно для частных сетей, Многоадресная рассылка не включена через интернет.

"обратите внимание, что если TCP теряет слишком много пакетов, соединение умирает; таким образом, UDP дает вам гораздо больше контроля для этого приложения, так как UDP не заботится о снижении уровня сетевого транспорта."

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

"обычно видеопоток несколько отказоустойчив"

закодированное видео не отказоустойчивость. При передаче по ненадежному транспорту в видеоконтейнер добавляется прямая коррекция ошибок. Хорошим примером является контейнер MPEG-TS, используемый в спутниковой видеотрансляции, который несет несколько аудио, видео, EPG и т. д. потоки. Это необходимо, так как спутниковая связь не является дуплексной связью, то есть приемником не удается запросить повторную передачу потерянных пакетов.

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

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

результатом пропущенных пакетов являются артефакты, подобные этому: artifacts

некоторые декодеры могут разбивать на потоки отсутствующие пакеты в критических местах.

Я рекомендую вам посмотреть на новый живой протокол p2p Bittorent Live.

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

Это зависит. Насколько важен контент, который вы транслируете? Если критическое использование TCP. Это может вызвать проблемы с пропускной способностью, качеством видео (Возможно, вам придется использовать более низкое качество, чтобы справиться с задержкой) и задержкой. Но если вам нужен контент, чтобы гарантированно попасть туда, используйте его.

в противном случае UDP должен быть прекрасным, если поток не критичен и был бы предпочтительным, потому что UDP имеет тенденцию иметь меньше накладных расходов.

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

есть несколько основных причин, почему TCP не масштабируется хорошо:

  1. один из самые большие компромиссы TCP-это вариативность пропускной способности, достижимая между отправителем и получателем. При потоковой передаче видео через Интернет видеопакеты должны проходить через несколько маршрутизаторов через Интернет, каждый из этих маршрутизаторов связан с различными скоростными соединениями. Алгоритм TCP начинается с TCP window off small, затем растет до тех пор, пока не будет обнаружена потеря пакетов, потеря пакетов считается признаком перегрузки, и TCP реагирует на это, резко уменьшая размер окна, чтобы избежать затор. Таким образом, в свою очередь, немедленно снижает эффективную пропускную способность. Теперь представьте себе сеть с передачей TCP, использующую 6-7 переходов маршрутизатора к клиенту (очень нормальный сценарий), если какой-либо из промежуточных маршрутизаторов потеряет какой-либо пакет, TCP для этого канала уменьшит скорость передачи. Фактически поток трафика между маршрутизаторами следует за формой песочных часов; всегда гонг вверх и вниз между одним из промежуточных маршрутизаторов. Оказание эффективной помощи гораздо ниже по сравнению с максимальных усилий УДП.

  2. Как вы уже знаете, TCP-это протокол на основе подтверждения. Например, скажем, отправитель находится на расстоянии 50 мс (т. е. задержка между двумя точками). Это означало бы, что время, которое требуется для отправки пакета на приемник, а приемник для отправки подтверждения будет составлять 100 мс; таким образом, максимальная пропускная способность, возможная по сравнению с передачей на основе UDP, уже уменьшена вдвое.

  3. TCP не поддерживает многоадресную рассылку или новое появление стандарт многоадресной передачи AMT. Это означает, что CDNs не имеют возможности уменьшить сетевой трафик путем репликации пакетов-когда многие клиенты смотрят один и тот же контент. Это само по себе является достаточно большой причиной для CDNs (например, Akamai или Level3), чтобы не идти с TCP для живых потоков.

для пропускной способности потокового видео, вероятно, ограничение на систему. Используя многоадресную рассылку, вы можете значительно уменьшить объем используемой восходящей полосы пропускания. С помощью UDP вы можете легко группировать свои пакеты на все подключенные терминалы. Вы также можете использовать надежный протокол многоадресной рассылки, который называется Pragmatic General Multicast (PGM), я ничего не знаю об этом, и я думаю, что он не распространен в его использовании.

все ответы "use UDP" предполагают открытую сеть и "наполняют ее столько, сколько вы можете". Хорошо подходит для старых закрытых садовых выделенных аудио / видео сетей, которые являются исчезающим видом.

в реальном мире ваша передача будет проходить через брандмауэры (которые будут отбрасывать многоадресную рассылку, а иногда и udp), сеть совместно используется с другими более важными ( $ $ $ ) приложениями, поэтому вы хочу чтобы наказать нарушителей с масштабированием окна.

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

TCP может более легко проходить через брандмауэры и трансляторы сетевых адресов. В зависимости от вашего NAT и оператора вы можете даже не получить поток UDP из-за проблем с пробивкой отверстий UDP.

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

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

UDP испытывает потерю пакета. На секунду во время видеопотока угол экрана становится немного размытым. Никто не замечает, и шоу продолжается, не ища потерянные пакеты.

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

UDP FTW при потоковой передаче.

Если пропускная способность намного выше, чем битрейтом, я бы рекомендовал TCP для unicast live Video streaming.

Случай 1: последовательные пакеты теряются в течение нескольких секунд. => live video остановится на стороне клиента независимо от транспортного уровня (TCP или UDP). Когда сеть восстанавливается: - если используется TCP, клиентский видеоплеер может перезапустить поток при первой потере пакета (timeshift) или отбросить все поздние пакеты и перезапустить видеопоток без сдвиг во времени. - если используется UDP, на стороне клиента нет выбора, перезапуск видео в прямом эфире без какого-либо сдвига времени. = > TCP равно или лучше.

случай 2: некоторые пакеты случайно и часто теряются в сети. - если используется TCP, эти пакеты будут немедленно ретранслированы и с правильным буфером дрожания, не будет никакого влияния на качество/задержку видеопотока. - если используется UDP, качество видео будет плохим. => Протокол TCP намного лучше

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