本セッションの構成

Aki@めもおきば氏(以下、Aki@めもおきば):では「Winnyのネットワークのおもしろさ」ということで話をしたいと思います。ふだん、技術系同人誌を「めもおきば」というサークルで出してるAkiと申します。15分ほどお時間いただきます。よろしくお願いします。

さて、今回の構成ですが、前半でWinnyのネットワークがどういうものだったかをおさらいをしながら、後半ではWinnyがたくさんのバージョンアップを重ねて最終的なかたちに至ったわけですが、そのバージョンアップのダイジェストみたいなものを振り返りながら、Winnyの開発史みたいな感じで振り返っていこうかなと思っています。

P2Pの基礎知識おさらい

というわけでWinnyのネットワークがどういったものだったかをおさらいをしようと思うのですが、さらにその前に、WinnyはP2Pと言われる技術ですが、P2Pと(言っても)いろいろなものがあるので、その分類や基礎知識から入っていこうと思います。

P2Pには、いわゆる「ピュアP2P」と呼ばれるものと「ハイブリッドP2P」と呼ばれるものがあります。(スライドを示して)一番下にありますが、データの転送と通信先を探す、あるいはファイルを探すような検索の部分の2段階で、それぞれがいわゆるクライアントサーバーのサーバーでやるのか、あるいはいわゆるP2Pのネットワーク、どこかにサーバーがあるのではなくて、相互の通信だけで全体の機能を影響しようとするP2Pのモデルを使うものとの2種類に分けられて、それぞれがよくクライアントサーバー、ハイブリッドP2P、ピュアP2Pと呼ばれたりします。

当時はやはりPCの性能もインターネットの性能も正直あまりよくなかったので、「検索の部分はやはりサーバー使わないと厳しいよね」というところがあって。(それで)最初はハイブリッドP2Pから、(サーバーの)代替技術として入ってきた感じになります。

例えば、大元のファイル共有の最初に広まったNapsterとか、Winnyの前に流行していたWinMXだったりとか、BitTorrentなんかもそうですね。こういったものがあります。

それに対してWinnyをはじめとしたピュアP2Pとしては、GnutellaとかFreenetとか。BitTorrentのDHTのモードもそうだし、最近はEthereumとかIPFSとか、いわゆるブロックチェーン系のネットワークとか分散システムもピュアP2Pの仕組みでできています。

ピュアP2Pの検索ネットワークも大まかに2種類に分けられて、非構造化オーバーレイネットワークと構造化オーバーレイネットワークの2種類あります。Winnyは非構造化オーバーレイネットワークに属しますが、逆のほうから(説明を)言うと簡単で。

“構造化されている”というのは(つまり)何かと言うと、要はハッシュ値とかそういった数値がノードに割り当てられていて、そこからネットワークの構造が計算で定まるネットワーク(のこと)なんですね。

IPFSやEthereumっていうのは、Kademliaという分散ハッシュの仕組みをベースに一意にネットワークのかたちが決まるようになっていますが、WinnyやWinnyが元にしたと言われているFreenetやGnutellaはそういった構造化がされていないので、オーバーレイネットワークと呼ばれるアプリケーションのネットワークの中のネットワークでメッセージを投げて、「誰がこのリソース持ってるかな?」ということをどんどん順繰りに探していくような動作をします。

Winnyのネットワークの仕組み

というわけで、WinnyはピュアP2Pの非構造化オーバーレイネットワークという分類になりますが、じゃあWinnyのネットワークがどういう仕組みで動いてるかというと、けっこうシンプルなんですね。

基本的には2種類の仕組みで動いています。1つはアプリケーションでネットワークが出来ていて。それぞれが動いてるPCのことをノードと言いますが、ノードの間でそれぞれが通信を張っていて。

Winnyでは検索リンクと呼んでますが、その検索リンクを介して「一番左下のノードAさんはどんなファイルを持ってますよ」という情報を、自分のIPアドレスとファイルの情報をセットにして、オーバーレイネットワークの上に流していきます。

点線で広まっていったとおりに検索リンクを通してファイル情報が広まっていきます。

今度は右側のBがポエムを探そうとして。そうすると、検索クエリを今度はオーバーレイネットワークの上に流していきます。そうすると、ノードCの上で左から来たファイルの情報と、右から来た検索クエリの結果がうまくマッチングされます。

その後、ノードBに返します。そこにはノードAのIPアドレスが書いてあるので、「じゃあそこに接続しにいきましょう」ということで転送リンクを別に張って、ファイル本体の転送をする。こういった仕組みが、Winnyのネットワークのすごくざっくりとしたあらましになります。要はこれだけのすごくシンプルな話なんです。

なので、やってることは左のほうからファイルの情報を広げていくのと、検索クエリを投げるとそれが数珠づたいに広まっていって、来た順に戻っていく。戻ってきた結果に書いてある内容から転送リンクを張って、ファイルを取りにいく仕組みになってるわけです。

Winnyのすごい特徴 自動ダウンロード

Winnyのすごい特徴としてあげられるものに、自動ダウンロードという機能があります。これが何かと言うと、先ほどはファイルの情報がどんどん広まったと言いました。

こういったファイルの情報があっちこっちに広まっていった結果、自動ダウンロードを設定しているノードまでファイルの情報が届くと、それを自動的にダウンロードの対象として設定する。

いわゆる検索条件を指定していくと、地引き網のように手当たり次第にダウンロードをかけていくようなモードが、Winnyのすごく特徴的な動作の1つになっています。

Winnyのすごい特徴 積極的にデータ中継を行う

もう1つのWinnyの特徴として、積極的にデータ中継を行う動作があります。これが何かって言うと、先ほど同じように左からファイルの情報が拡散されていきますが、その時に、Aさんから出た時はファイルの持ち主にはAのIPアドレスが書いてありますが、Cに届いた時にはその所有者、IPアドレスをCのものに書き換えます。そうすると、右の時に届いた時のファイルにはCのIPアドレスが書いてあるので、ノードBはノードCに接続しにきます。

ノードCは実はそのファイルの本体も持ってないけれど、Aが持っていることを知っているので、もう1回つなぎにいく動作をします。そうすると、Bから見た時にCを経由してAからファイルを取ってきているので、Cにはデータが全部中継されることになります。

その結果、ダウンロードが終わった時にはノードCのところにもそのキャッシュができるような仕組みになっています。

これも先ほど言ったとおり、ファイルの情報を拡散していく時に、そのキーの中身に書いてあるIPアドレスを書き換える動作で実現しています。

Winnyのすごい特徴 検索ネットワーク全体が自己組織化する

もう1つ。これだけだとやはり大規模は厳しいので、Winnyの検索ネットワーク全体が自己組織化するようになっています。1つは回線速度というものによって上流と下流が決まっていて、それぞれに対して「上流は何本まで」「下流は何本まで」といったように上下関係ができるようになっているのと、あと(もう1つは)検索キーワードという、先頭3つのキーワードを使うことによって、横方向でクラスタリングをしていくような構成になっています。

ここでは新規につながってきた検索キーワード1つに指定しますが、“ねこ”というキーワードをつないでWinnyのネットワークに参加しようとすると、いろいろなノードの情報を得ることができると思います。例えば、クラスタリングキーワードが“ポエム”というノードと“ねこ”というノードが両方が接続しようとしたら、“ねこ”のほうが優先されるような仕組みになっています。

こういった仕組みによって、ネットワークを自己組織化していきます。

Winnyのネットワークはシンプルなものの組み合わせでできている

こういったように、Winnyのネットワークはすごくシンプルなものの組み合わせでできています。

おさらいをすると、検索ネットワークによるファイル情報の拡散と検索。あとは回線速度とクラスタリングを使って、ネットワーク全体を自己組織化していく。ただ積極的にデータ中継をしていくことによって、キャッシュをバラ撒いていく。

これは細かくは説明しませんが、データ中継を使うことによって、いわゆるファイアウォール、ナットの裏にあるような外部から接続できないノード、WinnyではPort0と呼んでいましたが、Port0の対応をやっていました。

(次回に続く)