Для загального обміну повідомленнями протоколу, який може допустити деякі втрати пакету. Наскільки більш ефективним є UDP над TCP?
Для загального обміну повідомленнями протоколу, який може допустити деякі втрати пакету. Наскільки більш ефективним є UDP над TCP?
Відповіді:
UDP швидше, ніж TCP, і проста причина полягає в тому, що його неіснуючий пакет підтвердження (ACK), який дозволяє безперервний потік пакетів, замість TCP, який розпізнає набір пакетів, обчислюється за допомогою розміру вікна TCP та часу туди-назад. (RTT).
Для отримання додаткової інформації я рекомендую просте, але дуже зрозуміле пояснення Skullbox (TCP vs. UDP)
Люди кажуть, що головне, що дає вам TCP, - це надійність. Але це не зовсім так. Найголовніше, що надає TCP, - це контроль перевантаженості: ви можете запустити 100 TCP-з'єднань через DSL-з'єднання, що відбувається з максимальною швидкістю, і всі 100 з'єднань будуть продуктивними, оскільки всі вони «відчувають» наявну пропускну здатність. Спробуйте це зі 100 різними програмами UDP, усі пакети, що проштовхуються, настільки швидко, наскільки вони можуть пройти, і подивіться, як добре у вас справи.
У більш широкому масштабі ця поведінка TCP - це те, що перешкоджає Інтернету не замикатися на "краху перевантажень".
Те, що має тенденцію підштовхувати програми до UDP:
Семантика групової доставки: надійну доставку групі людей можна зробити набагато ефективніше, ніж підтвердження TCP «точка-точка».
Доставка поза замовленням: у багатьох програмах, поки ви отримаєте всі дані, вам не байдуже, яке замовлення воно надходить; ви можете зменшити затримку на рівні програми, прийнявши блок поза замовлення.
Недоброзичливість: на LAN-вечірці ви можете не хвилюватися, чи ваш веб-браузер працює добре, доки ви швидко оновлюєте оновлення в мережі так швидко, наскільки це можливо.
Але навіть якщо ви дбаєте про продуктивність, ви, ймовірно, не хочете користуватися UDP:
Ви зараз на гаку надійності, і багато речей, які ви можете зробити для впровадження надійності, можуть бути повільнішими, ніж те, що вже робить TCP.
Тепер ви непривітні для мережі, що може спричинити проблеми в умовах спільного використання.
Найголовніше, що брандмауери заблокують вас.
Ви можете потенційно подолати деякі проблеми з продуктивністю та затримкою TCP, "з'єднавши" декілька з'єднань TCP разом; iSCSI робить це для того, щоб увімкнути контроль заторів у локальних мережах, але ви також можете це зробити, щоб створити "терміновий" канал повідомлень із низькою затримкою (поведінка TCP "НЕПРАВНО" повністю порушена).
listen
-> accept
-> стан клієнта, природно, не залежить від інших клієнтів). Обробка декількох з'єднань від одного клієнта, зокрема, стає загальним за допомогою UDP. І справа на користь UDP полягає в тому, що стеки UDP дуже легко здійснити, що є величезним плюсом у вбудованих системах (мікроконтролери, FPGA тощо), зокрема реалізація TCP для FPGA - це те, що ви просто хочете придбати у когось іншого і не думати про).
У деяких додатках TCP швидше (краща пропускна здатність), ніж UDP.
Це випадок, коли ви робите безліч малих записів відносно розміру MTU. Наприклад, я прочитав експеримент, в якому по Ethernet (1500 байт MTU) надсилався потік з 300 байтових пакетів, а TCP на 50% швидше, ніж UDP .
Причина полягає в тому, що TCP намагатиметься запам'ятовувати дані та заповнювати повний мережевий сегмент, тим самим ефективніше використовуючи доступну пропускну здатність.
UDP, з іншого боку, негайно ставить пакет на дріт, тим самим замикаючи мережу з великою кількістю маленьких пакетів.
Ви, ймовірно, не повинні використовувати UDP, якщо у вас немає конкретної причини для цього. Тим більше, що ви можете надати TCP таку ж затримку, що і UDP, відключивши алгоритм Nagle (наприклад, якщо ви передаєте дані датчика в реальному часі і не переживаєте про перенапруження мережі з невеликими пакетами).
при толерантності до втрат
Ви маєте на увазі "з толерантністю до втрат"?
В основному, UDP не є "стійким до втрат". Ви можете відправити 100 пакетів комусь, і вони можуть отримати лише 95 з цих пакетів, а деякі можуть бути в неправильному порядку.
Для таких речей, як потокове відео та багатокористувацькі ігри, де краще пропустити пакет, ніж затримувати всі інші пакети за ним, це очевидний вибір
Однак для більшості інших речей важливе значення має відсутність або "переставлений" пакет. Вам доведеться написати якийсь додатковий код, щоб запустити поверх UDP, щоб повторити спробу, якщо щось пропустили, і навести правильний порядок. Це додало б невелику частину накладних витрат у певних місцях.
На щастя, деякі дуже розумні люди зробили це, і вони назвали це TCP.
Подумайте про це так: Якщо пакет пропаде, ви просто отримаєте наступний пакет якомога швидше та продовжуйте (використовуйте UDP), або вам справді потрібні ці відсутні дані (використовуйте TCP). Накладні витрати не матимуть значення, якщо ви не справжній сценарій кращого випадку.
Який протокол працює краще (з точки зору пропускної здатності) - UDP або TCP - дійсно залежить від характеристик мережі та мережевого трафіку. Роберт С. Барнс, наприклад, вказує на сценарій, коли TCP працює краще (невеликі за розмірами записи). Тепер розглянемо сценарій, коли мережа перевантажена і має трафік TCP та UDP. Відправники в мережі, яка використовує TCP, відчують "перевантаженість" та зменшать швидкість надсилання. Однак UDP не має механізмів уникнення перевантажень або контролю заторів, і відправники, що використовують UDP, продовжують завантажувати дані з тією ж швидкістю. Поступово відправники TCP знижуватимуть швидкість надсилання до мінімального рівня, і якщо UDP-відправники мають достатньо даних для передачі по мережі, вони б прискорили більшість доступних пропускних можливостей. Тож у такому випадку Передавачі UDP матимуть більшу пропускну здатність, оскільки вони отримують більший пиріг пропускної здатності мережі. Насправді це активна тема дослідження - Як покращити пропускну здатність TCP за наявності трафіку UDP. Мені відомий один із способів використання програм TCP, які можуть покращити пропускну здатність, відкриваючи декілька з'єднань TCP. Таким чином, навіть незважаючи на те, що пропускна здатність кожного TCP-з'єднання може бути обмежена, загальна сума пропускної здатності всіх TCP-з'єднань може бути більшою, ніж пропускна здатність для програми, що використовує UDP.
Якщо говорити про те, "що швидше", - принаймні два дуже різні аспекти: пропускна здатність та затримка.
Якщо говорити про пропускну здатність - контроль потоку 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/ (обов'язково читайте коментарі теж (!)).
Кожне з'єднання TCP вимагає початкового рукостискання перед передачею даних. Також заголовок TCP містить безліч накладних витрат, призначених для різних сигналів та виявлення доставки повідомлень. Для обміну повідомленнями, UDP, ймовірно, буде достатньо, якщо невеликий шанс виходу з ладу прийнятний. Якщо квитанцію потрібно підтвердити, TCP - найкращий варіант.
@Andrew , прошу відрізнятися. UDP - це вибір у деяких видах застосування через вимоги до продуктивності. Класичним прикладом є відеоконференції. Цей вид програми не дуже добре реагує на контроль TCP.
Інший аспект, який слід взяти до уваги, це якщо вам буде потрібно багатоадресна передача. Якщо так, використовуйте UDP.
Я просто проясню все. TCP / UDP - це два автомобілі, які рухаються по дорозі. припустимо, що дорожні знаки та перешкоди - помилки TCP піклується про дорожні знаки, поважає все навколо. Повільне водіння, тому що з автомобілем може трапитися щось. Поки UDP просто з'їжджає, повна швидкість не поважає вуличні знаки. Нічого, шалений водій. У UDP немає відновлення помилок. Якщо є перешкода, вона просто зіткнеться з нею та продовжить. У той час як TCP гарантує, що всі пакети відправлені та отримані ідеально, помилок немає, тож автомобіль просто проходить перешкоди, не стикаючись. Я сподіваюся, що це хороший приклад для розуміння, чому UDP віддається перевагою в іграх. Ігрові потрібна швидкість. TCP надається перед завантаженням, або завантажені файли можуть бути пошкоджені.
UDP трохи швидше, на мій досвід, але не набагато. Вибір слід робити не на продуктивність, а на вміст повідомлення та техніку стиснення.
Якщо це протокол з обміном повідомленнями , я б припустив, що дуже легкий показник продуктивності, який ви приймаєте з TCP, більш ніж вартий. Вам надається зв’язок між двома кінцевими точками, які дадуть вам все необхідне. Не намагайтеся виготовляти власний надійний двосторонній протокол поверх UDP, якщо ви справді не дуже впевнені в тому, що ви робите.
Майте на увазі, що TCP зазвичай зберігає кілька повідомлень на дроті. Якщо ви хочете реалізувати це в UDP, у вас буде досить багато роботи, якщо ви хочете зробити це надійно. Ваше рішення буде або менш надійним, менш швидким або неймовірним обсягом роботи. Є дійсні додатки UDP, але якщо ви задаєте це питання, ваше, мабуть, це не так.
Проведено певну роботу, щоб програміст мав переваги обох світів.
SCTP
Це незалежний протолол транспортного рівня, але його можна використовувати як бібліотеку, що забезпечує додатковий рівень над UDP. Основна одиниця зв'язку - це повідомлення (відображене в одному або декількох пакетах UDP). Вбудований контроль перевантаженості. У протоколі є ввімкнути ручки та подвійні ручки
якщо що-небудь із цього потрібно для вашої конкретної програми.
Одне питання з цим полягає в тому, що встановлення з'єднання є складним (і тому повільним процесом)
Інші подібні речі
Ще одна схожа власна експериментальна річ
Це також намагається покращити потрійне рукостискання TCP та змінити систему перевантаженості, щоб краще боротися зі швидкими лініями.
Безглуздо говорити про TCP або UDP без врахування стану мережі. Якщо мережа між двома точками має дуже високу якість, UDP абсолютно швидший, ніж TCP, але в іншому випадку, наприклад, мережі GPRS, TCP може бути швидшим і надійнішим, ніж UDP.
Налаштування мережі має вирішальне значення для будь-яких вимірювань. Це має велике значення, якщо ви спілкуєтесь через розетки на локальній машині або з іншого кінця світу.
Три речі, які я хочу додати до дискусії: