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

Как работает µTorrent?

2.0 Middle🔥 161 комментариев
#JavaScript Core

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

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

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

µTorrent: протокол и клиент для передачи файлов

µTorrent (micro Torrent) — это компактный клиент для работы с протоколом BitTorrent, который позволяет обмениваться файлами напрямую между пользователями без центрального сервера. Это технология P2P (peer-to-peer), которая распределяет нагрузку на всех участников сети.

Основные компоненты BitTorrent

Сеедер (Seeder) — пользователь с полным файлом
   ↓
Трекер — сервер, отслеживающий участников
   ↓
Пиры (Peers) — пользователи, скачивающие файл
   ↓
Личер (Leecher) — неполный скачиватель

Как работает процесс скачивания

// Абстрактная модель процесса

class TorrentClient {
  constructor(torrentFile) {
    this.torrentFile = parseTorrent(torrentFile);
    this.peers = [];
    this.downloadedPieces = new Set();
  }

  // 1. Подключение к трекеру
  connectToTracker() {
    const trackerUrl = this.torrentFile.announce;
    // Отправляем информацию о себе трекеру
    // Получаем список пиров для скачивания
    this.peers = fetchPeersFromTracker(trackerUrl);
  }

  // 2. Скачивание кусков (pieces) из разных источников
  downloadPieces() {
    const pieces = this.torrentFile.info.pieces;
    
    pieces.forEach((piece, index) => {
      if (this.downloadedPieces.has(index)) return;
      
      // Находим пира с этим куском
      const peerWithPiece = this.peers.find(peer => 
        peer.hasPiece(index)
      );
      
      // Скачиваем кусок
      this.downloadPieceFromPeer(peerWithPiece, piece);
      this.downloadedPieces.add(index);
    });
  }

  // 3. Проверка целостности
  verifyPiece(piece) {
    const hash = SHA1(piece);
    return hash === this.torrentFile.info.pieces[piece.index];
  }

  // 4. Сидирование (делиться с другими)
  seed() {
    // Если у нас есть полный файл, мы становимся сидером
    if (this.downloadedPieces.size === this.torrentFile.info.pieces.length) {
      this.acceptIncomingPeerConnections();
    }
  }
}

Структура .torrent файла

.torrent файл содержит:
- announce (URL трекера)
- info:
  - name (имя файла)
  - length (размер файла)
  - piece length (размер куска, обычно 256KB)
  - pieces (SHA1 хеши каждого куска)

Фазы работы

1. Инициализация

// Пользователь открывает .torrent файл
const torrent = parseTorrentFile('movie.torrent');
// Клиент начинает выполнение

2. Обнаружение пиров

// Подключаемся к трекеру и говорим:
// "Привет, я хочу скачать файл с инфо-хешем XYZ"
const peers = await tracker.getPeers({
  info_hash: torrent.infohash,
  peer_id: generateRandomPeerId(),
  port: 6881,
  uploaded: 0,
  downloaded: 0,
  left: torrent.totalSize // сколько осталось скачать
});

// Трекер возвращает список IP-адресов и портов других пиров
// например: ['192.168.1.100:6881', '10.0.0.5:6882', ...]

3. Скачивание кусков

// Подключаемся к пирам и скачиваем куски параллельно
const downloadedData = [];

for (let i = 0; i < numberOfPieces; i++) {
  // Выбираем пира, который имеет нужный кусок
  const peer = selectPeerWithPiece(peers, i);
  
  // Загружаем кусок
  const piece = await peer.requestPiece(i);
  
  // Проверяем целостность
  if (verifyHash(piece, expectedHash[i])) {
    downloadedData.push(piece);
  } else {
    // Кусок повреждён, скачиваем снова
    i--; // Повторяем
  }
}

4. Сборка и сидирование

// Объединяем куски в исходный файл
const file = concatenatePieces(downloadedData);
fs.writeFile(torrent.fileName, file);

// Теперь мы можем сидировать (загружать другим)
while (hasActivePeers()) {
  // Приносим пирам куски, которые они запрашивают
  const incomingRequest = await listenForPeerRequests();
  const piece = readPiece(incomingRequest.pieceIndex);
  sendPieceToPeer(incomingRequest.peer, piece);
}

Ключевые оптимизации µTorrent

  1. Компактность — очень маленький размер (всего несколько МБ)
  2. Эффективность — использует мало ресурсов
  3. UPnP/NAT — автоматически пробивает доступ в интернет
  4. DHT — распределённая хеш-таблица для поиска пиров без трекера
  5. PEX — обмен информацией о пирах между клиентами

Преимущества P2P

  • Отсутствие центрального сервера
  • Высокие скорости скачивания (суммируются скорости всех пиров)
  • Децентрализация (трудно заблокировать)
  • Масштабируемость

Связь с Frontend

Хотя µTorrent — это работа на уровне протокола и системы, Frontend разработчики могут взаимодействовать с торрент-клиентами через:

  • REST API торрент-приложений
  • WebTorrent (BitTorrent в браузере)
  • Electron приложения для торрент-менеджеров