В чем разница между протоколами TCP и UDP?

Ответ

TCP (Transmission Control Protocol) и UDP (User Datagram Protocol) — это транспортные протоколы, работающие поверх IP. В контексте Node.js выбор между ними влияет на архитектуру сетевых приложений.

TCP — надежный, с установкой соединения.

  • Гарантии: Гарантирует доставку, целостность и порядок пакетов. Использует подтверждения (ACK), повторные передачи и контроль перегрузки.
  • Соединение: Перед обменом данными устанавливается соединение (three-way handshake).
  • Использование в Node.js: Модуль net для создания TCP-серверов и клиентов. Это основа для HTTP, WebSocket, баз данных (PostgreSQL, Redis протоколы).
  • Пример TCP-сервера:
    const net = require('net');
    const server = net.createServer((socket) => {
      socket.write('Echo serverrn');
      socket.pipe(socket); // Эхо-ответ
    });
    server.listen(1337, '127.0.0.1');

UDP — быстрый, без установки соединения.

  • Гарантии: Не гарантирует доставку, порядок или целостность. Пакеты могут быть потеряны, продублированы или прийти в неправильном порядке.
  • Соединение: Отправляет датаграммы без предварительного соединения.
  • Использование в Node.js: Модуль dgram. Идеален для сценариев, где скорость важнее надежности.
  • Пример UDP-сервера:
    const dgram = require('dgram');
    const server = dgram.createSocket('udp4');
    server.on('message', (msg, rinfo) => {
      console.log(`Server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
    });
    server.bind(41234);

Когда что использовать?

  • TCP: Веб-серверы (HTTP/HTTPS), API, электронная почта (SMTP), передача файлов (FTP), когда важна полная и точная доставка данных.
  • UDP: Стриминг видео/аудио (VoIP, онлайн-игры), DNS-запросы, широковещательные рассылки, системы мониторинга в реальном времени, где допустима некоторая потеря пакетов.

Ответ 18+ 🔞

Слушай, давай разберем эту хрень про TCP и UDP, а то народ путается, как мартышлюшка в апельсинах. Представь, что тебе нужно отправить посылку.

TCP — это как отправка документов с курьером, который охуенно педантичный. Он тебе позвонит, договорится о встрече (это их handshake, три рукопожатия, ёпта), возьмёт коробку, по пути десять раз переспросит, всё ли цело, и принесёт тебе прямо в руки, да ещё и в правильном порядке. Если что-то потеряется — он поедет обратно и заберёт заново. Надёжно, но не быстро. В Node.js за это отвечает модуль net. Весь интернет, по сути, на этом и держится — HTTP, браузеры, почта. Вот смотри, как сервак простейший делается:

const net = require('net');
const server = net.createServer((socket) => {
  socket.write('Echo serverrn');
  socket.pipe(socket); // Эхо-ответ
});
server.listen(1337, '127.0.0.1');

Видишь? Создаёшь сервер, он слушает порт, и на каждое новое соединение (socket) отвечает. Всё чинно, благородно, с гарантиями. Доверия — ебать, полный ноль, в хорошем смысле.

А теперь UDP — это, блядь, полная его противоположность. Это как крикнуть что-то в толпу на площади в надежде, что нужный человек услышит. Ты просто выпалил данные (датаграмму) в сеть и забыл. Летит быстро, овердохуища быстро, но могло и не долететь, прилететь два раза или вообще впереди того, что ты отправил позже. Порядка — ноль, гарантий — ноль. Зато скорость — пиздец! В Node.js за это безобразие отвечает модуль dgram. Смотри, как выглядит:

const dgram = require('dgram');
const server = dgram.createSocket('udp4');
server.on('message', (msg, rinfo) => {
  console.log(`Server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.bind(41234);

Никаких соединений! Прилетел пакет — обработали. Не прилетел — и хуй с ним. Терпения ноль, ебать, ждать подтверждений.

Так когда что использовать? Вопрос на миллион, чувак.

TCP — когда тебе критична точность. Веб-сайты, API (чтобы баланс на счету не съехал), отправка фото котика подруге — чтобы каждый пиксель на месте был. Любая хрень, где потеря одного байта — это уже пизда рулю.

UDP — когда скорость важнее идеальной картинки. Онлайн-игра, где лаг в 100 мс — это смерть; голосовой звонок в Discord (пакет потерялся — хрипнуло и ок); стриминг видео (лучше пропустить кадр, чем буферовать). DNS-запросы — тоже UDP, потому что ждать ответа по TCP — это, ядрёна вошь, вечность.

Короче, если тебе нужна надёжная труба — бери TCP и не парься. Если гонишься за скоростью и готов к потерям — твой выбор UDP, хуй с горы. Главное — понимать, зачем ты это делаешь, а не просто тыкать наугад. Э, бошка, думай!

Видео-ответы