← Назад к вопросам

В чем разница между UDP и TCP/IP?

2.2 Middle🔥 111 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между UDP и TCP/IP

Оба протокола находятся в транспортном слое (Layer 4) модели OSI, но имеют совершенно разные подходы к доставке данных.

TCP/IP (Transmission Control Protocol over Internet Protocol)

Основные характеристики:

TCP это ориентированный на соединение (connection-oriented) протокол, гарантирующий надежную доставку данных в правильном порядке.

Отправитель                  Получатель
    |                            |
    |---- SYN (открыть) ------->|
    |<---- SYN-ACK (ок) ---------|
    |---- ACK (подтверждение) -->|
    |                            |
    | (соединение установлено)   |
    |                            |
    |---- Данные 1 ------------->|
    |<---- ACK (получено) -------|
    |---- Данные 2 ------------->|
    |<---- ACK (получено) -------|
    |                            |
    |---- FIN (закрыть) ------->|
    |<---- ACK ------------------|

Плюсы TCP:

  • Гарантирует доставку всех данных
  • Сохраняет порядок пакетов
  • Обнаруживает и исправляет ошибки
  • Управление потоком данных (не переполнит приемник)
  • Управление перегруженностью сети
  • Надежно для критических данных

Минусы TCP:

  • Медленнее чем UDP (много overhead)
  • Требует установления соединения
  • Больше обработки на сервере
  • Может быть задержка при потере пакетов (переотправка)

Использование:

- HTTP/HTTPS (веб)
- SMTP (email)
- FTP (передача файлов)
- SSH (удаленный доступ)
- Базы данных
- Мессенджеры

Пример в JavaScript (Node.js):

// TCP сервер
const net = require('net');

const server = net.createServer((socket) => {
  console.log('Клиент подключен');
  
  socket.write('Добро пожаловать!
');
  
  socket.on('data', (data) => {
    console.log('Получено:', data.toString());
    socket.write('Echo: ' + data);
  });
  
  socket.on('end', () => {
    console.log('Клиент отключился');
  });
  
  socket.on('error', (err) => {
    console.error('Ошибка:', err);
  });
});

server.listen(3000, '127.0.0.1');

// TCP клиент
const client = net.createConnection({ port: 3000 });

client.on('connect', () => {
  console.log('Подключен к серверу');
  client.write('Привет!');
});

client.on('data', (data) => {
  console.log('От сервера:', data.toString());
});

client.on('end', () => {
  console.log('Соединение закрыто');
});

UDP (User Datagram Protocol)

Основные характеристики:

UDP это не ориентированный на соединение (connectionless) протокол. Просто отправляет пакеты без проверки доставки.

Отправитель                  Получатель
    |                            |
    |---- Пакет 1 ------------->|
    |---- Пакет 2 ------------->| (может быть потеря)
    |---- Пакет 3 ------------->|
    |                            |
    | (никакого подтверждения)

Плюсы UDP:

  • Очень быстро (минимум overhead)
  • Низкая задержка (latency)
  • Минимум ресурсов на сервере
  • Хорош для потоковых данных
  • Идеален для real-time приложений

Минусы UDP:

  • Не гарантирует доставку пакетов
  • Не сохраняет порядок пакетов
  • Нет проверки ошибок
  • Нет управления потоком
  • Может потерять данные при перегруженности сети
  • Должны быть небольшие сообщения

Использование:

- DNS (домены)
- VoIP (голос)
- Online видеоигры
- Потоковое видео/аудио
- Live трансляции
- IoT датчики

Пример в JavaScript (Node.js):

// UDP сервер
const dgram = require('dgram');

const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  console.log('Получено от', rinfo.address, ':', msg.toString());
  
  // Отправить ответ
  const response = Buffer.from('Ответ: ' + msg.toString());
  server.send(response, 0, response.length, rinfo.port, rinfo.address);
});

server.bind(3000);

// UDP клиент
const client = dgram.createSocket('udp4');

const message = Buffer.from('Привет!');

client.send(message, 0, message.length, 3000, '127.0.0.1', (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('Отправлено');
  }
});

client.on('message', (msg) => {
  console.log('Ответ:', msg.toString());
  client.close();
});

// Без гарантии - просто отправляем и надеемся

Таблица сравнения

ПараметрTCPUDP
НадежностьГарантирует доставкуБез гарантий
Порядок данныхСохраняет порядокМожет изменить порядок
СкоростьМедленнееБыстрее
СоединениеТребует handshakeConnectionless
OverheadБольшеМинимум
Задержка (latency)Может быть большеНизкая
Поток данныхУправление потокомНет управления
Размер пакетаБольшие потоки данныхОграничено размером датаграммы
Обнаружение ошибокДаБазовое только
Использование портовДаДа
МасштабируемостьХуже (на соединение ресурсы)Лучше (мало ресурсов)

Практические примеры

Когда потеря одного пакета не важна (UDP идеален):

Пример: Трансляция температуры каждую секунду

UDP пакеты:
Сек 1: Temp=22°C ✓
Сек 2: Temp=22.1°C (потеряна)
Сек 3: Temp=22.2°C ✓
Сек 4: Temp=22.3°C (потеряна)
Сек 5: Temp=22.4°C ✓

Это нормально! У нас есть достаточно информации.
Следующий пакет придет через секунду.

Когда потеря пакета критична (TCP необходим):

Пример: Банковский перевод

Пакет 1: Счет отправителя -= 1000 ✓
Пакет 2: Счет получателя += 1000 (потеряна - КАТАСТРОФА!)

Деньги исчезли! Поэтому TCP гарантирует доставку всех пакетов.

WebSocket (для фронтенда)

WebSocket использует TCP под капотом, но предоставляет двусторонний канал:

// WebSocket сервер (Node.js)
const WebSocketServer = require('ws').Server;
const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', (ws) => {
  console.log('Клиент подключился');
  
  ws.send('Добро пожаловать на сервер');
  
  ws.on('message', (message) => {
    console.log('Получено:', message);
    // Отправить всем клиентам
    wss.clients.forEach((client) => {
      if (client.readyState === 1) {
        client.send('Сообщение: ' + message);
      }
    });
  });
  
  ws.on('close', () => {
    console.log('Клиент отключился');
  });
});

// WebSocket клиент (браузер)
const ws = new WebSocket('ws://localhost:8080');

ws.addEventListener('open', () => {
  console.log('Подключен');
  ws.send('Привет, сервер!');
});

ws.addEventListener('message', (event) => {
  console.log('От сервера:', event.data);
});

ws.addEventListener('close', () => {
  console.log('Соединение закрыто');
});

HTTP/HTTPS (для фронтенда)

HTTP использует TCP для надежной доставки запросов:

// Fetch API - использует TCP/HTTP под капотом
fetch('/api/users')
  .then(response => {
    if (!response.ok) {
      throw new Error('HTTP error, status = ' + response.status);
    }
    return response.json();
  })
  .then(data => console.log(data))
  .catch(error => console.error('Ошибка:', error));

// Гарантировано получим все данные или узнаем об ошибке
// Порядок сохранится
// Если сервер недоступен - узнаем об этом

Выбор для фронтенда

Используй TCP (HTTP/HTTPS/WebSocket) для:

  • Загрузки веб-страниц
  • API запросы
  • Аутентификация
  • Работа с БД
  • Загрузка файлов
  • Real-time синхронизация (но не требует абсолютной скорости)

Используй UDP (WebRTC, custom) для:

  • Видео/аудио чаты (потеря кадра не критична)
  • Мультиплеер игры (чуть меньше задержка важнее чем идеальная доставка)
  • Live потоки

Заключение

TCP и UDP решают разные проблемы:

  • TCP - надежность, порядок, гарантия (для критичных данных)
  • UDP - скорость, минимум задержки (для некритичных потоков)

Для фронтенд разработки обычно работаем с TCP (HTTP/HTTPS/WebSocket), но понимание UDP важно для особых случаев (игры, видео).

В чем разница между UDP и TCP/IP? | PrepBro