# BitTorrent

**BitTórrent** (літар. англ.:  «бітавая плынь») — пірынгавы (P2P) сеткавы пратакол для кааператыўнага абмену файламі праз сеціва.

Файлы перадаюцца часткамі, кожны torrent-кліент, які атрымлівае (спампоўвае) гэтыя часткі, адначасова аддае (запампоўвае) іх іншым кліентам, што зніжае нагрузку і залежнасць ад кожнага кліента-крыніцы і забяспечвае надмер інфармацыі.

Пратакол быў створаны Брэмам Коэнам, які напісаў першы torrent-кліент «BitTorrent» на мове Python 4 красавіка 2001 года. Запуск першай версіі адбыўся 2 ліпеня 2001 года.

Існуе шмат іншых BitTorrent кліентаў для абмену файламі па пратаколе BitTorrent.

## Файл метаданых

Файл метаданых з’яўляецца слоўнікам у фармаце bencode з пашырэннем .torrent. Змяшчае наступную інфармацыю:

* URL трэкера;
* агульную інфармацыю пра файлы (назва, памер і інш.) у гэтай раздачы;
* кантрольныя сумы (SHA1) кавалкаў файлаў у раздачы;
* Passkey карыстальніка, калі ён зарэгістраваны на гэтым трэкеры. Даўжыня ключа вызначаецца трэкерам;
* (неабавязкова) кантрольныя сумы цэлых файлаў;
* (неабавязкова) альтэрнатыўныя крыніцы, што працуюць не па пратаколе BitTorrent. Найбольшы распаўсюд маюць так званыя web-сіды (пратакол HTTP), але таксама могуць быць ftp, ed2k, magnet URI.

## Прынцып працы пратакола

Прынцып працы BitTorrent: нагрузка на распаўсюдніка файла памяншаецца дзякуючы таму, што кліенты пачынаюць абменьвацца інфармацыяй адразу ж, нават калі файл не дапампаваны імі да канца.
Перад пачаткам спампоўвання кліент падключаецца да трэкера па адрасе, пазначаным ў торэнт-файле, паведамляе яму свой адрас і хэш-суму торэнт-файла, на што ў адказ кліент атрымлівае адрасы іншых кліентаў, што спампоўваюць або раздаюць гэты ж файл. Далей кліент перыядычна інфармуе трэкер аб ходзе працэсу і атрымлівае абноўлены спіс адрасоў. Гэты працэс завецца абвяшчэннем (анг. announce).

Кліенты злучаюцца адзін з адным і абменьваюцца кавалкамі файлаў без непасрэднага ўдзелу трэкера, які толькі захоўвае інфармацыю, атрыманую ад падключаных да абмену кліентаў, спіс саміх кліентаў і іншую статыстычную інфармацыю. Для эфектыўнай працы сеткі BitTorrent неабходна, каб як мага больш кліентаў былі здольныя прымаць уваходныя злучэнні. Няправільна наладжаны NAT або брандмаўэр могуць гэтаму перашкодзіць.

Пры падключэнні кліенты адразу абменьваюцца інфармацыяй пра наяўныя ў іх кавалкі. Кліент, які хоча спампаваць кавалак (ліч), дасылае запыт і, калі другі кліент гатовы аддаваць, атрымлівае гэты кавалак. Пасля гэтага кліент правярае кантрольную суму кавалка. Калі яна супала з той, што запісана ў торэнт-файле, то кавалак лічыцца паспяхова спампаваным, і кліент паведамляе ўсім падключаным пірам пра наяўнасць ў яго гэтага кавалка. Калі ж кантрольныя сумы адрозніваюцца, то кавалак пачынае спампоўвацца ізноў. Некаторыя кліенты блакіруюць піры, якія дужа часта аддаюць некарэктныя кавалкі.

Такім чынам, аб'ём службовай інфармацыі (памер торэнт-файла і памер паведамленняў са спісам кавалкаў) непасрэдна залежыць ад колькасці, а значыць, і памеру кавалкаў. Таму пры выбары кавалка неабходна вытрымліваць баланс: з аднаго боку, пры вялікім памеры кавалка аб'ём службовай інфармацыі будзе менш, але ў выпадку памылкі праверкі кантрольнай сумы кліент мусіць спампоўваць нанава больш інфармацыі. З іншага боку, пры малым памеры памылкі не вельмі важныя, бо неабходна зноў спампоўваць меншы аб'ём, але затое памер торэнт-файла і паведамленняў пра наяўныя кавалкі робіцца большым.

### Раздача

Пасля атрымання поўнага файла кліент пераходзіць у іншы рэжым працы, у якім ён толькі аддае змесціва раздачы (робіцца сідам). Далей сід перыядычна інфармуе трэкер пра змены стану торэнтаў (спамповак) і абнаўляе спісы IP-адрасоў.

### Агульныя асаблівасці

* Адсутнасць чэргаў на спампоўванне.
* Файлы спампоўваюцца невялікімі кавалкамі; чым меней даступны кавалак, тым часцей ён будзе перадавацца. Такім чынам, прысутнасць у сетцы сіда з поўным файлам для спампоўвання неабавязкова — сістэма размяркуе кавалкі паміж пірамі, каб далей яны маглі абменьвацца адсутнымі кавалкамі.
* Кліенты-піры абменьваюцца кавалкамі непасрэдна паміж сабой.
* Спампаваныя кавалкі адразу становяцца даступнымі іншым кліентам.
* Кантралюецца цэльнасць кожнага кавалка.
* На кавалкі разбіваюцца не асобныя файлы, а ўся раздача цалкам, таму ў ліча, які пажадаў спампаваць толькі некаторыя файлы з раздачы, для падтрымкі суцэльнасці кавалкаў нярэдка будзе захоўвацца таксама невялікі аб'ём надмернай для яго інфармацыі.
* У якасці аб’екту раздачы могуць быць некалькі файлаў (напрыклад, змесціва каталога).

## Трэкер

**Трэкер** (англ.: tracker; /ˈtrækə(r)/) — спецыялізаваны сервер, які працуе па пратаколе HTTP. Трэкер патрэбны каб кліенты маглі знайсці адзін аднаго. Фактычна, на трэкеры захоўваюцца IP-адрасы, уваходныя порты кліентаў і хэш-сумы, якія унікальным чынам ідэнтыфікуюць аб’екты, што ўдзельнічаюць у спампоўках. Па стандарце, назвы файлаў на трэкеры не захоўваюцца, і даведацца пра іх па хэш-сумах нельга. Аднак на практыцы трэкер часта апрача сваёй асноўнай функцыі выконвае і функцыю невялікага вэб-сервера. Такі сервер захоўвае файлы метаданых і апісанні файлаў, падае статыстыку спамповак па розных файлах, паказвае бягучую колькасць падключаных піраў і інш.

## Web-сіды

Адным з варыянтаў раздачы з’яўляецца гэтак званая web-раздача. Часам на серверы з розных прычын нельга запусціць паўнавартасны торэнт-кліент. У гэтым выпадку ў якасці крыніцы раздачы выступае сервер, які працуе па пратаколе HTTP. Звычайна, кліенты аддаюць перавагу іншым BitTorrent кліентам і звяртаюцца да web-сіда толькі пры неабходнасці.

## Заганы і абмежаванні

* Недаступнасць раздачы. Гэта становішча, калі няма ніводнага сіда, а прысутныя піры яшчэ не скончылі спампоўванне.
* Адсутнасць ананімнасці. Кожны кліент атрымлівае ад сервера IP-адрасы іншых кліентаў. Можна даведацца, хто раздае або спампоўвае нейкі файл.
* Адсутнасць персаналізацыі. Карыстальнікі не маюць мянушак, няма чату паміж пірамі.
* Праблема лічаў. Некаторыя карыстальнікі не падтрымліваюць раздачу пасля завяршэння спампоўкі, што вядзе да зніжэння агульнай прадукцыйнасці.
* Адсутнасць дакладнага ўліку трафіку. Архітэктура пратаколу не прадугледжвае дакладнага механізму ўліку і кантролю трафіка паміж пунктамі сеткі. Усё, што ёсць — палі downloaded і uploaded, у якіх кліенты перадаюць пры абвяшчэнні трэкеру колькасць байт, ўлічаных пры спампоўванні/раздачы змесціва з моманту папярэдняга абвяшчэння. Аднак не кантралюючыся нікім, апроч як кліентам, яны могуць быць лёгка падменены. Для гэтага карыстальнікі статычна прапісваюць значэнні гэтых палёў у URI трэкера, карыстаюцца змененымі ці асобнымі праграмамі-кліентамі (RatioMaster, GiveMeTorrent, GreedyTorrent і г.д.), альбо папросту выдаляюць з кліента запіс аб трэкеры адразу ж пасля атрымання ад яго спісу пунктаў сеткі. Усё гэта дазваляе абыходзіць штучныя абмежаванні, якія ствараюцца адміністрацыяй шматлікіх прыватных і публічных трэкераў.

## Тэрміналогія

Ліч са сваім гуртам.
* **Абвяшчэнне** (англ.: announce) — звяртанне кліента да трэкера праз HTTP-GET-запыт. Пры кожным абвяшчэнні кліент перадае на трэкер інфармацыю пра аб'ёмы спампаванага і аддадзенага ім трафіка, a трэкер перадае кліенту спіс адрасоў іншых кліентаў. Зварот кліента да трэкера адбываецца праз пэўныя інтэрвалы часу, якія вызначаюцца наладамі кліента і трэкера.
* **Вэб-сід** — HTTP- або FTP-сервер, які выкарыстоўваецца як крыніца змесціва раздач, нароўні са звычайнымі сідамі.
* **Грэблівы** (англ.: snubbed) — кліент, які злучыўся з атрымальнікам, але не дасылае яму звесткі ўжо больш за 60 секунд.
* **Гурт** (англ.: swarm) — усе піры, што бяруць удзел у раздачы, разам.
* **Даступнасць** (англ.: availability) — колькасць поўных копій файла, даступных кліенту. Кожны сід дадае 1,00 да гэтага ліку; лічы павялічваюць даступнасць у залежнасці ад колькасці спампаванага, якога няма ў іншых лічаў. Напрыклад, калі на раздачы ёсць адзін сід і два лічы, якія спампавалі па 50% файла (спампаваныя часткі роўныя паміж сабой), то даступнасць складзе 1,50.
* **Заглухшы** (англ.: choked — заглухшы, здушаны) — кліент, абмен звесткамі з якім заглух. Або ягоны канал на выхад цалкам забіты і ён не можа нічога перадаць (дасягнуў max\_uploads), альбо ён *сід* і яму нічога не трэба атрымліваць.
* **Зацікаўлены** (англ.: interested) — удзельнік, які жадае атрымаць кавалкі файла, наяўныя ў іншага ўдзельніка. Напрыклад, калі ў кліента А няма нейкіх частак, якія ёсць у кліента Б, лічыцца, што кліент А зацікаўлены ў абмене з кліентам Б.
* **Індэкс** (англ.: index) — гэта спіс файлаў .torrent (ён звычайна ўключае апісанне і іншую інфармацыю), якім кіруе вэб-сайт (*індэксатар*), і які даступны для пошуку. Сайт, што індэксуе, часта памылкова завуць трэкерам.
* **Кавалак** (англ.: piece) — усе файлы для перадачы дзеляцца на невялікія кавалкі, якія затым перадаюцца па сетцы ў адвольнай паслядоўнасці для аптымізацыі абмену.
* **Кліент** (англ.: client) — праграма, якая дазваляе рабіць файлы агульнымі праз пратакол BitTorrent. Прыкладам: qBittorrent, Transmission, Vuze.
* **Ліч** (англ.: leech — п’яўка) — пір, які не мае пакуль ўсіх кавалкаў, то бок які працягвае спампоўку. Тэрмін часта ўжываецца і ў негатыўным сэнсе, які ён мае ў іншых файлаабменных сетках: карыстальнік, які аддае значна менш, як спампоўвае.
* **Паскрэбціся** (англ.: scrape — скрэбціся) — дзеянне, аналагічнае *абвяшчэнню*, але кліент запытвае толькі статыстыку торэнта, інфармацыю пра падключаныя кліенты і магчымасць з імі звязацца для абмену.
* **Пір** (англ.: peer — саўдзельнік) — кліент, які ўдзельнічае ў раздачы.
* **Раздача** (англ.: seeding) — працэс распаўсюджвання файла па пратаколе BitTorrent.
* **Сід** (англ.: seed — сеяць) — пір, што мае ўсе кавалкі файла з раздачы, то бок ён або пачатковы распаўсюднік файла, або ўжо спампаваў увесь файл і застаўся на раздачы.
* **Стасунак** (англ.: share ratio) — стасунак аддадзенага і спампаванага.
* **Супер-раздача** (англ.: super-seeding) — спецыяльны рэжым раздачы ў некаторых BitTorrent-кліентах. Спрабуе мінімізаваць колькасць звестак, якія аддасць сід перад з’яўленнем першага спампаваўшага. Суперсід прапануе кожнаму піру спампаваць толькі адзін кавалак файла, якога яшчэ няма ў іншых піраў. Затым сід не дае гэтаму піру наступных кавалкаў, пакуль не атрымае ад іншых піраў пацверджанне, што яны таксама атрымалі гэты кавалак. Такім чынам, суперсід імкнецца пазбегнуць паўторнага аддавання адных і тых жа кавалкаў і аддаваць кавалкі толькі тым пірам, якія актыўна перадаюць іх іншым.
* **Торэнт** (англ.: torrent) — у залежнасці ад кантэксту можа азначаць як .torrent-файл з метаданымі, так і змесціва (файлы і каталогі), якое апісваецца ў .torrent-файле.
* **Трэкер** (англ.: tracker) — сервер, які каардынуе працу кліентаў BitTorrent.
* **Хэш** (англ.: hash) — SHA1 асобных кавалкаў арыгінальных файлаў, пералічаных ў слоўніку «info» .torrent-файла. Кожная частка пасля атрымання спачатку правяраецца на супадзенне хэшу. Калі праверка не выйшла, інфармацыя адкідаецца і запытваецца ізноў. Таксама ў пратаколе выкарыстоўваецца хэш самога слоўніка «info» («інфахэш»), які выступае ў ролі ідэнтыфікатара канкрэтнай раздачы.
* **URL трэкера** (англ.: tracker URL) — адрас трэкера, якому кліент робіць абвяшчэнне.
* **P2P, peer-to-peer** — азначае «роўны-роўнаму». Гэта тэхналогія абмену файламі праз сетку, пры якой кожны вузел (камп’ютар) дзейнічае і як кліент, і як сервер. Такім чынам атрымліваецца сетка без адзінага цэнтра (так званая дэцэнтралізаваная сетка).
* **Passkey** — аўтэнтыфікатар карыстальніка на неананімных трэкерах. Змяшчаецца ў спампаваным torrent-файле. Такім чынам, калі хтосьці атрымае доступ да torrent-файла, ён зможа працаваць з трэкерам ад імя гэтага карыстальніка.

## Гл. таксама

* Transmission
* qBittorrent
* Параўнанне BitTorrent-праграм

## Спасылкі

* Афіцыйны сайт BitTorrent
* Бягучая спецыфікацыя пратакола BitTorrent