P2P通信

P2Pとは

P2P(Peer to Peer)は、中央のサーバーを介さず端末同士が対等に直接通信する方式です。参加する端末をピア(peer=対等な相手)と呼びます。

対する従来型がクライアント・サーバー方式で、全員が中央のサーバーにアクセスし、サーバーがデータを配る形です。Web サイトの閲覧はこちらにあたります。

クライアント・サーバーP2P
データの持ち主中央サーバー参加している各端末
参加者が増えるとサーバーの負荷が増える配信能力も一緒に増える
単一障害点サーバーが落ちると全滅一部が落ちても継続できる
管理・監視しやすいしにくい
Webサイト、メールファイル共有、ビデオ通話、ブロックチェーン

P2P の最大の魅力は、参加者が増えるほど全体の配信能力も増える点です。人気のファイルほど持っている人が多くなり、みんなで少しずつ送り合えるため速くなります。

どこで使われているか

  • ファイル共有 — BitTorrent などが代表格。ファイルを細かい断片に分け、複数のピアから並行してダウンロードします
  • ビデオ通話 — WebRTC を使ったブラウザ間の通話。映像と音声はサーバーを経由せず端末間を直接流れるため、遅延が小さくて済みます
  • ブロックチェーン — 台帳のコピーを全ノードが持ち合い、P2P ネットワークで同期します
  • ソフトウェア配布 — 大規模な更新データを端末同士で配り合い、配信サーバーの負荷を下げる仕組みもあります

NAT越えという難関

P2P の実装で最大の壁が NAT越え(NAT traversal)です。

家庭やオフィスの端末はプライベートIPアドレスしか持たず、ルーターの [[NATとポートフォワーディング]] を通して外と通信しています。この状態では、外側から「その端末」を名指しして接続することができません。お互いが NAT の内側にいると、どちらからも接続を始められないわけです。

そこで次の仕組みが使われます。

  • STUN — 外から見た自分のグローバルIPとポートを教えてくれるサーバー。これを互いに交換し、[[UDP]] で同時に送り合うと NAT に通り道ができます(UDPホールパンチング)
  • TURN — どうしても直接つながらない場合に、通信を中継してくれるサーバー。P2P を諦めて経由する最終手段です
  • シグナリングサーバー — 相手を見つけて接続情報を交換するための最小限のサーバー

つまり実務の P2P は「完全にサーバー不要」ではなく、出会いの手助けだけをサーバーに任せ、本番のデータは直接流す形が一般的です。

初学者向けポイント

  • P2P だからといって匿名でも安全でもありません。相手に自分のIPアドレスが見えるのが普通です
  • 直接つながる相手が信頼できるとは限らないため、[[ソケット通信]] で受け取ったデータの検証は必須です
  • 大規模配信では P2P より [[CDN]] のほうが管理しやすく、実務では CDN が選ばれる場面が多くあります。P2P が輝くのは「リアルタイム性」か「中央集権を避けたい」ときです
  • 企業ネットワークでは P2P 通信がファイアウォールで遮断されていることがあり、TURN 経由にフォールバックする設計が要ります

関連技術とのつながり

  • [[NATとポートフォワーディング]] — P2P最大の障壁。NAT越えの技術が必要になる
  • [[ソケット通信]] — ピア同士の直接通信はソケットの上に実装される
  • [[UDP]] — ホールパンチングやリアルタイム通信で主に使われる
  • [[CDN]] — 大規模配信における中央集権型の対抗手段
Q: P2P通信の特徴として正しいものはどれ?
- [x] 参加者が増えるほど全体の配信能力も増える
- [ ] 必ず中央サーバーがすべてのデータを保持する
- [ ] 通信内容が自動的に匿名化される
解説: 各ピアがデータを持ち合って送り合うため、参加者の増加がそのまま配信能力の増加になります。匿名性は保証されません。

Q: P2P実装で問題になる「NAT越え」とは何の課題?
- [ ] 暗号鍵を安全に配る課題
- [x] NATの内側にいる端末同士が互いに接続を始められない課題
- [ ] ファイルを断片に分割する課題
解説: プライベートIPしか持たない端末は外から名指しできないため、STUNやTURNといった仕組みで通り道を作る必要があります。

Q: 直接接続がどうしても確立できないときに通信を中継するサーバーはどれ?
- [ ] STUN
- [x] TURN
- [ ] DHCP
解説: STUNは外から見た自分のアドレスを教える役割で、直接つながらない場合の中継はTURNが担います。