Mainline DHTはTrackerなしでPeerを探すことができる。
- Trackerがなくてもデータを探せる
- 六次の隔たりで実現している
- 距離を定義してネットワークを構築する
本章では、Mainline DHT と呼ばれる機能の解説と実装をしていきます。
Trackerなしで、ネットワーク構築できる
当初のスペック(bep003)では、Torrentクライアントは、P2Pネットワークを構築する際に、Trackerサーバーへアクセスして、データを共有するPeerを教えてもらう必要がありました。このTrackerの役割を、P2Pネットワーク上で実現したものが、Mainline DHTです。
今までは、基本的には、データを共有するには、Trackerサーバーを、WWW上に公開する必要がありました。しかし、DHTを採用することで、WWW上にTrackerサーバーを公開しなくてもデータを共有できるようになりました。
六次の隔たりを利用する
では、どのようにして、Trackerの変わりとなるP2Pネックワークを構築するのでしょうか。 具体的には、Trackerが行っていた。「InfoHash(20バイトのユニークな値)を、問い合わせると。データを共有してくれるTorrentクライアントを紹介してくれる」 という機能をP2Pで実現する必要があります。
- より詳しい人を紹介してもらう事を繰り返す
「六次の隔たり」というこ言葉をご存知でしょうか?知り合いを6人くらいたどると、世界中のすべての人と繋がっているそうです。イェール大学のスタンレー・ミルグラム教授による、「スモール・ワールド現象」が有名です。 同封した写真の人物はボストン在住の株式仲買人です。この顔と名前の人物をご存知でしたらその人の元へこの手紙をお送り下さい。この人を知らない場合は貴方の住所氏名を書き加えた上で、貴方の友人の中で知っていそうな人にこの手紙を送って下さい」という文面の手紙をそれぞれに送った。その結果42通 (26.25%) が実際に届き、42通が届くまでに経た人数の平均は5.83人であった。(https://ja.wikipedia.org/wiki/六次の隔たり)
大好きな作家さんや、尊敬するプログラマーも、関節的な知り合いというわけですね。このように、賢く質問して回れば、特定の人にメッセージを届ける事ができます。
- P2Pでも同じ方法で実現している
対象としているP2Pネッワークも「六次の隔たり」によって実現しています。「スモール・ワールド現象」の実験と同じように、P2Pネットワークへ依頼を投げます。
- 知り合いのTorrentクライアントに、「InfoHashに関連するデータを所持しているTorrentクライアントがいないが聞く」
- もしも、所持していなければ、「所持していそうなTorrentクライアントを教えてもらう。」
スモールワールドの実験の依頼内容の手紙と見ていますね!! このような単純な機能だけでTrackerの役割をP2Pで実現できます。
距離を定義する
もう少し具体的に、「知っていそうな人を紹介する」を、P2Pネットワーク上で実現する方法を考えてみましょう。
P2Pネットワークに、InfoHashという20バイトのデータが渡されます。これを受け取ったは端末は、所持する数十のPeerからもっとも、InfoHashに対応するデータを持っていそうなPeerを紹介する必要があります。
DHTでは距離を定義して、紹介するPeerを決定します具体的には、「InfoHashにより近いPeerを紹介する」という事をします。 この距離はなんでも良いです。例えば、皆さんが学校で習ったユークリット距離でも良いでしょう。
ユークリット距離は、我々が日常世界で利用している距離のことです。例えば、東京駅から大阪駅までの走行距離は、508.0km。直線だと401kmくらい。神戸と名古屋は、東京よりも大阪り方が近い。仙台や神奈川は大阪よりも東京のほうが近いといった感じに定義できます。
各PeerにInfoHashと同様のIDを振り。InfoHashとPeerの距離を計算できるようにするのです。
ネットワークに偏りを作る
もうひとつ、「六次の隔たり」を実現するには、現実世界のおなじように、距離の近いものほど詳しく、距離の遠いものほど詳しくないといった状況をつくる必要があります。
自分の会社の同僚や同級生については、よく知っているでしょう。同級生よりも、同じ部活の友人などについては、より詳しく知っている事でしょう。しかし、別の会社の事や、別の学校の事は、詳しくないと思います。
P2Pネットワーク上に同様の構造を実現しないと、「InfoHashに近いPeerを紹介したけど、その紹介した人は、InfoHashに近いPeerの事を知らない」と問題が発生します。 この問題を解決するために、自分に近いPeerについてはたくさんの情報をもち、自分に遠いPeerについては少しだけ情報を持つようにしてあげます。これを、ネットワーク全体で繰り返す事で、現実世界と同じように、距離が近いPeerどうしはお互いを良く知っている状態が構築されるようになります。
Kyorohiro work