[P2P]Websocketでブラウザ間P2P通信は実現できるか?(その2)
前回はWebsocketでブラウザ間P2P通信は実現できるかどうかを考察し、Javascript+Websocketだけではそれが実現できないことを解説しました。
[P2P]Websocketでブラウザ間P2P通信は実現できるか?
この記事ではWebsocketに関わるP2P通信について研究会で投稿があったことを記しましたが、その著者からプライベートで連絡を頂き研究会の内容を元に解説記事を書いて頂きました。ありがとうございました、大変興味深い記事でした。
WebSocketを使ってWebブラウザ間P2P通信をしてみた
結論から言うとXPCOMと呼ばれる技術を使いTCPソケットを作成します。このXPCOMはFirefoxのアドオン機能として実装できます。研究会の著者はこの技術を使ってTCPによるWebSocket通信を実現したわけです。
ところで前の記事に書いたようにTCPによるNAT越えP2P通信はかなり難しいのが現状です。TCPを接続するタイミングなどをうまく使わないと実現できません。(TCP hole punchingと言う技術を使う。)
そのため、もしこの手のNAT越えをするのであればUDPを使うことになるでしょう。UDP hole punchingはTCP hole punchingと比べてぐっと難易度は下がります。これはUDPがステートレスなので、NATルータの処理を(うまい意味で)ごまかすのが簡単だからです。
NAT越えに詳しい人であればUDP hole punchingはSymetric NATと言われるNAT越えがしにくいことをご存知かと思います。しかしながら実際にUDP hole punchingができないのはSymetric NATでもその一部のタイプとなります。詳しくは私の実名をキーにして資料等検索してみてください。
少し脱線をしますが、実はJavascriptを使ってUDPやTCPソケットを利用できるライブラリを作成しているプロジェクトがあります。残念ながら今は休止状態となっています。
JNEXT- Javascript Native Extention
もしこのプロジェクトが休止してなかったらこの手の話はもっと興味深い話題になっていたことでしょう。
では、やはりWebSocketで何らかの特別なライブラリを使ってP2P通信ができないかと言われると気になる標準化動向があります。
現在ブラウザ間におけるリアルタイムにコミュニケーションを実現するための規定がW3Cによって標準化されつつあります。
WebRTC 1.0: Real-time Communication Between Browsers
それと連動してRtcwebというIETFのWGが既に設けられています。ただし現時点での標準化作業はようやくWGドラフトがでてきたという状況です。
そのWGドラフトである「 Overview: Real Time Protocols for Brower-based Applications」を見ると、シグナリングとしてHTTP/WebSocketを使い、メディアは直接ブラウザ間で通信するモデルとなります。これはSIPでいう台形モデルにかなり近いです。
http://tools.ietf.org/html/draft-ietf-rtcweb-overview-02
ですので、RTCWEBを使ってWebsocketをP2P通信をするという想定は、IETFの現時点の議論状況では当分なさそうです。メディアはRTP/SRTPを想定しており、NAT越えのネゴシエーションとしてICEを利用するようです。本ドラフトを見るとメディアとしてUDPを意識していることがわかります。
RTCWEBの世界においてWebsocketはサーバ/クライアントモデルによるシグナリング通信として使われ、P2Pの対象はメディアのみと言う状況です。まだWGドラフトの2版ですので、シグナリングもP2P通信を対象にしていくのか等今後どうなるかは更なる注目が必要ですね。Rtcweb WGの状況は機会を見て紹介しますのでお楽しみに。
websocketを勉強するには「徹底解説 HTML5 APIガイドブック コミュニケーション系API編」をお勧めします。websocketの良書が少ないなか、サンプルプログラミングを含めてwebsocketの特徴をわかりやすく、網羅的に説明しています。
また、websocketに関する資料は私が主催する「websocket勉強会」サイトにもありますので、併せてチェックすると良いでしょう。
http://homepage3.nifty.com/toremoro/study/websocketconf.html
| 固定リンク
「P2P」カテゴリの記事
- WebRTCを実現するためにSTUNだけでなくTURNも必要な理由(2015.01.08)
- [P2P]P2Pストリーミングのサーベイ文書について(2014.11.09)
- Winnyの開発者、金子 勇氏の急逝を悼んで(2013.07.07)
- 「分散ハッシュシステムでのNAT超えの考察」に対する質問について(2012.12.16)
- [P2P]Websocketでブラウザ間P2P通信は実現できるか?(その2)(2011.11.20)
この記事へのコメントは終了しました。
コメント