P2P型アプリケーション用ライブラリ SUNET B3 suno
アウトライン 背景・問題 STUNの説明 SUNETの概要 システム構成 動作フロー デモ まとめ・感想
背景 家庭のネットワーク環境 P2Pアプリケーション ブロードバンド化 ルーター 集中負荷がかからない クライアントの能力の有効活用 例 多くのコンピュータがプライベートなネットワークへ P2Pアプリケーション 集中負荷がかからない クライアントの能力の有効活用 例 ファイル交換 VoIP、ビデオチャット
問題 多くのコンピュータプライベートアドレスを持っている 直接通信が行えない 今のP2PソフトはグローバルなIPアドレスを持つノードを経由している 帯域の限界 遅延の発生
STUNとは? Simple Traversal of UDP through NATs NAT内の端末同士が直接通信できるようにする RFC 3489 NAT内の端末同士が直接通信できるようにする Suno家ネットワーク Quno家ネットワーク ルーター xxx.xxx.xxx.xxx ルーター yyy.yyy.yyy.yyy Qunoマシン 192.168.0.2 Sunoマシン 192.168.0.2 STUN
何故直接通信できるか サーバー ルーターがポート51を開いて サーバーのポート50へ送る ポート50からサーバーのポート50に送信 ルーターがポート51を開いて サーバーのポート50へ送る Suno家ネットワーク Quno家ネットワーク ポート50からサーバーのポート50に送信 ルーター xxx.xxx.xxx.xxx ルーター yyy.yyy.yyy.yyy Suno家のルータのポート51に送ると sunoマシンのポート50にに届く Sunoマシン 192.168.0.2
ルーターの種類 Full Cone Restricted Cone Port Restricted Cone Symmetric 高スループット Full Cone Restricted Cone Port Restricted Cone Symmetric 高セキュリティ
SUNETの概要 STUNを利用したP2Pのライブラリ ユニキャスト ブロードキャスト 直接通信 あて先にメッセージを送れる 参加者全員にメッセージを送れる 直接通信 STUNを用いた直接通信が行える 従来のP2PソフトではGlobalなIPアドレスをもったノードを経由していた 帯域と遅延の問題が解決
ノードのタイプ 親ノード 子ノード グローバルなIPアドレスを持っている 他の親ノード全てと繋がっている 親ノードのうち一つと繋がっている
システム構成 親 親 親 親 子 子
動作フロー(参加) 参加ノードに初期親ノードを与える 初期親ノードから親ノードのリストを受け取る ルーターのタイプをチェック 参加ノードがGlobalなIPを持っている場合親ノードとして参加 参加ノードがPrivateなIPを持っている場合子ノードとして参加 suno.net 初期ノード:suno.net 親 リストくれ あいよ 親 ? 親 子 ルーターチェックさせて
動作フロー(ユニキャスト) 親 親 子 子 Suno 親 子 子 Sunoとはつながってないから 別の親ノードに送ろう メッセージキター!! Sunoとはつながってないな。 メッセージは破棄しよう 子
動作フロー(ブロードキャスト) 親 親 子 子 親 子 子 つながってるみんなに 送るぞー つながってる子ノードに 送るぞー みんなにメッセージを 送りたい! 親ノード 子 子 親 子 子
動作フロー(直接通信) 親 親 子 子 親 直接通信確立 133.27.170.YのB番に接続してちょうだい 133.27.170.XのA番に接続してちょうだい 親 親 子 子 133.27.170.YのB番 133.27.170.XのA番 親 直接通信確立 開いたUDPポートと マッピングされている ルーターのIPとポートは? 開いたUDPポートと マッピングされている ルーターのIPとポートは?
デモ サンプルアプリケーション P2P型共有お絵かきボード 2つのノードで同じお絵かきボードを共有
まとめ P2P型アプリケーション用ライブラリ SUNETを作成した ユニキャスト ブロードキャスト 直接通信 帯域・遅延問題の解消
感想 時間がなくて設計がいまいち 親ノード間のトポロジーがいまいち P2Pのルーティングは大変だ クラスをより適切に定義すべきだった 今のままだとスケールしない P2Pのルーティングは大変だ Jxta使えばよかった・・・