BitTorrent の 分散ハッシュテーブル（DHT）や マグネットリンク とは

**2020/09/29 追記:**
過去に、本記事冒頭で言及している"DHT内の通信について見るOSSなプログラム"を試した際の記録を記事にしていたのを見つけました・・・。また、そちらでも、掲題についてある程度説明していました。ですので、そちらの記事も併せて参照していただけると、より正確な理解が得られるのではないかと思います。
[PythonでBitTorrent DHTネットワークに流れるメッセージを眺めるツール btsniff （libtorrentを利用） を試してみた - Qiita](https://qiita.com/ryo_grid/items/8830300c613b1b24f9b6)
　
　


どうも。ryo_gridです。
趣味プログラミングで、Rustのお勉強がてら、簡単な Key-Value Store（単一ネットワーク内で動作、RESTインタフェースでアクセス）を書いてみようと思っている今日このごろです。

その実装に当たって、DHT（具体的にはChord）の仕組みを採用しようと思っているのですが、そういえば、掲題について1-2年前に調べたことがあったなあ（BitTorrentのDHT内の通信を見るOSSなプログラムがあって、それを動かしてみたかった、というのが動機）、というのを思い出し、少なくとも当時、英語圏含めインターネッツにあまりまとまった情報が無かったので、私の理解をここに記しておきます。
（理解が誤っている可能性もかなりあるので、その場合はご指摘いただければ幸いです）
　
なお、本記事ではBitTorrentとDHTの基本的な仕組みは前提知識として、おおむね省略します。

[BitTorrent - Wikipedia](https://ja.wikipedia.org/wiki/BitTorrent)

#分散ハッシュテーブル（Distributed Hash Table、DHT）
Distributed Hash Table（DHT、分散ハッシュテーブル）という、中央集権的なサーバ・ノードがいなくても、賢いアルゴリズムにより、複数ノードが分散してデータを保持し、各ノードから、それらのデータに（さほど高速性を求めるアプリケーションでなければ十分実用的な範囲で）アクセス可能、といったデータストアを実現できる仕組みが存在します。

[分散ハッシュテーブル - Wikipedia](https://ja.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)

DHTはオーバーレイ・ネットワークと呼ばれるものを構成するための要素技術の一つでもあります。
10年前ぐらいは、（アカデミックの世界は別として、）違った気がしますが、現在はオーバーレイネットワークという文脈の中で出てくることが多いように思います。

[オーバーレイ・ネットワーク - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%BB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)

ちなみに、匿名性の実現などに重きを置いていたり、同じようなファイルを共有する者たちが効率的にデータ共有できるようにしていたために、かなり毛色は異なりますし、所望のデータを保有するノードの探索などではDHTに性能は劣ると思われますが、社会問題ともなったファイル共有ソフトWinnyが構成していたネットワークも一種のオーバーレイ・ネットワークだと認識しています。
（十数年前にWinnyって面白いアーキテクチャーだなーと思って調べてみたり、勉強会に参加したのがDHTとの出会いのきっかけでした）
　
[Winny - Wikipedia](https://ja.wikipedia.org/wiki/Winny)

Winnyのアーキテクチャに関しては、開発者である故金子勇氏自らが執筆した「Winnyの技術」という書籍がありますが、紙で出版されたものを新品で手に入れるのは難しいものの、電子版は以下のサイトで現在でも購入可能です。
（学生時代に紙で買って読みましたが、研究室に置いてきてしまったのか手元に見当たらなかったので、電子版を購入し直しました）

個人的には大変興味深い内容でした。分散システムに関心がある、業務で分散システムの開発・構築に関わっているという方であれば同様に興味深く読めるかと思います。
（例えば、ロードバランサを窓口としてクライアントからのリクエストをまず受けて、それを複数のサーバにバランシングする形で転送し、また中継して送り返す、というのはWeb系を筆頭に、多くのシステムで採用されているシステム構成だと思いますが、それも立派な分散システム、だと私は思っています）

[Winnyの技術 - 達人出版会](https://tatsu-zine.com/books/winny)


#BitTorrentとDHT
- 最近のBitTorrentは同ソフトウェア（プロトコル？）で言うトラッカーの役割を、世界中のユーザによって構成されているDHTに担わせるという機能も持っていたりします。ネットでBitTorrentのマグネットリンクとかいうやつを見かけたら、それはBitTorrentのDHTを利用して、ファイルをダウンロードするものです
- 通常は、ダウンロードのために必要な情報を含むtorrentファイルと呼ばれるものをWebサイトなどから入手し、BitTorrentクライアントに渡すことで、内容が参照され、ダウンロードが開始されますが、マグネットリンクがWebページ等に貼られていた場合（※）、それはBitTorrentのDHTの中で保持されているtorrentファイルへのリンク（識別子、URI）で、それをクリックすると、ブラウザに関連付けされたBitTorrentクライアント（されていない場合はマグネットリンクを処理するためのアプリケーションを選択させられる、はず）がそのリンクの文字列から、まずDHT内に格納されているtorrentファイルをとりに行き、それを読み込んだクライアントは、DHT内の、どのノードがトラッカーの役割をしてくれるかを判断し、そのノードからファイル全体なり一部なりを持っているピアの情報を受け取りながらダウンロードを進めるといった動作をします

※Webページに貼ってあるケースはあくまで一例であり、マグネットリンクの文字列を知ることができさえすればクライアントに渡すことでダウンロードは可能です

では、上記のような一般的なやり方と異なる方法をとってどのようなメリットがあるのでしょう。

- 1. そもそもBitTorrentは、HTTPサーバなどにファイルを置いて配信するというのをベースに考えた時に、一度データをダウンロードした奴は、他の同じファイルをダウンロードしたい奴と、ダウンロード済みのデータを共有するようにすれば、需要の大きいファイルであっても、大本のサーバの負荷の増大が抑えられ、貧弱なサーバやネットワークしか利用できずとも、多くの人にファイルを配信できる、というアイデアで作られたものです（私の認識）
- 従って、ファイルを配信したい者はまず、どこかしらのWebからアクセス可能な場所に自身の権限でファイルをアップロードできなければなりません。ですが、マグネットリンク x DHTによるトラッカー、という組み合わせで配信する場合は、特にグローバルなIPを持たない、NAT内のクライアントが大本のファイルを持っているという形でもファイルの配信が可能だった・・・・はずです（ちょっと自信がない）
    - 通常のBitTorrentの枠組みで言うと、大本のファイルの置いてあるサーバ以外に、配信を行うユーザのクライアントが、ファイルの全体がダウンロード済みの「シード/シーダー」などと呼ばれるノードとして起動状態にあって、他のノードにコピーを配る、という感じの流れと見ることができます。DHTから入手したtorrentファイルの、大本のファイルが置いてあるサーバの欄は空になっているか、その項目自体が含まれていなかったはず（torrentファイルはサーバに置いておけないが、トラッカーだけは通常通りグローバルIPを持つサーバが指定されている、というケースもあったかもしれません）
    - ここらへんも違法ファイル共有の温床になっている感じはします。十分な数のノードにファイルを配信したら、大本であったクライアントは共有を止めてしまって問題ないはずなので、単純に配信する場合と比べれば足はつきにくいでしょうし
- 2. ファイルを配信したい者がトラッカー用のサーバを用意する必要がない（インターネット上で配信するのであればグローバルIPが基本的には必要）
    - ただし、torrentファイルのインデックスサイトというのが世の中にはあって（違法ファイル共有を補助しているとして閉鎖させられたものも多いようですが）、それらのサイトがトラッカーの役割もやってくれるって話だったような気もするので（正直自信はない）、ここはさしたるメリットではないのかもしれません
- 3. 2) の補足的な話になりますが、公にIPアドレスや物理的な所在が分かるサーバがトラッカーを担っていた場合、何らかの理由で公権力などによりトラッカーと、大本のファイルを置いてあるサーバを停止・遮断させられてしまうと、ファイルの配信が行えなくなります（と、書くと言論の自由がーみたいな話に聞こえますが、実際のところは違法ファイル共有を行っている場合でも簡単には止められない、というのが実質的に活用されているメリットな気はします）

# おわりに
英語圏含めてインターネッツを漁っても案外と（まとまった）情報が無くて、（torrentのヘビーユーザーであれば使い方は知っているかもしれないですが、）上記あたりの仕組みを把握している開発者というのは、BitTorrentクライアントの開発に関わっていたり、研究者で上述のDHTを解析している、とかでなければ、世の中あまりいない気がします。
（自分も上記程度のレベルの情報を把握するだけでもかなり苦労した記憶があります）
　
あと、ここは割と重要？な点ではないかと個人的には思っているのですが、私の知る限り、一般ピーポーがアクセス可能で、それなりの規模を持つ広域分散なDHTというのは、BitTorrentのものが唯一なのではないかと認識しています。
*↑嘘でした。。。上の方でリンクしている"分散ハッシュテーブル"のWikipediaページを参照すると他のパブリックなシステムでの利用事例も乗っています（英語版のページも参照することをおすすめします）。
　例えば、匿名性を担保した上での情報共有やコミュニケーションを実現するFreenet（その手のものではTorに並ぶレベルで有名な感じですし、歴史のあるソフトウェアではないかと思います。DHTを使ってるとは思いませんでしたが）や、パブリックな分散ファイルシステムの実現を目指している（実現している）IPFSなどがあるようです。
（ファイル共有ソフトでの採用も多いですが、キリがないので、そこらへんは挙げません）*


だからなんだと言われると困りますが、自律分散系のシステムが（ユーザから見た時にうまくワークしているかまでは把握していないものの、）崩壊せずに維持されているというのはそれだけで、すごいなあと思うところです。
（学生時代の専門は並列分散システムで、特に広域分散システムに関する研究に主に取り組んでいた、という個人的な背景もあります）

#Reference
RFCと同じような感じで、BitTorrent Enhancement Proposals（BEP）のうち公式に採用、検討等されているものがリストされています。
基本的にはこのページを参照することで、公式な仕様は把握できるようになっていると認識しています。
（特定のクライアントにおいて、独自拡張で実現している機能といったものもあった気はします）

[Index of BitTorrent Enhancement Proposals - BitTorrent.org](https://www.bittorrent.org/beps/bep_0000.html)

BitTorrentのDHTについては、以下がベースのBEPになってますね。
（下のBEPを改めて読み直さずに書きますが、マグネットリンク等、同DHTを用いてアレコレするというところについては別のBEPとして記述されているかもしれません）

[BEP-5: DHT Protocol - BitTorrent.org](https://www.bittorrent.org/beps/bep_0005.html)