Winnyの検索ネットワークを構築するリンク。
このリンク上を保持キーや検索キーが流れていく。
最初は誰に繋ぎに行けばいいかわからないので初期ノードを手で追加する必要がある。
port0のノードから接続された検索リンクは、
転送リンクを兼ねてファイル内容の転送にも使われる。
待ち受けるポート番号の初期値はランダムで決定される。(β21.68から)
見つかったファイルを転送しているリンク。
上記のport0の場合を除いては実際にファイルを転送する段階ではじめて接続される。
リンク接続時には最初検索リンクとしてネゴしてから転送リンクとしてネゴする。
何度かプロトコルが変更されているが、 それぞれの互換性は一切無い。
パケット解析やWinnyトラフィックと特定されないようにする方法として、 通信の初期状態からいきなりDiffie-Hellmanなどの方式を用いて鍵交換を行い、 その後暗号方式その他を全て決め打ちでそこから通信を暗合化するといった方法が考えられる。
通信路の暗合化にはストリーム暗号のRC4が使われている模様。 (本スレ01#134)
接続時に、相手の種別と回線速度、Winnyのバージョン、 ダウン情報をお互いに交換する。
グローバルなIPアドレスで間にFirewallも無い「生」の接続先。
Rawに加えて、DNSのドメイン名を持っている接続先。
PPPoEやダイヤルアップのノードが初期ノードに登録するなどで
DynamicDNSのドメイン名を使う場合など。
NATの裏、
つまりコンピュータには192.168.0.xなどのアドレスが付いていて、
外部からはグローバルなIPアドレスで接続できる接続先。
実際の環境で言えば、ブロードバンドルータを使っていてポートを開けている場合。
NATやFirewallの裏にいて外部からの接続ができない接続先。
この場合は全ての接続は裏側にいるノードから繋ぎに行かなければならない。
逆に言えば、この接続は相手から接続してきたものである。
検索リンクは一度相手とのネゴしてから、一番よさそうなもののみを残して切ります。
ですので、少しの間は制限個数を超えます。あまりにコネクション要求が多いと
問答無用で切るようになります。
あ、そういえば、検索リンクでも値が上なら必ず上流っていうのは止めたんでした。
これですと、最も高い値を出したノードが死ぬんで、わざとループが出やすいように
少しアバウトな処理になってます。同じ程度なら接続したきた方が上流だったかな。
- ファイルダブルクリックでダウンタスクが生成される。同時に転送リンク接続。
- 対応するキャッシュがあるか調べて、あれば破損個所を先頭から探す
- 数ブロック分(ブロック数は速度設定により可変)の転送要求を送る
- UP側はブロック転送UP用のタスクを生成
- 送られてきたハッシュファイルの該当ブロック部を返送
- 受信側が送られてきたデータをキャッシュにくっつける
- 受信側が全ブロックそろった時点で転送リンクを切断してキャッシュ変換タスク起動
- 送信側は相手が転送リンク切るまでリンク切らない
正常に接続できたノードはノードバッファに追加される。
Winnyでは、2つの方法によって検索ネットワークの最適化を行っている。
接続時に交換した回線速度により、上流-下流が決まる。
このとき、あまりにかけ離れた回線速度の場合は切断する。
結果として、緩やかなピラミッドが形成される。
以下の場合に接続優先度が増加する。
接続優先度が負に大きくなったり、 検索リンクの接続が溢れた場合には優先度の低いノードから切断される。
おそらく、Ver0.1のキャッシュファイル名も同じアルゴリズムらしい。
SIWITAさんの アドレス復号化のソースを参照してください。 どうも適当にテキストに落としたつもりだったんですが間違っているらしいので一旦消します。
今のところすでにWinny網につないでいるノードに接続する。