P2Pとは?

#P2Pとは?


##目次
1,P2Pとは
2,P2Pの種類
3,P2Pのメリット
4,P2Pのデメリット
5,まとめ


##1,P2Pとは
####導入
P2Pとは一言でいうと<font color="crimson">***「対等な関係の複数台のサーバ同士によって成立しているシステム」***</font>のことです。
P2Pとは「Peer to Peer」の略です。Peerとは日本語にすると「仲間」ですが、要は対等である関係だよということを言いたいのです。

####詳細
では詳しい説明に入っていきたいと思います。
P2Pを説明するために、よく比較対象としてあげられるサーバ&クライアントモデルの処理形式も説明、比較をしながらしていきたいと思います。
P2Pもサーバクライアントモデルも両方ともシステムを構成する仕組みの種類です。すなわち、P2Pであれ、サーバ&クライアントモデルであれ、何かしらの処理がそのシステムによって行われています。
では、その処理システムがP2Pとサーバクライアントモデルの両方でどのように異なるのかのイメージを下にあげます。
P2Pとはイメージをあげると以下のようなシステムのイメージです。
![p2p03.png](https://qiita-image-store.s3.amazonaws.com/0/182526/e40b8de7-083d-e0db-7a3d-72107af065bd.png)

それに対してサーバ&クライアントモデルは以下のイメージです。
![p2p02.png](https://qiita-image-store.s3.amazonaws.com/0/182526/07f8c110-cf1f-fecd-dcd4-3b4176b5781a.png)

P2Pは見ていただければわかると思いますが、サーバ同士が処理を行う一つのサーバと接続されているのではなく、システムに参加している他のサーバ同士と接続がされ、その<font color="crimson">***全台が対等な関係でシステムが構成***</font>され、処理が行われています。もし何らかの処理を行う際には他のノードと協調して処理を行います。
それに対して、サーバ&クライアントモデルはクライアントが中央のサーバに対して全台接続されているような仕組みになっています。このモデルではクライアントは基本的に処理をせず、中央のサーバに対してリクエストを投げて、サーバが処理を行いその結果をレスポンスとしてクライアントに返すというような仕組みになっています。

P2Pはサーバクライアントの両方の処理をシステムに参加している全てのノードが行うことができ、対等であるという捉え方をするとイメージがしやすいかもしれません。
主にはこのように処理が中央に集中するのか、処理を分散させるのかというところで<font color="crimson">***サーバクライアント型は中央集権的、P2Pは非中央集権的***</font>と言われます。

###具体例
サーバクライアントモデルとして身近な例はwebサイトなどです。webサイトをみなさんが利用するときは、ブラウザを利用し、検索結果として出てきたリンクを辿ってwebページを閲覧しているかと思いますが、その裏側では、基本的にwebページの配信やDBの処理、管理などを中央にいるサーバが一手に引き受けて処理を行なっています。

上記に対してP2Pとして身近な例は暗号通貨です。暗号通貨を説明するとそれだけでいくつも記事がかけてしまうくらいなので、ここでは詳細の説明は省略させていただきますが、軽く説明すると、暗号通貨のシステムではどのユーザがいくら持っているのか、どこからどこに通貨が移動したのかの情報の管理を一台のサーバが行なっているのではなく、暗号通貨システムに参加している全てのノードが管理しています。そのため、暗号通貨を自分が取り扱うためにはシステムを成立させるためのノードとして参加し、自分もシステムの一部としてデータの管理を動作することになります。(フルノードとspvノードの違いなどは省略します。)
 
このようにP2Pシステムでは<font color="crimson">***自分もサーバの機能を果たすことでシステムを動作させているという***</font>認識を持っていただければと思います。



##2,P2Pの種類
P2Pには大きく分けて以下の2つの種類があります。
####***ハイブリッドP2P***
####***ピュアP2P***
P2Pシステムはシステムを構成するために参加している全ての対等なノード同士によって成立しています。このため、サーバクライアントのようにクライアントは一台のサーバに対して接続すれば良いのではなく、<font color="crimson">***システムに参加している不特定多数のノードと接続する必要***</font>があります。このP2P同士の接続を「P2Pネットワーク」といいます。このP2Pネットワークを成立させるためには他にどのノードがシステムに参加しているのかを知る仕組みが必要です。そのための方法は主に二種類あり、その違いによって上記の二つに別れています。
###2-1,ハイブリッドP2P
ハイブリッドP2PとはP2Pシステムに参加しているノードのリストを特定のノードがインデックス形式で管理している方式です。この仕組みにより、他のノードに対して処理をするためにデータのやりとりをしたいときは、そのノードに問い合わせることで目的のノードとやりとりを行うことができるという仕組みになっています。この仕組みのメリットは、P2Pシステムに参加しているノードが明確なため目的のノードと確実にやりとりを行うことができるという仕組みです。デメリットとしては、そのリストを管理しているサーバが単一障害点になりかねないということです。この仕組みは、複数のノードによってノードリストを管理することによって回避できると考えられています。

###2-2,ピュアP2P
ピュアP2PはP2Pシステムに参加している全てのノード情報を管理するノードは存在せず、やりとりを行いたい目的のノードを見つけ出す手法としては感染病が感染するように、自分が隣接しているノードに対して順々に問い合わせをし、目的のノードを見つけ出すまでそれを繰り返すという方法です。
この仕組みのメリットは全ノード情報を管理するノードが存在しないという点から単一障害点も存在せず、またシステムを広げるためのスケールアップもしやすいという点です。それに対してのデメリットは目的の相手と確実にやりとりを行えない可能性があるということです。感染病のように全台に問い合わせていくという方法ではあるが、何らかの障害などの原因でやりとりが行えないという可能性は考えられる。
またピュアP2Pにはさらに2つの種類があります。それは「非構造型」と「構造型」です。
###2-2-1,非構造型
は目的のノードとやりとりをするために自分が隣接しているノードに対して次々と問い合わせをしていき、結果的に目的のノードを見つけ出すという方法です。これは、一見非効率的ではありますが、前提として構造化していないため、システムが崩壊するというようなことは考えにくいという特徴があります。
###2-2-2,構造型
それに対して、構造型のピュアP2Pは自分がやりとりをするノードじゃあらかじめ割り当てられた番号などによって決まっています。例えば、自分のノードIDはn番だとします。この時の前提条件として自分は前後「n-1」「n+1」の二つのノードの場所のみ管理しているとします。この時に目的の相手を探し出す方法として自分のIDの前後にのみ連絡を取ることができるというルールが存在するとします。このような時に、時間はかかるかもしれませんが、確実に目的の相手までたどり着くことができます。さらに管理するノードは最小限で良いため無駄な負荷がかかることもありません。その反面、自分の隣接しているIDのノードで障害が発生した時にどうするのかなどへの対処に対する柔軟性がないという面では少し問題があります。

##3、P2Pのメリット
P2Pのメリットとしては主に以下の3個が挙げられます。
1,パフォーマンスアップに対応するスケーラビリティが容易
2,サービスの可用性が高い
3,コストの集中化が防げる
順番に説明していくと、
###1,パフォーマンスアップに対応するスケーラビリティが容易
サーバクライアントモデルでは、一箇所にサーバの負荷とネットワーク帯域などが集中します。このため、サーバの負荷に対してはある程度の金額を払えば対応できないこともないですが、ネットワークに関しては業者に依頼して専用線を引いてもらうなりとてもではありませんが、限界があります。それに対してP2Pでは全体で分散して処理を行うような仕組みになっています。(全てが全て綺麗に分散できているわけではありません。暗号通貨のように多数のノードに同じような負荷がかかってしまうシステムもありますがそれはシステム設計次第かと...)そのため、設計次第では台数を増やせばそのぶん処理性能をあげることもできるというような仕組みになっています。

###2,サービスの可用性が高い
P2Pはネットワークを介した場所に存在する複数台のサーバが処理を分散して行なっているため、一台もしくは複数台で障害が発生していても、システムを動かし続けるのに問題がない台数が残っていればシステムは維持することができます。

###3,コストの集中化が防げる
これはパブリックかプライベートかで変わるのですが、パブリックP2Pとして設計されているサービスであれば、サービスを動かしているサーバは全て自分で賄う必要がないため全体コストの総量としては変わらないかもしれませんが、それを参加しているノードで分散しているため一人当たりのコストは必然的に下がります。


##4,P2Pのデメリット
P2Pのデメリットとして挙げられるのは以下の3個です。
1,設計が難しい
2,ネットワーク分断耐性が低い
3,安全性と安定性を考慮した管理が大変
順番に説明していくと
###1,設計が難しい
P2Pシステムは一箇所にあるサーバ同士が連携して動作するのではなく、ネットワークを介した向こう側にいるノード同士が協調連携することでサービスが成立しています。P2Pシステムを設計するとはそのサーバ同士が問題なくやりとりを行えるようにすることや、どこかしらで問題が発生しても残りのノードで継続してシステムを動作させられるようにすることを考える必要があるなど普通のサーバクライアントシステムよりも考える内容が難しいことと、考えなければならないことの量が多いということが特徴です。
###2,ネットワーク分断耐性が低い
上記で、どこかしらのサーバで問題が発生した時にはそれ以外でサービスを継続できるように設計する必要があると書きましたが、ネットワーク自体が分断されてしまうと、全体で協調して動作しているためそこで必ず処理はストップしてしまい、また、復旧することも少し難しいかと考えられます。

###3,安全性と安定性を考慮した運用管理が大変
システム全体がプライベートならまだしも、パブリックシステムとなると話は全く異なります。サービスが稼働している中でどこかで問題が発生しているのか、発生しているとしたらそれをどのように解決するのか、プログラムレベルで自動に解決するのかそれとも一旦システムを停止するのか、などのように管理に関しても考えなければならないことはたくさんあります。

##5,まとめ
全体的に拙い文章になってしまいました。
これを調べたことで、P2Pによって成立している暗号通貨はやはりアプリケーションレベルだけの話ではなくシステム設計レベルで考えられているとても高度なシステムであるのだと実感しました。
また、P2Pを調べると分散処理に関してももっと調べる必要があるなと感じたことと分散処理の奥深さと面白さを感じました。
今後は分散処理に関しても調べてまとめていきたいと思います。
また、新しい情報が入り次第更新していきたいと思います。