9.9. UDP – відправ пакет і сподівайся на краще¶
UDP, Протокол датаграм користувача, є простішим із двох сервісів транспортного рівня. Кожне надсилання через UDP – це одна датаграма: самодостатній фрагмент байтів, адресований до IP та порту, відправлений у мережу самостійно. Протокол доставляє її, якщо може; якщо ні – не повторює спробу, не попереджає відправника і не зберігає жодного порядку між датаграмами.
9.9.1. Що UDP додає до IP¶
UDP – тонкий шар поверх IP. Він додає три речі до сирої IP-доставки:
Номери портів на обох кінцях, щоб датаграма могла бути доставлена потрібній програмі на хості-отримувачі, а не просто хосту (див. Порти).
Поле довжини, щоб отримувач точно знав, скільки байтів корисного навантаження зчитувати.
Невелика контрольна сума заголовка і корисного навантаження, щоб отримувач міг виявити пошкоджену датаграму і відкинути її.
Ось і все. Все інше, що IP робив або не робив, UDP зберігає. Датаграми не повторюються. Вони можуть надходити не по черзі. Вони можуть дублюватися через особливості нижнього рівня мережі. Вони можуть бути тихо скинуті, якщо мережа перевантажена, буфер хоста-отримувача переповнений або один із проміжних маршрутизаторів вирішить так зробити.
Кожна UDP-датаграма надсилається незалежно. Якщо одна загублена під час передачі, нічого не повідомляє ні відправника, ні отримувача – пропуск є беззвучним.¶
9.9.2. Навіщо це взагалі використовувати¶
Якщо UDP такий ненадійний, навіщо він взагалі існує? Три причини.
Швидкість і мінімальні накладні витрати. Надсилання через UDP – це один пакет назовні: без рукостискання, без підтверджень, без стану з’єднання для підтримки. Затримка та витрати на пропускну здатність – мінімальні.
Незалежні повідомлення. Деякий трафік – це потік оновлень стану, де кожне повідомлення є свіжим знімком, а застаріле – марне. Камера, яка щосекунди публікує «я ще живий, ось моє поточне показання», піклується про доставку кожного нового показання, а не про повтор тих, що загубились.
Мультикаст. Одну UDP-датаграму можна надіслати одразу багатьом отримувачам. (TCP це не може; кожне TCP-з’єднання – між рівно двома кінцевими точками.) Корисно для виявлення сервісів, телеметрії до багатьох слухачів, потокового відео.
Де мережа хороша і толерантність відправника до втрат висока, UDP – правильний вибір. Де необхідна гарантія доставки та порядку, UDP потребує додаткового рівня надійності зверху, або застосунок повинен просто використовувати TCP.
9.9.3. Коли не варто використовувати¶
Протилежне також варто назвати явно. UDP – невірний вибір, коли:
Важливий кожен байт. Конфігураційні дані, оновлення коду, підписані транзакції – будь-який випадок, де відсутній байт робить результат хибним.
Важливий порядок. UDP-датаграма 2 може прийти раніше датаграми 1.
Повідомлення велике. Великі корисні навантаження потрібно розбивати на менші датаграми самим застосунком; транспортний рівень цього не зробить. Якщо будь-яка частина загублена – все повідомлення неповне.
Якщо будь-яке з цього стосується вашого випадку – використовуйте TCP.
9.9.4. Конкретні приклади на камері¶
Приклади UDP-трафіку на стороні камери на практиці:
Виявлення. Камера при запуску розсилає в локальну мережу датаграму «хто тут є»; інші пристрої відповідають.
Телеметрія. Раз на секунду камера надсилає невелику датаграму зі своїми поточними показаннями датчиків колектору. Втрата окремого зразка не важлива, оскільки наступний надійде за секунду.
Синхронізація часу. NTP, протокол мережевого часу, працює через UDP. Клієнт надсилає невеликий запит, сервер відповідає поточним часом; якщо відповідь загублена, клієнт просто запитає знову пізніше.
DNS-запити. Запит до мережі «якому IP відповідає це ім’я?» виконується через UDP. (Розглянуто в Імена та DNS.)
Python API для надсилання і отримання датаграм описано на сторінці UDP-сокети, після того як решта розповіді про транспортний рівень буде розкрита.