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

За счет чего TCP быстрее UDP?

1.0 Junior🔥 171 комментариев
#JavaScript Core

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

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

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

TCP vs UDP: почему TCP может быть быстрее

Это интересный вопрос с контринтуитивным ответом. Распространенное заблуждение - что UDP всегда быстрее, чем TCP. На самом деле, это не так просто, и TCP часто быстрее в реальных условиях интернета. Давайте разберемся в деталях.

Теория: UDP кажется быстрее

UDP (User Datagram Protocol)

Структура UDP доставки:
1. Приложение -> Отправляет данные
2. Пакет отправляется в сеть
3. Конец

Оверхед: МИНИМАЛЬНЫЙ
- Нет подтверждения
- Нет переупорядочивания
- Нет управления потоком

TCP (Transmission Control Protocol)

Структура TCP доставки:
1. Приложение -> Отправляет данные
2. TCP делает handshake (3-way)
3. Отправляет данные
4. Ожидает подтверждения (ACK)
5. Гарантирует доставку и порядок
6. Управляет скоростью (congestion control)
7. Завершает соединение (4-way)

Оверхед: БОЛЬШИЙ

По теории, UDP должен быть быстрее. НО в реальности все иначе.

Практика: TCP часто быстрее

1. Надежность = меньше повторных передач

// UDP - потеря пакетов = повторная отправка с клиента
function sendWithUDP(data) {
  // Отправили пакет
  udpSocket.send(data);
  // Пакет потерялся (1-5% в интернете)
  // Приложение ждёт ответа, не получает
  // Повторно отправляет ВСЕ данные
  // Может повторить 3-10 раз
  // Итого: много трафика, медленнее
}

// TCP - потеря пакетов = автоматическая переотправка
function sendWithTCP(data) {
  // Отправили пакет
  tcpSocket.send(data);
  // Пакет потерялся
  // TCP АВТОМАТИЧЕСКИ переотправляет
  // Приложение об этом не знает
  // Итого: быстрее, так как нет задержек на уровне приложения
}

2. Управление потоком (Flow Control)

UDP без управления потоком:
[Отправить] [Отправить] [Отправить] [Отправить] [Отправить]
  100% бандвит | Но много потерь!
                | Приложение перезагружает
                | Итого медленнее

TCP с управлением потоком:
[Отправить] [Ждать ACK] [Отправить] [Ждать ACK]
  50% бандвита | Но БЕЗ потерь!
               | Без повторных передач
               | Итого выше пропускная способность

Реальный пример: HTTP/2 и HTTPS

Почему HTTPS (TCP) доминирует в интернете

// TCP (HTTPS) в браузере
// 1. TCP handshake: ~100мс
// 2. TLS handshake: ~100мс
// 3. Передача данных: супер надежно
// Всё работает. Контент загружается полностью.

// UDP (QUIC/HTTP3) - новый подход
// 1. QUIC handshake: ~50мс (быстрее!)
// 2. Передача данных: с потерями
// Может быть быстрее на слабых соединениях

Почему Google выбрал QUIC (UDP) для HTTP/3

Не потому что UDP быстрее, а потому что:

  1. Новый протокол можно оптимизировать лучше
  2. Можно пропускать потерянные пакеты (video streaming)
  3. Можно быстро переключаться между сетями (4G -> WiFi)
// QUIC решает проблемы TCP
// 1. Faster initial connection (0-RTT)
// 2. Connection migration (switch from 4G to WiFi)
// 3. Multiplexing (не блокируется одним потерянным пакетом)
// 4. Encryption по умолчанию

Скорость в разных сценариях

Сценарий 1: LAN (локальная сеть, 0% потерь)

UDP: 100 Mbps
TCP: 95 Mbps (оверхед минимален, но есть)

Победитель: UDP на ~5% быстрее
Но: разница незначительна в реальных приложениях

Сценарий 2: Интернет (1-3% потерь)

UDP:
- Отправляет 100 Mbps
- Теряется 1-3%
- Приложение замечает потерю
- Повторно отправляет утраченные данные
- Реальная пропускная способность: 60-80 Mbps
- Задержка: ВЕЛИКА (приложение ждет)

TCP:
- Отправляет адаптивно (50-80 Mbps)
- TCP обрабатывает потери автоматически
- Приложение не замечает потерь
- Реальная пропускная способность: 75-95 Mbps
- Задержка: МИНИМАЛЬНА (приложение не ждет)

Победитель: TCP на ~20-30% быстрее

Сценарий 3: Мобильное соединение (3-5% потерь, переключение сетей)

UDP:
- Теряет пакеты
- Приложение теряет данные
- Переключение 4G->WiFi = новое соединение
- Реальная надежность: 50-70%

TCP:
- TCP пересылает потерянные пакеты
- Соединение может мигрировать (в QUIC)
- Реальная надежность: 95-99%

Победитель: TCP (обычный) или QUIC (новый)

Вывод о скорости

// Формула эффективной скорости
EffectiveSpeed = NetworkSpeed - (PacketLoss * RetransmissionCost) - ProtocolOverhead

// UDP
UDP_Speed = 1000 Mbps - (2% * 500 Mbps) - 5 Mbps = 485 Mbps

// TCP
TCP_Speed = 1000 Mbps - (0% потерь за счёт TCP) - 20 Mbps = 980 Mbps

// TCP выигрывает даже с немного большим оверхедом!

Когда TCP медленнее (реально)

Случай 1: Очень плохое соединение (10%+ потерь)

// Если потери критичны, TCP может быть медленнее
// потому что ждет ретранслокации каждого пакета

// Решение: используй приложение-уровень протоколы
// которые могут пропускать потерянные пакеты
// (видеопотоки, онлайн игры)

Случай 2: Очень длинная задержка (спутниковый интернет)

// TCP ждет ACK
// Если задержка 500ms в обе стороны = 1000ms за пакет
// TCP будет ждать
// UDP отправляет и идёт дальше

// Но: QUIC (на UDP базе) решает эту проблему
// Мультиплексирование пакетов

Практический совет для разработчиков

// Используй TCP (HTTPS) для:
// - Веб-приложений
// - REST API
// - Всего, что требует надежности
// - 99% случаев

// Используй UDP для:
// - Видеопотоков (потеря пакета = один фрейм)
// - Онлайн игр (скорость > надежность)
// - Кастомных приложений с обработкой потерь
// - IoT и специальных случаев

// Используй QUIC (HTTP/3) для:
// - Нового контента
// - Мобильных приложений
// - Когда нужна скорость И надежность

Технические детали: почему TCP выигрывает

TCP Congestion Control

// TCP умно регулирует скорость отправки
// На основе потерь пакетов и RTT

// Алгоритм CUBIC:
// 1. Отправляй быстро, пока не будет потери
// 2. Потеря обнаружена -> снизь скорость
// 3. Медленно увеличивай скорость
// 4. Найди оптимальное значение

// Это гарантирует:
// - Максимальная пропускная способность
// - Без перегрузки сети
// - Справедливое распределение между потоками

TCP Fast Retransmit

// Не ждишь timeout для повторной передачи
// Если получишь 3 дубликата ACK = немедленно ретранслируй
// Это НАМНОГО быстрее, чем ждать timeout

Измерения в реальной жизни

# Интернет статистика (источник: различные CDN)

# Потери пакетов
WiFi дома: 0.1-1%
Мобильный 4G: 1-3%
Развивающиеся страны: 3-5%
Спутниковый интернет: 5-10%

# Задержка (Latency)
LAN: 1мс
Близкий интернет: 20-50мс
Медалеко (разные страны): 100-200мс
Спутник: 500-600мс

# Вывод: на большинстве соединений TCP выигрывает на 10-30%

Заключение

TCP часто БЫСТРЕЕ UDP на практике благодаря:

  1. Надежность - нет повторных передач на уровне приложения
  2. Управление потоком - оптимизирует использование бандвита
  3. Congestion control - умно регулирует скорость
  4. Fast retransmit - быстрая переотправка потерянных пакетов
  5. Автоматизм - приложение не должно обрабатывать потери

Теория говорит, что UDP быстрее. Практика показывает, что TCP часто выигрывает благодаря надежности и оптимизациям. Вот почему вся сеть интернета построена на TCP, а не на UDP.