Что такое протокол UDP?

«Что такое протокол UDP?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

UDP (User Datagram Protocol) — это простой, ненадёжный протокол транспортного уровня модели OSI/TCP-IP, ориентированный на минимальную задержку передачи данных.

Основные принципы и особенности:

  • Connectionless (без установки соединения): Пакеты (датаграммы) отправляются без предварительного "рукопожатия" (handshake).
  • Ненадёжность: Нет гарантий доставки, контроля целостности потока, подтверждений (ACK) или повторной отправки потерянных пакетов.
  • Не гарантирует порядок: Пакеты могут приходить в порядке, отличном от отправленного.
  • Лёгкий и быстрый: Минимальные накладные расходы на заголовок (8 байт).

Структура UDP-заголовка:

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     Source Port | Destination Port|
+--------+--------+--------+--------+
|     Length      |    Checksum     |
+--------+--------+--------+--------+
|          Data (payload)...        |
+-----------------------------------+

Типичные сферы применения UDP:

  1. Потоковое мультимедиа: Видеоконференции (Zoom), онлайн-трансляции, IP-телефония (VoIP). Потеря нескольких пакетов менее критична, чем задержка.
  2. DNS-запросы: Короткие запросы-ответы, где скорость важнее надёжности.
  3. Трансляция (Broadcast/Multicast): Рассылка данных множеству получателей (например, DHCP).
  4. Игры в реальном времени: Позиция игроков, где важна актуальность данных, а не каждый пакет.

Пример отправки UDP-датаграммы на Python:

import socket

# Создание UDP-сокета (SOCK_DGRAM)
upper_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('127.0.0.1', 5005)

# Отправка данных без установки соединения
message = b'Hello, UDP Server!'
upper_socket.sendto(message, server_address)
print(f"Sent: {message}")

# Получение ответа (если сервер отвечает)
data, addr = upper_socket.recvfrom(4096)
print(f"Received from {addr}: {data.decode()}")

upper_socket.close()

Сравнение с TCP: UDP жертвует надёжностью ради скорости и простоты, что делает его идеальным для задач, где потеря части данных предпочтительнее задержек.