Adobe Stratusサンプルを読み解く
Stratus Sample Application
がコードといっしょに公開されているので読んでみる。
■NetConnectionでAdobeの提供しているrtmfpサーバstratusにつなぐ
予めDeveloperKeyを手に入れておく。
PLAIN TEXT
Actionscript:
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler);
netConnection.connect("rtmfp://stratus.adobe.com/" + DeveloperKey);
NetStatusEventの NetConnection.Connect.Sucess になると、
NetConnection.nearID がとれる
この64桁のIDが、他のPeerから自分につなぐために、
相手が知る必要のある情報
webサービスに登録しておいて、
ユーザー名と照合できるようにしておく
#これがHttpIdManager.asのお仕事
なんだろサンプルでは4つのNetStream使ってるけど、
お互いの2つだけでいけそうだなぁ。
■音声/映像のやり取り
ユーザー名知ってる人に電話かけようかなと思ったら、
webサービスに照合して、相手の64桁のIDをもらい、
それをNetStreamに渡す(identity)
PLAIN TEXT
Actionscript:
incomingStream = new NetStream(netConnection, identity);
incomingStream.play("media-callee");
playすれば音が鳴るし、VideoにattachNetStreamすれば相手の映像が見える
出す方は、DIRECT_CONNECTIONS設定してpublishする
PLAIN TEXT
Actionscript:
outgoingStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
outgoingStream.publish("media-caller");
publish,playに渡す引数は、電話かける方はmedia-caller,受ける方はmedia-calleeとしてるけどなんでもよさそう。
ルールを決めておけばよい。
↓clientにonPeerConnectって関数を入れておくと、
誰かPeerがつないできたときに、farIDが取れる。
onPeerConnectがtrueを返せば接続ok、
falseを返せば接続ngッぽいので、
非接続側でもう一度webサービスにfarIDを照合して誰が電話かけてきたのか着信履歴表示や着信拒否ができそうだね
PLAIN TEXT
Actionscript:
var o:Object = new Object
o.onPeerConnect = function(caller:NetStream):Boolean {
status("Callee connecting to media stream: " + caller.farID + "\n");
return true;
}
outgoingStream.client = o;
■RPC
NetStream.sendを使えばPeer2PeerのRPCも簡単。
PLAIN TEXT
Actionscript:
outgoingStream.send("onIm", userNameInput.text, msg); [...]
FlashによるP2Pセッション確立用サーバStratus
って理解でいいのかな。
Adobe MAX 2008 US での発表つづき
Stratusってなんだろって探すとある
Stratus
http://labs.adobe.com/wiki/index.php/Stratus
Flash Player 10 and Adobe AIR 1.5 introduce a new communications protocol called the Real-Time Media Flow Protocol (RTMFP). The most important features of RTMFP include low latency, end-to-end peering capability, security and scalability. These properties make RTMFP especially well suited for developing real-time collaboration applications by not only providing superior [...]
第3回オーバレイネットワーク研究会とGnutella調査中
第3回オーバレイネットワーク研究会行ってきました。
http://wslash.com/?p=1928
http://mixi.jp/view_event.pl?id=34638897&comm_id=6936
ISP側からの話がおもしろかったなぁ、考えたことも無かったので。
P2Pは一見ネットワークに優しそうだけれど
物理的なネットワークトポロジーによってはそうでもないよ、ってのが自分的には新しかった。
Server to Client
A ----> B
A ----> C
A ----> D
P2Pで例えばこうやってdeliverしようとしたら、
A ----> B
B -> C
B -> D
という話で、
実は物理的な距離として↓こんなだったら、
A--CD-----------------B
P2Pの場合は
B->C,B->Dの分、Server to Clientの方が実は全体的には効率的だよね。って話。
きっとかなりはしょってるんだろうけれど感覚的に理解できました。
そのためのP4Pという構想。
プレゼン後に、クライアント同士がtracerouteうちあえばできるんじゃね?
というのもおもしろそうだった。
あと、IPアドレスとLocation情報の組み合わせってお金で買えるんだけど、
っていうのもなんかうまくやり方がありそうだなぁ。
帰りがけ、「GnutellaもNAT越え実装してるよ、コード参考になるかもしれないね」
ってお名前を失念したどなたかに教えていただいたので、
(NAT越えできてない先入観があったので今さらだけど)
Gnutellaも調べる
http://en.wikipedia.org/wiki/Gnutella
詳しい
peerは以下のいずれかに分類される
leaf node / ultra node
自分のデスクトップ(ADSLルーターの下にいる)はleaf nodeってLimeWireに言われる。
NATの下にいるからだろうね。
P2Pファイルシェアリングアプリ入れるの久々だなぁ、WinMX全盛時代以来だ。
leaf nodeは、3つ程度の ultra peer に接続する。
一方 ultra peer は 32以上の ultra peer に接続する。
検索は、検索したいnodeが検索語のハッシュを Query Routing Protocol で、 Query Routing [...]
XMPPでP2Pの音声チャットセッションを確立する方法4
XMPPでP2Pの音声チャットセッションを確立する方法3
の続き
libjingleでcallサンプル(P2Pの音声電話)を動かしてみて、
ログみてどういうxmpp stanza送りあってるのかなぁ、見てみる。
call.exe に -d オプションをつけて動かすとデバッグ情報がログに出てくる
libjingleではGIPSMediaEngineとlinphoneというのにデフォルト対応していますが
GIPSMediaEngine手に入らないし
linphoneはWindows上でうまくbuildできないので
とりあえず適当なpayload-typeを指定しています。
IPアドレスも適当にしています
XMPPのJIDはこんな感じ
caller: o.masakazu@gmail.com/callB3B38FB3
callee: o.masakazu@gmail.com/call7DA716D7
ところで悲しいことに、、
libjingle Developer Guide
libjingle was created at about the same time as the Jingle XMPP extension (XEP-0166). The libjingle team created their own protocol to handle session negotiation, and later worked with the XMPP Standards Foundation to standardize Jingle; thus, although the libjingle protocol and Jingle are very similar, they are not [...]
XMPPでP2Pの音声チャットセッションを確立する方法3
XMPPでP2Pの音声チャットセッションを確立する方法2
これの続き。
XEP-0176: Jingle ICE-UDP Transport Method
を読む。
This specification defines a Jingle transport method that results in sending media data using raw datagram sockets via the User Datagram Protocol (UDP). This transport method is negotiated via the Interactive Connectivity Establishment (ICE) methodology defined by the IETF and thus provides robust NAT traversal for media traffic.
これと並列なものとして、
XEP-0177: Jingle Raw UDP [...]
UDPホールパンチング整理(わかったかも)
わかったのかも → コメント参照
symmetric NAT以外の話、つまりFull Cone NAT,Restricted Cone NAT,Port-Restricted Cone NATなら
UDPホールパンチングを使って外から中向けのセッションを張れるようだ。
Full Cone NATとは
NAT内からNAT外へ出る(UDP)パケットを送って、マッピングをつくったら、
NAT外のどのIP,ポートからでも、そのマッピングを利用してNAT内にパケットを送ることのできるNAT。
Restricted Cone NATとは
Full Cone NATに加えて、一度NAT内からパケットが送信されたIPからのみ、そのマッピングを利用できるNAT。
Port-Restricted Cone NATとは
Restricted Cone NATに加えて、一度NAT内からパケットが送信されたIPとポートからのみ、そのマッピングを利用できるNAT。
Symmetric NATとは
NAT内からNAT外へ出るパケットを送って、マッピングを作っても、
その同じ宛先からのみ、マッピングを利用できるNAT。
逆に言うと、
NAT内からNAT外へ出るパケットを送って、マッピングを作っても、
違うIPとポートの組み合わせからはそのマッピング(=NATの外側のIPとポート)からはNAT内にパケットを送れないNAT。
こいつに対してはTURNを使う。
簡略化のためIPは省略、Full Cone NATもRestricted Cone NATもPort-Restricted Cone NATも同じだから
一番厳しいPort-Restricted Cone NATだと思って考える
図
A< -------->NAT1(port6000)< -------->STUNサーバ< -------->(port10000)NAT2< -------->B
1. まず、AとSTUNサーバ、BとSTUNサーバは別々につながってる。
AはNAT1の外側ポート6000番を通してSTUNサーバと、
BはNAT2の外側ポート10000番を通してSTUNサーバとつながってる
A< -------->NAT1(port6000)< -------->STUNサーバ< -------->(port10000)NAT2< -------->B
2. STUNサーバが外側ポートを教える
STUNサーバは、Aに対して、「BはNAT2のport10000番にいるよ」って言う
STUNサーバは、Bに対して、「AはNAT1のport6000番にいるよ」って言う
A< -------->NAT1(port6000)< -------->STUNサーバ< -------->(port10000)NAT2< -------->B
A--------->NAT1(port6002)-------------->--------------->x(port10000)NAT2 [...]
XMPPでP2Pの音声チャットセッションを確立する方法1
頭を整理するためのMemo
GoogleTalkで使われているというjingle
XEP-0166: Jingle
XMPP protocol extension for initiating and managing peer-to-peer media sessions between two XMPP entities in a way that is interoperable with existing Internet standards
既存のInternet標準と共存できる方法で、2つのXMPPentities間でP2Pメディアセッションを確立、管理するためのXMPPプロトコルの拡張。
In essence, Jingle enables two XMPP entities (e.g., romeo@montague.lit and juliet@capulet.lit) to set up, manage, and tear down a multimedia session. The negotiation takes place over XMPP, and the media transfer [...]
第十二回SIProp勉強会行ってきた
全員初めてなのになんとかなりましたね。
みなさま(お酒が入ったせいか)話やすい人たちでよかったです。
ありがとうございました!
今日せんえつながら発言したadobeのP2Pのことは
FlashPlayer10のP2Pに過去書きましたよ。
正直P2P界では今Adobeに一番注目してます。
セキュリティの話とかちんぷんかんぷんでしたが、
P2PSIPはあれだなぁ、ってみんな思ってるってことはわかりましたw
標準は泥臭いところから生まれる方が現実的なモノができやすいのでしょう。
ということで、セッション層はXMPP使うことにする。
まだ悩むのはlibjingleをがんばって使うか、C#で自分で実装しにいくか、、
トランスポート層はUDPかなぁ
TCPのNAT越えは
Characterization and Measurement of TCP Traversal through NATs and Firewalls
がちゃんとしたまとめっぽいけど、実現方法がきもいよなぁ、
今日もTCPがNAT超えられるの5割程度って言ってたしUDPでなんとかしよう
UDPのSTUNの仕組みがまだ理解できてないなぁ
フルコーンNAT → STUNサーバ にパケット送ってNATにマップを作らせることで
外部IP → フルコーンNAT内 方向が到達できる、ってのはわかったし実験できたんですが、
SymmetricじゃないNAT(IP制限のみかポート制限のみ)内から、SymmetricじゃないNAT内にメッセージを送る手順がわからない。
まずSTUN=UDPホールパンチングだと思ってたけど、今日の話の流れを考えると違うっぽいな
もうちょい調べよう
その上はRTPでSPEEXを包めばいいかなぁ、
FlashPlayer10でSPEEX対応した時に、ローカルアプリからブラウザのFP10にSPEEXストリーム流せたらすごい
オープンソースなbittorrent-trackerまとめ
trackerとは、torrentファイルDLした後につなぎにいって、本体ファイルをDLするための接続先ピアの一覧を返すサーバ。
どれがいいんだろ
○公式bittorrentのbittorrent-trackerサーバ
maybe slow..
http://www.bittorrent.com/
http://download.bittorrent.com/dl/
pythonで動いてる
./bittorrent-tracker.py --port 6969 --dfile dstate
○apache2とmod_btの組み合わせ
http://www.crackerjack.net/mod_bt/mod_bt.html
裏でlibbttrackerを使用
Net::BitTorrent::LibBT::Tracker これでそこにつなげるかも
○Net::BitTorrent::LibBT::Tracker 使って自前perlサーバ
mod_bt の libbttrackerのperlから使う
○Open Tracker
http://erdgeist.org/arts/software/opentracker/
http://opentracker.blog.h3q.com/
It aims for minimal resource usage and is intended to run at your wlan router.
○The Hydra Project
A Distributed, private BitTorrent tracker framework with goals of:
... user privacy, anonymity, survivability & distributed ratio maintainability.
The primary goal of this project is to replace the aging TorrentBits [...]
FlashPlayer10のP2P
Peer to Peer (P2P) in Flash Player 10 beta
ho-
利用シーンに関わる部分はここ。
Will RTMFP enable massive file-sharing applications through Flash Player 10 beta?
No. Large-scale file-sharing network applications rely on the ability to read from and write to the hard drive constantly to only load parts of files into memory when needed. In Flash Player 10 beta you can load [...]