ノード間接続

リンクの種類

検索リンク

Winnyの検索ネットワークを構築するリンク。
このリンク上を保持キーや検索キーが流れていく。
最初は誰に繋ぎに行けばいいかわからないので初期ノードを手で追加する必要がある。
port0のノードから接続された検索リンクは、 転送リンクを兼ねてファイル内容の転送にも使われる。

待ち受けるポート番号の初期値はランダムで決定される。(β21.68から)

転送リンク

見つかったファイルを転送しているリンク。
上記のport0の場合を除いては実際にファイルを転送する段階ではじめて接続される。

リンク接続時には最初検索リンクとしてネゴしてから転送リンクとしてネゴする。

プロトコル

何度かプロトコルが変更されているが、 それぞれの互換性は一切無い。

パケット解析やWinnyトラフィックと特定されないようにする方法として、 通信の初期状態からいきなりDiffie-Hellmanなどの方式を用いて鍵交換を行い、 その後暗号方式その他を全て決め打ちでそこから通信を暗合化するといった方法が考えられる。

通信路の暗合化にはストリーム暗号のRC4が使われている模様。 (本スレ01#134)

接続時に、相手の種別と回線速度、Winnyのバージョン、 ダウン情報をお互いに交換する。

接続先ノードの種別

Raw

グローバルなIPアドレスで間にFirewallも無い「生」の接続先。

DDNS

Rawに加えて、DNSのドメイン名を持っている接続先。
PPPoEやダイヤルアップのノードが初期ノードに登録するなどで DynamicDNSのドメイン名を使う場合など。

NAT

NATの裏、 つまりコンピュータには192.168.0.xなどのアドレスが付いていて、 外部からはグローバルなIPアドレスで接続できる接続先。
実際の環境で言えば、ブロードバンドルータを使っていてポートを開けている場合。

Port0

NATやFirewallの裏にいて外部からの接続ができない接続先。
この場合は全ての接続は裏側にいるノードから繋ぎに行かなければならない。 逆に言えば、この接続は相手から接続してきたものである。

接続されたときの挙動

  1. 検索リンクで接続。
  2. 接続相手は接続元のグローバルIPアドレスを記録。
  3. 検索リンク上でお互いの情報を交換。
    内容: 回線速度、ポート番号、DDNS名(設定している場合)、自己申告のIPアドレス、Port0かどうか、ダウン情報
    このとき、NATの裏に居るノードはプライベートアドレスを申告することに注意。
  4. 2.で記録したアドレスと3.で申告されたアドレスが異なる場合はNATフラグを立てる。
  5. もし他ノードからノード情報を要求された場合には、 DDNS名を伝えてきたノードはそのDDNS名とポート番号、 DDNS名が空のノードはグローバルIPアドレスとポート番号の組を伝える。
  6. 保持キーには保持ノードのアドレスが書かれているが、 NATフラグが立っているノードからキーが来た場合は そこに書いてあるアドレスと相手が申告してきたプライベートアドレスを比較し、 同じであればそれをそのNATノードのグローバルアドレスに書き換える。
  7. 逆にNATノードにキーを転送する場合には、 宛先を確認しNATノードのグローバルアドレスなら プライベートアドレスに書き換えてから渡す。
  8. Port0ノードからキーを受け取った場合には、 そのキーの元アドレスを自分のアドレスで書き換えて他に転送する。 ただし、自分が覚えているキーは書き換える前のもの。
  9. ダウン要求がかかったら、 キーに書かれているアドレスとポート番号のノードに転送リンクを張る。 もし接続先が本体を持っていなければ同じことを繰り返す。
  10. 終了時に Noderef.txt に書き出す際に、 DDNS名を持っているホストはそのDDNS名で保存する。

検索リンクは一度相手とのネゴしてから、一番よさそうなもののみを残して切ります。
ですので、少しの間は制限個数を超えます。あまりにコネクション要求が多いと
問答無用で切るようになります。

あ、そういえば、検索リンクでも値が上なら必ず上流っていうのは止めたんでした。
これですと、最も高い値を出したノードが死ぬんで、わざとループが出やすいように
少しアバウトな処理になってます。同じ程度なら接続したきた方が上流だったかな。

  1. ファイルダブルクリックでダウンタスクが生成される。同時に転送リンク接続。
  2. 対応するキャッシュがあるか調べて、あれば破損個所を先頭から探す
  3. 数ブロック分(ブロック数は速度設定により可変)の転送要求を送る
  4. UP側はブロック転送UP用のタスクを生成
  5. 送られてきたハッシュファイルの該当ブロック部を返送
  6. 受信側が送られてきたデータをキャッシュにくっつける
  7. 受信側が全ブロックそろった時点で転送リンクを切断してキャッシュ変換タスク起動
  8. 送信側は相手が転送リンク切るまでリンク切らない

回線速度

ダウン情報

ノードバッファ

正常に接続できたノードはノードバッファに追加される。

検索ネットワークの構成

Winnyでは、2つの方法によって検索ネットワークの最適化を行っている。

回線速度による木構造

接続時に交換した回線速度により、上流-下流が決まる。
このとき、あまりにかけ離れた回線速度の場合は切断する。

結果として、緩やかなピラミッドが形成される。

接続優先度によるクラスタ化

以下の場合に接続優先度が増加する。

接続優先度が負に大きくなったり、 検索リンクの接続が溢れた場合には優先度の低いノードから切断される。

初期ノード復号化

おそらく、Ver0.1のキャッシュファイル名も同じアルゴリズムらしい。

SIWITAさんの アドレス復号化のソースを参照してください。 どうも適当にテキストに落としたつもりだったんですが間違っているらしいので一旦消します。

初期ノード

今のところすでにWinny網につないでいるノードに接続する。


戻る

© aki 2002-
[email protected]