おもちゃバコ

中身スカスカ♡

「Winnyの技術」を読んだ

こんにちは

Winnyの技術を読んだ感想,レビュー,備忘録的なのです。


書籍

達人出版会で購入しましたが,PDFで読めるのがいいですね。
tatsu-zine.com

Amazonは実本しかないようで,プレミア価格っぽいです。

想定読者

  • P2Pの技術に興味があるけど知識がない人
  • ネットワーク技術を学習する取っ掛かりがほしい人
  • Winnyの技術に興味がある人

内容はWinnyに使用されている技術の解説ですが,P2P型のシステムなのでP2Pの解説が大部分を占めています。
P2Pの入門書としては読みやすく,技術解説も詳細に記述されているので,NFTなどでP2Pに興味を持った人が初めに読む1冊としても良いと思います。
ただし,執筆日が2005年なため情報が古い場合がある点には注意。

図を多用して解説されているので読みやすいネットワークアプリ開発の入門書を探している人にもおススメですが,既に何冊か大学講義で使用されているレベルのネットワーク関係の本を読んだことがある人は既知の内容かもしれません。
ただ,Winny開発者でもある著者の思想やP2P型のファイル共有ソフトへの考え・歴史,Winnyを運用して得られた知見なども記述されているので,その点では面白く読めると思います。

(関係ないけど)本文中のいくつかの単語は3音ルール(JIS Z 8301)で書かれており,個人的に読みやすかったです。
サーバーとサーバだったら後者が好き。


メモ

ウルトラ雑

1章 P2Pの基礎知識

・Peer to Peer(P2P)
 主従関係のないシステムモデル
 -> P2Pソフトの中で(当時)最も普及したものがファイル共有ソフト
 サーバは存在せず,各ピア(ノード)が状況に応じて変化する。
 -> P2Pのピアはサーバント(サーバ兼クライアント)とも呼ぶらしい

・クライアント・サーバ方式
 サーバ: クライアントからの接続を受けてサービス提供
 クライアント: サーバに接続して一方的にサービスを利用
 -> FTP, TELNETなど (関連技術の説明に時代を感じますね)

P2P型システムの特徴
 1. システム拡大に強い
  C/S方式ではサーバへのリクエスト増加でネットワーク負荷が高まる
  -> P2P型は各ノードがサーバ機能を持つため負荷が集中することがない
 2. 障害に強い
  C/S方式ではサーバが停止するとシステム全体が利用不可
  -> P2P型はノードの一部が停止しても他ノードを利用すればよい
 3. データの一元管理・短時間同期は困難
  P2P型はデータがネットワークに分散している都合上,管理が困難
  -> C/S方式はサーバが管理できる
  P2P型は一度稼働するとシステム停止が実質的に不可能
  -> 全ノードを管理することが出来ないため

P2PとC/Sのどっちが良いか
 ただの手段に過ぎないので,利用用途に合わせて選ぼうね
 P2P: 利用者の資源を有効活用可能 (NFTとか見るとそうだよね)
 C/S: データの一元管理が可能

ファイル共有ソフトの世代
 第一と第二の違いは分かるが,第三は諸説ありそう
 1. 第一世代: Napster
  サーバの集中管理
 2. 第二世代: Gnutella
  サーバ不要のノード間やり取り
 3. 第三世代: Winny
  キャッシュ機構,匿名性を持つ

・レジューム機能
 ファイル転送失敗時に途中から再開する機能

・キャッシュ機構と匿名性
 多数のノードを経由すればキャッシュか発信元なのか区別できない
 -> キャッシュファイルの量が匿名性に関与

WinnyFreenet
 WinnyFreenetを参考にして誕生した
 -> 匿名性はFreenet
 -> 匿名と効率のトレードオフを取ったのがWinny

2章 Winny紹介

技術的な詳細はコピペになるので省略します。本書を見てね。

Winnyのコンセプト
 -> コンセプトから分かる通り,利用者のことも考えている
 -> 著者はインタプリタVM系の言語は好きではないっぽい(効率重視)
 1. 匿名性
 2. 共有効率
 3. Windowsネイティブ

Freenetの課題点
 ネットワーク規模に比例して検索依頼の効率が低下する
 -> 資源は有限なため,理論上は可能であっても効率がかなり悪い
 -> WinnyFreenetの「情報の間接的なやり取り」に注目した

・プロクシーサーバ(プロキシサーバ)
 FWでさえぎられているLAN内のノードと外部ノードとの通信に使用
 -> 外部ノードからはプロキシサーバが通信相手であり,LAN内の通信相手は不明
 -> 通信の仕組み上,IPアドレスは開示されるが,中継ノードを挟めば有耶無耶に…
 プロキシサーバは中継時にデータをキャッシュする
 -> 同データを要求された場合はキャッシュを利用

Winnyはプロキシサーバから着想を得た
 プロキシサーバはC/S方式を前提とし,P2Pに応用するには...
 -> プロキシサーバを内包したファイル共有ソフト

Winnyの開発目的は技術的な検証
 P2P型のファイル共有システムという性質上,使用してもらわないと評価出来ない
 -> ユーザ資源(環境)は様々で,先行事例もなかったから
 -> 検証が目的だったので,Winny1は正式版をリリースして開発を終了

・Winny2
 Winny1上に大規模BBSを実現することが目的
 -> 開発環境をVisual C++ から C++ Builderへ(GUI関連が目的)
 -> あくまで分散BBSの開発が目的

3章 Winnyの仕組み

Winny特有の仕組みについての技術解説。
かなり踏み込んでいるので詳細は云々。

Winnyネットワーク
 インターネット状にWinnyノードが相互に構築したネットワーク
 -> ノード参加・離脱が頻繁な動的ネットワーク
 -> ネットワーク全体の機能を保つ必要がある
 -> 上流・下流の概念があるので転送ノードを限定できる

Winnyノード
 FTTH, ADSL, ISDNなどの順に重みづけ

・上流
 処理能力の高いノード
 -> キーとキャッシュファイルを多数集め,効率を高める
 -> 木構造の根
 -> 構造的にキーを多数保持するので検索がヒットしやすい

下流
 処理能力の低いノード
 -> 木構造の葉
 -> キャッシュ済みか検索結果を受信したキーが多数
 -> 上流に向かって検索クエリを飛ばす

クラスタリング
 集めているファイルの傾向が似たユーザ同士をまとめて効率を高める
 -> 自動ダウンロード機能に利用するキーワードでクラスタリング
 -> 上流・下流クラスタリングの概念を取り入れたことがWinnyの売り
 -> クラスタが異なれば同一LAN内でもWinnyネットワークでは距離が遠い

・効率の良いネットワーク形態
 ノード間のホップ数を短くする
 -> 転送時間が短くなり,経由ノードへの負担が小さくなる
 -> 理論上はフルメッシュが最強だけど,ネットワーク規模的に不可能
 -> 1960年,ミルグラムの手紙やり取りの実験

4章 実装

Winnyの実装がガチガチに解説されている。
利用者を意識した設計についても言及されているので,P2Pに限らずユーザ目線のアプリ開発にも参考になるかも。

・バージョン
 新バージョンのノードを見つけると警告メッセージを表示
 -> プロトコルの互換性によって通信できなくなるのを防ぐため
 -> 利用者に寄り添っていたことが伺えるね。

クラスタリングの評価
 「好みが近い」という主観的な情報から相関性をどう求めるか
 -> 3つのキーワードを設定し,近似度から論理距離を求める
 -> 一致文字数の合計で相関度を評価する都合上,短いキーワードが有利
 -> 仕組みを理解してなくても使用でき,理解していれば自由に渡り歩ける
 この辺は考察しがいのある面白い箇所だと思う。
 -> キーワードを意図的に長くし,ノード間の相関係数を高めるなど

・ハッシュはMD5
 脆弱性の観点からSHA-1に置き換えることを検討していた
 -> MD5SHA-1ってとこに時代を感じる

・ノードの処理能力を加味したルール
 当時はADSLが主流だが,光回線より効率が悪い
 -> ADSLを制限すればダウンロード総量を減らせるが,Winnyネットとしては遅い
 -> 上流と下流の性能を考慮したチューニングが必要

・自前タスク管理
 OSのマルチスレッド機能に頼ると面倒なバグに直面しそうだがら自前したらしい
 -> デッドロックデバッグなどがやっかいだと思っていた
 -> これまでの経験則なんだろうね
 -> ノンプリエンプティブマルチタスク

5章 P2Pソフトの開発手法

Winnyの運用を通して得られた知見について。
運営型のプロジェクトと見ると技術者は参考になる部分が多いと思う。

P2Pアプリケーションのテスト
 数台のPCだけでは限界がある。
 -> 大多数のネットワークアプリに当てはまるはず
 -> シミュレーションするのが良いが,最終的にはテスターを募る
 -> 問題点の解消はテスター離れを防ぐためにも迅速に!

・アプリケーション開発
 プログラムは気軽に作り変えるのはほぼ不可
 -> 互換性,ユーザ離れ
 開発が終了しない
 -> 公開されない神アプリ現象って勝手に思っている
 注目を集めると攻撃される
 -> 攻撃に対するテストもやろうね
 -> 偽りのバージョン警告を出されたりしたらしい

・シミュレーション
 最終的には動作しないとわからないけど...
 -> やってみないと分からない箇所もなんらかの検証は必要
 Winnyの開発前に取り組んだのはシミュレータ開発
 -> シミュレーション先行は基本だよね
 βテストで分かることも多い
 -> ユーザがポートを開いていない場合の対処など
 -> 基本的にユーザの振る舞いを予測することは困難

Winnyネットワークの状況把握は不可能か
 モニター機構を備えれば可能だが,P2Pシステムと相性が悪い
 -> 特定ノードへの接続がバレるとDDoSされるなど

・匿名性と転送効率はトレードオフの関係
 適切な中継発生率を求めて,効率を高める

Winnyと暗号技術
 暗号化は共通鍵,Winny2のBBS認証にはRSA,その他もろもろ(RC4とか)
 -> 執筆時点では通信内容がのぞき見されることはなかったっぽいね
 -> Winnyプロトコルをマネされたら面倒
 -> 基本的にはユーザ保存のものは公開データと考える
 基本的には暗号は破られるものと考える
 -> 破られても致命的な問題を起こさない設計
 IPアドレスなどの情報は暗号化してもすぐバレるけど,心理的な効果は期待できる
 -> クロールプログラム対策とか
 -> 平文よりは遥かにマシだしね
 パッカーを利用
 -> マルウェアとかで主流の手法だね

Winnyネットワーク/プログラムへの攻撃
 ・ゴミファイルのばら撒き
  -> クラスタリングの機能を逆手に取った攻撃
  -> ノード負荷の観点からもイヤッ(ちいかわ)
 ・ファイル捏造
 ・ウィルス問題
  -> Winnyが注目された最大要因だと思う問題
 ・プログラム改ざん
  -> ハッシュ値を確認して動作変更などの対策
  -> 他プログラムと同様,システム解析への時間稼ぎにすぎない

オープンソース
 フリーライドの増加などを考慮して行わなかった

6章 残された課題と可能性

将来の展望的なお話
論文みたいだね

・デジタル認証とアクセスコントロール
 特定ファイルの削除などは検討していたっぽい
 -> 情報流出やマルウェア騒動の対策としても必要だったと思う

ファイル共有ソフトの応用
 著作物の不正利用が問題になった
 -> 社会システムが技術の進歩に伴わなければならない事例
 -> インフラ利用も出来たのではないか

付録

キャッシュ構造やシミュレーション結果,Winnyプロトコル
結構面白い


感想

読みやすいネットワーク関係の本を探しているときに出会いました。

本書の大部分はWinnyの技術説明ですが,簡単なP2Pソフトを作成できる位の知識は身に付けられる内容だと思います。
また,内容に興味があったのでネットワーク技術の書籍としては個人的に読みやすく,飽きずに最後まで読み切れたので良かったです。

Winnyは社会に負の影響を与えた事は否定できませんが,開発に使用された技術や考え方は悪いものではないので, 頭ごなしに全てを否定するのではなく参考に出来る部分は参考にしていきたいですね。

ただ,Winnyは利用者に寄り添った実装を行っている部分が多々見受けられたので,開発者は利用者の使用用途をある程度は予測していたのではないかと感じました。
(まあ,この辺は終わった話なので深くは言及しませんが...)

P2P技術とソフトウェアの在り方について考えさせられる本でした。