Яка різниця між потоками та дейтаграмами в мережевому програмуванні?


131

Яка різниця між сокетами (потоком) від сокетами (дейтаграми)? Навіщо використовувати один над іншим?

Відповіді:


304

Давно я прочитав чудову аналогію для пояснення різниці між ними. Я не пам’ятаю, де я це прочитав, на жаль, я не можу почитати автора за ідею, але я так само додав багато власних знань до основної аналогії. Отже, ось що:

Потокова розетка подібна до телефонного дзвінка - одна сторона розміщує дзвінок, інша відповідає, ви привітаєтесь один з одним (SYN / ACK в TCP), а потім обмінюєтесь інформацією. Як тільки ви закінчите, ви прощаєтеся (FIN / ACK в TCP). Якщо одна сторона не почує прощання, вони зазвичай зателефонують іншій назад, оскільки це несподівана подія; зазвичай клієнт знову підключиться до сервера. Існує гарантія, що дані не надійдуть в іншому порядку, ніж ви їх надіслали, і є обґрунтована гарантія, що дані не будуть пошкоджені.

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

Таким чином, ви використовуєте гніздо потоку, коли важлива інформація про порядок та неушкодженість. Протоколи передачі файлів є хорошим прикладом тут. Ви не хочете завантажувати якийсь файл із його вмістом, випадковим чином перемішуватися та пошкодженим!

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

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

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


3
Просто чудово для включення деталей SYNACK.
LazerSharks

2
Цей приклад, або дуже подібний, з інтерфейсу програмування Linux. Видання 2010 року містить ці приклади на сторінках 1155 та 1159.
Джош

30

Розетка потоку:

  • Виділений & кінцевий канал між сервером і клієнтом.
  • Використовуйте протокол TCP для передачі даних.
  • Надійний і без втрат.
  • Дані надсилаються / отримуються в аналогічному порядку.
  • Довгий час для відновлення втрачених / помилкових даних

Розетка дейтаграми:

  • Не виділений & кінцевий канал між сервером і клієнтом.
  • Використовуйте UDP для передачі даних.
  • Не на 100% надійний і може втратити дані.
  • Дані, надіслані / отримані, можуть бути не однаковими.
  • Не турбуйтеся та не швидко повертайте втрачені / помилкові дані.

Чи не надсилаються дані в одному порядку (не просто "схожі")? тобто. не було б сенсу будувати механізм впорядкування пакетів у потоковій
сокетці

Пакети в потоковому зв’язку надсилаються та приймаються в "подібному" порядку в тому сенсі, що самі пакети НЕ гарантовано будуть доставлені приймаючому хосту в порядку, але TCP з'ясовує розбіжності, переставляючи пакети під час їх надходження та вимагаючи що-небудь що, здається, загубилося по дорозі.
Алехандро Бласко

Що має сенс. Можливо, просто видаліть це як різницю і покладіть його внизу (оскільки, якщо я правильно це розумію, якщо посилатися лише на порядок, з якого пакети надсилаються, в обох випадках порядок надсилання / отримання даних може бути не так само).
Меттью Д. Скоулфілд

@ Rick Точніше, сокети відомі як кінцеві точки, оскільки транспортні протоколи відповідають за доставку повідомлень до однієї або декількох кінцевих точок мережі.
Алехандро Бласко

0

Якщо це мережеве програмування, я думаю, що початок із сокетів було б гарним початком.
socket = ip + порт
є три типи
потоку сокетів (TCP, замовлення та доставка гарантовано, відсутність дублювання, відсутність меж довжини чи знаків для даних, орієнтована на з'єднання, надійна, паралельність)
дейтаграма (UDP, на основі пакетів, без підключення, дейтаграма обмеження розміру, дані можуть бути втрачені або дублюватись, не гарантується замовлення, не надійно)
необроблені (прямий доступ до протоколів нижнього рівня IP, ICMP)
Я не бачу жодного суворого правила щодо типу транспортного протоколу щодо того, який сокет повинен використовувати який транспортний протокол і надійність не повинна помилятися, оскільки UDP є надійним у випадку активності обох кінців.
Надійність відноситься до більш схожої на надійність доставки, оскільки є перевірка номерів послідовностей, використовуючи TCP як транспортний протокол, яких не існує в UDP. Краще використовувати аналізатор мережевих протоколів, як wireshark tcpdump тощо, щоб побачити, що саме робить ваше програмне забезпечення; вид перевірки або злиття теорії на папері з вашою роботою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.