UDP (User Datagram Protocol) — протокол передачі даних без встановлення з'єднання, що працює поверх IP і забезпечує мінімальну затримку при відправці дейтаграм. На відміну від TCP, UDP не гарантує доставку, порядок пакетів або захист від дублювання. За даними IETF RFC 768 (2024), UDP обробляє понад 40% світового інтернет-трафіку за рахунок відеодзвінків, стрімінгу та DNS-запитів.
Головне
UDP (User Datagram Protocol) — один із ключових протоколів транспортного рівня моделі TCP/IP, розроблений Девідом Рідом у 1980 році. Він надає мінімальний механізм передачі даних: додаток відправляє дейтаграму, і протокол не відстежує, чи дійшла вона до отримувача.
Заголовок UDP складається лише з чотирьох полів: порт джерела, порт призначення, довжина та контрольна сума. Кожне поле займає 2 байти, тому загальний розмір заголовка — 8 байт. Для порівняння, заголовок TCP без опцій займає 20 байт, а з опціями — до 60 байт.
Протокол не підтримує фрагментацію на своєму рівні — якщо дейтаграма перевищує MTU (Maximum Transmission Unit), вона фрагментується на рівні IP. При втраті одного фрагмента відкидається вся дейтаграма, оскільки UDP не вміє запитувати повторну передачу окремих фрагментів. Розробники повинні контролювати розмір дейтаграми — для мобільних мереж MTU часто становить 1400 байт, тому максимальний розмір не повинен перевищувати це значення.
Додаток, що використовує UDP, створює сокет з типом SOCK_DGRAM, вказує порт і IP-адресу призначення та відправляє дейтаграму. Протокол додає мінімальний заголовок і передає пакет IP-рівню. Отримувач слухає свій порт і вилучає дані з прибулих дейтаграм.
UDP не виконує контроль перевантаження — додаток може відправляти дейтаграми з максимальною швидкістю, яку підтримує мережа. Це може призводити до перевантаження каналу, але в сценаріях реального часу така агресивність виправдана: для відеодзвінка важливіший потік даних з можливими втратами, ніж зупинка передачі.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
У прикладі створюється сокет SOCK_DGRAM для UDP. Метод sendto відправляє дейтаграму без встановлення з'єднання — достатньо знати IP та порт отримувача. Метод recvfrom на стороні сервера повертає як дані, так і адресу відправника для відповіді. UDP-сокети на мобільних платформах налаштовуються аналогічно, але вимагають додаткових дозволів: на iOS необхідно додати NSAppTransportSecurity для незашифрованих UDP-з'єднань, а на Android — дозвіл INTERNET у маніфесті.
Вибір UDP виправданий у сценаріях, де швидкість критичніша за надійність. Протокол не витрачає час на встановлення з'єднання, підтвердження та повторні передачі — це дає мінімальну затримку, але вимагає від розробника самостійної обробки втрат.
| Переваги | Недоліки |
|---|---|
| Низька затримка — без handshake | Немає гарантії доставки |
| Менший заголовок — 8 байт | Немає контролю перевантаження |
| Підтримка broadcast і multicast | Можливі дублікати пакетів |
| Незалежність дейтаграм — без черг | Розмір дейтаграми обмежений MTU |
У мобільних додатках UDP застосовується через фреймворки на кшталт WebRTC, які додають поверх UDP контроль втрат, адаптивний бітрейт і jitter buffer. Це дає переваги швидкості без недоліків голого протоколу.
Ще один важливий аспект UDP — відсутність контролю перевантаження. У TCP алгоритми Slow Start і Congestion Avoidance знижують швидкість передачі при втраті пакетів, щоб не перевантажувати мережу. UDP не має таких механізмів, тому розробники повинні реалізувати власні стратегії контролю швидкості — наприклад, адаптивний бітрейт у відеодзвінках або rate limiting в ігрових серверах для запобігання надмірному перевантаженню мережевого каналу.
UDP незамінний у сценаріях, де пропуск затримки важливіший за пропуск пакетів. Розглянемо основні області застосування протоколу в мобільній та веб-розробці.
Протоколи RTP і RTSP, що працюють поверх UDP, використовуються для передачі аудіо- та відеопотоків у реальному часі. WebRTC — стандарт для відеодзвінків у браузерах і мобільних додатках — використовує UDP як основний транспорт для медіаданих, а TCP — для сигналізації. Втрата одного пакета в 30 fps відео непомітна для користувача, на відміну від затримки повторної передачі, яка викликає помітне зависання картинки.
Багатокористувацькі шутери та MOBA вимагають затримки менше 50 мс для коректної синхронізації. UDP передає позиції гравців, постріли та події швидше за TCP, а втрата пакета просто ігнорується — наступне оновлення прийде через 16–33 мс. Популярні ігрові рушії, включаючи Unity та Unreal Engine, використовують UDP через власні транспортні шари з додаванням надійності для критичних подій через підтвердження на рівні додатку.
DNS-запити використовують UDP на порту 53, тому що кожен запит — це одна маленька дейтаграма (зазвичай до 512 байт). Якщо відповідь не прийшла, клієнт просто повторює запит через тайм-аут, що швидше за встановлення TCP-з'єднання з його триетапним рукостисканням. DHCP також працює поверх UDP, оскільки клієнт ще не має IP-адреси і не може встановити TCP-з'єднання, а широкомовні UDP-пакети дозволяють знайти DHCP-сервер у локальній мережі.
Вибір між UDP і TCP — компроміс між швидкістю та надійністю. Кожен протокол оптимальний для свого класу задач, і розуміння їхніх відмінностей допомагає приймати правильні архітектурні рішення при проєктуванні мережевої взаємодії в мобільних додатках.
| Критерій | UDP | TCP |
|---|---|---|
| Встановлення з'єднання | Не потрібно | Триетапне рукостискання |
| Заголовок | 8 байт | 20–60 байт |
| Гарантія доставки | Ні | Так, з підтвердженням |
| Упорядкування | Ні | Так |
| Контроль перевантаження | Ні | Так (AIMD, Slow Start) |
| Застосування | Стрімінг, ігри, DNS | Веб, email, файли, API |
У мобільних проєктах часто використовують гібридний підхід: TCP для надійних запитів (авторизація, завантаження даних) і UDP для медіапотоків. QUIC — сучасний протокол Google, що працює поверх UDP, поєднує швидкість UDP з надійністю TCP і вже використовується в HTTP/3.
Розглянемо простий UDP-сервер на Python, який приймає повідомлення від клієнтів і відправляє відповідь. Сервер слухає порт 8888 і обробляє вхідні дейтаграми в нескінченному циклі.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('UDP сервер запущено на порту 8888')
while True:
data, addr = server.recvfrom(1024)
print(f'Отримано від {addr}: {data.decode()}')
server.sendto(b'OK', addr)
Сервер створює UDP-сокет, прив'язується до порту 8888 і очікує вхідні дейтаграми. recvfrom повертає дані та адресу клієнта, що дозволяє відповісти через sendto. На відміну від TCP, сервер не зберігає стан підключення — кожна дейтаграма обробляється незалежно. Це робить UDP-сервери масштабованими: один сервер може обробляти мільйони клієнтів, не виділяючи пам'ять під кожне окреме з'єднання, що важливо для DNS-серверів та ігрових матчмейкінгових систем.
У мобільній розробці UDP часто використовується через високорівневі бібліотеки. Наприклад, CocoaAsyncSocket для iOS надає UDP-сокети з делегатами та GCD для асинхронної обробки подій. На Android клас DatagramSocket входить до стандартної бібліотеки java.net і не потребує додаткових залежностей. Для Flutter існує пакет udp, який надає простий інтерфейс для відправки та прийому дейтаграм без налаштування нативних сокетів.
Важливо зазначити, що багато мобільних мереж і корпоративних фаєрволів блокують UDP-трафік, особливо на портах вище 1024. Якщо ваш додаток використовує UDP, необхідно передбачити fallback на TCP або перевірку доступності протоколу через STUN-сервери, як це робить WebRTC. На iOS системний фреймворк Network.framework з NWConnection підтримує як TCP, так і UDP, автоматично вибираючи оптимальний протокол на основі доступності. Для додатків реального часу також рекомендується впроваджувати адаптивний бітрейт, який знижує якість потоку при втраті пакетів, забезпечуючи безперервність відтворення навіть на нестабільних каналах з високим рівнем помилок.
Часті запитання
UDP не встановлює з'єднання і не гарантує доставку пакетів, що робить його швидшим за TCP. Заголовок UDP — 8 байт проти 20–60 байт у TCP. UDP підходить для стрімінгу та ігор, TCP — для веб-запитів і передачі файлів.
Дейтаграма — самостійний пакет даних із заголовком UDP (порт джерела, порт призначення, довжина, контрольна сума). Кожна дейтаграма обробляється незалежно, без зв'язку з попередніми. Розмір дейтаграми обмежений MTU мережі та за специфікацією — до 65507 байт.
UDP не забезпечує надійність на транспортному рівні — її реалізує додаток. Розробники додають порядкові номери, контрольні суми, повторні запити та корекцію помилок. FEC (Forward Error Correction) дозволяє відновлювати втрачені пакети без повторної відправки.
UDP не підходить для сценаріїв, де критична цілісність даних: передача файлів, банківські транзакції, REST-API. У цих випадках TCP гарантує, що кожен байт дійде в правильному порядку. UDP також не рекомендується на нестабільних каналах з високим рівнем втрат.
QUIC — транспортний протокол, що працює поверх UDP, розроблений Google і стандартизований IETF як RFC 9000. Він поєднує швидкість UDP з надійністю TCP, підтримує мультиплексування без блокування та вбудоване шифрування. HTTP/3 використовує QUIC як транспортний рівень.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також