Ну, раз тут собралось много лохов незнающих людей, то займусь просветлением.
BitTorrent - открытый протокол типа P2P.
Tracker - сервер, который предоставляет список пиров и сидов и ведет статистику. Не участвует в обмене.
DHT - если кратко: получает список пиров и сидов у и НЕ ведет статистику.
Для учета статистики к адресу трекера добавляется набор уникальных символов для идентификации (в народе прозван "passkey").
Запрос на tracker такой: "Дай мне список сидов и пиров. Я скачал Х байт, отдал Х байт."
Первый Запрос на tracker такой: "Дай мне список сидов и пиров. Я скачал 0 байт, отдал 0 байт."
То есть, если удалить tracker с passkey сразу после получения от него списка сидов и пиров, то статистика НЕ будет передаваться
Я вообще программно добавляю список анонимных трекеров еще при добавлении торрента в uTorrent
Анонимные трекеры. 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 можно скачать с левых сайтов или пропатчить самому (не каждый сможет) - разница в одном байте.
00408E2D EB 04 JMP SHORT utorrent.00408E33
==============
Ну-ну, это только «Сумерки» какие-нибудь так качать можно, а не редкое, когда приходится дожидаться днями раздачи.
Читай про DHT - из "редкого" превращает в "популярное"
Да и к тому же, подобный чит можно вычислить, если его часто юзать.
Если прочтешь устройство BitTorrent, то поймешь (наверно), что нелегальный чит только один: отправка на трекер ложной статистики. Это делается с помощью левых программ и только твоя жадность (множитель завысил на отдачу) и криворукость программиста выдадут тебя трекеру. Я этим не пользуюсь, а все, что описано выше, информацию на трекер вообще не передает!
Зачем вашему компу оперативная память, если вы сами не хотите, чтобы софт ее всю использовал?
Отсутствует
Ну, раз тут собралось много лохов незнающих людей, то займусь просветлением.
Это раздел "юмор"?
Я вообще программно добавляю список анонимных трекеров еще при добавлении торрента в uTorrent
И много таких как ты?
Если прочтешь устройство BitTorrent, то поймешь (наверно), что нелегальный чит только один
Сразу вспоминается бородатая шутка Задорнова: Если по новостям говорят что задержали того, кто распространял наркотики нелегально, значит есть те, кто распространяют их легально?
Я этим не пользуюсь, а все, что описано выше, информацию на трекер вообще не передает!
Ну насколько я знаю, когда ты в клиенте нажимаешь на паузу, или стопаешь скачивание, на трекер об этом сообщается. Когда ты просто удаляешь трекер после получения сидов, то как ты подметил, на трекер ничего не отсылается. Иными словами, спалить можно
Иногда мне кажется, что лучшие программисты мира и лучшие технические умы работают только над одним - как сделать так, чтоб на новом скоростном железе тормозило также, как на хламе 10 летней давности.
(с)
Отсутствует
Ну насколько я знаю, когда ты в клиенте нажимаешь на паузу, или стопаешь скачивание, на трекер об этом сообщается. Когда ты просто удаляешь трекер после получения сидов, то как ты подметил, на трекер ничего не отсылается. Иными словами, спалить можно
Старт, стоп, пауза - это вообще дополнительные данные и полагаться на них вообще нельзя, так что мимо.
Зачем вашему компу оперативная память, если вы сами не хотите, чтобы софт ее всю использовал?
Отсутствует
Keepun
Сидели себе качки, тихо мирно свои приблуды обсуждали. Не трогали никого, так сказать... Ты пошто боярыню обидел, смерд святые войны разжигаешь?
Отредактировано AC/PC (03-06-2011 19:31:21)
Раздаю плюсы за минусы. Расценка 1 к 3. Первой десятке скидка. 2 плюса за 4 минуса.
Отсутствует
Каким образом?
Патчер можно и самому написать. Или найти.
Я, например, свой написал на 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; } } }
Зачем вашему компу оперативная память, если вы сами не хотите, чтобы софт ее всю использовал?
Отсутствует
Всё это весьма интересно, но как объяснить следущee:
Дано: Ubuntu 10.04.2 x86_64, Deluge 1.3.1
В один прекрасный момент, без каких либо действий с моей стороны, треккер (rutracker) перестал учитывать скачаное. При этом все раздачи учитываются. Как и таймбонусы.
Я человек не жадный - раздаю по 15 и более Gb в день (канал безлимитный, 35+35 мбит/сек, полный дуплекс)., стараюсь всегда поддерживать 40-50 раздач, ограничения на скорость и время раздачи отключено.
Вот такие вот дела.
Arch Linux & xmonad
Отсутствует