UDP проти TCP, наскільки швидше? [зачинено]


194

Для загального обміну повідомленнями протоколу, який може допустити деякі втрати пакету. Наскільки більш ефективним є UDP над TCP?


Ви також можете додати тег "tcp", оскільки питання стосується і TCP.
Крістіан Цюпіту

5
Що означає "загальний обмін повідомленнями протоколу"? У питанні потрібно уточнити, що таке ефективність. Чи хочемо ми менше затримки для невеликого повідомлення? Або ми хочемо збільшити пропускну здатність для безперервного потоку даних?
Йохан Буле

Tcp має більше кращих функцій, ніж UDP, крім швидкості.
RAJKUMAR NAGARETHINAM

3
Питання швидкості TCP проти UDP суперечить. Питання у вашому заголовку насправді не відповідає тій частині питання. І пакети TCP, і UDP рухаються з однаковою швидкістю на одному і тому ж носії.
Рон Мопін

Відповіді:


86

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

Для отримання додаткової інформації я рекомендую просте, але дуже зрозуміле пояснення Skullbox (TCP vs. UDP)


19
Дійсно багато випадків, коли TCP насправді швидше, ніж UDP. Дивіться мою відповідь нижче.
Роберт С. Барнс

2
Що швидше, повністю залежить від особливостей руху.

4
Хоча відповідь може бути правильною, вона не відповідає на запитання, і повторює знання, згадані в інших місцях, неодноразово. Також не зазначає, що надійні методи UDP за допомогою ACK можуть бути помітно швидшими, ніж TCP.
Елліот Вудс

268

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

У більш широкому масштабі ця поведінка TCP - це те, що перешкоджає Інтернету не замикатися на "краху перевантажень".

Те, що має тенденцію підштовхувати програми до UDP:

  • Семантика групової доставки: надійну доставку групі людей можна зробити набагато ефективніше, ніж підтвердження TCP «точка-точка».

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

  • Недоброзичливість: на LAN-вечірці ви можете не хвилюватися, чи ваш веб-браузер працює добре, доки ви швидко оновлюєте оновлення в мережі так швидко, наскільки це можливо.

Але навіть якщо ви дбаєте про продуктивність, ви, ймовірно, не хочете користуватися UDP:

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

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

  • Найголовніше, що брандмауери заблокують вас.

Ви можете потенційно подолати деякі проблеми з продуктивністю та затримкою TCP, "з'єднавши" декілька з'єднань TCP разом; iSCSI робить це для того, щоб увімкнути контроль заторів у локальних мережах, але ви також можете це зробити, щоб створити "терміновий" канал повідомлень із низькою затримкою (поведінка TCP "НЕПРАВНО" повністю порушена).


18
Хороша відповідь, я б навіть підходив до більш загального "контролю потоку" (на відміну від контролю перевантаженості, який є підмножиною контролю потоку). Не лише кілька TCP-з'єднань можуть спільно використовувати одне посилання, але це також запобігає пересипанню буфера приймача, якщо вони зупиняють обробку вхідних даних з будь-якої причини.
Алекс Б

1
@AaronLS: втрата пакетів і RTT (час зворотного переходу ) збільшується (що може розглядатися як проксі для затримки в черзі ) є / можуть бути (наприклад: мережі WiFi можуть втрачати пакети без реального перевантаження, обманюючи деякі алгоритми управління перегрузкою TCP, щоб уникнути перевантажень) показники перевантаженості.
ніндзя

2
UDP - це ублюдок, з яким треба боротися ... Я вже згорів на цьому. Що б я не робив, я не можу знайти баланс продуктивності, затримки, пропускної здатності, надійності. Чудово підходить для реального часу, таких як таймери ... але я працюю над заміною TCP за допомогою UDP та Forward Error Correction, і це набагато важче, ніж я думав, що це буде. Контроль заторів. Універсальна система, яка працює в мережах 1 Гб і бездротових мережах, все ж є витвором мистецтва. Я відчуваю, що намагаюся зібрати пакети, завантажені в рушницю.
Джейсон Нельсон

1
Однак на користь TCP є те, що вона по своїй суті орієнтована на з'єднання, що значно спрощує логіку обробки клієнта програми ( listen-> accept-> стан клієнта, природно, не залежить від інших клієнтів). Обробка декількох з'єднань від одного клієнта, зокрема, стає загальним за допомогою UDP. І справа на користь UDP полягає в тому, що стеки UDP дуже легко здійснити, що є величезним плюсом у вбудованих системах (мікроконтролери, FPGA тощо), зокрема реалізація TCP для FPGA - це те, що ви просто хочете придбати у когось іншого і не думати про).
Джейсон C

1
Це все стоїть лише за умови, що ми зацікавлені в наданні значних даних (не надто піклуючись про затримку). У досить багатьох додатках (іграх / VoIP) ситуація кардинально відрізняється: ми маємо дуже малий об'єм даних, але нас цікавлять затримки. саме на цю просту річ припадає 99% легітимного використання UDP. І кілька ниткоподібних: (а) групова доставка НЕ ​​працює через Інтернет (і навряд чи коли-небудь буде), тож це лише область Інтранету; (b) за Google, лише 8-9% населення Інтернету має проблеми з UDP; (c) "мережа недружня" не застосовується до потоку з фіксованою швидкістю
Заєць із помилками

93

У деяких додатках TCP швидше (краща пропускна здатність), ніж UDP.

Це випадок, коли ви робите безліч малих записів відносно розміру MTU. Наприклад, я прочитав експеримент, в якому по Ethernet (1500 байт MTU) надсилався потік з 300 байтових пакетів, а TCP на 50% швидше, ніж UDP .

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

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

Ви, ймовірно, не повинні використовувати UDP, якщо у вас немає конкретної причини для цього. Тим більше, що ви можете надати TCP таку ж затримку, що і UDP, відключивши алгоритм Nagle (наприклад, якщо ви передаєте дані датчика в реальному часі і не переживаєте про перенапруження мережі з невеликими пакетами).


3
Я фактично зробив орієнтири для цього. Я надсилав пакети розмірами, які підтримували UDP, не викидаючи винятків (на Java), і TCP був набагато швидшим. Я б здогадався, багато оптимізації ОС, драйверів та апаратних засобів також є частиною цього.
Чарлі

14
@Myforwik: По-перше, це не визначена реалізація, це частина протоколу TCP. Це називається алгоритмом Nagle. Це допомагає запобігти тому, що зазвичай називають синдромом дурного вікна. Знайдіть обидва терміни. По-друге, не існує концепції пакетів від pov. TCP. Нарешті, книга "Ефективне програмування TCP / IP" присвячує цілу главу цій темі та кілька інших розділів пов'язаній темі того, як знати, коли використовувати TCP проти UDP. Я висуваю цю ситуацію (що насправді є досить поширеною), оскільки ОП задало загальне запитання, і це одна з багатьох можливих відповідей.
Роберт С. Барнс

46
@Myforwik. Пропонуючи моронізм в інших, спробуйте усвідомити, що всі ми маємо прогалини у своїх знаннях - ви включили. Зрештою, це форум для обміну знаннями. В основному всі стрільці від першої особи використовують UDP, і вони рідко надсилають пакети в будь-які розміри, близькі, як MTU. Якщо ви хочете піти і запропонувати Джону Кармаку, який він дебіл придумав такий підхід, спочатку я б радив вам всебічно навчитись цьому. 15 років, а галузевий гідний високоефективний мережевий код не лежить і не вмирає, тому що ви вважаєте його "придумливим".
Інженер

2
" Я читав експеримент, в якому по Ethernet (1500 байт MTU) надсилався потік з 300 байтових пакетів, а TCP на 50% швидше, ніж UDP ". - Чи можете ви зв’язати цей експеримент?
Левіафан

3
@Leviathan Це у книзі Ефективне програмування TCP / IP.
Роберт С. Барнс

31

при толерантності до втрат

Ви маєте на увазі "з толерантністю до втрат"?

В основному, UDP не є "стійким до втрат". Ви можете відправити 100 пакетів комусь, і вони можуть отримати лише 95 з цих пакетів, а деякі можуть бути в неправильному порядку.

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

Однак для більшості інших речей важливе значення має відсутність або "переставлений" пакет. Вам доведеться написати якийсь додатковий код, щоб запустити поверх UDP, щоб повторити спробу, якщо щось пропустили, і навести правильний порядок. Це додало б невелику частину накладних витрат у певних місцях.

На щастя, деякі дуже розумні люди зробили це, і вони назвали це TCP.

Подумайте про це так: Якщо пакет пропаде, ви просто отримаєте наступний пакет якомога швидше та продовжуйте (використовуйте UDP), або вам справді потрібні ці відсутні дані (використовуйте TCP). Накладні витрати не матимуть значення, якщо ви не справжній сценарій кращого випадку.


1
5 пакетів із 100? Це досить багато. Я думаю, це просто приклад. Питання: в реальній ситуації скільки пакетів можна втратити? Тому що якщо це, наприклад, 2 з 10000 (плюс мінус 1), я б не турбувався про це.
фрік

1
@freakish, так, це був просто приклад. Фактична кількість втрат пакета залежить від вашого з'єднання, висхідних мереж і т. Д. Я грав у багато онлайн-ігор, і я виявив би, що якби тільки я використовував Інтернет-з'єднання, я не отримав би втрати пакету, але як тільки я запустив фонове завантаження, я почав би отримувати деякі (можливо, 10% -20%). Це було близько 5 років тому, і швидше підключення до Інтернету може допомогти.
Оріон Едвардс

2
Інтернет-маршрутизатори скидають udp перед tcp
user1496062

19

Який протокол працює краще (з точки зору пропускної здатності) - UDP або TCP - дійсно залежить від характеристик мережі та мережевого трафіку. Роберт С. Барнс, наприклад, вказує на сценарій, коли TCP працює краще (невеликі за розмірами записи). Тепер розглянемо сценарій, коли мережа перевантажена і має трафік TCP та UDP. Відправники в мережі, яка використовує TCP, відчують "перевантаженість" та зменшать швидкість надсилання. Однак UDP не має механізмів уникнення перевантажень або контролю заторів, і відправники, що використовують UDP, продовжують завантажувати дані з тією ж швидкістю. Поступово відправники TCP знижуватимуть швидкість надсилання до мінімального рівня, і якщо UDP-відправники мають достатньо даних для передачі по мережі, вони б прискорили більшість доступних пропускних можливостей. Тож у такому випадку Передавачі UDP матимуть більшу пропускну здатність, оскільки вони отримують більший пиріг пропускної здатності мережі. Насправді це активна тема дослідження - Як покращити пропускну здатність TCP за наявності трафіку UDP. Мені відомий один із способів використання програм TCP, які можуть покращити пропускну здатність, відкриваючи декілька з'єднань TCP. Таким чином, навіть незважаючи на те, що пропускна здатність кожного TCP-з'єднання може бути обмежена, загальна сума пропускної здатності всіх TCP-з'єднань може бути більшою, ніж пропускна здатність для програми, що використовує UDP.


2
Це неправильно, маршрутизатори знизять UDP перед TCP. На спільному проводі ви можете заглушити UDP, але те, що, швидше за все, трапиться в умовах надмірної поставки, залежить від технології, але її UDP досить легко погіршиться до моменту, коли дуже мало надсилаються лише зіткнення.
користувач1496062

Мені подобається ваше пояснення, але не дотримуйтесь балів. Якщо UDP-з'єднання можуть отримати всі властивості (якщо пропускна здатність низька або дані високі), у цьому випадку ваша програма, якщо використання TCP, в основному є заручником для тих, хто використовує UDP. Якщо всі програми використовують TCP, то вони «добре грають» між собою. Тоді навіщо в першу чергу допускати UDP на rauter?
Ігор Чордаш

@PSIXO: Ну, TCP і UDP служать різним вимогам програми, тому обидва використовуються програмами. Наслідок вашої пропозиції полягає в тому, що ми повинні мати різну мережеву інфраструктуру для TCP і UDP-трафіку - дорога пропозиція, і, звичайно, не те, що ми можемо зробити зараз, особливо з усіма вже зробленими інвестиціями. Ось чому дослідники зайняті пошуком альтернативних способів врівноваження конфлікту в «програмному забезпеченні».
gjain

Ну, по суті, так, наявність двох інфраструктур було б ідеальним рішенням, але, на жаль, це неправдоподібно. Що я хотів сказати своїм коментарем, це те, що ви завищуєте потрапляння UDP до TCP, оскільки якби це був високий фактор, люди просто відключили UDP на маршрутизаторі (як це іноді в компаніях), якщо їм потрібен TCP для швидкої роботи. Майте на увазі також, що пакети UDP мають більший шанс потрапляння до TCP. Щодо решти фактів у вашій відповіді я повністю згоден і вважаю це досить корисним, але я просто думаю, що ви переоцінюєте певні наслідки.
Ігор Чордаш

18

Якщо говорити про те, "що швидше", - принаймні два дуже різні аспекти: пропускна здатність та затримка.

Якщо говорити про пропускну здатність - контроль потоку TCP (як зазначено в інших відповідях), є надзвичайно важливим і робити все, що можна порівняти з UDP, хоча це, безумовно, можливо, був би великий головний біль (tm). Як результат - використання UDP, коли вам потрібна пропускна здатність , рідко кваліфікується як хороша ідея (якщо ви не хочете отримати несправедливу перевагу перед TCP).

Однак якщо говорити про затримки - вся справа зовсім інша. У той час як за відсутності втрати пакетів TCP та UDP поводяться надзвичайно схоже (будь-які відмінності, якщо такі є, маргінальні) - після втрати пакета весь малюнок різко змінюється.

Після будь-якої втрати пакету TCP чекатиме повторної передачі щонайменше 200 мс (1 сек на абзац 2.4 RFC6298, але практичні сучасні реалізації, як правило, скорочують її до 200 мс). Більше того, із TCP, навіть ті пакети, які дісталися до хостового пункту призначення, не будуть доставлені у вашу програму, поки не буде отриманий відсутній пакет (тобто, весь зв’язок затримається на ~ 200 мс) - BTW, цей ефект, відомий як Head-of Блокування рядків, притаманне всім надійним упорядкованим потокам, будь то TCP або надійним + замовленим UDP. Щоб зробити ще гірше - якщо повторно переданий пакет також буде втрачений, тоді ми будемо говорити про затримку ~ 600 мс (через так звану експоненціальну мітку, 1-а повторна передача - 200 мс, а друга - 200 * 2 = 400 мс). Якщо наш канал має 1% втрати пакетів (що непогано за сьогоднішніми стандартами), і у нас гра з 20 оновленнями в секунду - такі 600 затримок трапляться в середньому кожні 8 хвилин. А оскільки 600 мс більш ніж достатньо, щоб вас вбили в швидкій грі - ну, це дуже погано для ігрового процесу. Саме ці ефекти саме тому, що гамедеви часто віддають перевагу UDP перед TCP.

Однак, використовуючи UDP для зменшення затримок - важливо усвідомити, що просто "використання UDP" недостатньо для значного поліпшення затримки, все стосується того, ЯК ви використовуєте UDP. Зокрема, хоча бібліотеки RUDP зазвичай уникають цього "експоненціального переходу" та використовують коротший час повторної передачі - якщо вони використовуються як "надійний упорядкований" потік, їм все одно доведеться страждати від блокування прямого рядка (так у випадку подвійного втрата пакету, замість цього 600мс ми отримаємо близько 1,5 * 2 * RTT - або для досить непоганих RTT 80мс, це затримка ~ 250 мс, що є поліпшенням, але все ж можна зробити краще). З іншого боку, якщо ви використовуєте методи, обговорені в http://gafferongames.com/networked-physics/snapshot-compression/ та / або http: // ithare. , можливо виключити блокування Head-of-Line повністю (тому для подвійної втрати пакету для гри з 20 оновленнями в секунду затримка становитиме 100 мс незалежно від RTT).

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


13

Кожне з'єднання TCP вимагає початкового рукостискання перед передачею даних. Також заголовок TCP містить безліч накладних витрат, призначених для різних сигналів та виявлення доставки повідомлень. Для обміну повідомленнями, UDP, ймовірно, буде достатньо, якщо невеликий шанс виходу з ладу прийнятний. Якщо квитанцію потрібно підтвердити, TCP - найкращий варіант.


Невеликий шанс виходу з ладу та обмеження розміру пакету.

11

@Andrew , прошу відрізнятися. UDP - це вибір у деяких видах застосування через вимоги до продуктивності. Класичним прикладом є відеоконференції. Цей вид програми не дуже добре реагує на контроль TCP.

Інший аспект, який слід взяти до уваги, це якщо вам буде потрібно багатоадресна передача. Якщо так, використовуйте UDP.


8
UDP також використовується, тому що якщо ви пропустили пакет або два, то, мабуть, все одно пізно, і вам, мабуть, найкраще просто пропустити його та рухатися далі, щоб ви могли продовжувати перегляд. Невеликий блиск у відео через деякі скинуті пакети набагато краще, ніж через тони заторів.
Kibbee

1
Правильно - мульти кастинг мережі є досить рідкісною більшістю маршрутизаторів блокують її.
користувач1496062

8

Якщо вам потрібно швидко вибухнути повідомлення по мережі між двома IP-адресами, про які ще не говорили, то UDP збирається приїхати щонайменше в 3 рази швидше, як правило, в 5 разів швидше.


1
Будь-які посилання?
Джерард

8

Я просто проясню все. TCP / UDP - це два автомобілі, які рухаються по дорозі. припустимо, що дорожні знаки та перешкоди - помилки TCP піклується про дорожні знаки, поважає все навколо. Повільне водіння, тому що з автомобілем може трапитися щось. Поки UDP просто з'їжджає, повна швидкість не поважає вуличні знаки. Нічого, шалений водій. У UDP немає відновлення помилок. Якщо є перешкода, вона просто зіткнеться з нею та продовжить. У той час як TCP гарантує, що всі пакети відправлені та отримані ідеально, помилок немає, тож автомобіль просто проходить перешкоди, не стикаючись. Я сподіваюся, що це хороший приклад для розуміння, чому UDP віддається перевагою в іграх. Ігрові потрібна швидкість. TCP надається перед завантаженням, або завантажені файли можуть бути пошкоджені.


7

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

Якщо це протокол з обміном повідомленнями , я б припустив, що дуже легкий показник продуктивності, який ви приймаєте з TCP, більш ніж вартий. Вам надається зв’язок між двома кінцевими точками, які дадуть вам все необхідне. Не намагайтеся виготовляти власний надійний двосторонній протокол поверх UDP, якщо ви справді не дуже впевнені в тому, що ви робите.


5

Майте на увазі, що TCP зазвичай зберігає кілька повідомлень на дроті. Якщо ви хочете реалізувати це в UDP, у вас буде досить багато роботи, якщо ви хочете зробити це надійно. Ваше рішення буде або менш надійним, менш швидким або неймовірним обсягом роботи. Є дійсні додатки UDP, але якщо ви задаєте це питання, ваше, мабуть, це не так.


5

Проведено певну роботу, щоб програміст мав переваги обох світів.

SCTP

Це незалежний протолол транспортного рівня, але його можна використовувати як бібліотеку, що забезпечує додатковий рівень над UDP. Основна одиниця зв'язку - це повідомлення (відображене в одному або декількох пакетах UDP). Вбудований контроль перевантаженості. У протоколі є ввімкнути ручки та подвійні ручки

  • для того, щоб доставити повідомлення
  • автоматична повторна передача втрачених повідомлень із визначеними користувачем параметрами

якщо що-небудь із цього потрібно для вашої конкретної програми.

Одне питання з цим полягає в тому, що встановлення з'єднання є складним (і тому повільним процесом)

Інші подібні речі

Ще одна схожа власна експериментальна річ

Це також намагається покращити потрійне рукостискання TCP та змінити систему перевантаженості, щоб краще боротися зі швидкими лініями.


3

Безглуздо говорити про TCP або UDP без врахування стану мережі. Якщо мережа між двома точками має дуже високу якість, UDP абсолютно швидший, ніж TCP, але в іншому випадку, наприклад, мережі GPRS, TCP може бути швидшим і надійнішим, ніж UDP.


1

Налаштування мережі має вирішальне значення для будь-яких вимірювань. Це має велике значення, якщо ви спілкуєтесь через розетки на локальній машині або з іншого кінця світу.

Три речі, які я хочу додати до дискусії:

  1. Ви можете знайти тут дуже гарну статтю про TCP проти UDP в контексті розвитку гри.
  2. Крім того, iperf ( jperf посилити iperf за допомогою GUI) - це дуже приємний інструмент для відповіді на ваше запитання самостійно шляхом вимірювання.
  3. Я реалізував орієнтир в Python (див. Це питання ТА ). В середньому 10 ^ 6 ітерацій різниця для надсилання 8 байтів становить приблизно 1-2 мікросекунди для UDP.

1
Щоб зробити орієнтир релевантним Інтернету, вам потрібно повторно запустити його за допомогою симулятора втрат пакетів, наприклад, netem. Якщо робити це правильно (і з імітацією RTT, скажімо, 100 мс та імітацією втрат пакету на 1%), результати різко відрізнятимуться. Коротше кажучи - хоча затримки TCP та UDP справді однакові для втрати нульових пакетів, вони починають відрізнятися LOT для кожного втраченого пакету.
Заєць без клопів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.