[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を勉強して改良していきたい。
「パソコン・インターネット」カテゴリの記事
- 第3回Twitter研究会のライトニングトークの実施について(2012.01.25)
- 第3回Twitter研究会公式サイトの公開+講演概要3つ追加しました(2012.01.15)
- 第3回Twitter研究会参加者募集のお知らせ+講演概要について(2012.01.09)
- 2012年のIT系勉強会開催予定について(2012.01.03)
- 第3回Twitter研究会の講師を発表します!(1/28[土]開催)(2011.12.30)

Comments