P2Pって何?
  P2Pは、あなたのそばにいる

IPROS 勉強会 2011/6/22
 株式会社イプロス 山口隼也
     @junya100
Winny?
    不正ダウンロードを
     助長する技術?
企業や社会の敵?
    マニアな人たちの
      おもちゃ?
いやいや、
    P2Pは、
あなたのそばにいます。
     そして、
  今の、これからの
IT社会を支えています。
P2Pが使われている
 主なシーンを3つ
iPhone
(iPad、Mac)
iPhone4を買った動機は?
マルチタスキング

         Retina Display
App Store
        iBooks
操作性/UI
Face Time
junya100   Junya Yamaguchi
iPhone4 Keynote                    FaceTime      P2P
  NAT                        SIP STUN TURN ICE

09 6 8
DNS/SIP/STUN/
              HTTP/FTP/SMTP
   ICE/RTP

    UDP           TCP


            IP
キーポイント

1.NAT トラバーサル

  2.UDPとIP網
Online
   Games
MO(Multiplayer Online)
オンラインゲーム ネットワーク概念図

                                                        プレイヤーC
                       220.X.X.X

                                                  NAT
                              ルータ
              サーバ                     223.X.X.X


                                       FTTH

                                                  192.168.X.X



                             FTTH   FTTH

         221.X.X.X                    222.X.X.X
                     NAT
プレイヤーA                                     NAT              プレイヤーB




                                                            192.168.X.X
192.168.X.X
キーポイント

1.NAT トラバーサル

2.ノードの参加と離脱
Cloud
(分散データベース)
負荷(読込み、書込み)を
    分散させて
  スケールアウト
 させる方法・・・
シャーディング
データを複数のサーバで分ける
1.クライアントが、完璧な「サーバ一覧表」をもつ方式




クライアント   アクセス




   サーバ一覧表       サーバ群



                数台∼数十台
問題点

・サーバ一覧表の
メンテナンスコスト
2.管理サーバが、完璧な「サーバ一覧表」をもつ方式

                  管理サーバ




                        サーバ一覧表
          問い合せ




         アクセス
クライアント


                 サーバ群


                 数百∼数千台
問題点

・サーバ増加による負荷の集中

・単一故障点(SPOF)の回避
3.各担当サーバが、それぞれ完璧な「サーバ一覧表」をもつ方式




                 サーバ群




    問い合せ/アクセス




クライアント




                数百∼数千台
問題点

・「サーバ一覧表」の
  同期コスト
4.各担当サーバが、それぞれ不完全な「サーバ一覧表」をもつ方式




     問い合せ/アクセス




 クライアント

                 サーバ群


                  数万台∼
コンシステント・ハッシング
     (Consistent Hashing)

          DHT
(Distributed Hash Table)

         構造化オーバーレイ
        (Structured Overlay)
One More Thing...
せっかくなので、
「NATトラバーサル」
を実装してみました。
UDPだけだとファイル転送とかに
   向かないので、TCPの機能
(輻輳制御、フロー制御、再送制御)
    をUDP上に実装すれば、
  万能なP2P通信が可能だよね?
STUN


                                  Server




                                                            STUN Server




       Peer A ( Download                                                                       Peer B ( Upload




                      Uploader                     Server       ExternalRegist
                       Uploader      IP                                Peers          ExternalPort

                      Downloader   Uploader                                 PeerRequest
                      Download          Server       SessionRegist
                      Uploader      PeerResponse
                      Uploader   Downloader                                 PeerRequest
                                  Downloader            Peer                 Downloader    Uploader HandShake
InetSocketAddress remoteEndPoint = null;
DatagramChannel socketChannel = (DatagramChannel) channel;

if (ConfigUtils.COMMON.getBoolean(CommonConfig.KEY_NAT_TRAVERSE_MODE)
          && remotePeer.isRequiredNatTraverse()) {

    STUNClient stun_client = new STUNClient();
    for (int retried_count = 0; true; retried_count++) {
          remoteEndPoint = stun_client.handShake(socketChannel,
                      remotePeer.getIp(), remotePeer.getPort(), remotePeer
                               .getInternalPort()), remotePeer.getPeerId());
          if (remoteEndPoint != null) {
                break;
          } else {
                if (retried_count >= HANDSHAKE_RETRY_COUNT) {
                      LogUtils.LOG.error("HandShakeが失敗しました");
                  break;
             } else {
                  LogUtils.LOG.info("HandShake Timeoutしました");
                  continue;
             }
        }
     }
} else {
     remoteEndPoint = new InetSocketAddress(remotePeer.getIp(),
            remotePeer.getPort());
}

if (remoteEndPoint != null) {
      setupSocketOptions(socketChannel.socket());
      socketChannel.configureBlocking(false);
      socketChannel.socket().setReuseAddress(true);
      socketChannel.connect(remoteEndPoint);
}
以上です。

P2Pって何?