トレントファイル

BitTorrentファイル配布システムにおいて、**トレントファイル**（）または**メタ情報ファイル**（）とは、配布対象のファイルおよびフォルダに関するメタデータを含み、通常はトラッカーと呼ばれるコンピュータのネットワーク上の位置情報のリストも含むファイルである。トラッカーは、システム参加者同士が互いを見つけ、スウォームと呼ばれる効率的な配布グループを形成するのを助ける。トレントファイルは通常、`.torrent`という拡張子を持つ。

トレントファイルは、トレントクライアントの使用により情報を見つけることが可能となる目次（インデックス）のような役割を果たす。トレントファイルを用いることで、元のファイルを既にダウンロード済みのコンピュータから小さな部分ごとに取得できる。これらの「ピア」は、プライマリサーバに加えて、あるいはその代替として、ファイルのダウンロードを可能にする。トレントファイル自体には配布されるコンテンツは含まれておらず、それらのファイルに関する情報、たとえばファイル名、、サイズ、ファイル完全性を検証するための暗号学的ハッシュ関数によるハッシュ値などが含まれている。

トレントシステムは中央サーバへの負荷を軽減するために設計されており、個々のクライアントがサーバからファイルを取得するのではなく、必要な帯域幅を分担することで、大容量ファイルのダウンロード時間を短縮する。多くの自由ソフトウェアやフリーウェア、Linuxディストリビューションをはじめとする各種オペレーティングシステムは、上記の利点を求めるユーザーのためにトレントによるダウンロードオプションを提供している。メディアファイルなどの他の大容量ダウンロードもトレントによって行われることが多い。

## 背景
一般的にインターネット接続は非対称型であり、アップロード速度よりもダウンロード速度が速く、各ダウンロードに割り当てられる帯域幅が制限されていたり、帯域制限やアクセス不能時間帯が設けられていたりする。このような状況では、多数のユーザーが同一ファイルセットを単一のソースから取得しようとする際に非効率が生じる。ソースは常時オンラインでなければならず、大量の送信帯域幅を必要とする。この問題を解決するためにトレントプロトコルは配布を分散化し、利用者同士が「P2P」でネットワークを構築する能力を活用する。

配布される各ファイルは「ピース」と呼ばれる小さな情報の断片に分割される。ダウンロードするピアは、スウォーム内の複数のコンピュータから同時に複数のピースを要求することで、高速なダウンロードを実現する。取得されたピースは通常、即座に他のスウォーム内の参加者がダウンロードできるように共有される。このようにして、ネットワーク負荷は中央の配布拠点ではなくダウンローダー間に分散される。すべてのピースが揃っていれば、ピア（ダウンローダーおよびアップローダー）は入退場自由であり、すべてのピースを保持していたりスウォームに常時接続していたりする必要はない。

共有対象のファイルまたはフォルダを表すために小さなトレントファイルが作成される。トレントファイルは実際のコンテンツのダウンロードを開始するための鍵となる。共有されたファイルまたはフォルダを取得したい者は、まず対応するトレントファイルを直接ダウンロードするか、マグネットリンクを利用して入手する。その後、ユーザーはそのファイルをトレントクライアントで開き、残りの処理は自動的に実行される。ピアのインターネット上の位置情報を得るため、クライアントはトレントファイルに記載されたトラッカーに接続、または分散ハッシュテーブルを利用して同様の結果を得る。そしてクライアントはピアに直接接続し、ピースの要求やスウォームへの参加を行う。クライアントは進捗状況をトラッカーに報告し、トラッカーによるピアの推薦を助ける場合もある。

すべてのピースが揃うと、トレントクライアントはそれらを組み立てて利用可能な形にする。またクライアントは引き続きピースを共有し、通常のピアではなく「シーダー」という役割を担うようになる。

## ファイル構造
トレントファイルは、ファイルの一覧とすべてのピースに関する完全性メタデータを含み、任意で多数のトラッカーのリストを含む。

トレントファイルは、以下のキーを持つBencode形式の連想配列（Bencoded辞書のキーは常に辞書式順序で並ぶ）である。
*  — メイントラッカーのURL
*  — 以下のキーを持つ辞書に対応し、キーは1つまたは複数のファイルが共有されるかに大きく依存する:
**  — 各ファイルに対応する辞書のリスト（複数ファイルが共有される場合のみ）。各辞書は以下のキーを持つ:
***  — ファイルのバイト単位のサイズ
***  — サブディレクトリ名に対応する文字列のリストで、最後の要素が実際のファイル名
**  — ファイルのバイト単位のサイズ（単一ファイルが共有される場合のみ）
**  — ファイルが保存される際の推奨ファイル名（単一ファイルの場合）／ファイル群が保存される推奨ディレクトリ名（複数ファイルの場合）
**  — ピースごとのバイト数。一般的に28KiB = 256&nbsp;KiB = 262,144&nbsp;B
**  — 、すなわち各ピースのSHA-1ハッシュを連結したもの。SHA-1は160ビットのハッシュを返すため、は20バイトの倍数長の文字列となる。トレントが複数ファイルを含む場合、辞書に記載された順にファイルを連結してピースが構成される（すべてのピースは完全な長さを持つが、最後のピースのみ短くなることがある）

すべての文字列はを除きUTF-8でエンコードされていなければならない。はバイナリデータを含む。

トレントはinfohashによって一意に識別される。これは辞書の内容をBencode形式でSHA-1ハッシュ化したものである。他の部分を変更してもこのハッシュは変化しない。このハッシュは、DHTを通じたピア間通信やトラッカーとのやり取り、そしてマグネットリンクで使用される。

### BitTorrent v2
BitTorrent v2プロトコル（BEP-0052）は、トレントファイルの新たな定義を導入する。基本構造は以下のとおりである。
*  — トラッカーのURL
*  — 以下のキーを持つ辞書に対応し、キーは1つまたは複数のファイルが共有されるかに依存する:
**  — ファイル群が保存される推奨ディレクトリ名
**  — ピースごとのバイト数。一般的に28KiB = 256&nbsp;KiB = 262,144&nbsp;B。v2では2の累乗でなければならない
**  — 数値 "2"
**  — 辞書のツリー構造。各キーはディレクトリ名またはファイル名を表す。ファイルには以下が含まれる:
***  — ファイルのバイト単位のサイズ（単一ファイルが共有される場合のみ）
***  — 非空ファイルの場合、ファイルを16KiBのブロックに分けて構築された分岐2のハッシュ木のルートハッシュ
*  — 各ピースに対応する新しいタイプのマークルルートハッシュを含む文字列の辞書

新しい形式では、ピースのハッシュ化とinfohashの両方にSHA-256が使用され、破損したSHA-1に置き換わる。"btmh"マグネットリンクには32バイトの完全なハッシュが含まれ、トラッカーやDHTとの通信では旧来のメッセージ構造に収めるため20バイトに短縮されたバージョンが用いられる。"v2"トレントとして新しいフィールドのみを用いたファイル、または旧形式と新形式の両方のフィールドを持つ「ハイブリッド」形式のファイルを構成することが可能である。ただし、v1とv2ではinfohashが異なるため、2つのスウォームが形成され、クライアントによる特別な統合処理が必要となる。

新形式の中核的な特徴はハッシュ木の応用であり、ピースを16KiB単位で個別に検証・再取得することが可能となる。各ファイルは常に完全なピースサイズに適合し、独立したマークルルートハッシュを持つため、ピースサイズが異なる無関係なトレント間でも重複ファイルの検出が可能である。ファイルサイズ自体は変化しない（ピースサイズが同じである場合。v2のツリー構造により、大きなピースでも影響が少ない）一方、マグネットリンクに必要な辞書のサイズは縮小される（v2専用トレントに限る）。

## 拡張

トレントファイルには、BitTorrent仕様の拡張として定義された追加のメタデータを含めることができる。これらは「BitTorrent Enhancement Proposals（BEP）」として知られている。その例としては、トレントの作成者や作成日時に関するメタデータがある。

### 承認された拡張
これらの拡張は、1つ以上の実装において導入されており、かつ一貫した広範な使用により有用性が実証されている。わずかな改訂が必要な場合もあるが、基本的には完成したものと見なされており、ブラム・コーエンの承認を得て最終/アクティブプロセスの地位へと昇格することが期待されている。

#### 分散ハッシュテーブル
BEP-0005は、BitTorrentを分散ハッシュテーブル、特にMainline DHTに対応させるための拡張である。

トラッカーを持たないトレント辞書にはキーが存在しない。その代わりに、キーが使用される。

```yaml
{
  # ...
  'nodes': [["<host>", <port>], ["<host>", <port>], ...],
  # ...
}
```

例えば、

```yaml
'nodes': [["127.0.0.1", 6881], ["your.router.node", 4804]],
```

仕様では、は「トレント生成クライアントのルーティングテーブル内でK個の最も近いノードに設定されるべき」と推奨している。または「トレントを生成する者が運用する既知の良好なノード」でもよいとされている。

#### 複数トラッカー
BEP-0012は、BitTorrentにおいて複数のトラッカーをサポートするための拡張である。

新たなキーは、最上位の辞書（つまりおよびと同じ階層）に配置される。

```yaml
{
  # ...
  'announce-list': [['<tracker1-url>']['<tracker2-url>']],
  # ...
}
```


#### HTTPシード
BEP-0019は、BitTorrentでHTTPシードを使用可能にする2つの拡張のうちの1つである。

BEP-0019では、新たなキーが最上位のリストに配置される。クライアントはこのリンクを用いて通常のHTTP URLを組み立てる。サーバー側のサポートは不要である。この機能は、ソフトウェアのダウンロードを提供するオープンソースプロジェクトで非常によく使用されている。Webシードを利用することで、クライアントはP2PとHTTP(S)のいずれも含めたミラーサイトを賢く選択し、同時に使用できる。これによりプロジェクトのサーバー負荷を軽減しつつ、ダウンロード速度を最大化できる。はWebシード付きのトレントを自動生成する。

#### プライベートトレント
BEP-0027は、BitTorrentでプライベートトレントをサポートするための拡張である。

新たなキーは、辞書内に配置される。このキーの値が1であれば、そのトレントはプライベートである。

```yaml
{
  # ...
  'info': {
    # ...
    'private': 1,
    # ...
  },
  # ...
}
```


プライベートトレントは「プライベートトラッカー」と共に使用される。こうしたトラッカーは、ピアのIPを確認し、未知のIPにはピアリストを提供しないことでトレントへのアクセスを制限する。通常、ピアはゲート付きオンラインコミュニティを通じてトラッカーに登録され、プライベートトラッカーはそのコミュニティ内で使用されるデータ転送量の統計も保持する。

DHT、PeX、といった分散型の手法は、集中管理を維持するために無効化される。プライベートトレントは手動で編集してプライベートフラグを削除できるが、その場合、info-hashは決定論的に変化し、別の「スウォーム」が形成される。一方、トラッカーリストを変更してもハッシュは変化しない。このフラグは真のプライバシーを提供するものではなく、むしろ紳士協定として機能する。

## 参考文献
* BitTorrent用語一覧
* マグネットリンク

## 脚注

## 外部リンク
* Official BitTorrent Specification
* BitTorrent Definition