Почему RTP использует UDP вместо TCP?

Затухание массива означает, что когда массив передается как параметр функции, он обрабатывается тождественно («распадается на») указатель.

void do_something(int *array) {
  // We don't know how big array is here, because it's decayed to a pointer.
  printf("%i\n", sizeof(array));  // always prints 4 on a 32-bit machine
}

int main (int argc, char **argv) {
    int a[10];
    int b[20];
    int *c;
    printf("%zu\n", sizeof(a)); //prints 40 on a 32-bit machine
    printf("%zu\n", sizeof(b)); //prints 80 on a 32-bit machine
    printf("%zu\n", sizeof(c)); //prints 4 on a 32-bit machine
    do_something(a);
    do_something(b);
    do_something(c);
}

Существует два осложнения или исключения для выше.

Во-первых, при работе с многомерными массивами в C и C ++ теряется только первое измерение. Это связано с тем, что массивы сложены в памяти, поэтому компилятор должен знать все, кроме первого измерения, чтобы вычислить смещения в этом блоке памяти.

void do_something(int array[][10])
{
    // We don't know how big the first dimension is.
}

int main(int argc, char *argv[]) {
    int a[5][10];
    int b[20][10];
    do_something(a);
    do_something(b);
    return 0;
}

Во-вторых, на C ++ вы можете используйте шаблоны для вывода размера массивов. Microsoft использует это для C ++-версий функций Secure CRT, таких как strcpy_s , и вы можете использовать подобный трюк, чтобы надежно получить количество элементов в массиве .

30
задан paxos1977 13 December 2008 в 00:48
поделиться

10 ответов

Как ди-джей указал, TCP о получении надежного потока данных, и замедлит передачу и ретранслирует поврежденные пакеты для достижения этого.

UDP не заботится о надежности коммуникации, и не замедлится или ретранслирует данные.

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

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

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

57
ответ дан 27 November 2019 в 23:07
поделиться

Другие корректны, однако не действительно говорит Вам Настоящую причину почему. Вид Saua намеков на него, но вот более полный ответ.

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

причина, просто. Задержка. VoIP пытается очень трудно минимизировать сумму задержки со времени, которое кто-то говорит в один конец, и Вы получаете его на своем конце и своем ответе назад. Иначе, поскольку ошибки произошли, сумма задержки между тем, когда человек говорил и когда сигнал был получен, будет непрерывно расти, пока это не стало бесполезным.

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

А 1 вторая задержка от повторной передачи означала бы, что это теперь будет 1 секунда со времени, я сказал что-то, пока Вы не слышали его. Вторая 1 вторая задержка теперь означает, что это - 2 секунды со времени, я говорю что-то, пока Вы не слышите его. Это кумулятивно, потому что данные воспроизводятся на том же уровне, на котором на них говорят и так далее...

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

12
ответ дан 27 November 2019 в 23:07
поделиться

Много хороших ответов было дано, но я хотел бы указать на одну вещь явно:

В основном полный поток данных является хорошей вещью иметь для аудио/видео в реальном времени, но не строго необходимый (поскольку другие указали):

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

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

, Таким образом, RTP делает некоторую передачу максимальных усилий, в которой он пытается передать все доступные данные вовремя, но не пытается ретранслировать данные, которые терялись/повреждались во время передачи (*). Это просто продолжает жизнь и надеется, что более важные текущие данные добираются там правильно.

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

19
ответ дан 27 November 2019 в 23:07
поделиться

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

3
ответ дан 27 November 2019 в 23:07
поделиться

RTP довольно нечувствителен к потере пакетов, таким образом, это не требует надежности TCP.

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

UDP обеспечивает быструю передачу данных также.

, Таким образом, UDP является очевидным выбором в случаях, таких как это.

2
ответ дан 27 November 2019 в 23:07
поделиться

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

1
ответ дан 27 November 2019 в 23:07
поделиться

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

TCP используется, если данные должны быть точно получены, поразрядно, никакая потеря битов.

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

0
ответ дан 27 November 2019 в 23:07
поделиться

просто замечание: Каждому пакету, отправляемому в потоке RTP, присваивается номер, на единицу превышающий его предшественник. Это позволяет адресату определить, отсутствуют ли какие-либо пакеты. Если пакет ошибается, лучшее действие для пункта назначения - аппроксимировать отсутствующее значение путем интерполяции. Повторная передача не является обязательной возможностью, поскольку повторно переданный пакет будет слишком поздно, чтобы быть полезным.

0
ответ дан 27 November 2019 в 23:07
поделиться

Я хотел бы быстро добавить к тому, что сказал Мэтт Х в ответ на ответ Стобора. Мэтт Н упомянул, что RTP через UDP пакеты могут быть контрольной суммой, так что если они повреждены, они будут возмущены. Это на самом деле является необязательной функцией на большинстве АТС. В Asterisk, например, вы можете включить / отключить контрольную сумму вашего RTP over UDP трафика в файле конфигурации rtp.conf со следующей строкой:

rtpchecksums=yes ; or no if you prefer

Cheers!

.
0
ответ дан 27 November 2019 в 23:07
поделиться

Технически пакеты RTP могут чередоваться через TCP-соединение. Здесь дано много отличных ответов. Два дополнительных незначительных момента:

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

Трафик RTP может чередоваться через TCP-соединение. На практике, когда это делается, разница между чередующимся RTP (т.е. по TCP) и RTP, передаваемым по UDP, заключается в том, как они работают в сети с потерями и недостаточной пропускной способностью для пользователя. Поток Interleaved TCP в конечном итоге будет отрывистым, поскольку плеер постоянно ожидает поступления пакетов в состоянии буферизации. В зависимости от проигрывателя он может прыгать вперед, чтобы догнать его. При RTP-соединении вы получите артефакты (размазывание/разрыв) в видео.

5
ответ дан 27 November 2019 в 23:07
поделиться