UDP против TCP, насколько быстрее это?

Для обмена сообщениями общего протокола, которые могут переносить потерю пакетов. Насколько эффективнее UDP через TCP?

UDP быстрее, чем TCP, и простая причина заключается в том, что его несуществующий пакет подтверждения (ACK), который разрешает непрерывный stream пакетов, вместо TCP, который подтверждает набор пакетов, рассчитывается с использованием размера windows TCP и времени округления (RTT ).

Для получения дополнительной информации я рекомендую простое, но очень понятное объяснение Skullbox (TCP против UDP)

Люди говорят, что главное, что дает TCP, – это надежность. Но это не совсем так. Самое важное, что TCP дает вам – это управление перегрузкой: вы можете запускать 100 TCP-соединений по всей DSL-линии, все на максимальной скорости, и все 100 соединений будут продуктивными, потому что все они «ощущают» доступную пропускную способность. Попробуйте это с помощью 100 различных приложений UDP, все толкающие пакеты так же быстро, как они могут идти, и посмотрите, как хорошо все работает для вас.

В более широком масштабе это поведение TCP – это то, что заставляет Интернет блокировать «коллапс перегрузки».

Вещи, которые склонны подталкивать приложения к UDP:

  • Семантика доставки группы: можно сделать надежную доставку группе людей намного эффективнее, чем TCP-точка.

  • Доставка вне заказа: во многих приложениях, пока вы получаете все данные, вам все равно, в каком порядке он прибывает; вы можете уменьшить задержку на уровне приложения, приняв блок вне порядка.

  • Неприемлемость: на вечеринке в локальной сети вам может быть все равно, работает ли ваш веб-браузер, как только вы будете бить обновления в сети настолько быстро, насколько сможете.

Но даже если вы заботитесь о производительности, вы, вероятно, не хотите идти с UDP:

  • Теперь у вас есть надежда на надежность, и многие вещи, которые вы можете сделать для повышения надежности, могут оказаться медленнее, чем TCP.

  • Теперь вы недружественны в сети, что может вызвать проблемы в общих средах.

  • Самое главное, брандмауэры заблокируют вас.

Вы можете потенциально преодолеть некоторые проблемы с производительностью и временем задержки TCP путем «транкинга» нескольких TCP-соединений; iSCSI делает это, чтобы обойти контроль перегрузок в локальных сетях, но вы также можете сделать это для создания «срочного» канала сообщений с низкой задержкой (поведение TCP «СРОЧНОЕ» полностью нарушено).

В некоторых приложениях TCP быстрее (более высокая пропускная способность), чем UDP.

Это тот случай, когда выполняется много мелких записей относительно размера MTU. Например, я прочитал эксперимент, в котором stream из 300 байтовых пакетов отправлялся по Ethernet (1500 байт MTU), а TCP был на 50% быстрее, чем UDP .

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

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

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

с устойчивостью к потерям

Вы имеете в виду «с потерей терпимости»?

В принципе, UDP не является «терпимым к потере». Вы можете отправить 100 пакетов кому-то, и они могут получить только 95 из этих пакетов, а некоторые могут быть в неправильном порядке.

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

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

К счастью, некоторые очень умные люди сделали это, и они назвали это TCP.

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

Какой протокол работает лучше (с точки зрения пропускной способности) – UDP или TCP – действительно зависит от характеристик сети и сетевого трафика. Роберт С. Барнс, например, указывает на сценарий, в котором TCP работает лучше (мелкие записи). Теперь рассмотрим сценарий, в котором сеть перегружена, и имеет как TCP, так и UDP-трафик. Отправители в сети, использующие TCP, будут ощущать «перегруженность» и сокращать скорость отправки. Однако UDP не имеет никаких механизмов предотвращения переполнения или контроля перегрузки, и отправители, использующие UDP, будут продолжать накачивать данные с той же скоростью. Постепенно TCP-отправители снижают скорость отправки до минимума, и если у UDP-отправителей будет достаточно данных для отправки по сети, они будут поддерживать большую доступную полосу пропускания. Таким образом, в таком случае UDP-отправители будут иметь большую пропускную способность, так как они получат большую долю пропускной способности сети. Фактически, это активная тема исследования – Как повысить пропускную способность TCP в присутствии трафика UDP. Один из способов, о котором я знаю, использование TCP-приложений для повышения пропускной способности – это открытие нескольких TCP-соединений. Таким образом, хотя пропускная способность каждого TCP-соединения может быть ограничена, общая пропускная способность всех TCP-соединений может быть больше, чем пропускная способность для приложения с использованием UDP.

Каждому TCP-соединению требуется первоначальное рукопожатие перед передачей данных. Кроме того, заголовок TCP содержит много накладных расходов, предназначенных для разных сигналов и обнаружения доставки сообщений. Для обмена сообщениями UDP, вероятно, будет достаточным, если допустима небольшая вероятность сбоя. Если получение должно быть подтверждено, TCP – ваш лучший вариант.

@ Андрю , я прошу отличить. UDP – это выбор в некоторых видах приложений из-за требований к производительности. Один classический пример – видеоконференции. Этот вид приложения плохо реагирует на управление TCP.

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

Говоря о «чем быстрее», есть по крайней мере два очень разных аспекта: пропускная способность и латентность.

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

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

После любой потери пакетов TCP будет ждать повторной передачи не менее 200 мс (1сек в параграфе 2.4 RFC6298, но практические современные реализации, как правило, уменьшают его до 200 мс). Более того, с TCP, даже те пакеты, которые достигли целевого хоста, не будут доставлены в ваше приложение до тех пор, пока не будет получен недостающий пакет (т. Е. Вся связь задерживается на ~ 200 мс) – BTW, этот эффект, известный как Head of of -Line Blocking, присуще всем надежным упорядоченным streamам, будь то TCP или надежный + упорядоченный UDP. Чтобы еще хуже: если ретранслируемый пакет также будет потерян, мы будем говорить о задержке ~ 600 мс (из-за так называемого экспоненциального отсрочка, 1-я повторная передача – 200 мс, а вторая – 200 * 2 = 400 мс). Если у нашего канала есть 1% потери пакетов (что плохо по сегодняшним стандартам), и у нас есть игра с 20 обновлениями в секунду – такие задержки в 600 мс будут происходить в среднем каждые 8 ​​минут. И поскольку 600 мс более чем достаточно, чтобы заставить вас убить в быстро развивающейся игре – хорошо, это довольно плохо для игрового процесса. Эти эффекты именно то, почему гамедевы часто предпочитают UDP через TCP.

Однако при использовании UDP для уменьшения латентности важно понять, что просто «использование UDP» недостаточно для существенного улучшения латентности, это все о том, КАК вы используете UDP. В частности, в то время как библиотеки RUDP обычно избегают «экспоненциального отсрочка» и используют более короткие времена повторной передачи – если они используются как «надежный упорядоченный» stream, им все равно придется страдать от блокировки Head-of-Line (поэтому в случае двойной потери пакетов, а не 600 мс, мы получим около 1.5 * 2 * RTT – или для довольно хорошего RTT 80 мс, это задержка 250 мс, что является улучшением, но все же можно сделать лучше). С другой стороны, если использовать методы, описанные в http://gafferongames.com/networked-physics/snapshot-compression/ и / или http://ithare.com/udp-from-mog-perspective/#low-latency- сжатие , возможно полностью исключить блокировку Head-of-Line (так что для потери двух пакетов для игры с 20 обновлениями в секунду задержка будет равна 100 мс независимо от RTT).

И в качестве побочного примечания – если у вас есть доступ только к TCP, но нет UDP (например, в браузере или если ваш клиент находится за одним из 6-9% уродливых брандмауэров, блокирующих UDP) – похоже, есть способ реализовать UDP-over-TCP без чрезмерных латентностей, см. здесь: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (обязательно прочитайте комментарии тоже (!)).

UDP немного быстрее в моем опыте, но не сильно. Выбор не должен производиться по производительности, а по содержанию сообщений и методам сжатия.

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

Если вам нужно быстро взорвать сообщение через сеть между двумя IP-адресами, которые еще не говорили, тогда UDP будет поступать как минимум в 3 раза быстрее, обычно в 5 раз быстрее.

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

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

SCTP

Это независимый транспортный уровень protolol, но он может использоваться как библиотека, обеспечивающая дополнительный уровень над UDP. Основной единицей связи является сообщение (сопоставленное с одним или несколькими UDP-пакетами). Внутри встроено управление перегрузкой. В протоколе есть кнопки и кружки для включения

  • для доставки сообщений
  • автоматическая повторная передача потерянных сообщений с заданными пользователем параметрами

если это необходимо для вашего конкретного приложения.

Одна из проблем заключается в том, что установление соединения является сложным (и, следовательно, медленным процессом)

Другие подобные вещи

Еще одна подобная проприетарная экспериментальная вещь

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

Я просто проясню ситуацию. TCP / UDP – это две машины, которые движутся по дороге. предположим, что дорожные знаки и препятствия – это ошибки. TCP заботится о дорожных знаках, уважает все вокруг. Медленное вождение, потому что что-то может случиться с автомобилем. В то время как UDP просто отключается, полная скорость не имеет отношения к уличным знакам. Ничего, безумный водитель. У UDP нет восстановления ошибок. Если есть препятствие, оно просто столкнется с ним, а затем продолжит. В то время как TCP гарантирует, что все пакеты отправляются и принимаются совершенно, никаких ошибок, поэтому автомобиль просто преодолевает препятствия без столкновения. Надеюсь, это хороший пример для вас, чтобы понять, почему UDP предпочтительнее в играх. Игрокам нужна скорость. TCP рекомендуется загружать, или загруженные файлы могут быть повреждены.

Бессмысленно говорить о TCP или UDP без учета состояния сети. Если сеть между двумя точками имеет очень высокое качество, UDP является абсолютно быстрее, чем TCP, но в некоторых других случаях, таких как сеть GPRS, TCP может быть быстрее и надежнее, чем UDP.

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

Три вещи, которые я хочу добавить к обсуждению:

  1. Вы можете найти здесь очень хорошую статью о TCP против UDP в контексте развития игры.
  2. Кроме того, iperf ( jperf улучшить iperf с графическим интерфейсом) – очень хороший инструмент для самостоятельного ответа на ваш вопрос.
  3. Я реализовал бенчмарк в Python (см. Этот вопрос SO ). В среднем из 10 ^ 6 итераций разница для отправки 8 байтов составляет около 1-2 микросекунд для UDP.
  • Как добавить заголовок сообщения в запрос при использовании клиента по умолчанию для сети Azure?
  • android BluetoothDevice.getName () return null
  • Как быстро получить адрес Ip
  • управление сеткой для ASP.NET MVC?
  • Заставить приложение запускаться под определенной версией .NET?
  • Android: проверка сети 3G или Wi-Fi включена или доступна или нет на устройстве Android
  • Что означает CultureInfo.InvariantCulture?
  • Сравнение сетевых библиотек Android: OkHTTP, Retrofit и Volley
  • Область памяти .NET EXE
  • == vs. Object.Equals (object) в .NET.
  • Брандмауэр Android с VpnService
  • Interesting Posts

    переопределить css для проверки формы html5 / требуемого всплывающего windows

    Уменьшить размер файла pdf

    Любой способ заставить панель задач Windows спрятаться (если в режиме «автоматического скрытия»)

    Изменение строкового литерала

    Как я могу анализировать файл .hprof?

    Как мне написать: «если typeclass a, то a также является экземпляром b по этому определению».

    Как указать корневой контекст в тегах в web.xml?

    Почему не указатели инициализируются с помощью NULL по умолчанию?

    Почему открытые поля быстрее, чем свойства?

    Производительность dynamic_cast?

    Как назначить зарегистрированного пользователя в качестве значения по умолчанию для поля модели?

    Что означает эта критическая команда Bash?

    Связывание событий при использовании ngForTemplate в Angular 2

    Абсолютный путь и относительный путь

    Как отключить кнопку «Очистить данные» в «Информация о приложении» для «Управление приложением»

    Давайте будем гением компьютера.