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

Что такое uTP?

3.0 Senior🔥 52 комментариев
#API и сетевые протоколы

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

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

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

uTP: микротранспортный протокол

Что такое uTP

uTP (Micro Transport Protocol) это протокол передачи данных, разработанный для P2P приложений (особенно BitTorrent). Основная идея: уменьшить задержку и congestion в сети, защищая другой трафик от перегрузки.

Разработан компанией BitTorrent Inc. и документирован в BEP 29 (BitTorrent Enhancement Proposal).

Характеристики uTP

├─ Транспортный уровень (как TCP)
├─ UDP-based (работает поверх UDP)
├─ Low latency (низкая задержка)
├─ Congestion control (управление перегрузкой)
├─ Connection-oriented
├─ Ordered delivery (гарантирует порядок)
├─ Selective retransmission
└─ NAT/Firewall friendly

TCP vs UDP vs uTP

TCP:
+ Надёжность (гарантирует доставку)
+ Порядок (гарантирует порядок пакетов)
- Высокая задержка (latency)
- Может занять весь bandwidth

UDP:
+ Низкая задержка (latency)
+ Простота
- Нет гарантии доставки
- Нет порядка
- Может перегрузить сеть

uTP:
+ Низкая задержка (как UDP)
+ Надёжность (как TCP)
+ Congestion control (не перегружает сеть)
+ Дружелюбен к другому трафику
- Более сложен

Как работает uTP

// Концептуально

const uTP = {
  // 1. Connection establishment
  setup: () => {
    // Трёхстороннее рукопожатие (как TCP SYN-SYN/ACK-ACK)
    // Но быстрее, потому что UDP-based
  },

  // 2. Data transmission
  sendData: (data) => {
    // Отправляет пакеты с порядковыми номерами
    // Слушает ACK от получателя
  },

  // 3. Congestion control
  adjustSpeed: () => {
    // Если сеть перегружена — уменьшаем скорость отправки
    // Используется алгоритм LEDBAT (Low Extra Delay Background Transport)
    // Анализирует RTT (round trip time) и регулирует bandwidth
  },

  // 4. Retransmission
  handleLostPacket: () => {
    // Если пакет потеряется — пересылаем только его
    // Не нужно пересылать всё как в TCP
  }
};

Где используется uTP

1. BitTorrent

Традиционный BitTorrent использует TCP:
- Много параллельных TCP соединений
- Каждое соединение требует bandwidth
- ISP видит большой трафик, может throttle

С uTP:
- Множество uTP соединений
- Каждое соединение автоматически регулирует bandwidth
- Не конкурирует с обычным интернет-трафиком
- ISP не видит перегрузку — не throttle'ит

2. Resilio Sync

P2P синхронизация файлов:
- Передача больших файлов между компьютерами
- uTP позволяет не замораживать интернет
- Пока синхронизируется — YouTube всё ещё работает

3. VPN и прокси

Некоторые VPN использют uTP для:
- Более стабильного соединения
- Лучшего управления пропускной способностью
- Обхода Rate Limiting

Сравнение с QUIC

QUIC (более новый протокол):
- Тоже UDP-based
- Используется HTTP/3
- Более современный, лучше оптимизирован
- Поддержка 0-RTT (faster connection)

uTP:
- Более старый, но проверенный
- Специфичен для P2P
- Всё ещё используется в BitTorrent

Структура uTP пакета

uTP Packet Header:
┌─────────┬─────────┬─────────┬──────────┐
│  Type   │ Vers    │ Ext     │ Window   │
│ (4 bits)│ (4 bits)│(8 bits) │(16 bits) │
├─────────┼─────────┼─────────┼──────────┤
│       Sequence Number (16 bits)       │
├─────────────────────────────────────────┤
│       Timestamp (32 bits)              │
├─────────────────────────────────────────┤
│  Timestamp Difference Ack (32 bits)   │
├─────────────────────────────────────────┤
│           Data...                      │
└─────────────────────────────────────────┘

Практический пример: P2P приложение

// Псевдокод uTP клиента

class uTPClient {
  async connect(remoteAddr, remotePort) {
    // Трёхстороннее рукопожатие
    this.sendSynPacket(remoteAddr, remotePort);
    const synAck = await this.waitForSynAck();
    this.sendAckPacket(synAck);
  }

  async sendFile(filePath) {
    const fileStream = fs.createReadStream(filePath);
    let bandwidth = 1000; // KB/s, начинаем с низкого

    for await (const chunk of fileStream) {
      // Отправляем пакет
      this.send(chunk);

      // Ждём ACK
      const ack = await this.waitForAck();
      const rtt = this.calculateRoundTripTime(ack);

      // Регулируем скорость на основе RTT
      if (rtt > this.targetLatency) {
        bandwidth *= 0.95; // Снижаем
      } else {
        bandwidth *= 1.05; // Повышаем
      }

      // Спим чтобы не превышать bandwidth
      await this.sleep(chunk.length / bandwidth);
    }
  }

  handleRetransmission(packet) {
    // Пересылаем только потерянный пакет
    // В TCP нужно пересылать всё после потери
  }
}

LEDBAT алгоритм (сердце uTP)

// Упрощённо:

const targetLatency = 100; // milliseconds
let currentLatency = 50;
let currentRate = 1000; // bytes per second

function adjustRate(newLatency) {
  const delayFactor = (newLatency - targetLatency) / targetLatency;

  if (delayFactor > 0) {
    // Задержка выросла — сеть перегружена
    currentRate *= (1 - delayFactor * 0.1); // Уменьшаем
  } else if (delayFactor < 0) {
    // Задержка упала — сеть свободна
    currentRate *= (1 + Math.abs(delayFactor) * 0.05); // Увеличиваем медленнее
  }

  return currentRate;
}

Плюсы uTP

✅ Низкая latency (задержка)
✅ Background-friendly (не мешает другому трафику)
✅ Congestion control встроен
✅ UDP-based (быстрее устанавливается соединение)
✅ NAT-friendly (лучше работает за роутером)
✅ Надёжность близка к TCP

Минусы uTP

❌ Не стандартный (не используется в HTTP/HTTPS)
❌ Некоторые ISP блокируют
❌ Ограниченная поддержка в операционных системах
❌ Более сложный чем TCP/UDP
❌ Менее оптимизирован чем TCP на высоких скоростях

Использование в Node.js

// uTP не встроена в Node.js
// Есть библиотеки, но не стандартные

// Например, для BitTorrent:
const WebTorrent = require('webtorrent');
const client = new WebTorrent();

client.add('magnet:?xt=urn:btih:...', (torrent) => {
  // WebTorrent использует uTP для P2P соединений
  torrent.getFile(0).createReadStream();
});

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

Используй uTP когда:
- Разрабатываешь P2P приложение
- Нужна низкая latency
- Не хочешь перегружать сеть
- Используешь BitTorrent
- Нужен NAT traversal

Не используй uTP когда:
- Разрабатываешь веб-сервер (используй TCP/QUIC)
- Нужна максимальная надёжность
- ISP блокирует P2P
- Не нужна низкая latency

Будущее uTP

QUIC/HTTP3 постепенно заменяют uTP для веб-трафика
Но uTP остаётся стандартом для BitTorrent
Новые версии uTP улучшают алгоритмы congestion control

Заключение

uTP это специализированный протокол для P2P приложений:

  • Находится между TCP (надёжность) и UDP (скорость)
  • Основан на LEDBAT алгоритме congestion control
  • Идеален для BitTorrent и подобных приложений
  • Не вытеснен QUIC но остаётся актуальным
  • Может быть полезен для backend разработчиков пишущих P2P системы