[P2P]Websocketでブラウザ間P2P通信は実現できるか?
□WebsocketでP2P通信ができるのか?を検討するきっかけ
第2回Websocket勉強会の開催を来年度また開催しようと考えています。今度は自分としても何か講演できるネタがないか少しずつ考えているところです。その一つのネタはWebsocketで実現できること、できないことはなにか?を解説することです。
さてWebsocketはブラウザ等によって双方向な通信を行うプロトコルとなります。Websokcetを使うことによって従来の技術では困難であった、サーバからのPush通信が容易になります。この考え方を拡張し、Websocketを用いてブラウザ間の直接通信を実施すること、すなわちP2P通信の実現を考えることは自然なことです。
ただWebsocketは現在の仕様を見る限りクライアント-サーバ間通信を基本としており、P2P通信を意識したプロトコルとは残念ながら考えにくいことは事実です。それを承知としてP2P通信をWebsocketとしてできるのか、もしできないなら何故なのかを今回思考実験してみます。
また自分が方式検討/開発として関わった050plusを世に出した後、この検討によってP2P、NAT越え技術を改めて振り返る良いきっかけになると考えています。皆様のコメントを是非頂きたいと考えています。
なお、今回は非常にラフな検討ですので(今夜思いついたアイデアをサラっと書いています)後日詳細な分析結果を改めて書きたいと考えています。
*本検討範囲はブラウザ単体で簡単に処理できるWebsocketとJavascriptの組合せまでとします。
□Weboskcetを用いたP2P通信を実現するための課題
Websocketではクライアント-サーバ間で通信する場合、HTTPのようなプロトコルにて通信を行います。P2P通信をする場合、互いの端末(ここでは端末をノードと呼ぶことにしましょう)はクライアントとサーバ機能を両方持つ必要があります。
これを実現するには以下の課題があります。
[課題1]ノード間でTCPによる接続を実現させるための技術が必要
[課題2]課題1を実現した後Websocketレイヤにおいてクライアント-サーバ間のハンドシェイクを実現するための技術が必要
まず課題1についてです。WebsocketはTCPを使う以上、ノード間でTCP接続をする必要があります。ブラウザはHTTPクライアント機能はありますがサーバ機能は一般的にはないため、どのようにしてブラウザにてサーバ機能を実現できるかが大きな課題となります。
残念ながらJavascriptだけではブラウザ間でP2P通信を行うことは2008年当時で困難であることを過去の記事で纏めています。
ブラウザー間直接通信で広がる世界と課題
すなわち、TCPにおけるブラウザ間P2P接続が実現しない限りWebsoketによるP2P通信の実現までたどり着くことはできません。ブラウザ間P2P接続を実現する可能性の一つとしてTCPのNAT越えで利用するTCP hole punchingを使い、お互い同時にTCPのハンドシェイクを開始することによってP2P実現をすることが考えられます。これを実現するにはJavascriptがTCPのsokcetレベルまでコントロールする必要があり、現在のJavascriptの規定を超えています。
仮にNATがない状態においてブラウザ間P2P接続ができたとしても、サーバレスでNAT越えを行うにはTCP hole punchingを使う必要があります。そのため、商用レベルでブラウザ間P2P通信を行うには、どうしてもブラウザにてTCPのsocketレベルでのコントロールが必須と考えられます。
課題1の解決ができた前提で課題2についても説明します。Websokcetではクライアント/サーバの役割がきっちりと明確化しています。仮にTCP hole punchingでブラウザ間P2P通信がうまく行った場合、どちらのノードがクライアントか、サーバかを決定する必要があります。Websocketのハンドシェイク前に独自プロトコルでクライアント/サーバを決定する、あるいはWebsokcetのハンドシェイク信号の受信タイミングによって役割を決定する等が考えられます。(*後者は受信タイミングによって色々なノード状態がありうるので慎重に実装の検討をする必要があります。)
そして課題1、2をクリアしてもWebsocketの実装によってはセキュリティ対策によってP2P通信が抑止される可能性もあります。参考にJavaAppletによってP2P通信を行う場合、このセキュリティ対策を回避するために、ちょっとしたおまじないをする必要があります。
□結論
上記の検討結果を踏まえると現時点でのWebsokcet+Javascirptの仕様においてはブラウザ間P2P通信の実現は困難だと考えられます。
ところで、信学会の研究会において「WebSocketを用いたWebブラウザ間P2P通信の実現とその応用に関する研究」という発表が既に行われています。サマリーを見るとJavascriptを「独自に拡張する」ことによってWebsocketにおけるブラウザ間P2P通信を実現しているようです。まだこの発表内容は未読ですが、どの程度のJavascriptの拡張をしているのか、それは今後仕様として実現できる見込みがある拡張なのか気になります。近々チェックしたいと考えています。
また、ブラウザ間でP2Pを実現することについては、W3Cのワーキンググループとして「Web Real-Time Communications Working Group」が立ち上がっていますので、本記事に興味がある方はこちらの動向をウォッチすると良いでしょう。機会があったらこの手の情報を随時ご紹介します。
websocketを勉強するには「徹底解説 HTML5 APIガイドブック コミュニケーション系API編」をお勧めします。websocketの良書が少ないなか、サンプルプログラミングを含めてwebsocketの特徴をわかりやすく、網羅的に説明しています。
また、websocketに関する資料は私が主催する「websocket勉強会」サイトにもありますので、併せてチェックすると良いでしょう。
http://homepage3.nifty.com/toremoro/study/websocketconf.html
| 固定リンク
« 大人も楽しめる!幼児用学習本「World Almanac for Kids Workbook」の学習効果がスゴい! | トップページ | [P2P]Websocketでブラウザ間P2P通信は実現できるか?(その2) »
「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)
この記事へのコメントは終了しました。
コメント