Ну, раз тут собралось много лохов незнающих людей, то займусь просветлением.

BitTorrent - открытый протокол типа P2P.
Tracker - сервер, который предоставляет список пиров и сидов и ведет статистику. Не участвует в обмене.
DHT - если кратко: получает список пиров и сидов у и НЕ ведет статистику.

Для учета статистики к адресу трекера добавляется набор уникальных символов для идентификации (в народе прозван "passkey").

Запрос на tracker такой: "Дай мне список сидов и пиров. Я скачал Х байт, отдал Х байт."
Первый Запрос на tracker такой: "Дай мне список сидов и пиров. Я скачал 0 байт, отдал 0 байт."

То есть, если удалить tracker с passkey сразу после получения от него списка сидов и пиров, то статистика НЕ будет передаваться yes.gif

Я вообще программно добавляю список анонимных трекеров еще при добавлении торрента в uTorrent biggrin.gif

Trackers
Ретрекер вашего провайдера
http://retracker.local/announce

Анонимные трекеры. uTorrent принимает список разделенный пустой строкой.
http://harryy.us:8080/announce

http://tracker.bittorrent.am/announce

http://tracker.mightynova.com/announce

http://tracker.mightynova.com:4315/announce

http://tracker.openbittorrent.com/announce

http://tracker.openbittorrent.com/announce

http://tracker.prq.to/announce

http://tracker.publicbt.com/announce

http://tracker.thepiratebay.org/announce

http://tracker.torrentalk.com:2710/announce

udp://tracker.openbittorrent.com:80/announce

udp://tracker.publicbt.com/announce

udp://tracker.thepiratebay.org:80/announce

А чтобы использовать DHT на полную катушку, нужно пропатчить клиент, чтобы он не отключал эту сеть на приватных торрентах. DHT опрашивает всех известных пиров и сидов на предмет содержимого. Чем больше у вас закачек с уже известными пирами и сидами, тем быстрее будет получен список пиров и сидов для новой закачки. Патченный uTorrent можно скачать с левых сайтов или пропатчить самому (не каждый сможет) - разница в одном байте.

uTorrent DHT Patcher
uTorrent DHT Patcher 2.0.3 (упакован UPX):
00408E1B  |. 57             PUSH EDI
00408E1C  |. 68 600E4700    PUSH utorrent.00470E60                   ;  ASCII "private"
00408E21  |. 8BCE           MOV ECX,ESI
00408E23  |. 8943 08        MOV DWORD PTR DS:[EBX+8],EAX
00408E26  |. E8 EE8DFFFF    CALL utorrent.00401C19
00408E2B  |. 85C0           TEST EAX,EAX
00408E2D  |. 74 04          JE SHORT utorrent.00408E33
00408E2F  |. 804B 46 02     OR BYTE PTR DS:[EBX+46],2
00408E33  |> 57             PUSH EDI

00408E2D     EB 04          JMP SHORT utorrent.00408E33


==============

krigstask пишет

Ну-ну, это только «Сумерки» какие-нибудь так качать можно, а не редкое, когда приходится дожидаться днями раздачи.

Читай про DHT - из "редкого" превращает в "популярное"

Raf-9600 пишет

Да и к тому же, подобный чит можно вычислить, если его часто юзать.

Если прочтешь устройство BitTorrent, то поймешь (наверно), что нелегальный чит только один: отправка на трекер ложной статистики. Это делается с помощью левых программ и только твоя жадность (множитель завысил на отдачу) и криворукость программиста выдадут тебя трекеру. Я этим не пользуюсь, а все, что описано выше, информацию на трекер вообще не передает!

Keepun пишет

Ну, раз тут собралось много лохов незнающих людей, то займусь просветлением.

Это раздел "юмор"?

Keepun пишет

Я вообще программно добавляю список анонимных трекеров еще при добавлении торрента в uTorrent

И много таких как ты?

Keepun пишет

Если прочтешь устройство BitTorrent, то поймешь (наверно), что нелегальный чит только один

Сразу вспоминается бородатая шутка Задорнова: Если по новостям говорят что задержали того, кто распространял наркотики нелегально, значит есть те, кто распространяют их легально?

Keepun пишет

Я этим не пользуюсь, а все, что описано выше, информацию на трекер вообще не передает!

Ну насколько я знаю, когда ты в клиенте нажимаешь на паузу, или стопаешь скачивание, на трекер об этом сообщается. Когда ты просто удаляешь трекер после получения сидов, то как ты подметил, на трекер ничего не отсылается. Иными словами, спалить можно ;)

Raf-9600 пишет

Ну насколько я знаю, когда ты в клиенте нажимаешь на паузу, или стопаешь скачивание, на трекер об этом сообщается. Когда ты просто удаляешь трекер после получения сидов, то как ты подметил, на трекер ничего не отсылается. Иными словами, спалить можно ;)

Старт, стоп, пауза - это вообще дополнительные данные и полагаться на них вообще нельзя, так что мимо.

Keepun
Сидели себе качки, тихо мирно свои приблуды обсуждали. Не трогали никого, так сказать... Ты пошто боярыню обидел, смерд святые войны разжигаешь? :)

Keepun пишет

Я вообще программно добавляю список анонимных трекеров еще при добавлении торрента в uTorrent

Каким образом?

Sid пишет

Каким образом?

Патчер можно и самому написать. Или найти.

Я, например, свой написал на C# Делюсь кодом, но он на каждом 5 торренте дает сбой (писал для себя).

скрытый текст

Выделить код

Код:

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Text;
using System.Diagnostics;

namespace TorrentPatcher
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                foreach (String arg in args)
                {
                    new Torrent(arg);
                }
                return;
            }
        }
    }

    public struct BenCode
    {
        public bool is_num;
        public long num;
        public bool is_list;
        public bool is_dict;
        public Byte[] bytes;
        public int grp;
        public int grp_index;
    }
    public class Torrent
    {
        public Torrent(string torrent)
        {
            try
            {
                if (!File.Exists(torrent)) return;

                BinaryReader bin = new BinaryReader(File.OpenRead(torrent));

                //if (bin.ReadChar() != 'd') return;
                
                BenCode[] bcode = new BenCode[0];

                this.Decode(ref bin, ref bcode, 0);

                int x = 0;
                List<string> urls = new List<string>();
                int ann = 0;
                for (x = 0; x < bcode.Length; x++ )
                {
                    if (bcode[x].bytes != null && Encoding.ASCII.GetString(bcode[x].bytes) == "announce" && x + 1 < bcode.Length)
                    {
                        ann = x + 1;
                        urls.Add(Encoding.ASCII.GetString(bcode[ann].bytes));
                        break;
                    }
                }
                int annlist = 0;
                for (x = 0; x < bcode.Length; x++)
                {
                    if (bcode[x].bytes != null && Encoding.ASCII.GetString(bcode[x].bytes) == "announce-list" && x + 1 < bcode.Length)
                    {
                        annlist = x + 1;
                        this.AnnList(ref urls, bcode, bcode[annlist].grp);
                        break;
                    }
                }

                urls.RemoveAll(DelTracker);
                
                urls.Add("http://retracker.local/announce");
                urls.Add("http://harryy.us:8080/announce");
                urls.Add("http://tracker.mightynova.com/announce");
                urls.Add("http://tracker.mightynova.com:4315/announce");
                urls.Add("http://tracker.bittorrent.am/announce");
                urls.Add("http://tracker.openbittorrent.com/announce");
                urls.Add("http://tracker.openbittorrent.com:80/announce");
                urls.Add("http://tracker.prq.to/announce");
                urls.Add("http://tracker.thepiratebay.org/announce");
                urls.Add("http://tracker.torrentalk.com:2710/announce");
                urls.Add("http://tracker.publicbt.com/announce");
                urls.Add("udp://tracker.openbittorrent.com:80/announce");
                urls.Add("udp://tracker.thepiratebay.org:80/announce");
                urls.Add("udp://tracker.publicbt.com/announce");
                
                urls.Sort();
                urls.Insert(0, "");
                Uri url;
                if (annlist > 0) bcode[annlist].grp = bcode.Length - 1;
                for (x = 1; x < urls.Count; x++ )
                {
                    if (urls[x] == urls[x - 1]) continue;
                    if (Uri.TryCreate(urls[x], UriKind.Absolute, out url))
                    {
                        if (ann > 0)
                        {
                            bcode[ann].grp_index = 1;
                            bcode[ann].grp = 0;
                            Array.Resize(ref bcode[ann].bytes, Encoding.ASCII.GetByteCount(url.AbsoluteUri));
                            bcode[ann].bytes = Encoding.ASCII.GetBytes(url.AbsoluteUri);
                            ann = -1;
                            x--;
                            continue;
                        }
                        else if (ann == 0)
                        {
                            Array.Resize(ref bcode, bcode.Length + 2);
                            bcode[bcode.Length - 2].grp_index = 1;
                            Array.Resize(ref bcode[bcode.Length - 2].bytes, Encoding.ASCII.GetByteCount("announce"));
                            bcode[bcode.Length - 2].bytes = Encoding.ASCII.GetBytes("announce");

                            ann = bcode.Length - 1;
                            bcode[ann].grp_index = 1;
                            bcode[ann].grp = 0;
                            Array.Resize(ref bcode[ann].bytes, Encoding.ASCII.GetByteCount(url.AbsoluteUri));
                            bcode[ann].bytes = Encoding.ASCII.GetBytes(url.AbsoluteUri);
                            ann = -1;
                            x--;
                            continue;
                        }

                        if (annlist == 0)
                        {
                            Array.Resize(ref bcode, bcode.Length + 2);
                            bcode[bcode.Length - 2].grp_index = 1;
                            Array.Resize(ref bcode[bcode.Length - 2].bytes, Encoding.ASCII.GetByteCount("announce-list"));
                            bcode[bcode.Length - 2].bytes = Encoding.ASCII.GetBytes("announce-list");

                            annlist = bcode.Length - 1;
                            bcode[annlist].is_list = true;
                            bcode[annlist].grp_index = 1;
                            bcode[annlist].grp = annlist;
                        }
                        if (annlist > 0)
                        {
                            Array.Resize(ref bcode, bcode.Length + 2);
                            bcode[bcode.Length - 2].is_list = true;
                            bcode[bcode.Length - 2].grp_index = bcode[annlist].grp;
                            bcode[bcode.Length - 2].grp = bcode.Length - 1;
                            bcode[bcode.Length - 1].grp_index = bcode.Length - 1;
                            Array.Resize(ref bcode[bcode.Length - 1].bytes, Encoding.ASCII.GetByteCount(url.AbsoluteUri));
                            bcode[bcode.Length - 1].bytes = Encoding.ASCII.GetBytes(url.AbsoluteUri);
                        }
                    }
                }

                int ext = torrent.LastIndexOf(".torrent");
                if (ext > 0)
                {
                    torrent = torrent.Insert(ext, "_" + DateTime.Now.Millisecond.ToString());
                }
                else
                {
                    torrent += ".torrent";
                }
                #if DEBUG
                    torrent = "test.torrent";
                #endif

                BinaryWriter binwr = new BinaryWriter(File.Create(torrent));

                this.Encode(ref binwr, bcode, 0);

                bin.Close();
                binwr.Close();

                #if !DEBUG
                    Process.Start(torrent);
                #endif
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private long Num(ref BinaryReader bin)//, ref Byte[] bytes, int index)
        {
            Char numb = bin.ReadChar();
            String res = "";
            while ((numb >= '0' && numb <= '9') || numb == '-')
            {
                res += numb.ToString();
                numb = bin.ReadChar();
            }
            if (numb != ':' && numb != 'e') return 0;
            return long.Parse(res);
        }

        private void AnnList(ref List<string> url, BenCode[] bcode, int index)
        {
            var ind = from i in bcode where i.grp_index == index select i;
            foreach (BenCode bc in ind)
            {
                if (bc.bytes != null && bc.bytes.Length > 0)
                {
                    String y = Encoding.ASCII.GetString(bc.bytes);
                    url.Add(Encoding.ASCII.GetString(bc.bytes));
                }

                if (bc.is_list || bc.is_dict)
                {
                    this.AnnList(ref url, bcode, bc.grp);
                }
            }
        }

        private bool Decode(ref BinaryReader bin, ref BenCode[] bcode, int index)
        {
            while (bin.BaseStream.Position < bin.BaseStream.Length)
            {
                switch (bin.ReadChar())
                {
                    case 'd': // Dictionary
                        {
                            Array.Resize(ref bcode, bcode.Length + 1);
                            bcode[bcode.Length - 1].is_dict = true;
                            bcode[bcode.Length - 1].grp_index = index;
                            bcode[bcode.Length - 1].grp = bcode.Length;
                            this.Decode(ref bin, ref bcode, bcode.Length);
                        }
                        break;
                    case 'i': // Number
                        {
                            Array.Resize(ref bcode, bcode.Length + 1);
                            bcode[bcode.Length - 1].is_num = true;
                            bcode[bcode.Length - 1].num = this.Num(ref bin);
                            bcode[bcode.Length - 1].grp_index = index;
                        }
                        break;
                    case 'l': // List
                        {
                            Array.Resize(ref bcode, bcode.Length + 1);
                            bcode[bcode.Length - 1].is_list = true;
                            bcode[bcode.Length - 1].grp_index = index;
                            bcode[bcode.Length - 1].grp = bcode.Length;
                            this.Decode(ref bin, ref bcode, bcode.Length);
                        }
                        break;
                    case 'e': // End
                        return true;
                    default:
                        {
                            bin.BaseStream.Position -= 1;
                            int count = (int)this.Num(ref bin);
                            if (count > 0)
                            {
                                Array.Resize(ref bcode, bcode.Length + 1);
                                Array.Resize(ref bcode[bcode.Length - 1].bytes, count);
                                bcode[bcode.Length - 1].grp_index = index;
                                bin.Read(bcode[bcode.Length - 1].bytes, 0, count);
                            }
                        }
                        break;
                }
            }
            return true;
        }

        private void Encode(ref BinaryWriter bin, BenCode[] bcode, int index)
        {
            var ind = from i in bcode where i.grp_index == index select i;
            foreach (BenCode bc in ind)
            {
                if (bc.bytes != null && bc.bytes.Length > 0)
                {
                    bin.Write(String.Format("{0}:", bc.bytes.Length).ToCharArray());
                    bin.Write(bc.bytes);
                }
                else if (bc.is_num)
                {
                    bin.Write(String.Format("i{0}e", bc.num).ToCharArray());
                }

                if (bc.is_dict)
                {
                    bin.Write('d');
                    this.Encode(ref bin, bcode, bc.grp);
                    bin.Write('e');
                }
                else if (bc.is_list)
                {
                    bin.Write('l');
                    this.Encode(ref bin, bcode, bc.grp);
                    bin.Write('e');
                }
            }
        }

        private static bool DelTracker(String s)
        {
// Сразу вырезает известные трекеры
            if (s.IndexOf("rutracker.") > 0) return true;
            if (s.IndexOf("free-torrents.") > 0) return true;
            return false;
        }
    }
}

Keepun пишет

Делюсь кодом

Ой нет, это слишком сильное колдунство для меня. :(

Всё это весьма интересно, но как объяснить следущee:
Дано: Ubuntu 10.04.2 x86_64, Deluge 1.3.1
В один прекрасный момент, без каких либо действий с моей стороны, треккер (rutracker) перестал учитывать скачаное. При этом все раздачи учитываются.  Как и таймбонусы.
Я человек не жадный - раздаю по 15 и более Gb в день (канал безлимитный, 35+35 мбит/сек, полный дуплекс)., стараюсь всегда поддерживать 40-50  раздач, ограничения на скорость и время раздачи отключено.
Вот такие вот дела. :/