Что такое протокол UDP и каковы его основные характеристики?

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

Ответ

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

Ключевые характеристики (vs TCP): Характеристика UDP TCP
Надёжность Нет гарантий доставки, порядка, целостности. Гарантированная, упорядоченная доставка.
Установка соединения Без соединения (connectionless). Нет handshake. С установкой соединения (3-way handshake).
Контроль перегрузки Отсутствует. Может «затопить» сеть. Присутствует (алгоритмы наподобие slow start).
Заголовок Маленький (8 байт). Большой (20+ байт).
Скорость Быстрее, меньше накладных расходов. Медленнее из-за накладных расходов.
Гарантии Best-effort delivery («по возможности»). Гарантированная доставка.

Структура UDP-датаграммы:

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     Source Port | Destination Port |  // Порт отправителя и получателя (по 16 бит)
+--------+--------+--------+--------+
|     Length      |    Checksum      |  // Длина и контрольная сумма (по 16 бит)
+--------+--------+--------+--------+
|                                   |
|           Data (Payload)          |  // Полезная нагрузка
|                                   |
+-----------------------------------+

Пример создания UDP-клиента на Java:

import java.net.*;

public class UDPClient {
    public static void main(String[] args) throws Exception {
        // 1. Создать сокет без привязки к конкретному порту
        DatagramSocket socket = new DatagramSocket();

        // 2. Подготовить данные и адрес назначения
        String message = "Hello, UDP Server!";
        byte[] buffer = message.getBytes();
        InetAddress serverAddress = InetAddress.getByName("localhost");
        int serverPort = 9876;

        // 3. Создать и отправить пакет
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, serverAddress, serverPort);
        socket.send(packet);
        System.out.println("Packet sent to " + serverAddress + ":" + serverPort);

        socket.close(); // Ресурс освобождён
    }
}

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

  • Мультимедиа и стриминг: Видеоконференции (Zoom, Teams), онлайн-видео (где потеря нескольких пакетов менее критична, чем задержка).
  • Голосовая связь (VoIP): Skype, Discord.
  • DNS-запросы: Быстрый обмен короткими запросами/ответами.
  • Онлайн-игры: Передача частых обновлений состояния (позиция игрока).
  • Трансляция (Broadcast/Multicast): Рассылка данных множеству получателей.

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