Что такое UDP и как с ним работать в Node.js?

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

Ответ

UDP (User Datagram Protocol) — это протокол транспортного уровня, альтернативный TCP. Его главное отличие — отсутствие установки соединения и гарантий доставки. Он отправляет независимые пакеты данных (датаграммы), что делает его быстрее, но менее надежным.

Характеристики UDP:

  • Без установки соединения: Нет «рукопожатия» (handshake).
  • Ненадежный: Пакеты могут быть потеряны, продублированы или прийти в неправильном порядке.
  • Не гарантирует целостность: Нет встроенного подтверждения получения.
  • Быстрый: Минимальные накладные расходы на заголовки и управление.

Когда использовать UDP в Node.js?

  • Стриминг (видео/аудио): Потеря нескольких пакетов менее критична, чем задержка.
  • DNS-запросы: Быстрые запросы, где если ответ потерян, клиент просто повторит его.
  • Многопользовательские онлайн-игры: Важна минимальная задержка (low latency).
  • Широковещательные (broadcast) и multicast-рассылки.

Работа с UDP в Node.js (модуль dgram):

const dgram = require('dgram');

// Создание UDP-сокета
const server = dgram.createSocket('udp4'); // 'udp4' для IPv4, 'udp6' для IPv6

server.on('error', (err) => {
  console.error(`Server error:n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  // rinfo содержит адрес и порт отправителя
  console.log(`Server received: "${msg}" from ${rinfo.address}:${rinfo.port}`);
  // Можно отправить ответ обратно
  server.send(`Echo: ${msg}`, rinfo.port, rinfo.address);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`UDP Server listening on ${address.address}:${address.port}`);
});

// Привязка сервера к порту 41234
server.bind(41234);

// --- Клиентская часть ---
const client = dgram.createSocket('udp4');
const message = Buffer.from('Hello UDP Server!');

client.send(message, 41234, 'localhost', (err) => {
  if (err) {
    client.close();
    throw err;
  }
  console.log('Message sent');
});

client.on('message', (msg) => {
  console.log(`Client got reply: ${msg}`);
  client.close();
});

Важно: Для задач, где важна надежная доставка и порядок данных (веб-API, загрузка файлов, электронная почта), всегда используйте TCP (например, через модуль net или HTTP/HTTPS).