GNUnet

GNUnetは分散型P2P通信のためのフリーソフトウェアフレームワークであり、公式のGNUプロジェクトのパッケージである。データ・リンク暗号化、ピアの検出、リソース割り当て、様々な手段での通信(TCP、UDP、HTTP、HTTPS、無線LAN)、基本的なP2Pアルゴリズムとしてルーティング、マルチキャスト、 交通トラフィック推定機能を持つ。

GNUnetの基本的なネットワークトポロジーはメッシュネットワークである。GNUnetはスモールワールドネットワークに最適化されたKademliaのランダム化版分散ハッシュテーブルを内蔵している。GNUnetはユーザーの信頼された友人だけに通信を制限するためのトポロジーオプションを有する。ユーザーの「友人」の更に友人といった閉じたネットワーク上で、互いにIPアドレスを直接公開することなくファイル交換が可能である。

GNUnetはUniform Resource Identifier (URI) 識別子（IANA未認可）を使用する。GNUnetのURIはモジュールとモジュール特有識別子の二つで構成される。GNUnetのURIはgnunet://module/identifierという形式であり、moduleがモジュール名でありidentifierがモジュール特有識別子である。

コードの基礎はC言語で書かれているが、 gnunet-javaの進展によりJavaにより拡張機能を開発するためのAPIも存在する。GNUnetは現在Linux、 BSD、 macOS、Solaris、 Windowsで動作する。

GNUnetはフレームワークの主なディストリビューションで様々なP2Pアプリケーションを提供し、追加プロジェクトのSecuShare等がそれを拡張している。

ファイル共有 
現時点の設計は匿名性、検閲への耐性のあるファイル共有を重視し、ユーザーに匿名ですべての種類の情報を送受信させるためのものである。GNUnetは共有されたファイルを自動的にGNU libextractorを使用しメタデータにより注釈する。  

ファイル共有サービスはルーティングのクエリと返答にGNUnetの匿名プロトコルを使用する。転送されたクエリのメッセージはデータブロック等のコンテンツの検索に使用される。転送ノードの負荷状況により、メッセージはゼロまたは1以上のノードに転送される。ノードに負荷がかかっているときは近隣ノードからのリクエストを拒否し、ノード内部の信頼値が低下する。GNUnetの匿名プロトコル固有の機能としてユーザーは匿名化レベルを選択可能である。匿名化レベルは自分の通信を隠すための迂回通信回数を決定するものである。ユーザーは個別のアップロード、検索、ダウンロードのために毎回好きな匿名化レベルを設定できる。匿名化レベルゼロを選択することによることにより、非匿名で実IPを明らかにしたファイル共有も可能である。GNUnetのDHTインフラストラクチャーは非匿名が設定された場合のみ有効化される。

ファイル共有URI 
GNUnetで共有されたファイルはECRS (An Encoding for Censorship-Resistant Sharing) によりエンコードされる。fsモジュールのidentifierはchk、sks、ksk、locのいずれか一つにより構成され、スラッシュとカテゴリ特有値を伴う。

 chkはファイルを特定する。典型的には: gnunet://fs/chk/[ファイルハッシュ、0-9A-Vの値を使用].[クエリハッシュ、0-9A-Vの値を使用].[バイト値でのファイルサイズ]
 sksは名前空間内のファイルを特定する。典型的には: gnunet://fs/sks/NAMESPACE/IDENTIFIER
 kskは検索クエリを特定する。典型的には: gnunet://fs/ksk/KEYWORD[+KEYWORD]*
 locは特定のマシン上での情報を特定する。典型的には: gnunet://fs/loc/PEER/QUERY.TYPE.KEY.SIZE

例 
GNU GPLライセンス文書の特定の版を示すGNUnetのファイル共有URI:
 gnunet://fs/chk/9E4MDN4VULE8KJG6U1C8FKH5HA8C5CHSJTILRTTPGK8MJ6VH\
 ORERHE68JU8Q0FDTOH1DGLUJ3NLE99N0ML0N9PIBAGKG7MNPBTT6UKG.1I823C58O3L\
 KS24LLI9KB384LH82LGF9GUQRJHACCUINSCQH36SI4NF88CMAET3T3BHI93D4S0M5CC\
 6MVDL1K8GFKVBN69Q6T307U6O.17992

"gpl"の検索結果を示すGNUnetのファイル共有URI:
 gnunet://fs/ksk/gpl

GNU代替ドメインシステム 
GNUnetはDNSの分散化版であり検閲体制版であるGNU代替ドメインシステム（GNU Alternative Domain System、GADSとも）の実装を含む。GADSでは、それぞれのユーザーは.gads TLDの下のDNS名前空間にマップされた自分のmasterDNSゾーンを管理する。ユーザーは他のユーザーに管理されたDNSゾーンにサブドメインを委譲することもできる。他のユーザーの定義はGNUnetのDHT機能により参照される。このシステムの大きな問題として、ドメイン名は特有の物ではなくなり、通常のアプリケーションからアクセスするためにはプロキシなどの手段が必要である。

プロトコル変換 
GNUnetはIP通信をP2Pネットワーク経由で行うことができる。必要ならば、GNUnetはIPv4-IPv6プロトコル変換を実行できる。GNUnetはDNSのアプリケーションレベルゲートウェイを提供し、DNSリクエストをプロキシすることで必要なアドレスをマップすることができる。これにより、GNUnetはIPv6移行のために使用することも可能である。また、GADSとの組み合わせにより、GNUnetはGADS内にある秘匿サービスのウェブページなどにアクセスできる。

チャット 
簡素なチャット機能がテスト用に実装され、使用可能である。

関連項目 

 匿名P2P
 Friend-to-friend
 匿名通信ソフト: Freenet、I2P、Tor
 匿名ファイル共有ソフト : Share、 Winny

脚注

外部リンク 
 
 日本版ミラー
 Paper describing ECRS (pdf file)
 A comparison of GNUnet with other peer-to-peer networking
 GNUnet adds VPN, direct wireless peering, and more, LWN.net, December 21, 2011
 Master's thesis about the GNU Alternative Domain System

GNUプロジェクト
P2P
クロスプラットフォームのソフトウェア