Skip to content

Instantly share code, notes, and snippets.

@ymmt2005
Created February 3, 2016 08:00
Show Gist options
  • Save ymmt2005/a32c0e712b7f16ff05e2 to your computer and use it in GitHub Desktop.
Save ymmt2005/a32c0e712b7f16ff05e2 to your computer and use it in GitHub Desktop.
BitTorrent 調査

BitTorrent 調査まとめ

概要

BitTorrentの仕組みを読むのが早い。

完全な P2P というわけではなく、コンテンツとピアの情報を管理するトラッカーというサーバーがいる。トラッカー不在でも動作するDHTモードという仕組みもある。

多数のピアから分散ダウンロードする仕組みなので、以下の場合に有効。

  • 巨大なファイルを複数サーバーでダウンロードする
  • そこそこのファイルを非常に多数のサーバーでダウンロードする

逆に言えば、帯域が問題にならないケースで利用する意味は薄い。

Winny と違い、ダウンロードしようとしていないファイルを勝手にダウンロード することはないので、その点は安心。

準備

Ubuntu 14.04 に以下のパッケージをインストールしておく。

  • transmission-cli
  • transmission-daemon

transmission-daemon はデフォルトで DHT 有効になっているので、 インストール後はひとまず停止しておくのが無難。

transmission-daemontransmission-remote コマンドで管理する。 transmission-daemon の RPC の初期パスワードは明記されていないがtransmission

例えば新たなファイルをシードする方法は以下に詳しい。

用語

torrent (torrent file)

トレントファイルには、ファイルの情報とトラッカーの情報が記録されている。 クライアントはトラッカーにアクセスしてファイルを持つピアの情報を入手し、 分散ダウンロードする仕組みとなっている。

torrent ファイルの作成には transmission-create コマンドを使う。

DHT Network

トラッカーが落ちたときでもダウンロードができるよう、ピア同士で相手を 探してネットワークを構築する仕組み。UDP でピアを探すのでネットワーク に負荷がかかるとのこと。

データセンター内であれば、ここは最適化できそうではある。

Seed/Seeder

torrent の指すファイルを完全に保持しており、他のピアに配信している ピアのこと。torrent 単位であって、ある torrent のシードでも、完全に 保持していない torrent についてはピアのまま。

Web Seed

HTTP/FTP サーバーをシードサーバーにする機能。torrent ファイルに ダウンロード用の URL を埋め込む拡張で、対応しているクライアントなら HTTP/FTP サーバーをシードとして利用する。

Magnet URI

torrent ファイルにかわり、DHT を前提にファイルのハッシュを URI にしたもの。 トラッカーの情報は含まれない。torrent ファイルを magnet に変換するには、 以下のようにする。

transmission-show -m *.torrent

Magnet URI には HTTP の URL もフォールバック用に as パラメータとして 含めることができる。しかしながら、クライアントが対応していないことがある。

対応しているクライアントであれば、通常の HTTP サーバーに初期シードさせる ことができる、気がする(要検証)。

Wikipedia にはないが、ws という Web Seed 用のパラメータがあり、これは transmission も対応している。ここによると、ws に指定した URL + ".torrent" として torrent ファイルをメタデータとして 置いておくべし、とある。

活用例

Twitter

  • Murder: Fast datacenter code deploys using BitTorrent

    Murdur という OSS を公開している。Ruby のデプロイツールである Capistrano に組込んで使うようになっている。40分かかっていたデプロイ 作業が 12 秒に短縮されたとのこと。

Facebook

eBay

各種実装

Transmission

transmission-gtk は Ubuntu Desktop の標準 BitTorrent クライアントに なっている。transmission-daemon としてデーモンとしても動作し、サーバーで 常時走らせることも可能。

Deluge

後述する libtorrent の Python バインディングで作成された 高機能クライアント。とあるが、ドキュメント不足でインストールしても まともに使えない。。

Murdur

Twitter は BitTorrent の配布の仕組みを Murdur という OSS として公開している。 Capistrano 連携を除くと、Python で書かれた BitTornado をもとにした非常に シンプルな仕組みとなっている。BitTornado の開発は 2006 年から停滞しており、 Python3 対応も見込めないことから、参考に留めるのが良さそう。

Go

  • Taipei-Torrent

    一通りクライアント機能はあるようだが、トラッカーの実装は初期にあたえた torrent のアナウンスしかないようだ。
    torrent 増やすには再起動? しかしそうすると、ピアの情報が失われる。。

  • anacrolix/torrent

    ライブラリとしての利用を前提とある。かなり巨大な実装。
    一方でトラッカーはクライアントからトラッカーにつなぐ部分しか実装がない。

短くいうと、トラッカーは別で調達する必要はあるが、クライアントは作れる or ある。

C/C++

C++ で実装された libtorrent を使うものが多い。 Python binding もあり、頻繁にリリースもされている。

うまくいかない実験

magnet URI に ws パラメータを付加して transmission-daemon に ダウンロードさせようとしたが、ダウンロードが開始されなくて困ったの図。

他にピアがいないからなのか、やはり Web サーバーに .torrent ファイルを 置いてないからなのか、まだ調査できていない。

$ transmission-remote -n transmission:transmission -a 'magnet:?xt=urn:btih:d9aeb6e7bfbd65886dc2394d19a473c01d53c69e&dn=block-modules-2.6.32-21-generic-di%5F2.6.32-21.32%5Famd64.udeb&ws=http%3a%2f%2farchive%2eubuntu%2ecom%2fubuntu%2fpool%2fmain%2fl%2flinux%2fblock%2dmodules%2d2%2e6%2e32%2d21%2dgeneric%2ddi_2%2e6%2e32%2d21%2e32_amd64%2eudeb'
localhost:9091/transmission/rpc/ responded: "success"

$ transmission-remote -n transmission:transmission -l
ID     Done       Have  ETA           Up    Down  Ratio  Status       Name
   1    n/a       None  Unknown      0.0     0.0   None  Idle         memtest86+.bin
   2    n/a       None  Unknown      0.0     0.0   None  Idle         block-modules-2.6.32-21-generic-di_2.6.32-21.32_amd64.udeb
Sum:              None               0.0     0.0

$ transmission-remote -n transmission:transmission -t 2 -i
NAME
  Id: 2
  Name: block-modules-2.6.32-21-generic-di_2.6.32-21.32_amd64.udeb
  Hash: d9aeb6e7bfbd65886dc2394d19a473c01d53c69e
  Magnet: magnet:?xt=urn:btih:d9aeb6e7bfbd65886dc2394d19a473c01d53c69e&dn=block-modules-2.6.32-21-generic-di%5F2.6.32-21.32%5Famd64.udeb&ws=http%3A%2F%2Farchive.ubuntu.com%2Fubuntu%2Fpool%2Fmain%2Fl%2Flinux%2Fblock-modules-2.6.32-21-generic-di%5F2.6.32-21.32%5Famd64.udeb

TRANSFER
  State: Idle
  Location: /var/lib/transmission-daemon/downloads
  Percent Done: nan%
  ETA: 0 seconds (0 seconds)
  Download Speed: 0 kB/s
  Upload Speed: 0 kB/s
  Have: None (None verified)
  Availability: None
  Availability: nan%
  Total size: None (None wanted)
  Downloaded: None
  Uploaded: None
  Ratio: None
  Corrupt DL: None
  Peers: connected to 0, uploading to 0, downloading from 0
  Web Seeds: downloading from 0 of 1 web seeds

HISTORY
  Date added:       Wed Feb  3 09:53:23 2016
  Date started:     Wed Feb  3 09:53:23 2016
  Downloading Time: 3 minutes, 17 seconds (197 seconds)

ORIGINS
  Public torrent: Yes
  Piece Count: 0
  Piece Size: None

LIMITS & BANDWIDTH
  Download Limit: Unlimited
  Upload Limit: Unlimited
  Ratio Limit: Default
  Honors Session Limits: Yes
  Peer limit: 50
  Bandwidth Priority: Normal

$ sudo transmission-show /var/lib/transmission-daemon/info/torrents/block-modules-2.6.32-21-generic-di_2.6.32-21.32_amd64.udeb.d9aeb6e7bfbd6588.torrent
Name: block-modules-2.6.32-21-generic-di_2.6.32-21.32_amd64.udeb
File: torrents/block-modules-2.6.32-21-generic-di_2.6.32-21.32_amd64.udeb.d9aeb6e7bfbd6588.torrent

GENERAL

  Name: block-modules-2.6.32-21-generic-di_2.6.32-21.32_amd64.udeb
  Hash: d9aeb6e7bfbd65886dc2394d19a473c01d53c69e
  Created by: 
  Created on: Unknown
  Piece Count: 0
  Piece Size: 0.00 KiB
  Total Size: 0.00 kB
  Privacy: Public torrent

TRACKERS

WEBSEEDS

  http://archive.ubuntu.com/ubuntu/pool/main/l/linux/block-modules-2.6.32-21-generic-di_2.6.32-21.32_amd64.udeb

FILES

所感

トラッカーどうするかがちょっと悩ましい。 Seeding はやはり Web Seeding できるほうが楽。

magnet URI 対応しているなら、BitTorrent プロトコルにこだわる必要は 必ずしもないかもしれない。と思ってみたが、Gnutella はじめ、BitTorrent ほど クライアントや実装の選択肢が広いものはない。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment