UDP в Node.js — модуль dgram
Пакетный протокол без гарантии доставки и порядка — быстрее TCP, для игр, видео/аудио стриминга, DNS.
Что это
UDP (User Datagram Protocol) — посылает датаграммы (пакеты) без установления соединения. Нет handshake, нет упорядочивания, нет повтора потерянных. Зато минимальный overhead — быстрее TCP.
В ноде доступен через модуль dgram (datagram).
API / Пример
const dgram = require('dgram');
// Сервер
const server = dgram.createSocket('udp4');
server.on('message', (msg, rinfo) => {
console.log(`from ${rinfo.address}:${rinfo.port} -> ${msg}`);
server.send('pong', rinfo.port, rinfo.address);
});
server.bind(41234);
// Клиент
const client = dgram.createSocket('udp4');
client.send('ping', 41234, 'localhost', () => client.close());
TCP vs UDP
| TCP | UDP |
|---|---|
| гарантия доставки | без гарантии |
| порядок пакетов | пакеты могут прийти не по порядку |
| connection (handshake) | connectionless |
| streaming байтов | datagrams |
| backpressure | нет управления потоком |
| HTTP, SSH, SMTP | DNS, VoIP, игры, видео |
Broadcast и Multicast
UDP умеет рассылать один пакет нескольким получателям:
- broadcast — всем в подсети (шлюз не пропускает наружу)
- multicast — списку адресов, подписавшихся на группу
socket.setBroadcast(true);
socket.addMembership('224.0.0.114'); // multicast группа
Производительность / Подводные камни
- Клиентский порт меняется на каждый
send— ОС выбирает свободный эфемерный порт. - Пакет может не дойти — не факт что сервер получит. По сети UDP теряется регулярно.
- Свой протокол надёжности — если нужны гарантии, придумывать NACK/ACK поверх UDP вручную (как QUIC, RUDP).
- MTU ~1500 байт — большие сообщения фрагментируются и теряются чаще.
- Когда применяют — радио/видео-стриминг (потеря фрейма терпима), игры (latency важнее точности), discovery (mDNS, SSDP).
🎓 Источники
- 🎓 Клиент-сервер на Node.js TCP и UDP, DNS · 2018-10-03
- Тезисы: модуль
dgram; клиентский порт UDP каждый раз новый; UDP быстрее TCP, но без гарантий; broadcast по подсети, multicast — списку адресов; для надёжности приходится писать свой протокол поверх. - Цитата: «Очень часто UDP используется когда перепосылка не нужна — интернет-радио, телевидение: потеряются какие-то фреймы — не страшно.»
- Тезисы: модуль