« [学習]東大オープンスクール | トップページ | [P2P]P2P勉強会プレ飲み会お疲れ様でした~ »

2004.07.24

[P2P]サーバレスでVoIPを実現する(メモ)

SkypeというVoIPソフトがある。既にユーザ数を多く獲得している評判の高いソフトである。その理由の一つにファイアウォールがあっても設定なしに通話ができる点が挙げられる。

ところで、Skypeシステムには実はサーバがある。詳しくは下記のページを見て欲しい。またファイアウォール越えはUDP hole punchingでなく、グローバルアドレスノード(スーパーノード)を介するという方法であった。
P2Pソフト「Skype」で新しいタイプの通信事業者を目指す──Skype CEO Niklas Zennstrom氏に聞く

DHT(分散ハッシュ)において、ファイアウォール越えを行う方法は既に提案したのでここでは書かない。これはグローバルノードを介しても、UDP hole punching でもどちらも対応している。

そこで、今回はDHTを使いながらサーバレスでVoIPを構成することを考えてみよう。

まず、準備として呼(インターネット用語だとセッションが適切かな。)の制御としてSIPを使う。
SIPについては以下のページを見ると良いでしょう。
SIP入門

ではその手順を考えてみよう。

1)自分のプロフィールなどのメタ情報はユーザの名前をnameとしてNode_A=Node_ID(hash(name))に格納。hash()はハッシュ関数を表わす。自分のノードをMy_Nodeとすると、My_Nodeは定期的にNode_Aに通信を行う事により、自分のノード状態を記憶させておく。(このため、例えば通話外の時間に自分のIPアドレス等が変化してもその後の通話には影響が出ない。)
ここでもうわかってしまう方も多いと思うが、Node_AがMy_nodeのロケーションサーバの代替となっている。

2)My_nodeは通話先のYour_Nodeと接続したい。Node_B=Node_ID(hash(your_name))とする。
My_nodeは相手名前your_nameを知っているからhash(your_name)からNode_Bと接続する。Node_BはMy_nodeにYour_nodeのIPを返す。

3)My_nodeはYour_nodeにセッションを張るため、SIPで通信。ここからMy_nodeとYour_nodeはP2P状態。
(本来はここで、My_nodeyとYour_nodeでNAT越えをすための制御をしなければならないが、ここでは省略。先程リンクした先日私が書いたBlogを見て下さい。)
つまり、SIPプロキシが無い状態でのSIP通信と同等と考えて欲しい。(=あるノードが相手のIPアドレスを知っている状態)

4)SIPのネゴシエーションが成立し、VoIP通信開始

5)VoIPが終了し、SIPのセッションが再開。終了をお互いにアナウンス。

これでサーバレスでVoIPが実現できた。

ただ、これだとSIPの機能を充分使ってない。例えば、Your_nodeのIPアドレスを知る場合、SIPであればリダイレクトサーバの概念を取り入れれば良いはずだ。ということで、もっとSIPで記述できる範囲は多いと思われるので、その辺をもっとすっきりさせてみたい。あと、レジストラ(ノードの登録)の部分についてもSIPで書けるはずだ。

こうなると、DHT上でのアプリケーションにおいて互いのセッション、接続の要求・終了についてSIPを使うと非常にスマートになることがわかる。非常に面白い研究だと思うので、多くの人がチャレンジして欲しい。

もう少しSIPを勉強して改良していきたい。


|

« [学習]東大オープンスクール | トップページ | [P2P]P2P勉強会プレ飲み会お疲れ様でした~ »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/18781/1035980

この記事へのトラックバック一覧です: [P2P]サーバレスでVoIPを実現する(メモ):

« [学習]東大オープンスクール | トップページ | [P2P]P2P勉強会プレ飲み会お疲れ様でした~ »