P2PとCDN
昨日の続きだが、P2PでのCDNについてちょっと考えてみた。CDNとはコンテンツを配送するシステムで、大容量のコンテンツを多数に配信するときに良く使われる。特にライブ配信では重要な役割をする。P2P-CDNはP2Pストリーム配信を包含するとも言える。
P2PでのCDNでは普通、ノード(ユーザと考えても構わない)間の接続を管理するサーバがあって、ノード間でコンテンツを渡すことになる。ところで問題は新たなノードがどこのノードと接続するかということである。
例えば、Nifty内のノードとSo-netのノードが接続するよりも、Nifty間のノードで接続した方がレスポンスが良いし、ネットワークにも負荷をかけない。また、接続するノードが多ければそのノードはそのノード及び回線に負荷がかかっているので避けた方がいいと考えられる。
では、どうすればネットワーク的に近いノードであるかを判別できるのだろうか?
一つの手はノードが接続する際に自分のプロファイルを渡す事である。プロファイルには自分のプロバイダ、地域を設定し、それを基にサーバが適切なノードを紹介する。でもこれはノードのプロファイル編集に手作業があるのでユーザに優しくない。
それを解決する手段としてサーバがノードのIP情報からDNSの逆引きをするということが考えられる。そうすればサーバがノードのプロバイダ名がわかるので、ネットワーク的に近いノードを紹介することができる。
では同じプロバイダで同じ地域に複数のノードがあったり逆引きができない場合、新たなノードはどこに接続すれば良いのだろうか?例えば、
・ノードのスペックを考慮する。例えばCPパワー、回線帯域を見て一番余裕のあるノードに接続
・複数ノードに対してpingを打つ。その応答時間の短いところに接続。
ことが考えられる。実際にはもっと複雑な処理をしているのだろう。
さて、もう少し考えてみよう。今、P2Pストリームを検討対象としよう。通常このP2PネットワークはTree状になっていると想定される。
この時、より上位レベルのノードが不安定になれば、全体に与える影響は大きいと考えられる。そこで上位のノードは基本的にスペックに余裕がある安定的なノードを選ぶのがふさわしいと思われる。
ストリームのクライアンソフトはバッファ機能がある。例えば親ノードとの接続が切れた場合、バッファ内の情報を充分使い切る前に、別のノードに接続すればストリームは途切れないと思われる。親ノードがネットワークから離れた場合、サーバはどのノードに接続するように要求するのだろか?
例えば、ノードは親ノード以外にも親ノードのレベルと同じノードに対してセッションを維持しておくがコンテンツデータは流さない。このノードをノードAとすれば、親ノードがネットワークから抜けた時にはノードはノードAと接続する。このようにすればバッファが充分消費する前にネットワークに再接続することができるだろう。もちろん、親ノードがネットワークに離れた時にサーバがノードに再接続要求しても良いのだが、そうするとどうしても再接続するまでに時間がかかってしまうのだろう。
もうちょっと文献でも見てみるか。
今日読んだ本:「CDNプロトコル入門」Scot Hull著 日経BP社
それにしても、地域分散型CDNについては、ベンダ独自技術が多く、それも一般に詳しくは開示してないことが多いから、調べるのが大変だなぁ。まとめている論文はないのかな。
「P2P」カテゴリの記事
- [P2P]Websocketでブラウザ間P2P通信は実現できるか?(2011.10.30)
- TwitterをP2Pで実現する方法をもう少し考えてみる(2010.05.03)
- オフィスツアー(ビットメディア)を振り返る(2009.10.25)
- [開催日変更]オフィスツアー(株式会社ビットメディア)参加者募集のご案内(2009.08.14)
- [NAT]NAT越え入門1-NATとは何か?(2009.04.11)

Comments