Відповіді:
Давно я прочитав чудову аналогію для пояснення різниці між ними. Я не пам’ятаю, де я це прочитав, на жаль, я не можу почитати автора за ідею, але я так само додав багато власних знань до основної аналогії. Отже, ось що:
Потокова розетка подібна до телефонного дзвінка - одна сторона розміщує дзвінок, інша відповідає, ви привітаєтесь один з одним (SYN / ACK в TCP), а потім обмінюєтесь інформацією. Як тільки ви закінчите, ви прощаєтеся (FIN / ACK в TCP). Якщо одна сторона не почує прощання, вони зазвичай зателефонують іншій назад, оскільки це несподівана подія; зазвичай клієнт знову підключиться до сервера. Існує гарантія, що дані не надійдуть в іншому порядку, ніж ви їх надіслали, і є обґрунтована гарантія, що дані не будуть пошкоджені.
Розетка дейтаграми - це як передача примітки в класі. Розгляньте випадок, коли ви не перебуваєте безпосередньо поруч із людиною, якій ви передаєте нотатку; примітка буде подорожувати від людини до людини. Він може не дістатися до місця призначення, і він може бути змінений часом, коли він потрапить. Якщо ви передаєте дві замітки одній і тій же особі, вони можуть надходити в порядку, яке ви не мали наміру, оскільки маршрут, який проходять через аудиторію, може бути не однаковим, одна людина може не передавати замітку так само швидко, як інша тощо. .
Таким чином, ви використовуєте гніздо потоку, коли важлива інформація про порядок та неушкодженість. Протоколи передачі файлів є хорошим прикладом тут. Ви не хочете завантажувати якийсь файл із його вмістом, випадковим чином перемішуватися та пошкодженим!
Ви використовуєте сокет дейтаграми, коли замовлення є менш важливим, ніж своєчасна доставка (думаю, VoIP або протоколи ігор), коли ви не хочете, щоб більший накладні витрати потоку (саме тому DNS - це насамперед протокол дейтаграми, щоб сервери могли відповідати на багато, багато запитів відразу дуже швидко) або коли ви не надто переймаєтеся, чи дані коли-небудь досягають місця призначення.
Для розширення справи VoIP / гри такі протоколи включають власний механізм упорядкування даних. Але якщо один пакет пошкоджений або загублений, ви не хочете чекати, коли протокол потоку (як правило, TCP) видає запит на повторне надсилання - вам потрібно швидко відновитись. TCP може зайняти до певної кількості хвилин, а для протоколів реального часу, таких як ігри чи VoIP, навіть три секунди можуть бути неприйнятними! Використання протоколу дейтаграми на зразок UDP дозволяє програмному забезпеченню відновитись після такої події надзвичайно швидко, просто ігноруючи втрачені дані або повторно запросивши їх раніше, ніж це зробить TCP.
VoIP є хорошим кандидатом для простого ігнорування втрачених даних - одна сторона просто почує короткий проміжок, подібний до того, що відбувається під час розмови з ким-небудь по мобільному телефону, коли у них поганий прийом. Ігрові протоколи часто трохи складніші, але вжиті дії зазвичай полягають у тому, щоб або ігнорувати відсутні дані (якщо згодом отримані дані перевершують втрачені дані), повторно вимагати відсутні дані або вимагати повного оновлення стану переконайтеся, що стан клієнта синхронізований із сервером.
Розетка потоку:
Розетка дейтаграми:
Якщо це мережеве програмування, я думаю, що початок із сокетів було б гарним початком.
socket = ip + порт
є три типи
потоку сокетів (TCP, замовлення та доставка гарантовано, відсутність дублювання, відсутність меж довжини чи знаків для даних, орієнтована на з'єднання, надійна, паралельність)
дейтаграма (UDP, на основі пакетів, без підключення, дейтаграма обмеження розміру, дані можуть бути втрачені або дублюватись, не гарантується замовлення, не надійно)
необроблені (прямий доступ до протоколів нижнього рівня IP, ICMP)
Я не бачу жодного суворого правила щодо типу транспортного протоколу щодо того, який сокет повинен використовувати який транспортний протокол і надійність не повинна помилятися, оскільки UDP є надійним у випадку активності обох кінців.
Надійність відноситься до більш схожої на надійність доставки, оскільки є перевірка номерів послідовностей, використовуючи TCP як транспортний протокол, яких не існує в UDP. Краще використовувати аналізатор мережевих протоколів, як wireshark tcpdump тощо, щоб побачити, що саме робить ваше програмне забезпечення; вид перевірки або злиття теорії на папері з вашою роботою.