Peer to Peer
Peer to Peer（ピア・トゥ・ピア または ピア・ツー・ピア）とは、複数の端末間で通信を行う際のアーキテクチャのひとつで、対等の者（Peer、ピア）同士が通信をすることを特徴とする通信方式、通信モデル、あるいは通信技術の一分野を指す。P2Pと略記することが多く、以下本記事においてもP2Pとする。
P2Pに対置される用語としてクライアント-サーバ方式がある。クライアント-サーバ方式ではネットワークに接続されたコンピューターに対しクライアントとサーバに立場・機能を分離しており、一般的には多数のクライアントに対してサーバーが一つである。クライアントはサーバーとだけ通信でき、あるクライアントが他のクライアントと通信するにはサーバーを介す必要がある。
P2Pではネットワークに接続されたコンピューター同士が端末装置として対等の立場、機能で直接通信するものである。クライアント-サーバ方式ではクライアント数が非常に多くなると、サーバおよびその回線に負荷が集中するのに対して、Peer to Peer方式はその構造上、端末数が膨大になっても特定端末へのアクセス集中が発生しづらいという特徴がある。
P2P通信の一例としては、インターネットに接続した一般ユーザーの複数パソコン同士が互いのIPアドレスを呼び合う直接通信が挙げられる。P2Pによるネットワークはオーバーレイ・ネットワークの一つに数えられる。
実用化されたシステムとしてはP2Pデータ配信、P2P電話、P2P掲示板、P2P放送(テレビ、ラジオ)、P2Pグループウェア、P2P分散ファイルシステム、P2P-SIP、P2P-DNS、P2P-仮想ネットワーク、P2P地震情報などがある。またここ数年、商用的にも注目を集めており、特にIP電話（Skype,LINEなど）や動画配信サービス（Veohなど）といった応用例が増えてきている。
しかしこれらの応用技術は2000年代初頭から実用化され始めた技術であり、歴史的にはまだ日が浅く、成熟技術となるまでには解決しなければならない様々な問題がある（後述）。そのため現在でも学術的な研究が盛んな分野である。また無線通信で使われるモバイルアドホックネットワークもP2Pの一種であるが、無線での通信可能距離を稼ぐという特殊な使い方であるので詳細な解説は別項に譲る。
P2Pにおける通信端末はピア(peer)と呼ばれるが、トポロジー理論、グラフ理論などで用いる「ノード」（node:節点）という呼称を用いることも多い。またクライアントの機能とサーバの機能を併せ持つという意味でサーバントという呼び方をすることもある。
端末装置の種類としては一般家庭のパソコンやスマートフォンが使われることが多いが、STBやHDDレコーダ、HDD内蔵ルーターといったものもピアになりうる。
インターネットの基盤であるIPネットワークはIPアドレスさえ分かっていればどの端末にも到達できる。つまり端末同士が相手のIPアドレスを知っていればP2P通信が可能である。したがってインターネット上のP2P応用技術はIPネットワークのオーバーレイ・ネットワーク（Overlay Network：以下、OLNと略記する）と見ることができる。
例えば放送型サービスにP2Pを応用する場合はマルチキャスト型の通信形態となる。そのためこれをオーバーレイマルチキャスト(Overlay Multicast: OLM)あるいはアプリケーションレイヤマルチキャスト(Application Layer Multicast: ALM)と呼ぶことがある。
後者の呼び方はIPマルチキャストがTCP/IPのレイヤでのパケットの複製によりマルチキャストを行うのに対して、アプリケーション層でデータのコピーをしてマルチキャストを行う、という意味合いから来ている。
インターネットにおけるP2P方式の通信には、以下のようなメリットとデメリットがある。ピア間で何を行うか、という観点で、大きく以下の4つのタイプ：
のアプリケーションに分けられる。
複数の機能を併せ持ったアプリケーションも存在する。
IP電話、LINE電話やSkypeに代表されるような、端末間で一対一のコミュニケーションを行う使い方である。相手のIPアドレスを、電話番号やニックネームなどから見つけ出し（＝IPアドレス解決と呼ぶ）、その後、ピアとピアが対等の立場で通信を行う。音声データであれば電話となり、映像データであればテレビ電話となる。インスタントメッセージやオンラインチャットもある。通常、アプリケーションの背後に特定の利用者が居ることが想定されており、その人物に対して接続を行うような使い方が多い。この種のアプリケーションのほとんどには、相手がオンラインかどうかを認識する仕掛け(プレゼンス機能)が設けられている。
このタイプのアプリケーションでは、データは通常、リアルタイムでのストリーミングでやりとりされる。
P2P-SIPでは、SIP-URIからIPアドレスを知るためにP2P技術を利用しており、従来からあるSIPサーバを不要にできる。アドレス解決以外の、接続・切断のシグナリング、音声データのストリーミングに関しては、従来からのSIPやRTP/RTCPの技術をそのまま利用している。
応用例：IP電話、Skype、LINE、MSN メッセンジャー、P2P-SIP、P2Pグループウェア。
ノード間接続を、カスケード状に多段階層化して、配信ツリーを形成することで、放送型のサービスが実現できる。ツリーの根元のノードが、放送局となり、上流ノードから下流ノードへ、データをバケツリレーさせることで、全参加ノードに、ほぼ同時に同じデータを配信することが出来る。これにより、リアルタイムのストリーミング中継が可能となる。
多くのP2P型放送システムでは、アドレス解決にハイブリッドP2P方式(後述)を採用しており、通常、チャンネル名でインデックスサーバに問い合わせると、「あのノードの下流につながってストリームをもらいなさい」というようにノードを紹介してくれる。インデックスサーバの役割を各ノードに分散させる（＝ピュアP2P型OLM）ことも可能ではあるが、そのような実装例はまだ発表されていない。
上流ノードが脱退したときに、ストリームが途切れるが、内部にバッファを持つことで、一定時間は再生が途絶えないようにして、その間に、別の上流ノードを探し出して、再接続を行う。再接続の処理には時間がかかるため、通常、予備の上流ノードを用意しておく。再接続先候補のノードを、効率的に準備しておくために、様々な創意工夫が考案されている（詳細は、オーバーレイマルチキャスト or アプリケーションレイヤマルチキャストを参照）。
応用例：P2P放送(映像＋音声、音声のみ); (PeerCast他)
動画コンテンツの配信などでは、コンテンツを欲するノードが、当該コンテンツを持っているノードを探し出して、そこへデータを要求することで、保持ノードがそれに応じてデータを送信する（オンデマンド）、という一方向型の通信が行われる。言い換えると、持っている者から欲する者へ、という通信である。送信元は、持っている端末が複数ある場合、どれからでも良くて、不特定多数の中からアプリケーションまかせで選ばれる。送信元のIPアドレスは、コンテンツのタイトルなどを手がかりに、インデックスを検索して見つけ出し、コンテンツ保持ノードにデータ送信を要求することで、データ転送が開始される。
オンデマンド型のP2Pアプリケーションでは、配信効率を上げるために、コンテンツのコピー（レプリカ）を作ることが良く行われる。一度取得したコンテンツのコピーを保持して、他のノードに対して提供可能な状態にすることで、他の誰かが再度同じコンテンツをリクエストしたときに、負荷分散の効果が期待できるからである。これは特に、人気のあるコンテンツに対してのアクセス集中の緩和に効果的である。レプリカを作るアプリケーションでは、通常、レプリカをキャッシュフォルダ内に作り、古いレプリカから追い出すような実装になっていることが多い。
オンデマンド型のP2Pアプリケーションでは、データ全体を、一旦リクエストした端末までは持ってきてから利用する「ダウンロード方式」の実装がほとんどである。
応用例：P2Pコンテンツ配信、P2P掲示板、P2Pグループウェア、P2P分散ファイルシステム、無線のアドホックネットワーク、ゲームソフトのアップデート
ビットコイン、Ripple (支払いシステム)などでは、通貨の取引履歴情報を、各ノードで分散して持つことによって、通常はサーバで管理する台帳データの不正な改竄を防ぐことができるので、P2Pを利用している。これにより自分のノードの台帳データを改ざんしたとしても、他の多数のノードが正しいデータを保持していることにより、比較した際に改竄を検知することができる。
「こういうデータを持っているのは誰ですか？」という問いに答えるためには、データを検索するための属性キーとデータのありかの対応表（インデックス）を持っている必要があるが、これをサーバに集中して持たせる場合と、各ノードに分散して持たせる場合と、特定の選ばれたノードに分散して持たせる場合、の３種類が存在する。
ハイブリッドP2Pにおいては、インデックス情報を、中央のインデックスサーバで一括して管理する。新しいデータを保持したノードは、自分が持っていることを、インデックスサーバに申告しておく。データを欲するノードが、「このキーに対応する相手を教えて下さい」とインデックスサーバに問い合わせると、対応する相手のIPアドレスを教えてくれる。インデックスが膨大になると、スケーラビリティが無くなる点が、後述のピュアP2Pと比べて劣るが、通常規模のシステムであれば、この方式で事足りるケースが多い。インデックスサーバがダウンすると、システム全体が停止するため、耐障害性の面では、ピュアP2Pに劣る。
BitTorrent、Napster、WinMX、放送型P2P(OLM)の多くは、この方式を採用している。
インデックス情報は、各ノードが少しずつ分散して持ち合う。
自分の知っているノードに、「データを持っているのは誰ですか？」というメッセージを投げると、そのノードが知っていれば回答が返り、知らなければ又聞きをしてくれる（メッセージを転送する）仕組みになっている。インデックスが膨大になっても破綻しないため、スケーラビリティが高い。メッセージ転送の方式により、非構造化タイプと構造化タイプの２つに分類できる（後述）。
Gnutella、Freenet、OceanStore、Winny、Share は、この方式を採用している。
ピュアP2Pに参加する際には、既に参加しているノードのIP情報を何らかの形で知っている必要がある。このためには、常に活きているノード(コンタクトノード)を用意しておいて、参加時はいつもそこに接続するようにするか、あるいは、参加しているいくつかのノードの情報をサーバに集めて、ここから知るように構成する。
インデックス情報は、特定の選ばれたノード（スーパーノード）が分担して持つ。スーパーノードには、できるだけ安定な端末（ずっと電源が入っていて、通信回線も安定していて、帯域幅も太いようなノード）が選ばれる。スーパーノードは、一般のエンドユーザの端末から能力に応じて選ばれるが、サービス提供者側が用意した端末であることも多い。
KaZaA、Skypeは、この方式を採用している。
ピュアP2Pにおいては、インデックス情報も分散されて持たれるため、相手先IPアドレスの発見の仕組みは、検索メッセージを転送することで行われる。転送方式で、２種類に分類ができる。P2Pに参加するノードには、以下のような機能が必要となる。ソフトウェアで、これらの機能は実現できる。P2Pの技術は、実用化されて間もないため、成熟した技術として使われるためには、いくつかの課題が残されている。
また、これまでのP2P技術は、ファイル共有ソフトによって注目されてきた経緯があり、P2Pを使っていると聞くだけで有害なソフトウェアだと思うような誤解を与えてしまうことがある。しかし、以下に示すように、多くの誤解はアプリケーションやP2Pソフトの実装上の問題であり、解決策が見えてきている。つまり、P2P技術自体は、うまく使えば非常に有用な技術である。