中継の話

今後スレで話題に出ていた中継の話。
とりあえず、αでは実装しない。よって匿名性ない。
ただし、Winnyネットワークに混じって、Winnyかポエニーか分からないならある程度の匿名性があるはず。(実際はポエニーかどうかすぐ分かります。)
ポエニーだけでネットワークを組むと、直接通信のみ行う。
一時配布者の匿名性のみが保障される。

以下まだあいまいだけど、中継について自分が思っていること。

@ 方法
Winnyでは、キーという呼ばれる情報に自分のアドレスと保持しているファイルの情報を詰めてネットワークに流している。中継は、実際には自分が持っていないファイルのキー情報を自分のアドレスに書き換えることで発生させる。中継を誘導するイメージ。ダウンローダー側は、それが中継かファイル保有者か分からない。ファイル保有者側は、それが中継かダウンローダーか分からない。中継されたノードには、転送したファイルのキャッシュが残るので、拡散促進の効果がある。

@ 起こるとまずいこと
一番まずいのは中継ループ。Winnyでは、基本的にキー情報は上書き(と思っている)だが、これを自分が中継のために書き換えたのキーに対して行ってしまうと、中継がループしてしまう可能性がある。
C->A->B->A->B->A->B・・・
よって、中継のために書き換えたキーは、上書きしない。ただ、そうするとダウンロード対象のノードがかなり限られてくる。『上書き』ではなく『追加』という方法もあるが、その場合でも、一度自分を経由する可能性がある。
C-B->A->B->E

ループや自分経由を行ってしまう確率がかなり低くできるならOK。ただ、どうするかまだよく分かっていない。

@ 思うこと

  • 匿名性確保のための中継、拡散促進のための中継、それぞれ目的が別で、達成すべき目標も別
  • 匿名性確保だけが目的なら、単に中継すればいいだけ。特に考えることもない
  • 拡散促進が目的の場合、中継ノードに完全キャッシュを作る必要があり、これはサイズの大きなファイルほど難しいが、サイズの大きなファイルほどダウンロードを分散させたい
  • 中継ではなく、勝手にダウンロードってのはダメ?中継よりは効率が悪いけど、確実に行える。強制アップロードの逆。強制ダウンロード。外部から指示・誘導されるのではなく、ノードが自分の意思で行うため安全。

@ どのファイルを中継させるか

  • 人気ファイル

ダウンロード数が多いファイル
ダウンロード数 = (被参照ブロック数 * 0x10000) / ((0x10000 < ファイルサイズ) ? ファイルサイズ: 0x10000)
ファイルサイズも考慮。

  • これから人気が出そうなファイル

更新日時から現在日時までの差とダウンロード数から、これから人気の出るファイルかを判断する(これだけでは、あまり期待できない)。

  • 以前中継を行ったことがあり、完全キャッシュになっていないファイル

人気のある大きいなファイルを中継させる場合の2度目以降の条件はこれ。優先度高し。

@ 誰が中継者になるか

  • ダウンロード登録がない(遊んでいる)ノード(条件のひとつとしては決定)
  • 人気ファイルをダウンロードしようとしている、または途中までダウンロードしているノード(微妙な案)
  • 考え中

まだ微妙。

中継処理の実装自体は、ダウンローダーのキャッシュを保存する処理の下の行に、要求元へキャッシュを転送する処理を置くだけと思ってる。起動要因はアップローダーと同じ。問題は、中継を行う条件。