なむやんの電子工作 -3ページ目

なむやんの電子工作

電子工作が好きで、その備忘録にブログをハジメマス
最近は仮想通貨にはまってます、http://namuyan.dip.jp『It works!yay!!!』の管理人
※このブログの記事をまねしたことで何かしらの損害を被りましても自己責任でお願いいたします。

↑P2Pアプリケーションを作って動作させている図

半年以上間が空いての投稿です。

前置き

2017年の終わりごろからPythonでP2Pネットワークを構築してみたいと考えていました。その頃にはプログラミング能力もだいぶ上がり、ある程度混み入ったシステムも作り出すことができると考えていたためプロジェクト開始しました。当初は複数のノード間を繋いで簡単なシステム程度にしようかなと考えていました。同梱したツールとしてFileShareやらChannelが存在しますが、利便性との折り合いが悪く実用性の低いツールですので参考程度で説明はしません(PureP2Pでファイルを共有したり、Torライクにコミュニケーションできたりと面白い事ができます。

p2p-pythonとは

p2p-pythonとは、2018年初めから開発がスタートし、2月にオープンソースとして公開を始めたP2Pライブラリです。使用言語はPython3、対応OSはWindowsとLinuxを確認しています。Wikiの記事を元に分類をするとピュアP2Pに当たります。システムには中央が存在せず、各ユーザー間で情報を管理しています。P2P網の構築に必要なツールは大体入っており(Port開放、ネットワーク安定器、コネクション管理...etc)、コレ1つでシンプルにP2Pを構築する事が出来ます。Pureは難しかったです^^;

起動時の設定

まずはnetwork_verp2p_portp2p_acceptsub_dirの設定。デフォルト値は存在せずsetup_p2p_paramsで起動時に毎回設定する。参考
network_verは、P2P網で各ノードが接続する際に同一のネットワークか確認する為の数字。自主的に同一ネットワークか確認し弾く。p2p_portは、P2P接続受け入れに使用するPort番号。network_verさえ同じであれば同一のポートである必要はないです。p2p_acceptは、外部からノードの接続を受け入れるかのフラグ。NAT越えできない環境でFalseにしておくと網の構築が早くなる。sub_dirは、Peer情報を書き留めておくフォルダの指定。p2p-pythonを複数起動する時などに混ざらないようにする為、ローカルの同じPCでクライアントを複数起動させて実験する時などを想定。

起動直後

Peer情報を持つ場合、リストよりかたっぱしからコネクションを試みる。参考 無い場合は外部からのコネクションを待つか手動でコネクションを試みる必要がある。初期接続先をデフォルトに設定しておかないと孤立したまま。起動時にf_stabilizeをTrueにした場合、ある程度のPeerと接続するとネットワーク上の立ち位置を把握して偏らないように接続を管理する。
接続先は2種類に分けてノードを評価。自分と接続しているノード(近接ノード)と近接ノードと接続しているが未接続のノード、それぞれ第一層(減点)と第二層(加点)と呼んでいる。Scoreを計算して高いものと接続を試み、低いものは切断する。参考 (後々詳しく書くかも

プログラムでの操作

DirectCmd, NetworkCmd, BroadcastCmdの三種類で操作する。DirectCmdは、起動時にコマンドを送られた時の動作を登録しておく。CallBack関数の入力出力は文字列である必要はなく、Pythonがデフォで持つ構造体なら大抵OK(tuple, dict, set, list,..etc)。NetworkCmdは、内部で使用を想定したコマンド集であり、ユーザーが使っても問題ない。BroadcastCmdは、P2P上のノード全てに同じデータを送信する時に用いる。しかし、容易にSpamでシステムを壊せるため通常はDisabledされている。broadcast_checkで厳しく伝播条件を設定しないといけない。
なので、利用者はDirectCmdのみを気にすればいいと思います。

最後に

こんな感じ。
”Simple”を謳ったけど使うの難しいと今更思って記事を書きました。