Winny の動作の核はこのキー配布です。
現在のキー配布メカニズムはβ17.3 で採用されたもの。
"ファイルを持っている" という情報が入っているキーで、 検索リンク経由で周囲のノードにばらまかれる。 また、後述の検索クエリによっても移動する。
検索条件を持って検索リンクをたどってノード間を渡り歩く。
検索にヒットした仮想キーをクエリパケット限界(200?)まで抱え込んで、
逆をたどって元ノードに戻る。
ちゃんとした定義はないが、
検索クエリ := 検索キー(発見した仮想キー)*
という感じに推測される。
基本的には隣接ノードに少しずつ拡散する方式になっている。
これだけだと検索リンクで近いノードのキーしか検索できないので、 加えて検索クエリを飛ばすことによって遠くのノードのキーを引き寄せる。
遠くのノードの場合には途中で何度もキーの持ち主が書き換えられている可能性が高いためすぐにはダウンロードできないが、 そのキーの持ち主に自ら近付くことで、中継段数を減らして目的のファイルを落としやすくする。
仮想キーを転送する場合に、持ち主を転送ノードのIPアドレスで書き換えることがある。 Winnyでは、検索クエリに仮想キーがパックされる際に主に書き換えが行われる。
Winny網でのキー流通はだいたい以下の3つのパラメータによって調整されている。
保持キーが他ノードに転送される確率
あるキーがWinny網に存在できる時間。
キーを他ノードに転送する場合に、IPアドレスを書き換える確率。 書き換えた場合はダウンロード時に中継を行うことになる。
指定した検索条件を含めた検索クエリを発行する。
このとき、クエリによって移動する経路が変わるので自動で繰り返し発行される。
基本的には検索クエリを発行せず、
周囲から来て自分が保持している仮想キーから検索を行う。
ただし保持キーからの検索で見つからない場合には、
手動検索と同様に検索クエリを発行する。
基本的には、Port0の直上のノードが中継します。
以下のような場合:
A ← B(Port0)
C ← D
この段階で……
……という認識をしているので、あとは通常の転送になります。
ダウンロードに続きます。